/ Hex Artifact Content
Login

Artifact 4d64e3ccccfd2b46e60e7a4cfd21175c3341e859:


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 70 4e 65   = pEList;.  pNe
0940: 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  w->pSrc = pSrc;.
0950: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
0960: 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d   pWhere;.  pNew-
0970: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
0980: 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  upBy;.  pNew->pH
0990: 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b  aving = pHaving;
09a0: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
09b0: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
09c0: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
09d0: 20 69 73 44 69 73 74 69 6e 63 74 20 3f 20 53 46   isDistinct ? SF
09e0: 5f 44 69 73 74 69 6e 63 74 20 3a 20 30 3b 0a 20  _Distinct : 0;. 
09f0: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53   pNew->op = TK_S
0a00: 45 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70  ELECT;.  pNew->p
0a10: 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
0a20: 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
0a30: 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73  = pOffset;.  ass
0a40: 65 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20  ert( pOffset==0 
0a50: 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a  || pLimit!=0 );.
0a60: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0a70: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
0a80: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0a90: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
0aa0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0ab0: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  [2] = -1;.  if( 
0ac0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
0ad0: 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65   ) {.    clearSe
0ae0: 6c 65 63 74 28 64 62 2c 20 70 4e 65 77 29 3b 0a  lect(db, pNew);.
0af0: 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 26 73      if( pNew!=&s
0b00: 74 61 6e 64 69 6e 20 29 20 73 71 6c 69 74 65 33  tandin ) sqlite3
0b10: 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29  DbFree(db, pNew)
0b20: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
0b30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
0b40: 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21  ert( pNew->pSrc!
0b50: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
0b60: 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73  rr>0 );.  }.  as
0b70: 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61  sert( pNew!=&sta
0b80: 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e  ndin );.  return
0b90: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
0ba0: 44 65 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e  Delete the given
0bb0: 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
0bc0: 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73  e and all of its
0bd0: 20 73 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a   substructures..
0be0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
0bf0: 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69  electDelete(sqli
0c00: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
0c10: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
0c20: 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28      clearSelect(
0c30: 64 62 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69  db, p);.    sqli
0c40: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
0c50: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
0c60: 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e  iven 1 to 3 iden
0c70: 74 69 66 69 65 72 73 20 70 72 65 63 65 65 64 69  tifiers preceedi
0c80: 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77  ng the JOIN keyw
0c90: 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74  ord, determine t
0ca0: 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f  he.** type of jo
0cb0: 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  in.  Return an i
0cc0: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
0cd0: 74 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74  that expresses t
0ce0: 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74  hat type.** in t
0cf0: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  erms of the foll
0d00: 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73  owing bit values
0d10: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49  :.**.**     JT_I
0d20: 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43  NNER.**     JT_C
0d30: 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f  ROSS.**     JT_O
0d40: 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e  UTER.**     JT_N
0d50: 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54  ATURAL.**     JT
0d60: 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f  _LEFT.**     JT_
0d70: 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75  RIGHT.**.** A fu
0d80: 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73  ll outer join is
0d90: 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e   the combination
0da0: 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20   of JT_LEFT and 
0db0: 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20  JT_RIGHT..**.** 
0dc0: 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72  If an illegal or
0dd0: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
0de0: 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20  n type is seen, 
0df0: 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72  then still retur
0e00: 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65  n.** a join type
0e10: 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72  , but put an err
0e20: 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  or in the pParse
0e30: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
0e40: 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79  nt sqlite3JoinTy
0e50: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
0e60: 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b  , Token *pA, Tok
0e70: 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70  en *pB, Token *p
0e80: 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79  C){.  int jointy
0e90: 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20  pe = 0;.  Token 
0ea0: 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b  *apAll[3];.  Tok
0eb0: 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20  en *p;.         
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ed0: 20 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36      /*   0123456
0ee0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
0ef0: 33 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20  3456789 123 */. 
0f00: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
0f10: 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20  ar zKeyText[] = 
0f20: 22 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72  "naturaleftouter
0f30: 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f  ightfullinnercro
0f40: 73 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  ss";.  static co
0f50: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
0f60: 20 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a   u8 i;        /*
0f70: 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65   Beginning of ke
0f80: 79 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b  yword text in zK
0f90: 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20  eyText[] */.    
0fa0: 75 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20  u8 nChar;    /* 
0fb0: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65  Length of the ke
0fc0: 79 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74  yword in charact
0fd0: 65 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f  ers */.    u8 co
0fe0: 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20  de;     /* Join 
0ff0: 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d  type mask */.  }
1000: 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a   aKeyword[] = {.
1010: 20 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a      /* natural *
1020: 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41  / { 0,  7, JT_NA
1030: 54 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20  TURAL           
1040: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c       },.    /* l
1050: 65 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20  eft    */ { 6,  
1060: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55  4, JT_LEFT|JT_OU
1070: 54 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  TER          },.
1080: 20 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a      /* outer   *
1090: 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55  / { 10, 5, JT_OU
10a0: 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  TER             
10b0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72       },.    /* r
10c0: 69 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20  ight   */ { 14, 
10d0: 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  5, JT_RIGHT|JT_O
10e0: 55 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a  UTER         },.
10f0: 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a      /* full    *
1100: 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45  / { 19, 4, JT_LE
1110: 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  FT|JT_RIGHT|JT_O
1120: 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69  UTER },.    /* i
1130: 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20  nner   */ { 23, 
1140: 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20  5, JT_INNER     
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1160: 20 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a      /* cross   *
1170: 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e  / { 28, 5, JT_IN
1180: 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20  NER|JT_CROSS    
1190: 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69       },.  };.  i
11a0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c  nt i, j;.  apAll
11b0: 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c  [0] = pA;.  apAl
11c0: 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41  l[1] = pB;.  apA
11d0: 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f  ll[2] = pC;.  fo
11e0: 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70  r(i=0; i<3 && ap
11f0: 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  All[i]; i++){.  
1200: 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a    p = apAll[i];.
1210: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41      for(j=0; j<A
1220: 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72  rraySize(aKeywor
1230: 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  d); j++){.      
1240: 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f  if( p->n==aKeywo
1250: 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20  rd[j].nChar .   
1260: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1270: 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a  3StrNICmp((char*
1280: 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74  )p->z, &zKeyText
1290: 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c  [aKeyword[j].i],
12a0: 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   p->n)==0 ){.   
12b0: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
12c0: 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64   aKeyword[j].cod
12d0: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
12e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
1300: 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d  =0 || j==1 || j=
1310: 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d  =2 || j==3 || j=
1320: 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d  =4 || j==5 || j=
1330: 3d 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e  =6 );.    if( j>
1340: 3d 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77  =ArraySize(aKeyw
1350: 6f 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f  ord) ){.      jo
1360: 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52  intype |= JT_ERR
1370: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
1380: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1390: 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20  .     (jointype 
13a0: 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  & (JT_INNER|JT_O
13b0: 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45  UTER))==(JT_INNE
13c0: 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20  R|JT_OUTER) ||. 
13d0: 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20      (jointype & 
13e0: 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29  JT_ERROR)!=0.  )
13f0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
1400: 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20   *zSp = " ";.   
1410: 20 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29   assert( pB!=0 )
1420: 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20  ;.    if( pC==0 
1430: 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20  ){ zSp++; }.    
1440: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1450: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
1460: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
1470: 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20  join type: ".   
1480: 20 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c      "%T %T%s%T",
1490: 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43   pA, pB, zSp, pC
14a0: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
14b0: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65  = JT_INNER;.  }e
14c0: 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70  lse if( (jointyp
14d0: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
14e0: 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a   .         && (j
14f0: 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
1500: 46 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a  FT|JT_RIGHT))!=J
1510: 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71  T_LEFT ){.    sq
1520: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1530: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49  arse, .      "RI
1540: 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54  GHT and FULL OUT
1550: 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74  ER JOINs are not
1560: 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f   currently suppo
1570: 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e  rted");.    join
1580: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
1590: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f  .  }.  return jo
15a0: 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  intype;.}../*.**
15b0: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
15c0: 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  x of a column in
15d0: 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72   a table.  Retur
15e0: 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75  n -1 if the colu
15f0: 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  mn.** is not con
1600: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61  tained in the ta
1610: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
1620: 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54  nt columnIndex(T
1630: 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73  able *pTab, cons
1640: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20  t char *zCol){. 
1650: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1660: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
1670: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
1680: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54  qlite3StrICmp(pT
1690: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
16a0: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65  e, zCol)==0 ) re
16b0: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
16c0: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
16d0: 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72  * Search the fir
16e0: 73 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70  st N tables in p
16f0: 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74  Src, from left t
1700: 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67  o right, looking
1710: 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20   for a.** table 
1720: 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d  that has a colum
1730: 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a  n named zCol.  .
1740: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64  **.** When found
1750: 2c 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64  , set *piTab and
1760: 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74   *piCol to the t
1770: 61 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63  able index and c
1780: 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f  olumn index.** o
1790: 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63  f the matching c
17a0: 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e  olumn and return
17b0: 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   TRUE..**.** If 
17c0: 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72  not found, retur
17d0: 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74  n FALSE..*/.stat
17e0: 69 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43  ic int tableAndC
17f0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72  olumnIndex(.  Sr
1800: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
1810: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74     /* Array of t
1820: 61 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20  ables to search 
1830: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
1840: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1850: 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
1860: 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65   pSrc->a[] to se
1870: 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  arch */.  const 
1880: 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f  char *zCol,    /
1890: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
18a0: 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b  lumn we are look
18b0: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ing for */.  int
18c0: 20 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20   *piTab,        
18d0: 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78    /* Write index
18e0: 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65   of pSrc->a[] he
18f0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43  re */.  int *piC
1900: 6f 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ol           /* 
1910: 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70  Write index of p
1920: 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70  Src->a[*piTab].p
1930: 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65  Tab->aCol[] here
1940: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1960: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1970: 72 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  r tables in pSrc
1980: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20   */.  int iCol; 
1990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
19a0: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61  dex of column ma
19b0: 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a  tching zCol */..
19c0: 20 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62    assert( (piTab
19d0: 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29  ==0)==(piCol==0)
19e0: 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20   );  /* Both or 
19f0: 6e 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c  neither are NULL
1a00: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
1a10: 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43  <N; i++){.    iC
1a20: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
1a30: 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62  (pSrc->a[i].pTab
1a40: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  , zCol);.    if(
1a50: 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
1a60: 20 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20    if( piTab ){. 
1a70: 20 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20         *piTab = 
1a80: 69 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f  i;.        *piCo
1a90: 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  l = iCol;.      
1aa0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  }.      return 1
1ab0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1ac0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1ad0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1ae0: 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65  s used to add te
1af0: 72 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a  rms implied by J
1b00: 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68  OIN syntax to th
1b10: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
1b20: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  e expression of 
1b30: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
1b40: 6e 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d  nt. The new term
1b50: 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e  , which.** is AN
1b60: 44 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69  Ded with the exi
1b70: 73 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75  sting WHERE clau
1b80: 73 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f  se, is of the fo
1b90: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61  rm:.**.**    (ta
1ba0: 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63  b1.col1 = tab2.c
1bb0: 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  ol2).**.** where
1bc0: 20 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72   tab1 is the iSr
1bd0: 63 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72  c'th table in Sr
1be0: 63 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74  cList pSrc and t
1bf0: 61 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28  ab2 is the .** (
1c00: 69 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75  iSrc+1)'th. Colu
1c10: 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d  mn col1 is colum
1c20: 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61  n iColLeft of ta
1c30: 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a  b1, and col2 is.
1c40: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69  ** column iColRi
1c50: 67 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a  ght of tab2..*/.
1c60: 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57  static void addW
1c70: 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73  hereTerm(.  Pars
1c80: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1ca0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1cb0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
1cc0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1cd0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
1ce0: 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c  ables in FROM cl
1cf0: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
1d00: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
1d10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1d20: 65 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c  ex of first tabl
1d30: 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72  e to join in pSr
1d40: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c  c */.  int iColL
1d50: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
1d60: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1d70: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72  of column in fir
1d80: 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  st table */.  in
1d90: 74 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20  t iRight,       
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1db0: 20 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64   Index of second
1dc0: 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a   table in pSrc *
1dd0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68  /.  int iColRigh
1de0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1df0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1e00: 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64  column in second
1e10: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
1e20: 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20  isOuterJoin,    
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e40: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
1e50: 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a  n OUTER join */.
1e60: 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65    Expr **ppWhere
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e80: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65    /* IN/OUT: The
1e90: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
1ea0: 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20   add to */.){.  
1eb0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1ec0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
1ed0: 20 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70   *pE1;.  Expr *p
1ee0: 45 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b  E2;.  Expr *pEq;
1ef0: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66  ..  assert( iLef
1f00: 74 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73  t<iRight );.  as
1f10: 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63  sert( pSrc->nSrc
1f20: 3e 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  >iRight );.  ass
1f30: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65  ert( pSrc->a[iLe
1f40: 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73  ft].pTab );.  as
1f50: 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52  sert( pSrc->a[iR
1f60: 69 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20  ight].pTab );.. 
1f70: 20 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72   pE1 = sqlite3Cr
1f80: 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64  eateColumnExpr(d
1f90: 62 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20  b, pSrc, iLeft, 
1fa0: 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32  iColLeft);.  pE2
1fb0: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
1fc0: 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70  ColumnExpr(db, p
1fd0: 53 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f  Src, iRight, iCo
1fe0: 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20  lRight);..  pEq 
1ff0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2000: 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45  Parse, TK_EQ, pE
2010: 31 2c 20 70 45 32 2c 20 30 29 3b 0a 20 20 69 66  1, pE2, 0);.  if
2020: 28 20 70 45 71 20 26 26 20 69 73 4f 75 74 65 72  ( pEq && isOuter
2030: 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78 70 72  Join ){.    Expr
2040: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 71 2c  SetProperty(pEq,
2050: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
2060: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2070: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
2080: 45 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  Eq, EP_TokenOnly
2090: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
20a0: 20 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64      ExprSetIrred
20b0: 75 63 69 62 6c 65 28 70 45 71 29 3b 0a 20 20 20  ucible(pEq);.   
20c0: 20 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e   pEq->iRightJoin
20d0: 54 61 62 6c 65 20 3d 20 28 69 31 36 29 70 45 32  Table = (i16)pE2
20e0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  ->iTable;.  }.  
20f0: 2a 70 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  *ppWhere = sqlit
2100: 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 2a 70  e3ExprAnd(db, *p
2110: 70 57 68 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a  pWhere, pEq);.}.
2120: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
2130: 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65  P_FromJoin prope
2140: 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  rty on all terms
2150: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
2160: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64  pression..** And
2170: 20 73 65 74 20 74 68 65 20 45 78 70 72 2e 69 52   set the Expr.iR
2180: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f  ightJoinTable to
2190: 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72   iTable for ever
21a0: 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a  y term in the.**
21b0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
21c0: 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f  ** The EP_FromJo
21d0: 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73 20 75  in property is u
21e0: 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20  sed on terms of 
21f0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  an expression to
2200: 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46   tell.** the LEF
2210: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f  T OUTER JOIN pro
2220: 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68  cessing logic th
2230: 61 74 20 74 68 69 73 20 74 65 72 6d 20 69 73 20  at this term is 
2240: 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a  part of the.** j
2250: 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20  oin restriction 
2260: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
2270: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
2280: 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61  use and not a pa
2290: 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72  rt.** of the mor
22a0: 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20  e general WHERE 
22b0: 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65 20 74  clause.  These t
22c0: 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f  erms are moved o
22d0: 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48  ver to the.** WH
22e0: 45 52 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e  ERE clause durin
22f0: 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e  g join processin
2300: 67 20 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f  g but we need to
2310: 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74   remember that t
2320: 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65  hey.** originate
2330: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
2340: 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  SING clause..**.
2350: 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52 69 67  ** The Expr.iRig
2360: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c  htJoinTable tell
2370: 73 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  s the WHERE clau
2380: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  se processing th
2390: 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  at the.** expres
23a0: 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20  sion depends on 
23b0: 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e  table iRightJoin
23c0: 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68  Table even if th
23d0: 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a  at table is not.
23e0: 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65  ** explicitly me
23f0: 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65  ntioned in the e
2400: 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74  xpression.  That
2410: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2420: 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61  needed.** for ca
2430: 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ses like this:.*
2440: 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
2450: 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
2460: 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
2470: 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a  .b AND t1.x=5.**
2480: 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c  .** The where cl
2490: 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65  ause needs to de
24a0: 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67  fer the handling
24b0: 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a   of the t1.x=5.*
24c0: 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74  * term until aft
24d0: 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f  er the t2 loop o
24e0: 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20  f the join.  In 
24f0: 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e  that way, a.** N
2500: 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20  ULL t2 row will 
2510: 62 65 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e  be inserted when
2520: 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49  ever t1.x!=5.  I
2530: 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64  f we do not.** d
2540: 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e  efer the handlin
2550: 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20  g of t1.x=5, it 
2560: 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65  will be processe
2570: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  d immediately.**
2580: 20 61 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f   after the t1 lo
2590: 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68  op and rows with
25a0: 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65   t1.x!=5 will ne
25b0: 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a  ver appear in.**
25c0: 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69   the output, whi
25d0: 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e  ch is incorrect.
25e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25f0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72  setJoinExpr(Expr
2600: 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29   *p, int iTable)
2610: 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  {.  while( p ){.
2620: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
2630: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
2640: 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  in);.    assert(
2650: 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
2660: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
2670: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2680: 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 49   );.    ExprSetI
2690: 72 72 65 64 75 63 69 62 6c 65 28 70 29 3b 0a 20  rreducible(p);. 
26a0: 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e     p->iRightJoin
26b0: 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61  Table = (i16)iTa
26c0: 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e  ble;.    setJoin
26d0: 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69  Expr(p->pLeft, i
26e0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20  Table);.    p = 
26f0: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a  p->pRight;.  } .
2700: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2710: 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20  utine processes 
2720: 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61  the join informa
2730: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
2740: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
2750: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
2760: 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74  uses are convert
2770: 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65  ed into extra te
2780: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
2790: 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55   clause..** NATU
27a0: 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63  RAL joins also c
27b0: 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52  reate extra WHER
27c0: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  E clause terms..
27d0: 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20  **.** The terms 
27e0: 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  of a FROM clause
27f0: 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
2800: 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72  n the Select.pSr
2810: 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  c structure..** 
2820: 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61  The left most ta
2830: 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73 74  ble is the first
2840: 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74   entry in Select
2850: 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67 68  .pSrc.  The righ
2860: 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20  t-most.** table 
2870: 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  is the last entr
2880: 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65  y.  The join ope
2890: 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e  rator is held in
28a0: 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a   the entry to.**
28b0: 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73   the left.  Thus
28c0: 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e   entry 0 contain
28d0: 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  s the join opera
28e0: 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e  tor for the join
28f0: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72   between.** entr
2900: 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e  ies 0 and 1.  An
2910: 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  y ON or USING cl
2920: 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65 64  auses associated
2930: 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61   with the join a
2940: 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63  re.** also attac
2950: 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20  hed to the left 
2960: 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  entry..**.** Thi
2970: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2980: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2990: 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
29a0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
29b0: 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  t sqliteProcessJ
29c0: 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  oin(Parse *pPars
29d0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
29e0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69   /* All tables i
2a10: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2a20: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  e */.  int i, j;
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2a50: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72  ounters */.  str
2a60: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2a70: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20   *pLeft;     /* 
2a80: 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67  Left table being
2a90: 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72   joined */.  str
2aa0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2ab0: 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20   *pRight;    /* 
2ac0: 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e  Right table bein
2ad0: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70  g joined */..  p
2ae0: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
2af0: 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e   pLeft = &pSrc->
2b00: 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d  a[0];.  pRight =
2b10: 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f   &pLeft[1];.  fo
2b20: 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
2b30: 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67  Src-1; i++, pRig
2b40: 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a  ht++, pLeft++){.
2b50: 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74      Table *pLeft
2b60: 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61  Tab = pLeft->pTa
2b70: 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52  b;.    Table *pR
2b80: 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68 74  ightTab = pRight
2b90: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20  ->pTab;.    int 
2ba0: 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66  isOuter;..    if
2bb0: 28 20 4e 45 56 45 52 28 70 4c 65 66 74 54 61 62  ( NEVER(pLeftTab
2bc0: 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62  ==0 || pRightTab
2bd0: 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ==0) ) continue;
2be0: 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28  .    isOuter = (
2bf0: 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65  pRight->jointype
2c00: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b   & JT_OUTER)!=0;
2c10: 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68  ..    /* When th
2c20: 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
2c30: 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64  d is present, ad
2c40: 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  d WHERE clause t
2c50: 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20  erms for.    ** 
2c60: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61  every column tha
2c70: 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  t the two tables
2c80: 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e   have in common.
2c90: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2ca0: 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65  pRight->jointype
2cb0: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b   & JT_NATURAL ){
2cc0: 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68  .      if( pRigh
2cd0: 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74  t->pOn || pRight
2ce0: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
2cf0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2d00: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e  Msg(pParse, "a N
2d10: 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20  ATURAL join may 
2d20: 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20 20  not have ".     
2d30: 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20        "an ON or 
2d40: 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30  USING clause", 0
2d50: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2d60: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
2d70: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52     for(j=0; j<pR
2d80: 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a  ightTab->nCol; j
2d90: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
2da0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e  r *zName;   /* N
2db0: 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  ame of column in
2dc0: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
2dd0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
2de0: 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d 61  iLeft;     /* Ma
2df0: 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61 62 6c  tching left tabl
2e00: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
2e10: 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d   iLeftCol;  /* M
2e20: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 69  atching column i
2e30: 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  n the left table
2e40: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61   */..        zNa
2e50: 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62 2d 3e  me = pRightTab->
2e60: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  aCol[j].zName;. 
2e70: 20 20 20 20 20 20 20 69 66 28 20 74 61 62 6c 65         if( table
2e80: 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
2e90: 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c  Src, i+1, zName,
2ea0: 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43   &iLeft, &iLeftC
2eb0: 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ol) ){.         
2ec0: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50   addWhereTerm(pP
2ed0: 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66  arse, pSrc, iLef
2ee0: 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31  t, iLeftCol, i+1
2ef0: 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , j,.           
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 75              isOu
2f10: 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29  ter, &p->pWhere)
2f20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2f30: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
2f40: 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20  * Disallow both 
2f50: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
2f60: 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65  uses in the same
2f70: 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20   join.    */.   
2f80: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e   if( pRight->pOn
2f90: 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69   && pRight->pUsi
2fa0: 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
2fb0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2fc0: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65  se, "cannot have
2fd0: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
2fe0: 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c  NG ".        "cl
2ff0: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
3000: 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20  e join");.      
3010: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
3020: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
3030: 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  ON clause to the
3040: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
3050: 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63  E clause, connec
3060: 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e  ted by.    ** an
3070: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
3080: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
3090: 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20  ight->pOn ){.   
30a0: 20 20 20 69 66 28 20 69 73 4f 75 74 65 72 20 29     if( isOuter )
30b0: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69   setJoinExpr(pRi
30c0: 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74  ght->pOn, pRight
30d0: 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
30e0: 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71    p->pWhere = sq
30f0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
3100: 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65  rse->db, p->pWhe
3110: 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29  re, pRight->pOn)
3120: 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e  ;.      pRight->
3130: 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  pOn = 0;.    }..
3140: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78      /* Create ex
3150: 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65  tra terms on the
3160: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f   WHERE clause fo
3170: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61  r each column na
3180: 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  med.    ** in th
3190: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20  e USING clause. 
31a0: 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65   Example: If the
31b0: 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62   two tables to b
31c0: 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20  e joined are .  
31d0: 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64    ** A and B and
31e0: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
31f0: 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e  e names X, Y, an
3200: 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68  d Z, then add th
3210: 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  is.    ** to the
3220: 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20   WHERE clause:  
3230: 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e    A.X=B.X AND A.
3240: 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e  Y=B.Y AND A.Z=B.
3250: 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20  Z.    ** Report 
3260: 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20  an error if any 
3270: 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64  column mentioned
3280: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
3290: 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e  ause is.    ** n
32a0: 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
32b0: 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62  both tables to b
32c0: 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f  e joined..    */
32d0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
32e0: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
32f0: 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d   IdList *pList =
3300: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b   pRight->pUsing;
3310: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
3320: 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b  j<pList->nId; j+
3330: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
3340: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20   *zName;     /* 
3350: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 72 6d  Name of the term
3360: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
3370: 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ause */.        
3380: 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 20  int iLeft;      
3390: 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68 65   /* Table on the
33a0: 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74 63 68   left with match
33b0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ing column name 
33c0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
33d0: 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20 43  LeftCol;    /* C
33e0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
33f0: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
3400: 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20  on the left */. 
3410: 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67 68         int iRigh
3420: 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d  tCol;   /* Colum
3430: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  n number of matc
3440: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74  hing column on t
3450: 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20 20  he right */..   
3460: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c 69       zName = pLi
3470: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[j].zName;.
3480: 20 20 20 20 20 20 20 20 69 52 69 67 68 74 43 6f          iRightCo
3490: 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  l = columnIndex(
34a0: 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65  pRightTab, zName
34b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
34c0: 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20 20  RightCol<0.     
34d0: 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e 64      || !tableAnd
34e0: 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63  ColumnIndex(pSrc
34f0: 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69  , i+1, zName, &i
3500: 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29  Left, &iLeftCol)
3510: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
3520: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
3530: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
3540: 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67  annot join using
3550: 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c   column %s - col
3560: 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20  umn ".          
3570: 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69    "not present i
3580: 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20  n both tables", 
3590: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
35a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
35b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64      }.        ad
35c0: 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73  dWhereTerm(pPars
35d0: 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20  e, pSrc, iLeft, 
35e0: 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 69  iLeftCol, i+1, i
35f0: 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20 20  RightCol,.      
3600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
3610: 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65  sOuter, &p->pWhe
3620: 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  re);.      }.   
3630: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3640: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  0;.}../*.** Inse
3650: 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76 22  rt code into "v"
3660: 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20   that will push 
3670: 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74 68  the record on th
3680: 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20  e top of the.** 
3690: 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 73  stack into the s
36a0: 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  orter..*/.static
36b0: 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f   void pushOntoSo
36c0: 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  rter(.  Parse *p
36d0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
36e0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
36f0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
3700: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f 2a 20  pOrderBy,    /* 
3710: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
3720: 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  use */.  Select 
3730: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  *pSelect,       
3740: 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c  /* The whole SEL
3750: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
3760: 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 20 20  .  int regData  
3770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
3780: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61  ister holding da
3790: 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  ta to be sorted 
37a0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
37b0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
37c0: 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70  .  int nExpr = p
37d0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
37e0: 20 20 69 6e 74 20 72 65 67 42 61 73 65 20 3d 20    int regBase = 
37f0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
3800: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70  nge(pParse, nExp
3810: 72 2b 32 29 3b 0a 20 20 69 6e 74 20 72 65 67 52  r+2);.  int regR
3820: 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
3830: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
3840: 29 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 73  );.  int op;.  s
3850: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
3860: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
3870: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
3880: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
3890: 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61 73  pOrderBy, regBas
38a0: 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  e, 0);.  sqlite3
38b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
38c0: 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72 64 65  _Sequence, pOrde
38d0: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  rBy->iECursor, r
38e0: 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20  egBase+nExpr);. 
38f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
3900: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  Move(pParse, reg
3910: 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45  Data, regBase+nE
3920: 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71 6c  xpr+1, 1);.  sql
3930: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
3940: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
3950: 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72 20   regBase, nExpr 
3960: 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  + 2, regRecord);
3970: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e  .  if( pSelect->
3980: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73  selFlags & SF_Us
3990: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f  eSorter ){.    o
39a0: 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  p = OP_SorterIns
39b0: 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ert;.  }else{.  
39c0: 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73    op = OP_IdxIns
39d0: 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ert;.  }.  sqlit
39e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
39f0: 6f 70 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  op, pOrderBy->iE
3a00: 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72  Cursor, regRecor
3a10: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  d);.  sqlite3Rel
3a20: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
3a30: 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
3a40: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
3a50: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
3a60: 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72  , regBase, nExpr
3a70: 2b 32 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 65  +2);.  if( pSele
3a80: 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20  ct->iLimit ){.  
3a90: 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64    int addr1, add
3aa0: 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d  r2;.    int iLim
3ab0: 69 74 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c  it;.    if( pSel
3ac0: 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a  ect->iOffset ){.
3ad0: 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70        iLimit = p
3ae0: 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b  Select->iOffset+
3af0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
3b00: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65      iLimit = pSe
3b10: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  lect->iLimit;.  
3b20: 20 20 7d 0a 20 20 20 20 61 64 64 72 31 20 3d 20    }.    addr1 = 
3b30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3b40: 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  1(v, OP_IfZero, 
3b50: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c  iLimit);.    sql
3b60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3b70: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c 69  , OP_AddImm, iLi
3b80: 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64  mit, -1);.    ad
3b90: 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
3ba0: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
3bb0: 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  to);.    sqlite3
3bc0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
3bd0: 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69  addr1);.    sqli
3be0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
3bf0: 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72   OP_Last, pOrder
3c00: 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  By->iECursor);. 
3c10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3c20: 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74  dOp1(v, OP_Delet
3c30: 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  e, pOrderBy->iEC
3c40: 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69  ursor);.    sqli
3c50: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
3c60: 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a 7d  v, addr2);.  }.}
3c70: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65  ../*.** Add code
3c80: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
3c90: 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74  e OFFSET.*/.stat
3ca0: 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73  ic void codeOffs
3cb0: 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  et(.  Vdbe *v,  
3cc0: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
3cd0: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
3ce0: 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63  is VM */.  Selec
3cf0: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  t *p,        /* 
3d00: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
3d10: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
3d20: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
3d30: 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  nue     /* Jump 
3d40: 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65  here to skip the
3d50: 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20   current record 
3d60: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69  */.){.  if( p->i
3d70: 4f 66 66 73 65 74 20 26 26 20 69 43 6f 6e 74 69  Offset && iConti
3d80: 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  nue!=0 ){.    in
3d90: 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c 69  t addr;.    sqli
3da0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3db0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69   OP_AddImm, p->i
3dc0: 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20  Offset, -1);.   
3dd0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
3de0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
3df0: 49 66 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73 65  IfNeg, p->iOffse
3e00: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
3e10: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3e20: 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e  Goto, 0, iContin
3e30: 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  ue);.    VdbeCom
3e40: 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20 4f  ment((v, "skip O
3e50: 46 46 53 45 54 20 72 65 63 6f 72 64 73 22 29 29  FFSET records"))
3e60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3e70: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
3e80: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
3e90: 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77   Add code that w
3ea0: 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ill check to mak
3eb0: 65 20 73 75 72 65 20 74 68 65 20 4e 20 72 65 67  e sure the N reg
3ec0: 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
3ed0: 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20  at iMem.** form 
3ee0: 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79  a distinct entry
3ef0: 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72  .  iTab is a sor
3f00: 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
3f10: 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79  holds previously
3f20: 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61  .** seen combina
3f30: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76  tions of the N v
3f40: 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e  alues.  A new en
3f50: 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69  try is made in i
3f60: 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75  Tab.** if the cu
3f70: 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61  rrent N values a
3f80: 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20  re new..**.** A 
3f90: 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65  jump to addrRepe
3fa0: 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74  at is made and t
3fb0: 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72  he N+1 values ar
3fc0: 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
3fd0: 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68  e.** stack if th
3fe0: 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73  e top N elements
3ff0: 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63   are not distinc
4000: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
4010: 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a  d codeDistinct(.
4020: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4030: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
4040: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
4050: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
4060: 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20   int iTab,      
4070: 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67      /* A sorting
4080: 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74   index used to t
4090: 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74  est for distinct
40a0: 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ness */.  int ad
40b0: 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20  drRepeat,    /* 
40c0: 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20  Jump to here if 
40d0: 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  not distinct */.
40e0: 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
40f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4100: 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  f elements */.  
4110: 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20  int iMem        
4120: 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d     /* First elem
4130: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ent */.){.  Vdbe
4140: 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a   *v;.  int r1;..
4150: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
4160: 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69  dbe;.  r1 = sqli
4170: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
4180: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
4190: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
41a0: 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c   OP_Found, iTab,
41b0: 20 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65   addrRepeat, iMe
41c0: 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  m, N);.  sqlite3
41d0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
41e0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65  _MakeRecord, iMe
41f0: 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c  m, N, r1);.  sql
4200: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4210: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
4220: 69 54 61 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c  iTab, r1);.  sql
4230: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
4240: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
4250: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
4260: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
4270: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
4280: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
4290: 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69 73  when a SELECT is
42a0: 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 73   used within a s
42b0: 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  ubexpression.** 
42c0: 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e  (example:  "a IN
42d0: 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
42e0: 74 61 62 6c 65 29 22 29 20 62 75 74 20 69 74 20  table)") but it 
42f0: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31 20  has more than 1 
4300: 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e  result.** column
4310: 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20 69 6e  .  We do this in
4320: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65   a subroutine be
4330: 63 61 75 73 65 20 74 68 65 20 65 72 72 6f 72 20  cause the error 
4340: 75 73 65 64 20 74 6f 20 6f 63 63 75 72 0a 2a 2a  used to occur.**
4350: 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61   in multiple pla
4360: 63 65 73 2e 20 20 28 54 68 65 20 65 72 72 6f 72  ces.  (The error
4370: 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 6e 20   only occurs in 
4380: 6f 6e 65 20 70 6c 61 63 65 20 6e 6f 77 2c 20 62  one place now, b
4390: 75 74 20 77 65 0a 2a 2a 20 72 65 74 61 69 6e 20  ut we.** retain 
43a0: 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  the subroutine t
43b0: 6f 20 6d 69 6e 69 6d 69 7a 65 20 63 6f 64 65 20  o minimize code 
43c0: 64 69 73 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f 0a  disruption.).*/.
43d0: 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
43e0: 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65  ForMultiColumnSe
43f0: 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61 72  lectError(.  Par
4400: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4410: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
4420: 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  xt. */.  SelectD
4430: 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a  est *pDest,   /*
4440: 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20   Destination of 
4450: 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a  SELECT results *
4460: 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20 20  /.  int nExpr   
4470: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4480: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
4490: 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
44a0: 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20   SELECT */.){.  
44b0: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
44c0: 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28 20  t->eDest;.  if( 
44d0: 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44 65 73  nExpr>1 && (eDes
44e0: 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44  t==SRT_Mem || eD
44f0: 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b  est==SRT_Set) ){
4500: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
4510: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e  rMsg(pParse, "on
4520: 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75  ly a single resu
4530: 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22  lt allowed for "
4540: 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43  .       "a SELEC
4550: 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  T that is part o
4560: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22  f an expression"
4570: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
4580: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
4590: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65  turn 0;.  }.}.#e
45a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
45b0: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
45c0: 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
45d0: 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68  the inside of th
45e0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
45f0: 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a  of a SELECT..**.
4600: 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61 6e 64  ** If srcTab and
4610: 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74   nColumn are bot
4620: 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  h zero, then the
4630: 20 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69   pEList expressi
4640: 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75  ons.** are evalu
4650: 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
4660: 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f   get the data fo
4670: 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20  r this row.  If 
4680: 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65  nColumn>0.** the
4690: 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64  n data is pulled
46a0: 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64   from srcTab and
46b0: 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64 20   pEList is used 
46c0: 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a  only to get the.
46d0: 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f 72  ** datatypes for
46e0: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f   each column..*/
46f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
4700: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20  ectInnerLoop(.  
4710: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4720: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
4730: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
4740: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
4750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
4760: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63  e complete selec
4770: 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  t statement bein
4780: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70  g coded */.  Exp
4790: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
47a0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
47b0: 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74  values being ext
47c0: 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racted */.  int 
47d0: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
47e0: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
47f0: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
4800: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
4810: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n,            /*
4820: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
4830: 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65  ns in the source
4840: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
4850: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
4860: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55      /* If not NU
4870: 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73  LL, sort results
4880: 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20   using this key 
4890: 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63  */.  int distinc
48a0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
48b0: 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72  If >=0, make sur
48c0: 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
48d0: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 53 65 6c 65  stinct */.  Sele
48e0: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
48f0: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69      /* How to di
4900: 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73  spose of the res
4910: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ults */.  int iC
4920: 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20  ontinue,        
4930: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
4940: 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
4950: 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  next row */.  in
4960: 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
4970: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4980: 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
4990: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
49a0: 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  p */.){.  Vdbe *
49b0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
49c0: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
49d0: 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20  t hasDistinct;  
49e0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
49f0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
4a00: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
4a10: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73   */.  int regRes
4a20: 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ult;            
4a30: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65    /* Start of me
4a40: 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73  mory holding res
4a50: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  ult set */.  int
4a60: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
4a70: 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20  eDest;   /* How 
4a80: 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65  to dispose of re
4a90: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
4aa0: 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 50  Parm = pDest->iP
4ab0: 61 72 6d 3b 20 20 20 2f 2a 20 46 69 72 73 74 20  arm;   /* First 
4ac0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70  argument to disp
4ad0: 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
4ae0: 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b   int nResultCol;
4af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4b00: 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  Number of result
4b10: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61   columns */..  a
4b20: 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 69 66  ssert( v );.  if
4b30: 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
4b40: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
4b50: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
4b60: 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 64   hasDistinct = d
4b70: 69 73 74 69 6e 63 74 3e 3d 30 3b 0a 20 20 69 66  istinct>=0;.  if
4b80: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ( pOrderBy==0 &&
4b90: 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b   !hasDistinct ){
4ba0: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
4bb0: 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29  v, p, iContinue)
4bc0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c  ;.  }..  /* Pull
4bd0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
4be0: 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  olumns..  */.  i
4bf0: 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a  f( nColumn>0 ){.
4c00: 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d      nResultCol =
4c10: 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73   nColumn;.  }els
4c20: 65 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f  e{.    nResultCo
4c30: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
4c40: 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65  r;.  }.  if( pDe
4c50: 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20  st->iMem==0 ){. 
4c60: 20 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d     pDest->iMem =
4c70: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
4c80: 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d  .    pDest->nMem
4c90: 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20   = nResultCol;. 
4ca0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
4cb0: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20  += nResultCol;. 
4cc0: 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61 73 73   }else{ .    ass
4cd0: 65 72 74 28 20 70 44 65 73 74 2d 3e 6e 4d 65 6d  ert( pDest->nMem
4ce0: 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a  ==nResultCol );.
4cf0: 20 20 7d 0a 20 20 72 65 67 52 65 73 75 6c 74 20    }.  regResult 
4d00: 3d 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3b 0a 20  = pDest->iMem;. 
4d10: 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29   if( nColumn>0 )
4d20: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
4d30: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
4d40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4d50: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
4d60: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c  lumn, srcTab, i,
4d70: 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20   regResult+i);. 
4d80: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
4d90: 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73   eDest!=SRT_Exis
4da0: 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ts ){.    /* If 
4db0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
4dc0: 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e  is an EXISTS(...
4dd0: 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  ) expression, th
4de0: 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20  e actual.    ** 
4df0: 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20  values returned 
4e00: 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72  by the SELECT ar
4e10: 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  e not required..
4e20: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
4e30: 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
4e40: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71  (pParse);.    sq
4e50: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
4e60: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
4e70: 4c 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74 2c  List, regResult,
4e80: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
4e90: 75 74 29 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c 75  ut);.  }.  nColu
4ea0: 6d 6e 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  mn = nResultCol;
4eb0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49  ..  /* If the DI
4ec0: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77  STINCT keyword w
4ed0: 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68  as present on th
4ee0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
4ef0: 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73  nt.  ** and this
4f00: 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65   row has been se
4f10: 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20  en before, then 
4f20: 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73  do not make this
4f30: 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f   row.  ** part o
4f40: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  f the result..  
4f50: 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74  */.  if( hasDist
4f60: 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65  inct ){.    asse
4f70: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
4f80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c  .    assert( pEL
4f90: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c  ist->nExpr==nCol
4fa0: 75 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65 44  umn );.    codeD
4fb0: 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
4fc0: 64 69 73 74 69 6e 63 74 2c 20 69 43 6f 6e 74 69  distinct, iConti
4fd0: 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65  nue, nColumn, re
4fe0: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 69 66  gResult);.    if
4ff0: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ( pOrderBy==0 ){
5000: 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65  .      codeOffse
5010: 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75  t(v, p, iContinu
5020: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
5030: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
5040: 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
5050: 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63   mode, write eac
5060: 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74  h query result t
5070: 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  o the key of the
5080: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a   temporary.    *
5090: 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  * table iParm.. 
50a0: 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
50b0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
50c0: 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61  ND_SELECT.    ca
50d0: 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a  se SRT_Union: {.
50e0: 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
50f0: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
5100: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
5110: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
5120: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5130: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
5140: 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e  gResult, nColumn
5150: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
5160: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5170: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
5180: 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20  iParm, r1);.    
5190: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
51a0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
51b0: 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
51c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
51d0: 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f  Construct a reco
51e0: 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72  rd from the quer
51f0: 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e  y result, but in
5200: 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20  stead of.    ** 
5210: 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f  saving that reco
5220: 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20  rd, use it as a 
5230: 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c  key to delete el
5240: 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20  ements from.    
5250: 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ** the temporary
5260: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
5270: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
5280: 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20  T_Except: {.    
5290: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
52a0: 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c  Op3(v, OP_IdxDel
52b0: 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ete, iParm, regR
52c0: 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  esult, nColumn);
52d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
52e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
52f0: 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
5300: 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
5310: 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
5320: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
5330: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
5340: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
5350: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
5360: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
5370: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
5380: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
5390: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
53a0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
53b0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
53c0: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73  emTab );.      s
53d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
53e0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
53f0: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43  d, regResult, nC
5400: 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20  olumn, r1);.    
5410: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
5420: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
5430: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
5440: 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31   pOrderBy, p, r1
5450: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
5460: 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d          int r2 =
5470: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
5480: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
5490: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
54a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
54b0: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29  owid, iParm, r2)
54c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
54d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
54e0: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
54f0: 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20   r1, r2);.      
5500: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
5510: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
5520: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20  APPEND);.       
5530: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5540: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5550: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
5560: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
5570: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5580: 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
5590: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
55a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
55b0: 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
55c0: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
55d0: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
55e0: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
55f0: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
5600: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
5610: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
5620: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
5630: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
5640: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
5650: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
5660: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
5670: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
5680: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
5690: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
56a0: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
56b0: 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  p->affinity = sq
56c0: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
56d0: 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30  nity(pEList->a[0
56e0: 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e  ].pExpr, pDest->
56f0: 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20  affinity);.     
5700: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
5710: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66  .        /* At f
5720: 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20  irst glance you 
5730: 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63  would think we c
5740: 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75  ould optimize ou
5750: 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  t the.        **
5760: 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68 69   ORDER BY in thi
5770: 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68 65  s case since the
5780: 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65   order of entrie
5790: 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20  s in the set.   
57a0: 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74       ** does not
57b0: 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74 68   matter.  But th
57c0: 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c  ere might be a L
57d0: 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20  IMIT clause, in 
57e0: 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a  which.        **
57f0: 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72 20   case the order 
5800: 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20  does matter */. 
5810: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
5820: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
5830: 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65  rderBy, p, regRe
5840: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  sult);.      }el
5850: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
5860: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
5870: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
5880: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5890: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
58a0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
58b0: 65 73 75 6c 74 2c 20 31 2c 20 72 31 2c 20 26 70  esult, 1, r1, &p
58c0: 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a  ->affinity, 1);.
58d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
58e0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
58f0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
5900: 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20  egResult, 1);.  
5910: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5920: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
5930: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
5940: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r1);.        sql
5950: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
5960: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
5970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5980: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
5990: 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78  /* If any row ex
59a0: 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ist in the resul
59b0: 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68  t set, record th
59c0: 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72  at fact and abor
59d0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
59e0: 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b  se SRT_Exists: {
59f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5a00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
5a10: 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d  nteger, 1, iParm
5a20: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
5a30: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
5a40: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
5a50: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
5a60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5a70: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
5a80: 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
5a90: 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
5aa0: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
5ab0: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
5ac0: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
5ad0: 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
5ae0: 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
5af0: 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20   and break out. 
5b00: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61     ** of the sca
5b10: 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
5b20: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
5b30: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
5b40: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
5b50: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
5b60: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
5b70: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
5b80: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c  se, pOrderBy, p,
5b90: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
5ba0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5bb0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
5bc0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
5bd0: 67 52 65 73 75 6c 74 2c 20 69 50 61 72 6d 2c 20  gResult, iParm, 
5be0: 31 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  1);.        /* T
5bf0: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
5c00: 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
5c10: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
5c20: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
5c30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
5c40: 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
5c50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
5c60: 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a  QUERY */..    /*
5c70: 20 53 65 6e 64 20 74 68 65 20 64 61 74 61 20 74   Send the data t
5c80: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  o the callback f
5c90: 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20  unction or to a 
5ca0: 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20  subroutine.  In 
5cb0: 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  the.    ** case 
5cc0: 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2c  of a subroutine,
5cd0: 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
5ce0: 69 74 73 65 6c 66 20 69 73 20 72 65 73 70 6f 6e  itself is respon
5cf0: 73 69 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a  sible for.    **
5d00: 20 70 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74   popping the dat
5d10: 61 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  a from the stack
5d20: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
5d30: 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
5d40: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75  .    case SRT_Ou
5d50: 74 70 75 74 3a 20 7b 0a 20 20 20 20 20 20 74 65  tput: {.      te
5d60: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
5d70: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a  RT_Coroutine );.
5d80: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
5d90: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
5da0: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
5db0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
5dc0: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
5dd0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
5de0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
5df0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5e00: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
5e10: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43  d, regResult, nC
5e20: 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20  olumn, r1);.    
5e30: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
5e40: 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  er(pParse, pOrde
5e50: 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20  rBy, p, r1);.   
5e60: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
5e70: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5e80: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65  e, r1);.      }e
5e90: 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53  lse if( eDest==S
5ea0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
5eb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5ec0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
5ed0: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50  Yield, pDest->iP
5ee0: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  arm);.      }els
5ef0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
5f00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5f10: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65  OP_ResultRow, re
5f20: 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e  gResult, nColumn
5f30: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5f40: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
5f50: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
5f60: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
5f70: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lumn);.      }. 
5f80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5f90: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
5fa0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
5fb0: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
5fc0: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
5fd0: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
5fe0: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
5ff0: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
6000: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
6010: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
6020: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
6030: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
6040: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
6050: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
6060: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
6070: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
6080: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
6090: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
60a0: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
60b0: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
60c0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
60d0: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
60e0: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
60f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6100: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
6110: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
6120: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
6130: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
6140: 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70   reached.  Excep
6150: 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65  t, if.  ** there
6160: 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e   is a sorter, in
6170: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
6180: 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61  sorter has alrea
6190: 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20  dy limited.  ** 
61a0: 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75  the output for u
61b0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  s..  */.  if( pO
61c0: 72 64 65 72 42 79 3d 3d 30 20 26 26 20 70 2d 3e  rderBy==0 && p->
61d0: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  iLimit ){.    sq
61e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
61f0: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
6200: 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c  >iLimit, iBreak,
6210: 20 2d 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   -1);.  }.}../*.
6220: 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72  ** Given an expr
6230: 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e  ession list, gen
6240: 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  erate a KeyInfo 
6250: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
6260: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f  ecords.** the co
6270: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
6280: 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   for each expres
6290: 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70  sion in that exp
62a0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
62b0: 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c  .** If the ExprL
62c0: 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ist is an ORDER 
62d0: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
62e0: 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72  lause then the r
62f0: 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49  esulting.** KeyI
6300: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
6310: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
6320: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
6330: 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
6340: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  .** implement th
6350: 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74  at clause.  If t
6360: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74  he ExprList is t
6370: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
6380: 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65   a SELECT.** the
6390: 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  n the KeyInfo st
63a0: 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f  ructure is appro
63b0: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69  priate for initi
63c0: 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61  alizing a virtua
63d0: 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d  l.** index to im
63e0: 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e  plement a DISTIN
63f0: 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53  CT test..**.** S
6400: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
6410: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
6420: 72 65 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f  re is obtain fro
6430: 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63  m malloc.  The c
6440: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
6450: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
6460: 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61  e for seeing tha
6470: 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
6480: 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
6490: 2a 20 66 72 65 65 64 2e 20 20 41 64 64 20 74 68  * freed.  Add th
64a0: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
64b0: 75 72 65 20 74 6f 20 74 68 65 20 50 34 20 66 69  ure to the P4 fi
64c0: 65 6c 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65  eld of an opcode
64d0: 20 75 73 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59   using.** P4_KEY
64e0: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20  INFO_HANDOFF is 
64f0: 74 68 65 20 75 73 75 61 6c 20 77 61 79 20 6f 66  the usual way of
6500: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68   dealing with th
6510: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65  is..*/.static Ke
6520: 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72  yInfo *keyInfoFr
6530: 6f 6d 45 78 70 72 4c 69 73 74 28 50 61 72 73 65  omExprList(Parse
6540: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
6550: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71  st *pList){.  sq
6560: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
6570: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45  se->db;.  int nE
6580: 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  xpr;.  KeyInfo *
6590: 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  pInfo;.  struct 
65a0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
65b0: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Item;.  int i;..
65c0: 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d    nExpr = pList-
65d0: 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20  >nExpr;.  pInfo 
65e0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
65f0: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
6600: 28 2a 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72  (*pInfo) + nExpr
6610: 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
6620: 2a 29 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70  *)+1) );.  if( p
6630: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66  Info ){.    pInf
6640: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  o->aSortOrder = 
6650: 28 75 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f  (u8*)&pInfo->aCo
6660: 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70  ll[nExpr];.    p
6670: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 28  Info->nField = (
6680: 75 31 36 29 6e 45 78 70 72 3b 0a 20 20 20 20 70  u16)nExpr;.    p
6690: 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  Info->enc = ENC(
66a0: 64 62 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  db);.    pInfo->
66b0: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 66 6f 72  db = db;.    for
66c0: 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (i=0, pItem=pLis
66d0: 74 2d 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69  t->a; i<nExpr; i
66e0: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
66f0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
6700: 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20  ll;.      pColl 
6710: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
6720: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
6730: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
6740: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
6750: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
6760: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
6770: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
6780: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  fo->aColl[i] = p
6790: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66  Coll;.      pInf
67a0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
67b0: 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72   = pItem->sortOr
67c0: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  der;.    }.  }. 
67d0: 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d   return pInfo;.}
67e0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
67f0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
6800: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  ELECT./*.** Name
6810: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
6820: 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65  on operator, use
6830: 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  d for error mess
6840: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
6850: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65  const char *sele
6860: 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29  ctOpName(int id)
6870: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  {.  char *z;.  s
6880: 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20  witch( id ){.   
6890: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
68a0: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41      z = "UNION A
68b0: 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  LL";   break;.  
68c0: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
68d0: 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53  ECT: z = "INTERS
68e0: 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ECT";   break;. 
68f0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
6900: 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50  T:    z = "EXCEP
6910: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
6920: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
6930: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
6940: 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  N";       break;
6950: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
6960: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
6970: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
6980: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66  D_SELECT */..#if
6990: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
69a0: 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55  _EXPLAIN./*.** U
69b0: 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49  nless an "EXPLAI
69c0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f  N QUERY PLAN" co
69d0: 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70  mmand is being p
69e0: 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66  rocessed, this f
69f0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20  unction.** is a 
6a00: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
6a10: 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67  , it adds a sing
6a20: 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  le row of output
6a30: 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75   to the EQP resu
6a40: 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65  lt,.** where the
6a50: 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74   caption is of t
6a60: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
6a70: 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   "USE TEMP B-TRE
6a80: 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a  E FOR xxx".**.**
6a90: 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e   where xxx is on
6aa0: 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c  e of "DISTINCT",
6ab0: 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22   "ORDER BY" or "
6ac0: 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74  GROUP BY". Exact
6ad0: 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ly which.** is d
6ae0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
6af0: 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74   zUsage argument
6b00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6b10: 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
6b20: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
6b30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73   const char *zUs
6b40: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72  age){.  if( pPar
6b50: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
6b60: 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
6b70: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
6b80: 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
6b90: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
6ba0: 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20  Parse->db, "USE 
6bb0: 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20  TEMP B-TREE FOR 
6bc0: 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20  %s", zUsage);.  
6bd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6be0: 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
6bf0: 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
6c00: 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67  ctId, 0, 0, zMsg
6c10: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
6c20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69   }.}../*.** Assi
6c30: 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20  gn expression b 
6c40: 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73  to lvalue a. A s
6c50: 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65  econd, no-op, ve
6c60: 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61  rsion of this ma
6c70: 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64  cro.** is provid
6c80: 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f  ed when SQLITE_O
6c90: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64  MIT_EXPLAIN is d
6ca0: 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c  efined. This all
6cb0: 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20  ows the code.** 
6cc0: 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  in sqlite3Select
6cd0: 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c  () to assign val
6ce0: 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72 65  ues to structure
6cf0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
6d00: 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65  s that.** only e
6d10: 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f  xist if SQLITE_O
6d20: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e  MIT_EXPLAIN is n
6d30: 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f  ot defined witho
6d40: 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65  ut polluting the
6d50: 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69  .** code with #i
6d60: 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65 73  fndef directives
6d70: 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  ..*/.# define ex
6d80: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
6d90: 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c  a, b) a = b..#el
6da0: 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73  se./* No-op vers
6db0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c  ions of the expl
6dc0: 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f  ainXXX() functio
6dd0: 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a  ns and macros. *
6de0: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
6df0: 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29  inTempTable(y,z)
6e00: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
6e10: 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29  nSetInteger(y,z)
6e20: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
6e30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6e40: 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64  T_EXPLAIN) && !d
6e50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6e60: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
6e70: 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  CT)./*.** Unless
6e80: 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45   an "EXPLAIN QUE
6e90: 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64  RY PLAN" command
6ea0: 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73   is being proces
6eb0: 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  sed, this functi
6ec0: 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  on.** is a no-op
6ed0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
6ee0: 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  adds a single ro
6ef0: 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74  w of output to t
6f00: 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a  he EQP result,.*
6f10: 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74  * where the capt
6f20: 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66  ion is of one of
6f30: 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a   the two forms:.
6f40: 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49  **.**   "COMPOSI
6f50: 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53  TE SUBQUERIES iS
6f60: 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f  ub1 and iSub2 (o
6f70: 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  p)".**   "COMPOS
6f80: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
6f90: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 55  Sub1 and iSub2 U
6fa0: 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45  SING TEMP B-TREE
6fb0: 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65   (op)".**.** whe
6fc0: 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53 75  re iSub1 and iSu
6fd0: 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65 67  b2 are the integ
6fe0: 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74 68  ers passed as th
6ff0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
7000: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61  ** function para
7010: 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69  meters, and op i
7020: 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65  s the text repre
7030: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
7040: 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66   parameter.** of
7050: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
7060: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f  The parameter "o
7070: 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  p" must be one o
7080: 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  f TK_UNION, TK_E
7090: 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54  XCEPT,.** TK_INT
70a0: 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c  ERSECT or TK_ALL
70b0: 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  . The first form
70c0: 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67 75   is used if argu
70d0: 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20  ment bUseTmp is 
70e0: 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68  .** false, or th
70f0: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66  e second form if
7100: 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a   it is true..*/.
7110: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
7120: 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20  ainComposite(.  
7130: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7150: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
7160: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7180: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
7190: 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
71a0: 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e  EPT etc. */.  in
71b0: 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20 20  t iSub1,        
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
71d0: 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20 2a   Subquery id 1 *
71e0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20  /.  int iSub2,  
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7200: 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20      /* Subquery 
7210: 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55  id 2 */.  int bU
7220: 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20 20  seTmp           
7230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7240: 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c  e if a temp tabl
7250: 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b  e was used */.){
7260: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
7270: 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54  K_UNION || op==T
7280: 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d  K_EXCEPT || op==
7290: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20  TK_INTERSECT || 
72a0: 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20  op==TK_ALL );.  
72b0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
72c0: 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64  ain==2 ){.    Vd
72d0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
72e0: 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20  pVdbe;.    char 
72f0: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
7300: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
7310: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d  pParse->db, "COM
7320: 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45 53  POUND SUBQUERIES
7330: 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25 73   %d AND %d %s(%s
7340: 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  )", iSub1, iSub2
7350: 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54 6d  ,.        bUseTm
7360: 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  p?"USING TEMP B-
7370: 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63  TREE ":"", selec
7380: 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20  tOpName(op).    
7390: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
73a0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
73b0: 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
73c0: 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
73d0: 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
73e0: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  C);.  }.}.#else.
73f0: 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e  /* No-op version
7400: 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e  s of the explain
7410: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  XXX() functions 
7420: 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23  and macros. */.#
7430: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43   define explainC
7440: 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79  omposite(v,w,x,y
7450: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,z).#endif../*.*
7460: 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  * If the inner l
7470: 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65  oop was generate
7480: 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75  d using a non-nu
7490: 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75  ll pOrderBy argu
74a0: 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ment,.** then th
74b0: 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70  e results were p
74c0: 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65  laced in a sorte
74d0: 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f  r.  After the lo
74e0: 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  op is terminated
74f0: 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72  .** we need to r
7500: 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e  un the sorter an
7510: 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73  d output the res
7520: 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ults.  The follo
7530: 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  wing.** routine 
7540: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
7550: 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20  de needed to do 
7560: 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  that..*/.static 
7570: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72  void generateSor
7580: 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a  tTail(.  Parse *
7590: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
75a0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
75b0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
75c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
75d0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
75e0: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
75f0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
7600: 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56  code into this V
7610: 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  DBE */.  int nCo
7620: 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75  lumn,      /* Nu
7630: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
7640: 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  of data */.  Sel
7650: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f  ectDest *pDest /
7660: 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74  * Write the sort
7670: 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ed results here 
7680: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  */.){.  int addr
7690: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
76a0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
76b0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
76c0: 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a  e to exit loop *
76d0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
76e0: 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
76f0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
7700: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f   /* Jump here fo
7710: 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a  r next cycle */.
7720: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e    int addr;.  in
7730: 74 20 69 54 61 62 3b 0a 20 20 69 6e 74 20 70 73  t iTab;.  int ps
7740: 65 75 64 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45  eudoTab = 0;.  E
7750: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
7760: 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
7770: 0a 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  ..  int eDest = 
7780: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20  pDest->eDest;.  
7790: 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73  int iParm = pDes
77a0: 74 2d 3e 69 50 61 72 6d 3b 0a 0a 20 20 69 6e 74  t->iParm;..  int
77b0: 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72   regRow;.  int r
77c0: 65 67 52 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62  egRowid;..  iTab
77d0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43   = pOrderBy->iEC
77e0: 75 72 73 6f 72 3b 0a 20 20 72 65 67 52 6f 77 20  ursor;.  regRow 
77f0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
7800: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
7810: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
7820: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
7830: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
7840: 20 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20      pseudoTab = 
7850: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
7860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7870: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
7880: 50 73 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61  Pseudo, pseudoTa
7890: 62 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75  b, regRow, nColu
78a0: 6d 6e 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 69  mn);.    regRowi
78b0: 64 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 0;.  }else{.
78c0: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73      regRowid = s
78d0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
78e0: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20  (pParse);.  }.  
78f0: 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
7900: 26 20 53 46 5f 55 73 65 53 6f 72 74 65 72 20 29  & SF_UseSorter )
7910: 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f 72  {.    int regSor
7920: 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tOut = ++pParse-
7930: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 70  >nMem;.    int p
7940: 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
7950: 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Tab++;.    sqlit
7960: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7970: 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70  OP_OpenPseudo, p
7980: 74 61 62 32 2c 20 72 65 67 53 6f 72 74 4f 75 74  tab2, regSortOut
7990: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
79a0: 72 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  r+2);.    addr =
79b0: 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
79c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
79d0: 74 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  terSort, iTab, a
79e0: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 63  ddrBreak);.    c
79f0: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
7a00: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
7a10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7a20: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
7a30: 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65 67  rData, iTab, reg
7a40: 53 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 73 71  SortOut);.    sq
7a50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7a60: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 74  v, OP_Column, pt
7a70: 61 62 32 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  ab2, pOrderBy->n
7a80: 45 78 70 72 2b 31 2c 20 72 65 67 52 6f 77 29 3b  Expr+1, regRow);
7a90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7aa0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
7ab0: 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a  AG_CLEARCACHE);.
7ac0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
7ad0: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
7ae0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7af0: 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Sort, iTab, addr
7b00: 42 72 65 61 6b 29 3b 0a 20 20 20 20 63 6f 64 65  Break);.    code
7b10: 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 61 64 64  Offset(v, p, add
7b20: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  rContinue);.    
7b30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7b40: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
7b50: 69 54 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e  iTab, pOrderBy->
7b60: 6e 45 78 70 72 2b 31 2c 20 72 65 67 52 6f 77 29  nExpr+1, regRow)
7b70: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
7b80: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73  eDest ){.    cas
7b90: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
7ba0: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
7bb0: 61 62 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  ab: {.      test
7bc0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
7bd0: 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  _Table );.      
7be0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
7bf0: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b  =SRT_EphemTab );
7c00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7c10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
7c20: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
7c30: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
7c40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7c50: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
7c60: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20   iParm, regRow, 
7c70: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
7c80: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7c90: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
7ca0: 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72  PPEND);.      br
7cb0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
7cc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
7cd0: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
7ce0: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
7cf0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
7d00: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
7d10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
7d20: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
7d30: 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67  , regRow, 1, reg
7d40: 52 6f 77 69 64 2c 20 26 70 2d 3e 61 66 66 69 6e  Rowid, &p->affin
7d50: 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  ity, 1);.      s
7d60: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
7d70: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
7d80: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31 29  arse, regRow, 1)
7d90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7da0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7db0: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
7dc0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
7dd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7de0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
7df0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
7e00: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
7e10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
7e20: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
7e30: 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c  , regRow, iParm,
7e40: 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68   1);.      /* Th
7e50: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
7e60: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
7e70: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
7e80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7e90: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
7ea0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
7eb0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 61 73 73  int i;.      ass
7ec0: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
7ed0: 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d  Output || eDest=
7ee0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
7ef0: 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ; .      testcas
7f00: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  e( eDest==SRT_Ou
7f10: 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65  tput );.      te
7f20: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
7f30: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a  RT_Coroutine );.
7f40: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
7f50: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
7f60: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7f70: 72 65 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e 69  regRow!=pDest->i
7f80: 4d 65 6d 2b 69 20 29 3b 0a 20 20 20 20 20 20 20  Mem+i );.       
7f90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7fa0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
7fb0: 20 70 73 65 75 64 6f 54 61 62 2c 20 69 2c 20 70   pseudoTab, i, p
7fc0: 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 29 3b 0a 20  Dest->iMem+i);. 
7fd0: 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20         if( i==0 
7fe0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
7ff0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
8000: 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52  (v, OPFLAG_CLEAR
8010: 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20 20  CACHE);.        
8020: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
8030: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
8040: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
8050: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8060: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
8070: 6f 77 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c  ow, pDest->iMem,
8080: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
8090: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
80a0: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
80b0: 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d  e(pParse, pDest-
80c0: 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  >iMem, nColumn);
80d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
80e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
80f0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
8100: 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50 61 72  eld, pDest->iPar
8110: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
8120: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8130: 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
8140: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
8150: 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73 71  e, regRow);.  sq
8160: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
8170: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
8180: 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  owid);..  /* The
8190: 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c   bottom of the l
81a0: 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
81b0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
81c0: 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e  el(v, addrContin
81d0: 75 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65  ue);.  if( p->se
81e0: 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 53  lFlags & SF_UseS
81f0: 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  orter ){.    sql
8200: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8210: 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
8220: 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20   iTab, addr);.  
8230: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
8240: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8250: 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
8260: 64 64 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ddr);.  }.  sqli
8270: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
8280: 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
8290: 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  );.  if( eDest==
82a0: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
82b0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
82c0: 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ne ){.    sqlite
82d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
82e0: 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f 54  P_Close, pseudoT
82f0: 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ab, 0);.  }.}../
8300: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
8310: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
8320: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  g containing the
8330: 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79   'declaration ty
8340: 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78  pe' of the.** ex
8350: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
8360: 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62  The string may b
8370: 65 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61  e treated as sta
8380: 74 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65  tic by the calle
8390: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63  r..**.** The dec
83a0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73  laration type is
83b0: 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74   the exact datat
83c0: 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65  ype definition e
83d0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
83e0: 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52  e.** original CR
83f0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
8400: 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72  ment if the expr
8410: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
8420: 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61  mn. The.** decla
8430: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
8440: 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73  a ROWID field is
8450: 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c   INTEGER. Exactl
8460: 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73  y when an expres
8470: 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  sion.** is consi
8480: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63  dered a column c
8490: 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e  an be complex in
84a0: 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
84b0: 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65   subqueries. The
84c0: 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65  .** result-set e
84d0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c  xpression in all
84e0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
84f0: 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  g SELECT stateme
8500: 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69  nts is .** consi
8510: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62  dered a column b
8520: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
8530: 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
8540: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
8550: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
8560: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
8570: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
8580: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
8590: 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61  );.**   SELECT a
85a0: 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  bc FROM (SELECT 
85b0: 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20  col AS abc FROM 
85c0: 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65  tbl);.** .** The
85d0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
85e0: 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73  e for any expres
85f0: 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  sion other than 
8600: 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c  a column is NULL
8610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
8620: 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79  t char *columnTy
8630: 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  pe(.  NameContex
8640: 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20  t *pNC, .  Expr 
8650: 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20  *pExpr,.  const 
8660: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 44  char **pzOriginD
8670: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
8680: 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a 20  **pzOriginTab,. 
8690: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
86a0: 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63  OriginCol.){.  c
86b0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65  har const *zType
86c0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
86d0: 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d 20  st *zOriginDb = 
86e0: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
86f0: 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 30 3b  *zOriginTab = 0;
8700: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
8710: 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20  OriginCol = 0;. 
8720: 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 4e 45   int j;.  if( NE
8730: 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 7c 7c  VER(pExpr==0) ||
8740: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d   pNC->pSrcList==
8750: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
8760: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
8770: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
8780: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
8790: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
87a0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
87b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
87c0: 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20   column. Locate 
87d0: 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f  the table the co
87e0: 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20  lumn is being.  
87f0: 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64      ** extracted
8800: 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e   from in NameCon
8810: 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54  text.pSrcList. T
8820: 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65  his table may be
8830: 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64   real.      ** d
8840: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
8850: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20   a subquery..   
8860: 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
8870: 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
8880: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
8890: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d   structure colum
88a0: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
88b0: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  rom */.      Sel
88c0: 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20  ect *pS = 0;    
88d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
88e0: 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  ct the column is
88f0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
8900: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  */.      int iCo
8910: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
8920: 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66  mn;  /* Index of
8930: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20   column in pTab 
8940: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
8950: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
8960: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
8970: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
8980: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
8990: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77 68 69  UMN );.      whi
89a0: 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62  le( pNC && !pTab
89b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c   ){.        SrcL
89c0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
89d0: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
89e0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a         for(j=0;j
89f0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
8a00: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
8a10: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72  ].iCursor!=pExpr
8a20: 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20  ->iTable;j++);. 
8a30: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61         if( j<pTa
8a40: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20  bList->nSrc ){. 
8a50: 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20           pTab = 
8a60: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
8a70: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
8a80: 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  S = pTabList->a[
8a90: 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  j].pSelect;.    
8aa0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8ab0: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
8ac0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
8ad0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
8ae0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
8af0: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65         /* At one
8b00: 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68   time, code such
8b10: 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e   as "SELECT new.
8b20: 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  x" within a trig
8b30: 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20  ger would.      
8b40: 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20    ** cause this 
8b50: 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e  condition to run
8b60: 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77  .  Since then, w
8b70: 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75  e have restructu
8b80: 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20  red how.        
8b90: 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20  ** trigger code 
8ba0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64  is generated and
8bb0: 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69   so this conditi
8bc0: 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  on is no longer 
8bd0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
8be0: 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  ible. However, i
8bf0: 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74  t can still be t
8c00: 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e  rue for statemen
8c10: 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20  ts like.        
8c20: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
8c30: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
8c40: 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
8c50: 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e   TABLE t1(col IN
8c60: 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20  TEGER);.        
8c70: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
8c80: 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d  ECT t1.col) FROM
8c90: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
8ca0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
8cb0: 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  when columnType(
8cc0: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
8cd0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74  he expression "t
8ce0: 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20  1.col" in the . 
8cf0: 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65         ** sub-se
8d00: 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61  lect. In this ca
8d10: 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75  se, set the colu
8d20: 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c  mn type to NULL,
8d30: 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   even.        **
8d40: 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c   though it shoul
8d50: 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54  d really be "INT
8d60: 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a  EGER"..        *
8d70: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
8d80: 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  s is not a probl
8d90: 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  em, as the colum
8da0: 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f  n type of "t1.co
8db0: 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20  l" is never.    
8dc0: 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65      ** used. Whe
8dd0: 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69  n columnType() i
8de0: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
8df0: 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20  expression .    
8e00: 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20      ** "(SELECT 
8e10: 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f  t1.col)", the co
8e20: 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65  rrect type is re
8e30: 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20  turned (see the 
8e40: 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20  TK_SELECT.      
8e50: 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f    ** branch belo
8e60: 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  w.  */.        b
8e70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
8e80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
8e90: 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62  b && pExpr->pTab
8ea0: 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ==pTab );.      
8eb0: 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20  if( pS ){.      
8ec0: 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22    /* The "table"
8ed0: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73   is actually a s
8ee0: 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76  ub-select or a v
8ef0: 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  iew in the FROM 
8f00: 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a  clause.        *
8f10: 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  * of the SELECT 
8f20: 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72  statement. Retur
8f30: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
8f40: 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69  n type and origi
8f50: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  n.        ** dat
8f60: 61 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  a for the result
8f70: 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  -set column of t
8f80: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20  he sub-select.. 
8f90: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
8fa0: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
8fb0: 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53 2d   ALWAYS(iCol<pS-
8fc0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  >pEList->nExpr) 
8fd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
8fe0: 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20  If iCol is less 
8ff0: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
9000: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
9010: 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20  equests the.    
9020: 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f        ** rowid o
9030: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
9040: 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65   or view. This e
9050: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67  xpression is leg
9060: 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20  al (see .       
9070: 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20     ** test case 
9080: 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20  misc2.2.2) - it 
9090: 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73  always evaluates
90a0: 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20   to NULL..      
90b0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
90c0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
90d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  ;.          Expr
90e0: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
90f0: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b  ->a[iCol].pExpr;
9100: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
9110: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
9120: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  rc;.          sN
9130: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
9140: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61           sNC.pPa
9150: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
9160: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e;.          zTy
9170: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
9180: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69  &sNC, p, &zOrigi
9190: 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62  nDb, &zOriginTab
91a0: 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20  , &zOriginCol); 
91b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
91c0: 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
91d0: 53 28 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  S(pTab->pSchema)
91e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
91f0: 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20   real table */. 
9200: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
9210: 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pS );.        if
9220: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
9230: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
9240: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
9250: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
9260: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
9270: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
9280: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
9290: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
92a0: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
92b0: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43          zOriginC
92c0: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
92d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
92e0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70         zType = p
92f0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
9300: 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20  zType;.         
9310: 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 70 54   zOriginCol = pT
9320: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
9330: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Name;.        }.
9340: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 54          zOriginT
9350: 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ab = pTab->zName
9360: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
9370: 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20  C->pParse ){.   
9380: 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d         int iDb =
9390: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
93a0: 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73  Index(pNC->pPars
93b0: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
93c0: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20  hema);.         
93d0: 20 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70 4e 43   zOriginDb = pNC
93e0: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  ->pParse->db->aD
93f0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
9400: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9410: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9420: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
9430: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
9440: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
9450: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
9460: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
9470: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52   a sub-select. R
9480: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
9490: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20  ation type and. 
94a0: 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69       ** origin i
94b0: 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67  nfo for the sing
94c0: 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  le column in the
94d0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
94e0: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20  he SELECT.      
94f0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ** statement..  
9500: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d      */.      Nam
9510: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
9520: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
9530: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
9540: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
9550: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
9560: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
9570: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
9580: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
9590: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
95a0: 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  .      sNC.pSrcL
95b0: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
95c0: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
95d0: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43  = pNC;.      sNC
95e0: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
95f0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79  Parse;.      zTy
9600: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
9610: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69  &sNC, p, &zOrigi
9620: 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62  nDb, &zOriginTab
9630: 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20  , &zOriginCol); 
9640: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9650: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
9660: 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69 6e   .  if( pzOrigin
9670: 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Db ){.    assert
9680: 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26 26  ( pzOriginTab &&
9690: 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b 0a   pzOriginCol );.
96a0: 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62 20      *pzOriginDb 
96b0: 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20 20  = zOriginDb;.   
96c0: 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20   *pzOriginTab = 
96d0: 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20 20  zOriginTab;.    
96e0: 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 7a  *pzOriginCol = z
96f0: 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20  OriginCol;.  }. 
9700: 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d   return zType;.}
9710: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
9720: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
9730: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
9740: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
9750: 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  pes of columns.*
9760: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
9770: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  set..*/.static v
9780: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
9790: 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65  mnTypes(.  Parse
97a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
97b0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
97c0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
97d0: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
97e0: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
97f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
9800: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
9810: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
9820: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
9830: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
9840: 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
9850: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
9860: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
9870: 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
9880: 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63   sNC;.  sNC.pSrc
9890: 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
98a0: 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20  .  sNC.pParse = 
98b0: 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d  pParse;.  for(i=
98c0: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
98d0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
98e0: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
98f0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
9900: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
9910: 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
9920: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
9930: 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73  ETADATA.    cons
9940: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20  t char *zOrigDb 
9950: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
9960: 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  har *zOrigTab = 
9970: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
9980: 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  r *zOrigCol = 0;
9990: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
99a0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
99b0: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
99c0: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29  gTab, &zOrigCol)
99d0: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64  ;..    /* The vd
99e0: 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73  be must make its
99f0: 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65   own copy of the
9a00: 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64   column-type and
9a10: 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63   other .    ** c
9a20: 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73  olumn specific s
9a30: 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20  trings, in case 
9a40: 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65  the schema is re
9a50: 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a  set before this.
9a60: 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d      ** virtual m
9a70: 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65  achine is delete
9a80: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
9a90: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
9aa0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
9ab0: 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69  E_DATABASE, zOri
9ac0: 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  gDb, SQLITE_TRAN
9ad0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
9ae0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
9af0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
9b00: 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c  TABLE, zOrigTab,
9b10: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
9b20: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
9b30: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
9b40: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55   i, COLNAME_COLU
9b50: 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51  MN, zOrigCol, SQ
9b60: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
9b70: 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65  .#else.    zType
9b80: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
9b90: 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b  NC, p, 0, 0, 0);
9ba0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
9bb0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
9bc0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
9bd0: 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c  DECLTYPE, zType,
9be0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
9bf0: 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  T);.  }.#endif /
9c00: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  * SQLITE_OMIT_DE
9c10: 43 4c 54 59 50 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  CLTYPE */.}../*.
9c20: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
9c30: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
9c40: 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d  the VDBE the nam
9c50: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
9c60: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
9c70: 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  et.  This inform
9c80: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
9c90: 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20   provide the.** 
9ca0: 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69  azCol[] values i
9cb0: 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  n the callback..
9cc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
9cd0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
9ce0: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
9cf0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
9d00: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
9d10: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
9d20: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
9d30: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
9d40: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
9d50: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
9d60: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
9d70: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56  lt set */.){.  V
9d80: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
9d90: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c  >pVdbe;.  int i,
9da0: 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   j;.  sqlite3 *d
9db0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9dc0: 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c    int fullNames,
9dd0: 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69   shortNames;..#i
9de0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9df0: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49  T_EXPLAIN.  /* I
9e00: 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50  f this is an EXP
9e10: 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20  LAIN, skip this 
9e20: 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50  step */.  if( pP
9e30: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
9e40: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
9e50: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
9e60: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
9e70: 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30  et || NEVER(v==0
9e80: 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ) || db->mallocF
9e90: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
9ea0: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
9eb0: 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c  esSet = 1;.  ful
9ec0: 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  lNames = (db->fl
9ed0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
9ee0: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  lColNames)!=0;. 
9ef0: 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64   shortNames = (d
9f00: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
9f10: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
9f20: 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  !=0;.  sqlite3Vd
9f30: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
9f40: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
9f50: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
9f60: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
9f70: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20  {.    Expr *p;. 
9f80: 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61     p = pEList->a
9f90: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
9fa0: 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
9fb0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
9fc0: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  f( pEList->a[i].
9fd0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63  zName ){.      c
9fe0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
9ff0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
a000: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a010: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
a020: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
a030: 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54   zName, SQLITE_T
a040: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
a050: 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d  else if( (p->op=
a060: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d  =TK_COLUMN || p-
a070: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
a080: 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74 20  MN) && pTabList 
a090: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
a0a0: 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72  pTab;.      char
a0b0: 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e   *zCol;.      in
a0c0: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c  t iCol = p->iCol
a0d0: 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  umn;.      for(j
a0e0: 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54 61  =0; ALWAYS(j<pTa
a0f0: 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b  bList->nSrc); j+
a100: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
a110: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69  pTabList->a[j].i
a120: 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c  Cursor==p->iTabl
a130: 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  e ) break;.     
a140: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
a150: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
a160: 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20  c );.      pTab 
a170: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
a180: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  .pTab;.      if(
a190: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
a1a0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
a1b0: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
a1c0: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
a1d0: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
a1e0: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66  Col) );.      if
a1f0: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
a200: 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69      zCol = "rowi
a210: 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d";.      }else{
a220: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
a230: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
a240: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  .zName;.      }.
a250: 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74        if( !short
a260: 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61  Names && !fullNa
a270: 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  mes ){.        s
a280: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
a290: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
a2a0: 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20  ME_NAME, .      
a2b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53        sqlite3DbS
a2c0: 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  trDup(db, pEList
a2d0: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53  ->a[i].zSpan), S
a2e0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
a2f0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
a300: 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20  fullNames ){.   
a310: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
a320: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e   = 0;.        zN
a330: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
a340: 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
a350: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
a360: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
a370: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
a380: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
a390: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
a3a0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
a3b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a3c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a3d0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
a3e0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
a3f0: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
a400: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a  SIENT);.      }.
a410: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a420: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
a430: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
a440: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20  NAME_NAME, .    
a450: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53        sqlite3DbS
a460: 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  trDup(db, pEList
a470: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53  ->a[i].zSpan), S
a480: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
a490: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65      }.  }.  gene
a4a0: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
a4b0: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
a4c0: 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  , pEList);.}../*
a4d0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 61 6e 20 65  .** Given a an e
a4e0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28  xpression list (
a4f0: 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
a500: 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
a510: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
a520: 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20  form the result 
a530: 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20  set of a SELECT 
a540: 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75  statement) compu
a550: 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  te appropriate.*
a560: 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  * column names f
a570: 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  or a table that 
a580: 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
a590: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
a5a0: 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e  **.** All column
a5b0: 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75   names will be u
a5c0: 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  nique..**.** Onl
a5d0: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
a5e0: 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e  es are computed.
a5f0: 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20    Column.zType, 
a600: 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a  Column.zColl,.**
a610: 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64   and other field
a620: 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20  s of Column are 
a630: 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  zeroed..**.** Re
a640: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
a650: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61  n success.  If a
a660: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
a670: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
a680: 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69  .** store NULL i
a690: 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69  n *paCol and 0 i
a6a0: 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74  n *pnCol and ret
a6b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
a6c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a6d0: 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f  selectColumnsFro
a6e0: 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  mExprList(.  Par
a6f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
a700: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
a710: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
a720: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
a730: 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73       /* Expr lis
a740: 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  t from which to 
a750: 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61  derive column na
a760: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  mes */.  int *pn
a770: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
a780: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
a790: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
a7a0: 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  here */.  Column
a7b0: 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20   **paCol        
a7c0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
a7d0: 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  ew column list h
a7e0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
a7f0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
a800: 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62  ->db;   /* Datab
a810: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
a820: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a840: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
a850: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20   */.  int cnt;  
a860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a870: 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64    /* Index added
a880: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d   to make the nam
a890: 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f  e unique */.  Co
a8a0: 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f  lumn *aCol, *pCo
a8b0: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  l;        /* For
a8c0: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65   looping over re
a8d0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
a8e0: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
a8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a900: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
a910: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
a920: 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a   set */.  Expr *
a930: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
a940: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
a950: 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ion for a single
a960: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a   result column *
a970: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
a980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a990: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  /* Column name *
a9a0: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9c0: 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20  /* Size of name 
a9d0: 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20  in zName[] */.. 
a9e0: 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d   *pnCol = nCol =
a9f0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
aa00: 20 20 61 43 6f 6c 20 3d 20 2a 70 61 43 6f 6c 20    aCol = *paCol 
aa10: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
aa20: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
aa30: 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b  (aCol[0])*nCol);
aa40: 0a 20 20 69 66 28 20 61 43 6f 6c 3d 3d 30 20 29  .  if( aCol==0 )
aa50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
aa60: 4f 4d 45 4d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  OMEM;.  for(i=0,
aa70: 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43   pCol=aCol; i<nC
aa80: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
aa90: 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20  {.    /* Get an 
aaa0: 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65  appropriate name
aab0: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a   for the column.
aac0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70      */.    p = p
aad0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
aae0: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
aaf0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 45  ->pRight==0 || E
ab00: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
ab10: 2d 3e 70 52 69 67 68 74 2c 20 45 50 5f 49 6e 74  ->pRight, EP_Int
ab20: 56 61 6c 75 65 29 0a 20 20 20 20 20 20 20 20 20  Value).         
ab30: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 70 52 69 67        || p->pRig
ab40: 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d 30 20  ht->u.zToken==0 
ab50: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 75 2e  || p->pRight->u.
ab60: 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a  zToken[0]!=0 );.
ab70: 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d      if( (zName =
ab80: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
ab90: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
aba0: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
abb0: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41  n contains an "A
abc0: 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65  S <name>" phrase
abd0: 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20  , use <name> as 
abe0: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
abf0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
ac00: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e  3DbStrDup(db, zN
ac10: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
ac20: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f  .      Expr *pCo
ac30: 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54  lExpr = p;  /* T
ac40: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
ac50: 61 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  at is the result
ac60: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   column name */.
ac70: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
ac80: 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  b;         /* Ta
ac90: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
aca0: 69 74 68 20 74 68 69 73 20 65 78 70 72 65 73 73  ith this express
acb0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  ion */.      whi
acc0: 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  le( pColExpr->op
acd0: 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20  ==TK_DOT ){.    
ace0: 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70      pColExpr = p
acf0: 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ColExpr->pRight;
ad00: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
ad10: 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a   pColExpr!=0 );.
ad20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
ad30: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
ad40: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57  TK_COLUMN && ALW
ad50: 41 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70 54  AYS(pColExpr->pT
ad60: 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ab!=0) ){.      
ad70: 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73    /* For columns
ad80: 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20   use the column 
ad90: 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  name name */.   
ada0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
adb0: 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pColExpr->iColum
adc0: 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  n;.        pTab 
add0: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62  = pColExpr->pTab
ade0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
adf0: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
ae00: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
ae10: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
ae20: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
ae30: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
ae40: 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20 70       iCol>=0 ? p
ae50: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
ae60: 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 29  zName : "rowid")
ae70: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
ae80: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
ae90: 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20  TK_ID ){.       
aea0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
aeb0: 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78  sProperty(pColEx
aec0: 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
aed0: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   );.        zNam
aee0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
aef0: 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70 43 6f  tf(db, "%s", pCo
af00: 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  lExpr->u.zToken)
af10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
af20: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
af30: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
af40: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
af50: 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
af60: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
af70: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
af80: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
af90: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
afa0: 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pan);.      }.  
afb0: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
afc0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
afd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
afe0: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
aff0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b000: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
b010: 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  sure the column 
b020: 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20  name is unique. 
b030: 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   If the name is 
b040: 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20  not unique,.    
b050: 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65  ** append a inte
b060: 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20  ger to the name 
b070: 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d  so that it becom
b080: 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a  es unique..    *
b090: 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71  /.    nName = sq
b0a0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
b0b0: 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  ame);.    for(j=
b0c0: 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29  cnt=0; j<i; j++)
b0d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
b0e0: 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b  te3StrICmp(aCol[
b0f0: 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  j].zName, zName)
b100: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
b110: 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20  har *zNewName;. 
b120: 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61         zName[nNa
b130: 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  me] = 0;.       
b140: 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69   zNewName = sqli
b150: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
b160: 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b  %s:%d", zName, +
b170: 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  +cnt);.        s
b180: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
b190: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
b1a0: 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d   zName = zNewNam
b1b0: 65 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d  e;.        j = -
b1c0: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  1;.        if( z
b1d0: 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Name==0 ) break;
b1e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b1f0: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
b200: 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66   zName;.  }.  if
b210: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
b220: 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  ed ){.    for(j=
b230: 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<i; j++){.  
b240: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
b250: 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e  e(db, aCol[j].zN
b260: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
b270: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
b280: 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61  , aCol);.    *pa
b290: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e  Col = 0;.    *pn
b2a0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Col = 0;.    ret
b2b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
b2c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
b2d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b2e0: 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20  ** Add type and 
b2f0: 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
b300: 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d  ation to a colum
b310: 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a  n list based on.
b320: 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ** a SELECT stat
b330: 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ement..** .** Th
b340: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72  e column list pr
b350: 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72  esumably came fr
b360: 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e  om selectColumnN
b370: 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  amesFromExprList
b380: 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ()..** The colum
b390: 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20  n list has only 
b3a0: 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73  names, not types
b3b0: 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20   or collations. 
b3c0: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
b3d0: 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e   goes through an
b3e0: 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73  d adds the types
b3f0: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e   and collations.
b400: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
b410: 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ine requires tha
b420: 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72  t all identifier
b430: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
b440: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20  ** statement be 
b450: 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61  resolved..*/.sta
b460: 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
b470: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
b480: 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73  ollation(.  Pars
b490: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
b4a0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
b4b0: 74 65 78 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  texts */.  int n
b4c0: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
b4d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
b4e0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 43 6f 6c 75 6d  lumns */.  Colum
b4f0: 6e 20 2a 61 43 6f 6c 2c 20 20 20 20 20 20 20 20  n *aCol,        
b500: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75   /* List of colu
b510: 6d 6e 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  mns */.  Select 
b520: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f  *pSelect       /
b530: 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f  * SELECT used to
b540: 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73   determine types
b550: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20   and collations 
b560: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
b570: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
b580: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
b590: 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  sNC;.  Column *p
b5a0: 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Col;.  CollSeq *
b5b0: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pColl;.  int i;.
b5c0: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72    Expr *p;.  str
b5d0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
b5e0: 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  m *a;..  assert(
b5f0: 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20   pSelect!=0 );. 
b600: 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65 63   assert( (pSelec
b610: 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
b620: 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b  _Resolved)!=0 );
b630: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d  .  assert( nCol=
b640: 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  =pSelect->pEList
b650: 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  ->nExpr || db->m
b660: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
b670: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
b680: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
b690: 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
b6a0: 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
b6b0: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
b6c0: 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
b6d0: 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70    a = pSelect->p
b6e0: 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28  EList->a;.  for(
b6f0: 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20  i=0, pCol=aCol; 
b700: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  i<nCol; i++, pCo
b710: 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b  l++){.    p = a[
b720: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 43  i].pExpr;.    pC
b730: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69  ol->zType = sqli
b740: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
b750: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
b760: 20 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a 20   p, 0, 0, 0));. 
b770: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74     pCol->affinit
b780: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  y = sqlite3ExprA
b790: 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20  ffinity(p);.    
b7a0: 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  if( pCol->affini
b7b0: 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66  ty==0 ) pCol->af
b7c0: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
b7d0: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 70 43  AFF_NONE;.    pC
b7e0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
b7f0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
b800: 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   p);.    if( pCo
b810: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  ll ){.      pCol
b820: 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  ->zColl = sqlite
b830: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43  3DbStrDup(db, pC
b840: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
b850: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
b860: 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
b870: 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
b880: 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
b890: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
b8a0: 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
b8b0: 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
b8c0: 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
b8d0: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
b8e0: 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
b8f0: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
b900: 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
b910: 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
b920: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
b930: 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  >db;.  int saved
b940: 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46  Flags;..  savedF
b950: 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73  lags = db->flags
b960: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
b970: 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c   ~SQLITE_FullCol
b980: 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  Names;.  db->fla
b990: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
b9a0: 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71  rtColNames;.  sq
b9b0: 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
b9c0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
b9d0: 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   0);.  if( pPars
b9e0: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
b9f0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65   0;.  while( pSe
ba00: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  lect->pPrior ) p
ba10: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
ba20: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e  ->pPrior;.  db->
ba30: 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61  flags = savedFla
ba40: 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  gs;.  pTab = sql
ba50: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
ba60: 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
ba70: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
ba80: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
ba90: 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68  n 0;.  }.  /* Th
baa0: 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  e sqlite3ResultS
bab0: 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20  etOfSelect() is 
bac0: 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74  only used n cont
bad0: 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61  exts where looka
bae0: 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73  side.  ** is dis
baf0: 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  abled */.  asser
bb00: 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  t( db->lookaside
bb10: 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a  .bEnabled==0 );.
bb20: 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
bb30: 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20  ;.  pTab->zName 
bb40: 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f  = 0;.  pTab->nRo
bb50: 77 45 73 74 20 3d 20 31 30 30 30 30 30 30 3b 0a  wEst = 1000000;.
bb60: 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46    selectColumnsF
bb70: 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
bb80: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  se, pSelect->pEL
bb90: 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
bba0: 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
bbb0: 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d    selectAddColum
bbc0: 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
bbd0: 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  n(pParse, pTab->
bbe0: 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  nCol, pTab->aCol
bbf0: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54  , pSelect);.  pT
bc00: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
bc10: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
bc20: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
bc30: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
bc40: 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
bc50: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
bc60: 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
bc70: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45  /*.** Get a VDBE
bc80: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
bc90: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20  arser context.  
bca0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
bcb0: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
bcc0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
bcd0: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c  curs, return NUL
bce0: 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65  L and leave a me
bcf0: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
bd00: 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65  .*/.Vdbe *sqlite
bd10: 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a  3GetVdbe(Parse *
bd20: 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
bd30: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
bd40: 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  be;.  if( v==0 )
bd50: 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65  {.    v = pParse
bd60: 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65  ->pVdbe = sqlite
bd70: 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72  3VdbeCreate(pPar
bd80: 73 65 2d 3e 64 62 29 3b 0a 23 69 66 6e 64 65 66  se->db);.#ifndef
bd90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
bda0: 43 45 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a  CE.    if( v ){.
bdb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bdc0: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72  eAddOp0(v, OP_Tr
bdd0: 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ace);.    }.#end
bde0: 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  if.  }.  return 
bdf0: 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  v;.}.../*.** Com
be00: 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20  pute the iLimit 
be10: 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c  and iOffset fiel
be20: 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ds of the SELECT
be30: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
be40: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
be50: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  set expressions.
be60: 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66    pLimit and pOf
be70: 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78  fset hold the ex
be80: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
be90: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
bea0: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
beb0: 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65  tement after the
bec0: 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
bed0: 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20  T.** keywords.  
bee0: 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65  Or NULL if those
bef0: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d   keywords are om
bf00: 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e  itted. iLimit an
bf10: 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72  d iOffset .** ar
bf20: 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65  e the integer me
bf30: 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75  mory register nu
bf40: 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65  mbers for counte
bf50: 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  rs used to compu
bf60: 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74  te .** the limit
bf70: 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66   and offset.  If
bf80: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d   there is no lim
bf90: 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74  it and/or offset
bfa0: 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69  , then .** iLimi
bfb0: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72  t and iOffset ar
bfc0: 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a  e negative..**.*
bfd0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
bfe0: 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65  hanges the value
bff0: 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20  s of iLimit and 
c000: 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a  iOffset only if.
c010: 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66  ** a limit or of
c020: 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20  fset is defined 
c030: 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  by pLimit and pO
c040: 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61  ffset.  iLimit a
c050: 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68  nd.** iOffset sh
c060: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
c070: 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72  reset to appropr
c080: 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c  iate default val
c090: 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20  ues.** (usually 
c0a0: 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d  but not always -
c0b0: 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  1) prior to call
c0c0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
c0d0: 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69  ..** Only if pLi
c0e0: 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65  mit!=0 or pOffse
c0f0: 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69  t!=0 do the limi
c100: 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a  t registers get.
c110: 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54  ** redefined.  T
c120: 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
c130: 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20  rator uses this 
c140: 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63  property to forc
c150: 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f  e.** the reuse o
c160: 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74  f the same limit
c170: 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69   and offset regi
c180: 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c  sters across mul
c190: 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20  tiple.** SELECT 
c1a0: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  statements..*/.s
c1b0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75  tatic void compu
c1c0: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
c1d0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c1e0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
c1f0: 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a  Break){.  Vdbe *
c200: 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69  v = 0;.  int iLi
c210: 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  mit = 0;.  int i
c220: 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64  Offset;.  int ad
c230: 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20 70 2d  dr1, n;.  if( p-
c240: 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >iLimit ) return
c250: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c  ;..  /* .  ** "L
c260: 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20  IMIT -1" always 
c270: 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20  shows all rows. 
c280: 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20   There is some. 
c290: 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73 79 20   ** contraversy 
c2a0: 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63  about what the c
c2b0: 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20  orrect behavior 
c2c0: 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20  should be..  ** 
c2d0: 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  The current impl
c2e0: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72  ementation inter
c2f0: 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20  prets "LIMIT 0" 
c300: 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20  to mean.  ** no 
c310: 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  rows..  */.  sql
c320: 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
c330: 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  ar(pParse);.  as
c340: 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
c350: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74  ==0 || p->pLimit
c360: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
c370: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d  pLimit ){.    p-
c380: 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74  >iLimit = iLimit
c390: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
c3a0: 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  m;.    v = sqlit
c3b0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
c3c0: 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  );.    if( NEVER
c3d0: 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (v==0) ) return;
c3e0: 20 20 2f 2a 20 56 44 42 45 20 73 68 6f 75 6c 64    /* VDBE should
c3f0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
c400: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
c410: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
c420: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
c430: 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20  pLimit, &n) ){. 
c440: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c450: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
c460: 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29  eger, n, iLimit)
c470: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
c480: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
c490: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
c4a0: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
c4b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c4c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
c4d0: 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20  o, 0, iBreak);. 
c4e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c4f0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
c500: 63 74 52 6f 77 20 3e 20 28 64 6f 75 62 6c 65 29  ctRow > (double)
c510: 6e 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  n ) p->nSelectRo
c520: 77 20 3d 20 28 64 6f 75 62 6c 65 29 6e 3b 0a 20  w = (double)n;. 
c530: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
c540: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
c550: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
c560: 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69  p->pLimit, iLimi
c570: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
c580: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
c590: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69  P_MustBeInt, iLi
c5a0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  mit);.      Vdbe
c5b0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
c5c0: 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
c5d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c5e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a  AddOp2(v, OP_IfZ
c5f0: 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72  ero, iLimit, iBr
c600: 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eak);.    }.    
c610: 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29  if( p->pOffset )
c620: 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  {.      p->iOffs
c630: 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b  et = iOffset = +
c640: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
c650: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
c660: 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  m++;   /* Alloca
c670: 74 65 20 61 6e 20 65 78 74 72 61 20 72 65 67 69  te an extra regi
c680: 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f  ster for limit+o
c690: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 73  ffset */.      s
c6a0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
c6b0: 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65  Parse, p->pOffse
c6c0: 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  t, iOffset);.   
c6d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c6e0: 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
c6f0: 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a  eInt, iOffset);.
c700: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
c710: 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f  t((v, "OFFSET co
c720: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
c730: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
c740: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
c750: 49 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 29 3b  IfPos, iOffset);
c760: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c770: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
c780: 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f 66 66 73  nteger, 0, iOffs
c790: 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
c7a0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
c7b0: 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20  , addr1);.      
c7c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c7d0: 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69  3(v, OP_Add, iLi
c7e0: 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f  mit, iOffset, iO
c7f0: 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20  ffset+1);.      
c800: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
c810: 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29  "LIMIT+OFFSET"))
c820: 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20  ;.      addr1 = 
c830: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c840: 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  1(v, OP_IfPos, i
c850: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71  Limit);.      sq
c860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c870: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d  v, OP_Integer, -
c880: 31 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20  1, iOffset+1);. 
c890: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c8a0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
c8b0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
c8c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c8d0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
c8e0: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  LECT./*.** Retur
c8f0: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
c900: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
c910: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f  ence for the iCo
c920: 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  l-th column of.*
c930: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
c940: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
c950: 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d-select stateme
c960: 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20  nt "p".  Return 
c970: 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63  NULL if.** the c
c980: 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66  olumn has no def
c990: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ault collating s
c9a0: 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  equence..**.** T
c9b0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
c9c0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f  uence for the co
c9d0: 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73  mpound select is
c9e0: 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a   taken from the.
c9f0: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  ** left-most ter
ca00: 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  m of the select 
ca10: 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61  that has a colla
ca20: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
ca30: 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71  /.static CollSeq
ca40: 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c   *multiSelectCol
ca50: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
ca60: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
ca70: 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c  nt iCol){.  Coll
ca80: 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  Seq *pRet;.  if(
ca90: 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
caa0: 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65    pRet = multiSe
cab0: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
cac0: 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69  se, p->pPrior, i
cad0: 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Col);.  }else{. 
cae0: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d     pRet = 0;.  }
caf0: 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
cb00: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 65 74  =0 );.  if( pRet
cb10: 3d 3d 30 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 70  ==0 && iCol<p->p
cb20: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
cb30: 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
cb40: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
cb50: 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  arse, p->pEList-
cb60: 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b  >a[iCol].pExpr);
cb70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
cb80: 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  et;.}.#endif /* 
cb90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
cba0: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
cbb0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
cbc0: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
cbd0: 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
cbe0: 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
cbf0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
cc00: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
cc10: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
cc20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
cc30: 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
cc40: 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
cc50: 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
cc60: 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
cc70: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
cc80: 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
cc90: 73 20 2a 2f 0a 29 3b 0a 0a 0a 23 69 66 6e 64 65  s */.);...#ifnde
cca0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
ccb0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
ccc0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ccd0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
cce0: 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ocess a compound
ccf0: 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d   query form from
cd00: 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  .** two or more 
cd10: 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73  separate queries
cd20: 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e   using UNION, UN
cd30: 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c  ION ALL, EXCEPT,
cd40: 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54   or.** INTERSECT
cd50: 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74  .**.** "p" point
cd60: 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
cd70: 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71  ost of the two q
cd80: 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65  ueries.  the que
cd90: 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66  ry on the.** lef
cda0: 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20  t is p->pPrior. 
cdb0: 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20   The left query 
cdc0: 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20  could also be a 
cdd0: 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a  compound query.*
cde0: 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  * in which case 
cdf0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
ce00: 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75  l be called recu
ce10: 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20  rsively. .**.** 
ce20: 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  The results of t
ce30: 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61  he total query a
ce40: 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  re to be written
ce50: 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74   into a destinat
ce60: 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65  ion.** of type e
ce70: 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65  Dest with parame
ce80: 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ter iParm..**.**
ce90: 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e   Example 1:  Con
cea0: 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61  sider a three-wa
ceb0: 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73  y compound SQL s
cec0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
ced0: 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
cee0: 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
cef0: 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T b FROM t2 UNIO
cf00: 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20  N SELECT c FROM 
cf10: 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74  t3.**.** This st
cf20: 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
cf30: 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d up as follows:
cf40: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
cf50: 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20  T c FROM t3.**  
cf60: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d      |.**      `-
cf70: 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20  ---->  SELECT b 
cf80: 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20  FROM t2.**      
cf90: 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20            |.**  
cfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d                `-
cfb0: 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61  ----->  SELECT a
cfc0: 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54   FROM t1.**.** T
cfd0: 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65  he arrows in the
cfe0: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72   diagram above r
cff0: 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c  epresent the Sel
d000: 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74  ect.pPrior point
d010: 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69  er..** So if thi
d020: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
d030: 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c  led with p equal
d040: 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79   to the t3 query
d050: 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72  , then.** pPrior
d060: 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20   will be the t2 
d070: 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69  query.  p->op wi
d080: 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69  ll be TK_UNION i
d090: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
d0a0: 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62  ** Notice that b
d0b0: 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
d0c0: 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20  y SQLite parses 
d0d0: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  compound SELECTs
d0e0: 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  , the.** individ
d0f0: 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61  ual selects alwa
d100: 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65  ys group from le
d110: 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a  ft to right..*/.
d120: 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
d130: 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
d140: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
d150: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
d160: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
d170: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
d180: 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
d190: 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
d1a0: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
d1b0: 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
d1c0: 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
d1d0: 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
d1e0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ts */.){.  int r
d1f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
d200: 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
d210: 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
d220: 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
d230: 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
d240: 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
d250: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
d260: 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
d270: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
d280: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
d290: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
d2a0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
d2b0: 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41   dest;      /* A
d2c0: 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20  lternative data 
d2d0: 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
d2e0: 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65   Select *pDelete
d2f0: 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20   = 0;  /* Chain 
d300: 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  of simple select
d310: 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  s to delete */. 
d320: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
d330: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
d340: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
d350: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d360: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
d370: 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20 20 20  nt iSub1;       
d380: 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
d390: 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72  f left-hand quer
d3a0: 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  y */.  int iSub2
d3b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
d3c0: 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d  EQP id of right-
d3d0: 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65  hand query */.#e
d3e0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ndif..  /* Make 
d3f0: 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
d400: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
d410: 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69  IT clause on pri
d420: 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c  or SELECTs.  Onl
d430: 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20  y.  ** the last 
d440: 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c  (right-most) SEL
d450: 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65  ECT in the serie
d460: 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52  s may have an OR
d470: 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e  DER BY or LIMIT.
d480: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
d490: 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29  p && p->pPrior )
d4a0: 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75  ;  /* Calling fu
d4b0: 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65  nction guarantee
d4c0: 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20  s this much */. 
d4d0: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
d4e0: 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ;.  pPrior = p->
d4f0: 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74  pPrior;.  assert
d500: 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74  ( pPrior->pRight
d510: 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a  most!=pPrior );.
d520: 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
d530: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d  ->pRightmost==p-
d540: 3e 70 52 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20  >pRightmost );. 
d550: 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a   dest = *pDest;.
d560: 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f    if( pPrior->pO
d570: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
d580: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
d590: 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63  arse,"ORDER BY c
d5a0: 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
d5b0: 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
d5c0: 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
d5d0: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
d5e0: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
d5f0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
d600: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
d610: 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
d620: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
d630: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
d640: 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  e,"LIMIT clause 
d650: 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
d660: 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22  r %s not before"
d670: 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
d680: 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
d690: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
d6a0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
d6b0: 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20  end;.  }..  v = 
d6c0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
d6d0: 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
d6e0: 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68  ( v!=0 );  /* Th
d6f0: 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20 63  e VDBE already c
d700: 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e  reated by callin
d710: 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  g function */.. 
d720: 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64   /* Create the d
d730: 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f  estination tempo
d740: 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65  rary table if ne
d750: 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69  cessary.  */.  i
d760: 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
d770: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
d780: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
d790: 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69  List );.    sqli
d7a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d7b0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
d7c0: 6c 2c 20 64 65 73 74 2e 69 50 61 72 6d 2c 20 70  l, dest.iParm, p
d7d0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
d7e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
d7f0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52  eChangeP5(v, BTR
d800: 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20  EE_UNORDERED);. 
d810: 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
d820: 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a  SRT_Table;.  }..
d830: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61    /* Make sure a
d840: 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68  ll SELECTs in th
d850: 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65  e statement have
d860: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
d870: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a   of elements.  *
d880: 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c  * in their resul
d890: 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61  t sets..  */.  a
d8a0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
d8b0: 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69   && pPrior->pELi
d8c0: 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  st );.  if( p->p
d8d0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50  EList->nExpr!=pP
d8e0: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  rior->pEList->nE
d8f0: 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
d900: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
d910: 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74  e, "SELECTs to t
d920: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
d930: 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22  t of %s".      "
d940: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
d950: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
d960: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c  result columns",
d970: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
d980: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
d990: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
d9a0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
d9b0: 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64  }..  /* Compound
d9c0: 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68 61   SELECTs that ha
d9d0: 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  ve an ORDER BY c
d9e0: 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65  lause are handle
d9f0: 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20  d separately..  
da00: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  */.  if( p->pOrd
da10: 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75  erBy ){.    retu
da20: 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  rn multiSelectOr
da30: 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c  derBy(pParse, p,
da40: 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20   pDest);.  }..  
da50: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
da60: 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e   for the left an
da70: 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73  d right SELECT s
da80: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
da90: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
daa0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
dab0: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
dac0: 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  addr = 0;.      
dad0: 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20  int nLimit;.    
dae0: 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
daf0: 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20  r->pLimit );.   
db00: 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69     pPrior->pLimi
db10: 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
db20: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66       pPrior->pOf
db30: 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
db40: 74 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  t;.      explain
db50: 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
db60: 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
db70: 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
db80: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
db90: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
dba0: 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  r, &dest);.     
dbb0: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
dbc0: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
dbd0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
dbe0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
dbf0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
dc00: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
dc10: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
dc20: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69  ;.      p->iLimi
dc30: 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  t = pPrior->iLim
dc40: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66  it;.      p->iOf
dc50: 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  fset = pPrior->i
dc60: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66  Offset;.      if
dc70: 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
dc80: 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
dc90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
dca0: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
dcb0: 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >iLimit);.      
dcc0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
dcd0: 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66  , "Jump ahead if
dce0: 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22 29   LIMIT reached")
dcf0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
dd00: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
dd10: 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
dd20: 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
dd30: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
dd40: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
dd50: 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
dd60: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
dd70: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
dd80: 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
dd90: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
dda0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
ddb0: 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65  or;.      p->nSe
ddc0: 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f  lectRow += pPrio
ddd0: 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
dde0: 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d       if( pPrior-
ddf0: 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 26  >pLimit.       &
de00: 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  & sqlite3ExprIsI
de10: 6e 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70  nteger(pPrior->p
de20: 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a  Limit, &nLimit).
de30: 20 20 20 20 20 20 20 26 26 20 70 2d 3e 6e 53 65         && p->nSe
de40: 6c 65 63 74 52 6f 77 20 3e 20 28 64 6f 75 62 6c  lectRow > (doubl
de50: 65 29 6e 4c 69 6d 69 74 20 0a 20 20 20 20 20 20  e)nLimit .      
de60: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  ){.        p->nS
de70: 65 6c 65 63 74 52 6f 77 20 3d 20 28 64 6f 75 62  electRow = (doub
de80: 6c 65 29 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20  le)nLimit;.     
de90: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64 64   }.      if( add
dea0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
deb0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
dec0: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
ded0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
dee0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
def0: 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61  K_EXCEPT:.    ca
df00: 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
df10: 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61       int unionTa
df20: 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  b;    /* Cursor 
df30: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65  number of the te
df40: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f  mporary table ho
df50: 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a  lding result */.
df60: 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b        u8 op = 0;
df70: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
df80: 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   the SRT_ operat
df90: 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f  ions to apply to
dfa0: 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69   self */.      i
dfb0: 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20  nt priorOp;     
dfc0: 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72  /* The SRT_ oper
dfd0: 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74  ation to apply t
dfe0: 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20  o prior selects 
dff0: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
e000: 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
e010: 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73   /* Saved values
e020: 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e   of p->nLimit an
e030: 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a  d p->nOffset */.
e040: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
e050: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
e060: 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20   uniondest;..   
e070: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
e080: 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b  op==TK_EXCEPT );
e090: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e0a0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
e0b0: 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 4f   );.      priorO
e0c0: 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
e0d0: 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
e0e0: 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20  est==priorOp && 
e0f0: 41 4c 57 41 59 53 28 21 70 2d 3e 70 4c 69 6d 69  ALWAYS(!p->pLimi
e100: 74 20 26 26 21 70 2d 3e 70 4f 66 66 73 65 74 29  t &&!p->pOffset)
e110: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
e120: 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
e130: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
e140: 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
e150: 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
e160: 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
e170: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
e180: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
e190: 74 6d 6f 73 74 21 3d 70 20 29 3b 20 20 2f 2a 20  tmost!=p );  /* 
e1a0: 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  Can only happen 
e1b0: 66 6f 72 20 6c 65 66 74 77 61 72 64 20 65 6c 65  for leftward ele
e1c0: 6d 65 6e 74 73 0a 20 20 20 20 20 20 20 20 20 20  ments.          
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1e0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66             ** of
e1f0: 20 61 20 33 2d 77 61 79 20 6f 72 20 6d 6f 72 65   a 3-way or more
e200: 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 20   compound */.   
e210: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
e220: 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20  pLimit==0 );    
e230: 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64    /* Not allowed
e240: 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65   on leftward ele
e250: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  ments */.       
e260: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
e270: 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a  set==0 );     /*
e280: 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   Not allowed on 
e290: 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
e2a0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69  s */.        uni
e2b0: 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 50 61  onTab = dest.iPa
e2c0: 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  rm;.      }else{
e2d0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77  .        /* We w
e2e0: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61  ill need to crea
e2f0: 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f  te our own tempo
e300: 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f  rary table to ho
e310: 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ld the.        *
e320: 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
e330: 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20  esults..        
e340: 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
e350: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
e360: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ab++;.        as
e370: 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
e380: 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  y==0 );.        
e390: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
e3a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
e3b0: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e  penEphemeral, un
e3c0: 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
e3d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
e3e0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
e3f0: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  = -1 );.        
e400: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
e410: 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
e420: 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74     p->pRightmost
e430: 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
e440: 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
e450: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e460: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
e470: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
e480: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
e490: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
e4a0: 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20   left.      */. 
e4b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
e4c0: 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
e4d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
e4e0: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75  electDestInit(&u
e4f0: 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f  niondest, priorO
e500: 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20  p, unionTab);.  
e510: 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
e520: 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
e530: 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
e540: 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
e550: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
e560: 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75  arse, pPrior, &u
e570: 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
e580: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
e590: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
e5a0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
e5b0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
e5c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
e5d0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
e5e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
e5f0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
e600: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20  T ){.        op 
e610: 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20  = SRT_Except;.  
e620: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e630: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
e640: 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
e650: 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55        op = SRT_U
e660: 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nion;.      }.  
e670: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
e680: 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
e690: 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
e6a0: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
e6b0: 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
e6c0: 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
e6d0: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
e6e0: 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64   0;.      uniond
e6f0: 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a  est.eDest = op;.
e700: 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
e710: 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
e720: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
e730: 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
e740: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
e750: 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f  pParse, p, &unio
e760: 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  ndest);.      te
e770: 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
e780: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f  TE_OK );.      /
e790: 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69  * Query flatteni
e7a0: 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ng in sqlite3Sel
e7b0: 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69  ect() might refi
e7c0: 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a  ll p->pOrderBy..
e7d0: 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65        ** Be sure
e7e0: 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f   to delete p->pO
e7f0: 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72  rderBy, therefor
e800: 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65  e, to avoid a me
e810: 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20  mory leak. */.  
e820: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
e830: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
e840: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
e850: 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
e860: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
e870: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
e880: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
e890: 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  By = 0;.      if
e8a0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
e8b0: 4e 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  N ) p->nSelectRo
e8c0: 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  w += pPrior->nSe
e8d0: 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73  lectRow;.      s
e8e0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
e8f0: 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
e900: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
e910: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
e920: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
e930: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
e940: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
e950: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
e960: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ;..      /* Conv
e970: 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20  ert the data in 
e980: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
e990: 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ble into whateve
e9a0: 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  r form.      ** 
e9b0: 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75  it is that we cu
e9c0: 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20  rrently need..  
e9d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
e9e0: 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64  ert( unionTab==d
e9f0: 65 73 74 2e 69 50 61 72 6d 20 7c 7c 20 64 65 73  est.iParm || des
ea00: 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
ea10: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65   );.      if( de
ea20: 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
ea30: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  p ){.        int
ea40: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
ea50: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20  iStart;.        
ea60: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
ea70: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t );.        if(
ea80: 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
ea90: 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
eaa0: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
eab0: 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
eac0: 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
ead0: 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
eae0: 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
eaf0: 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65  or;.          ge
eb00: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
eb10: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
eb20: 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
eb30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
eb40: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
eb50: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
eb60: 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20  ;.        iCont 
eb70: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
eb80: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
eb90: 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
eba0: 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
ebb0: 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
ebc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ebd0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
ebe0: 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
ebf0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
ec00: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
ec10: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
ec20: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65  v);.        sele
ec30: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
ec40: 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
ec50: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70  , unionTab, p->p
ec60: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec80: 20 20 20 20 20 20 30 2c 20 2d 31 2c 20 26 64 65        0, -1, &de
ec90: 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
eca0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
ecb0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
ecc0: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
ecd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ece0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
ecf0: 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ext, unionTab, i
ed00: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20  Start);.        
ed10: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
ed20: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
ed30: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
ed40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ed50: 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e   OP_Close, union
ed60: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Tab, 0);.      }
ed70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ed80: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
ed90: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
eda0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20  TK_INTERSECT ); 
edb0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31  {.      int tab1
edc0: 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e  , tab2;.      in
edd0: 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
ede0: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45   iStart;.      E
edf0: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
ee00: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74  ffset;.      int
ee10: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
ee20: 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63  ectDest intersec
ee30: 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  tdest;.      int
ee40: 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49   r1;..      /* I
ee50: 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
ee60: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
ee70: 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
ee80: 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
ee90: 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
eea0: 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
eeb0: 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
eec0: 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
eed0: 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
eee0: 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
eef0: 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
ef00: 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20  */.      tab1 = 
ef10: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
ef20: 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
ef30: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
ef40: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
ef50: 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20  rderBy==0 );..  
ef60: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
ef70: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ef80: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
ef90: 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
efa0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
efb0: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
efc0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
efd0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
efe0: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
eff0: 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46  pRightmost->selF
f000: 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
f010: 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
f020: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
f030: 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  t );..      /* C
f040: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
f050: 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
f060: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
f070: 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
f080: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  /.      sqlite3S
f090: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69  electDestInit(&i
f0a0: 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52  ntersectdest, SR
f0b0: 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a  T_Union, tab1);.
f0c0: 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
f0d0: 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
f0e0: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
f0f0: 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
f100: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
f110: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
f120: 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
f130: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
f140: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
f150: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
f160: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
f170: 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
f180: 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
f190: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
f1a0: 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
f1b0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
f1c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f1d0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
f1e0: 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  l, tab2, 0);.   
f1f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
f200: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d  drOpenEphm[1] ==
f210: 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
f220: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
f230: 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d  = addr;.      p-
f240: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
f250: 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
f260: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
f270: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
f280: 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
f290: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
f2a0: 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
f2b0: 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73      intersectdes
f2c0: 74 2e 69 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a  t.iParm = tab2;.
f2d0: 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
f2e0: 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
f2f0: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
f300: 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
f310: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
f320: 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65  pParse, p, &inte
f330: 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20  rsectdest);.    
f340: 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
f350: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
f360: 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
f370: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
f380: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
f390: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
f3a0: 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72  SelectRow>pPrior
f3b0: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70  ->nSelectRow ) p
f3c0: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
f3d0: 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
f3e0: 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  w;.      sqlite3
f3f0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
f400: 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
f410: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
f420: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  mit;.      p->pO
f430: 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
f440: 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
f450: 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65  ate code to take
f460: 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f   the intersectio
f470: 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d  n of the two tem
f480: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20  porary.      ** 
f490: 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f  tables..      */
f4a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f4b0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
f4c0: 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
f4d0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
f4e0: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
f4f0: 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
f500: 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
f510: 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
f520: 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
f530: 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e  ior;.        gen
f540: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
f550: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
f560: 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  st->pEList);.   
f570: 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61     }.      iBrea
f580: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
f590: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
f5a0: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
f5b0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
f5c0: 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74  v);.      comput
f5d0: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
f5e0: 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
f5f0: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
f600: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f610: 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20  P_Rewind, tab1, 
f620: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 72  iBreak);.      r
f630: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
f640: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
f650: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
f660: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f670: 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61  v, OP_RowKey, ta
f680: 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  b1, r1);.      s
f690: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
f6a0: 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
f6b0: 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c  nd, tab2, iCont,
f6c0: 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73   r1, 0);.      s
f6d0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
f6e0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
f6f0: 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
f700: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
f710: 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61  p, p->pEList, ta
f720: 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  b1, p->pEList->n
f730: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
f740: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 2d              0, -
f750: 31 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c  1, &dest, iCont,
f760: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
f770: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
f780: 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
f790: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f7a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f7b0: 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74  _Next, tab1, iSt
f7c0: 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  art);.      sqli
f7d0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
f7e0: 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
f7f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f800: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
f810: 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ose, tab2, 0);. 
f820: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f830: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
f840: 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  se, tab1, 0);.  
f850: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f860: 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43  .  }..  explainC
f870: 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c  omposite(pParse,
f880: 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69   p->op, iSub1, i
f890: 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f  Sub2, p->op!=TK_
f8a0: 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ALL);..  /* Comp
f8b0: 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ute collating se
f8c0: 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20  quences used by 
f8d0: 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
f8e0: 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f  tables needed to
f8f0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
f900: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
f910: 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20    ** Attach the 
f920: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
f930: 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61  e to all tempora
f940: 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ry tables..  **.
f950: 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f    ** This sectio
f960: 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20  n is run by the 
f970: 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43  right-most SELEC
f980: 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79  T statement only
f990: 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74  ..  ** SELECT st
f9a0: 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  atements to the 
f9b0: 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70  left always skip
f9c0: 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65   this part.  The
f9d0: 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
f9e0: 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c   SELECT might al
f9f0: 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  so skip this par
fa00: 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f  t if it has no O
fa10: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
fa20: 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20  nd.  ** no temp 
fa30: 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69  tables are requi
fa40: 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  red..  */.  if( 
fa50: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
fa60: 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29  _UsesEphemeral )
fa70: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  {.    int i;    
fa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa90: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
faa0: 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e  ter */.    KeyIn
fab0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20  fo *pKeyInfo;   
fac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
fad0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
fae0: 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  or the result se
faf0: 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20  t */.    Select 
fb00: 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
fb10: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
fb20: 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45  oping through SE
fb30: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
fb40: 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  */.    CollSeq *
fb50: 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20  *apColl;        
fb60: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
fb70: 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79  ing through pKey
fb80: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f  Info->aColl[] */
fb90: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
fba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbb0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
fbc0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
fbd0: 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73  t set */..    as
fbe0: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d  sert( p->pRightm
fbf0: 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 43  ost==p );.    nC
fc00: 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
fc10: 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49  nExpr;.    pKeyI
fc20: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
fc30: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20  allocZero(db,.  
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc50: 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65       sizeof(*pKe
fc60: 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 28 73 69 7a  yInfo)+nCol*(siz
fc70: 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20  eof(CollSeq*) + 
fc80: 31 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b  1));.    if( !pK
fc90: 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
fca0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
fcb0: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  M;.      goto mu
fcc0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
fcd0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49      }..    pKeyI
fce0: 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64  nfo->enc = ENC(d
fcf0: 62 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  b);.    pKeyInfo
fd00: 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  ->nField = (u16)
fd10: 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  nCol;..    for(i
fd20: 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49  =0, apColl=pKeyI
fd30: 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43  nfo->aColl; i<nC
fd40: 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  ol; i++, apColl+
fd50: 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c  +){.      *apCol
fd60: 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
fd70: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
fd80: 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
fd90: 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20  0==*apColl ){.  
fda0: 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
fdb0: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
fdc0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
fdd0: 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
fde0: 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
fdf0: 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
fe00: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
fe10: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
fe20: 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e  t addr = pLoop->
fe30: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b  addrOpenEphm[i];
fe40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
fe50: 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r<0 ){.         
fe60: 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e   /* If [0] is un
fe70: 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73  used then [1] is
fe80: 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53   also unused.  S
fe90: 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20  o we can.       
fea0: 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66     ** always saf
feb0: 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f  ely abort as soo
fec0: 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75  n as the first u
fed0: 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f  nused slot is fo
fee0: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
fef0: 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
ff00: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c  addrOpenEphm[1]<
ff10: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  0 );.          b
ff20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
ff30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ff40: 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
ff50: 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ddr, nCol);.    
ff60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
ff70: 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
ff80: 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
ff90: 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
ffa0: 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64         pLoop->ad
ffb0: 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20  drOpenEphm[i] = 
ffc0: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
ffd0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
ffe0: 72 65 65 28 64 62 2c 20 70 4b 65 79 49 6e 66 6f  ree(db, pKeyInfo
fff0: 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65  );.  }..multi_se
10000 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73  lect_end:.  pDes
10010 74 2d 3e 69 4d 65 6d 20 3d 20 64 65 73 74 2e 69  t->iMem = dest.i
10020 4d 65 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 4d  Mem;.  pDest->nM
10030 65 6d 20 3d 20 64 65 73 74 2e 6e 4d 65 6d 3b 0a  em = dest.nMem;.
10040 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
10050 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74  elete(db, pDelet
10060 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
10070 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
10080 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
10090 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a  D_SELECT */../*.
100a0 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75  ** Code an outpu
100b0 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72  t subroutine for
100c0 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70   a coroutine imp
100d0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
100e0 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d  .** SELECT statm
100f0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ent..**.** The d
10100 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74  ata to be output
10110 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
10120 20 70 49 6e 2d 3e 69 4d 65 6d 2e 20 20 54 68 65   pIn->iMem.  The
10130 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e  re are.** pIn->n
10140 4d 65 6d 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62  Mem columns to b
10150 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74  e output.  pDest
10160 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75   is where the ou
10170 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  tput should.** b
10180 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65  e sent..**.** re
10190 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e  gReturn is the n
101a0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67  umber of the reg
101b0 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  ister holding th
101c0 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20  e subroutine.** 
101d0 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a  return address..
101e0 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76  **.** If regPrev
101f0 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  >0 then it is th
10200 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
10210 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61   in a vector tha
10220 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65  t.** records the
10230 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
10240 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20  .  mem[regPrev] 
10250 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  is a flag that i
10260 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68  s false.** if th
10270 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20  ere has been no 
10280 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e  previous output.
10290 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74    If regPrev>0 t
102a0 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67  hen code is.** g
102b0 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70 70  enerated to supp
102c0 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e  ress duplicates.
102d0 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73    pKeyInfo is us
102e0 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67  ed for comparing
102f0 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20  .** keys..**.** 
10300 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75  If the LIMIT fou
10310 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20  nd in p->iLimit 
10320 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70  is reached, jump
10330 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a   immediately to.
10340 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74  ** iBreak..*/.st
10350 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74  atic int generat
10360 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
10370 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
10380 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
10390 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
103a0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
103b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
103c0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
103d0 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ment */.  Select
103e0 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20  Dest *pIn,      
103f0 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73    /* Coroutine s
10400 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f  upplying data */
10410 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
10420 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68  Dest,      /* Wh
10430 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20  ere to send the 
10440 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65  data */.  int re
10450 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20  gReturn,        
10460 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
10470 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
10480 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65   */.  int regPre
10490 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v,            /*
104a0 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74   Previous result
104b0 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75   register.  No u
104c0 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a  niqueness if 0 *
104d0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
104e0 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46  yInfo,      /* F
104f0 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74  or comparing wit
10500 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  h previous entry
10510 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65   */.  int p4type
10520 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
10530 20 54 68 65 20 70 34 20 74 79 70 65 20 66 6f 72   The p4 type for
10540 20 70 4b 65 79 49 6e 66 6f 20 2a 2f 0a 20 20 69   pKeyInfo */.  i
10550 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20  nt iBreak       
10560 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
10570 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68  ere if we hit th
10580 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20  e LIMIT */.){.  
10590 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
105a0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
105b0 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20  Continue;.  int 
105c0 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20  addr;..  addr = 
105d0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
105e0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f  ntAddr(v);.  iCo
105f0 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
10600 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
10610 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
10620 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20   duplicates for 
10630 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61  UNION, EXCEPT, a
10640 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20  nd INTERSECT .  
10650 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76  */.  if( regPrev
10660 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20   ){.    int j1, 
10670 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c  j2;.    j1 = sql
10680 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10690 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50  , OP_IfNot, regP
106a0 72 65 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73  rev);.    j2 = s
106b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
106c0 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
106d0 70 49 6e 2d 3e 69 4d 65 6d 2c 20 72 65 67 50 72  pIn->iMem, regPr
106e0 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c  ev+1, pIn->nMem,
106f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
10710 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
10720 70 34 74 79 70 65 29 3b 0a 20 20 20 20 73 71 6c  p4type);.    sql
10730 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
10740 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c  , OP_Jump, j2+2,
10750 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b 32   iContinue, j2+2
10760 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
10770 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
10780 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
10790 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73  prCodeCopy(pPars
107a0 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 72 65  e, pIn->iMem, re
107b0 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 4d  gPrev+1, pIn->nM
107c0 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  em);.    sqlite3
107d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
107e0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67  _Integer, 1, reg
107f0 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Prev);.  }.  if(
10800 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
10810 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
10820 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  rn 0;..  /* Supp
10830 72 65 73 73 20 74 68 65 20 74 68 65 20 66 69 72  ress the the fir
10840 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65  st OFFSET entrie
10850 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  s if there is an
10860 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20   OFFSET clause. 
10870 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74   */.  codeOffset
10880 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
10890 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 44  );..  switch( pD
108a0 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20  est->eDest ){.  
108b0 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
108c0 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73  esult as data us
108d0 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79  ing a unique key
108e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
108f0 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
10900 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
10910 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab: {.      int 
10920 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
10930 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
10940 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73        int r2 = s
10950 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
10960 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
10970 74 65 73 74 63 61 73 65 28 20 70 44 65 73 74 2d  testcase( pDest-
10980 3e 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c  >eDest==SRT_Tabl
10990 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
109a0 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ase( pDest->eDes
109b0 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
109c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
109d0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
109e0 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e  _MakeRecord, pIn
109f0 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65  ->iMem, pIn->nMe
10a00 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  m, r1);.      sq
10a10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10a20 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
10a30 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72 32  pDest->iParm, r2
10a40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10a50 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
10a60 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e  _Insert, pDest->
10a70 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a  iParm, r1, r2);.
10a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10a90 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
10aa0 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
10ab0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
10ac0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
10ad0 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
10ae0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
10af0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
10b00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10b10 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
10b20 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
10b30 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
10b40 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
10b50 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
10b60 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
10b70 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
10b80 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
10b90 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
10ba0 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
10bb0 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
10bc0 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
10bd0 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
10be0 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
10bf0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
10c00 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _Set: {.      in
10c10 74 20 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65  t r1;.      asse
10c20 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31  rt( pIn->nMem==1
10c30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66   );.      p->aff
10c40 69 6e 69 74 79 20 3d 20 0a 20 20 20 20 20 20 20  inity = .       
10c50 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65    sqlite3Compare
10c60 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69  Affinity(p->pELi
10c70 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
10c80 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 29  pDest->affinity)
10c90 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
10ca0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
10cb0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
10cc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
10cd0 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
10ce0 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 2c 20  , pIn->iMem, 1, 
10cf0 72 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79  r1, &p->affinity
10d00 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
10d10 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
10d20 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
10d30 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 29  e, pIn->iMem, 1)
10d40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10d50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10d60 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74  IdxInsert, pDest
10d70 2d 3e 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20  ->iParm, r1);.  
10d80 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
10d90 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
10da0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
10db0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30  ak;.    }..#if 0
10dc0 20 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63 75 72    /* Never occur
10dd0 73 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20 42 59  s on an ORDER BY
10de0 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a   query */.    /*
10df0 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73   If any row exis
10e00 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  t in the result 
10e10 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74  set, record that
10e20 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e   fact and abort.
10e30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
10e40 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20   SRT_Exists: {. 
10e50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10e60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
10e70 65 67 65 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e  eger, 1, pDest->
10e80 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a  iParm);.      /*
10e90 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
10ea0 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
10eb0 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
10ec0 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
10ed0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
10ee0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
10ef0 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
10f00 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
10f10 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
10f20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
10f30 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
10f40 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
10f50 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
10f60 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a   break out.    *
10f70 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
10f80 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
10f90 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
10fa0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
10fb0 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20  ->nMem==1 );.   
10fc0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
10fd0 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
10fe0 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d  In->iMem, pDest-
10ff0 3e 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20  >iParm, 1);.    
11000 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
11010 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20  lause will jump 
11020 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
11030 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
11040 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
11050 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
11060 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
11070 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54  ERY */..    /* T
11080 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  he results are s
11090 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65  tored in a seque
110a0 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
110b0 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
110c0 20 61 74 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2e   at pDest->iMem.
110d0 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f    Then the co-ro
110e0 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20  utine yields..  
110f0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
11100 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20  T_Coroutine: {. 
11110 20 20 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e       if( pDest->
11120 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iMem==0 ){.     
11130 20 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d     pDest->iMem =
11140 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
11150 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
11160 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  ->nMem);.       
11170 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 70   pDest->nMem = p
11180 49 6e 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  In->nMem;.      
11190 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
111a0 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
111b0 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70  se, pIn->iMem, p
111c0 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 70 44 65 73  Dest->iMem, pDes
111d0 74 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20  t->nMem);.      
111e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
111f0 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
11200 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20  Dest->iParm);.  
11210 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11220 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65  ..    /* If none
11230 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74   of the above, t
11240 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64  hen the result d
11250 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20  estination must 
11260 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75  be.    ** SRT_Ou
11270 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74  tput.  This rout
11280 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
11290 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68  led with any oth
112a0 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e  er.    ** destin
112b0 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ation other than
112c0 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65   the ones handle
112d0 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f  d above or SRT_O
112e0 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  utput..    **.  
112f0 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74    ** For SRT_Out
11300 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65  put, results are
11310 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
11320 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
11330 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65  rs.  .    ** The
11340 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52  n the OP_ResultR
11350 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  ow opcode is use
11360 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74  d to cause sqlit
11370 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20  e3_step() to.   
11380 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e   ** return the n
11390 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  ext row of resul
113a0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  t..    */.    de
113b0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
113c0 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
113d0 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
113e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
113f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11400 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d  _ResultRow, pIn-
11410 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d  >iMem, pIn->nMem
11420 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11430 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
11440 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
11450 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e  pIn->iMem, pIn->
11460 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 62 72 65  nMem);.      bre
11470 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
11480 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
11490 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
114a0 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
114b0 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20  reached..  */.  
114c0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b  if( p->iLimit ){
114d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
114e0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a  AddOp3(v, OP_IfZ
114f0 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
11500 69 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d  iBreak, -1);.  }
11510 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
11520 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72  the subroutine r
11530 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c  eturn.  */.  sql
11540 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
11550 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75  abel(v, iContinu
11560 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
11570 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
11580 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29  turn, regReturn)
11590 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  ;..  return addr
115a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72  ;.}../*.** Alter
115b0 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20  native compound 
115c0 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65  select code gene
115d0 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20  rator for cases 
115e0 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73  when there.** is
115f0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
11600 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73  use..**.** We as
11610 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20  sume a query of 
11620 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
11630 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c  rm:.**.**      <
11640 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61  selectA>  <opera
11650 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20  tor>  <selectB> 
11660 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72   ORDER BY <order
11670 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f  bylist>.**.** <o
11680 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20  perator> is one 
11690 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e  of UNION ALL, UN
116a0 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20  ION, EXCEPT, or 
116b0 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65 20  INTERSECT.  The 
116c0 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f  idea.** is to co
116d0 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41  de both <selectA
116e0 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20  > and <selectB> 
116f0 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42  with the ORDER B
11700 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63  Y clause as.** c
11710 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65  o-routines.  The
11720 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75  n run the co-rou
11730 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65  tines in paralle
11740 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20  l and merge the 
11750 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20  results.** into 
11760 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20  the output.  In 
11770 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20  addition to the 
11780 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28  two coroutines (
11790 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61  called selectA a
117a0 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74  nd.** selectB) t
117b0 68 65 72 65 20 61 72 65 20 37 20 73 75 62 72 6f  here are 7 subro
117c0 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  utines:.**.**   
117d0 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74   outA:    Move t
117e0 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
117f0 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69   selectA corouti
11800 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ne into the outp
11810 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
11820 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e    of the compoun
11830 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  d query..**.**  
11840 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20    outB:    Move 
11850 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
11860 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74  e selectB corout
11870 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ine into the out
11880 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
11890 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75     of the compou
118a0 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79  nd query.  (Only
118b0 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55   generated for U
118c0 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20  NION and.**     
118d0 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
118e0 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20 49  L.  EXCEPT and I
118f0 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65 72 20  NSERTSECT never 
11900 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74 68 61  output a row tha
11910 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
11920 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e   appears only in
11930 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c   B.).**.**    Al
11940 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  tB:    Called wh
11950 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
11960 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
11970 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a  tines and A<B..*
11980 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20  *.**    AeqB:   
11990 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
119a0 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
119b0 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
119c0 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20  and A==B..**.** 
119d0 20 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c     AgtB:    Call
119e0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
119f0 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
11a00 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
11a10 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66  >B..**.**    Eof
11a20 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  A:    Called whe
11a30 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  n data is exhaus
11a40 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  ted from selectA
11a50 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a  ..**.**    EofB:
11a60 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
11a70 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
11a80 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a  d from selectB..
11a90 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  **.** The implem
11aa0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
11ab0 6c 61 74 74 65 72 20 66 69 76 65 20 73 75 62 72  latter five subr
11ac0 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f  outines depend o
11ad0 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65  n which .** <ope
11ae0 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a  rator> is used:.
11af0 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  **.**.**        
11b00 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20       UNION ALL  
11b10 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20         UNION    
11b20 20 20 20 20 20 20 20 20 45 58 43 45 50 54 20 20          EXCEPT  
11b30 20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45 43          INTERSEC
11b40 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d  T.**          --
11b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
11b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
11b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
11b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b90 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f  -.**   AltB:   o
11ba0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
11bb0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
11bc0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
11bd0 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a        nextA.**.*
11be0 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41  *   AeqB:   outA
11bf0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
11c00 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20 20  nextA           
11c10 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20    nextA         
11c20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a  outA, nextA.**.*
11c30 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42  *   AgtB:   outB
11c40 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74  , nextB      out
11c50 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20  B, nextB        
11c60 20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20    nextB         
11c70 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20     nextB.**.**  
11c80 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e   EofA:   outB, n
11c90 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20  extB      outB, 
11ca0 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 68  nextB          h
11cb0 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  alt             
11cc0 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66  halt.**.**   Eof
11cd0 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
11ce0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
11cf0 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  A       outA, ne
11d00 78 74 41 20 20 20 20 20 20 20 20 20 68 61 6c 74  xtA         halt
11d10 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c  .**.** In the Al
11d20 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67  tB, AeqB, and Ag
11d30 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20  tB subroutines, 
11d40 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c  an EOF on A foll
11d50 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63  owing nextA.** c
11d60 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61  auses an immedia
11d70 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20  te jump to EofA 
11d80 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20  and an EOF on B 
11d90 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20  following nextB 
11da0 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d  causes.** an imm
11db0 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45  ediate jump to E
11dc0 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66  ofB.  Within Eof
11dd0 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20  A and EofB, and 
11de0 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a  EOF on entry or.
11df0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78  ** following nex
11e00 74 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70  tX causes a jump
11e10 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
11e20 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73  he select proces
11e30 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c  sing..**.** Dupl
11e40 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e  icate removal in
11e50 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45   the UNION, EXCE
11e60 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43  PT, and INTERSEC
11e70 54 20 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c  T cases is handl
11e80 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ed.** within the
11e90 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
11ea0 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72 65 76  ne.  The regPrev
11eb0 20 72 65 67 69 73 74 65 72 20 73 65 74 20 68 6f   register set ho
11ec0 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  lds the previous
11ed0 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c  ly.** output val
11ee0 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f  ue.  A compariso
11ef0 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73  n is made agains
11f00 74 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64  t this value and
11f10 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69   the output.** i
11f20 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
11f30 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f   next results wo
11f40 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20  uld be the same 
11f50 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e  as the previous.
11f60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  .**.** The imple
11f70 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69  mentation plan i
11f80 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  s to implement t
11f90 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65  he two coroutine
11fa0 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73  s and seven.** s
11fb0 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74  ubroutines first
11fc0 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65 20 63  , then put the c
11fd0 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20  ontrol logic at 
11fe0 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b  the bottom.  Lik
11ff0 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
12000 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74         goto Init
12010 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72  .**     coA: cor
12020 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20  outine for left 
12030 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20  query (A).**    
12040 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20   coB: coroutine 
12050 66 6f 72 20 72 69 67 68 74 20 71 75 65 72 79 20  for right query 
12060 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20  (B).**    outA: 
12070 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f  output one row o
12080 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20  f A.**    outB: 
12090 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f  output one row o
120a0 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55  f B (UNION and U
120b0 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a  NION ALL only).*
120c0 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a  *    EofA: ....*
120d0 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a  *    EofB: ....*
120e0 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a  *    AltB: ....*
120f0 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a  *    AeqB: ....*
12100 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a  *    AgtB: ....*
12110 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69  *    Init: initi
12120 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20  alize coroutine 
12130 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20  registers.**    
12140 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a        yield coA.
12150 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
12160 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a  of(A) goto EofA.
12170 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  **          yiel
12180 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20  d coB.**        
12190 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f    if eof(B) goto
121a0 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72   EofB.**    Cmpr
121b0 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a  : Compare A, B.*
121c0 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20  *          Jump 
121d0 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42  AltB, AeqB, AgtB
121e0 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e  .**     End: ...
121f0 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41  .**.** We call A
12200 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c  ltB, AeqB, AgtB,
12210 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20   EofA, and EofB 
12220 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75  "subroutines" bu
12230 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a  t they are not.*
12240 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65  * actually calle
12250 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e  d using Gosub an
12260 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65  d they do not Re
12270 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20  turn.  EofA and 
12280 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74  EofB loop.** unt
12290 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65  il all data is e
122a0 78 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75  xhausted then ju
122b0 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20  mp to the "end" 
122c0 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71  labe.  AltB, Aeq
122d0 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a  B,.** and AgtB j
122e0 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32  ump to either L2
122f0 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f   or to one of Eo
12300 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23  fA or EofB..*/.#
12310 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12320 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
12330 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  CT.static int mu
12340 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
12350 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
12360 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
12370 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
12380 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
12390 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
123a0 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
123b0 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
123c0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
123d0 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
123e0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
123f0 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
12400 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
12410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
12420 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
12430 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
12440 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
12450 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
12460 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
12470 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
12480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
12490 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
124a0 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53  this VDBE */.  S
124b0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 41 3b  electDest destA;
124c0 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74       /* Destinat
124d0 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e  ion for coroutin
124e0 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  e A */.  SelectD
124f0 65 73 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f  est destB;     /
12500 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
12510 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f  r coroutine B */
12520 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b  .  int regAddrA;
12530 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
12540 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
12550 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
12560 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
12570 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 20 2f  EofA;          /
12580 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61  * Flag to indica
12590 74 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 41  te when select-A
125a0 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a   is complete */.
125b0 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20    int regAddrB; 
125c0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
125d0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
125e0 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69  select-B corouti
125f0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45  ne */.  int regE
12600 6f 66 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ofB;          /*
12610 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74   Flag to indicat
12620 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 42 20  e when select-B 
12630 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20  is complete */. 
12640 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41   int addrSelectA
12650 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
12660 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
12670 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
12680 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42   int addrSelectB
12690 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
126a0 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
126b0 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
126c0 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20   int regOutA;   
126d0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
126e0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
126f0 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
12700 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
12710 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20  regOutB;        
12720 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
12730 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
12740 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  tput-B subroutin
12750 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
12760 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  utA;         /* 
12770 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
12780 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
12790 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
127a0 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a  OutB = 0;     /*
127b0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
127c0 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
127d0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
127e0 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f  rEofA;         /
127f0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
12800 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73   select-A-exhaus
12810 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ted subroutine *
12820 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42  /.  int addrEofB
12830 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
12840 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
12850 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73  ct-B-exhausted s
12860 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
12870 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20  nt addrAltB;    
12880 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
12890 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f  of the A<B subro
128a0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
128b0 64 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20  ddrAeqB;        
128c0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
128d0 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69  he A==B subrouti
128e0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
128f0 41 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AgtB;         /*
12900 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
12910 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A>B subroutine *
12920 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
12930 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  A;        /* Lim
12940 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
12950 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
12960 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20  t regLimitB;    
12970 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67      /* Limit reg
12980 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
12990 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  -A */.  int regP
129a0 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  rev;          /*
129b0 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69   A range of regi
129c0 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72  sters to hold pr
129d0 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f  evious output */
129e0 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69  .  int savedLimi
129f0 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65  t;       /* Save
12a00 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c  d value of p->iL
12a10 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  imit */.  int sa
12a20 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20  vedOffset;      
12a30 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
12a40 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a  f p->iOffset */.
12a50 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b    int labelCmpr;
12a60 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
12a70 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f   for the start o
12a80 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f  f the merge algo
12a90 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c  rithm */.  int l
12aa0 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20  abelEnd;        
12ab0 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
12ac0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65  e end of the ove
12ad0 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74  rall SELECT stmt
12ae0 20 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20   */.  int j1;   
12af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
12b00 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ump instructions
12b10 20 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67   that get retarg
12b20 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  etted */.  int o
12b30 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
12b40 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c   /* One of TK_AL
12b50 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  L, TK_UNION, TK_
12b60 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52  EXCEPT, TK_INTER
12b70 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  SECT */.  KeyInf
12b80 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20  o *pKeyDup = 0; 
12b90 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  /* Comparison in
12ba0 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75  formation for du
12bb0 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
12bc0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
12bd0 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f  eyMerge;   /* Co
12be0 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61  mparison informa
12bf0 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67  tion for merging
12c00 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74   rows */.  sqlit
12c10 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
12c20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
12c30 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
12c40 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
12c50 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
12c60 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
12c70 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  nt nOrderBy;    
12c80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12c90 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  f terms in the O
12ca0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
12cb0 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74  /.  int *aPermut
12cc0 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70  e;        /* Map
12cd0 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20  ping from ORDER 
12ce0 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75  BY terms to resu
12cf0 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a  lt set columns *
12d00 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
12d10 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
12d20 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20 20  int iSub1;      
12d30 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
12d40 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65  of left-hand que
12d50 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  ry */.  int iSub
12d60 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  2;            /*
12d70 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74   EQP id of right
12d80 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23  -hand query */.#
12d90 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
12da0 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20   p->pOrderBy!=0 
12db0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
12dc0 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d  yDup==0 ); /* "M
12dd0 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65  anaged" code nee
12de0 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74  ds this.  Ticket
12df0 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20   #3382. */.  db 
12e00 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
12e10 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
12e20 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
12e30 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c  0 );       /* Al
12e40 72 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65  ready thrown the
12e50 20 65 72 72 6f 72 20 69 66 20 56 44 42 45 20 61   error if VDBE a
12e60 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20  lloc failed */. 
12e70 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69   labelEnd = sqli
12e80 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
12e90 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72  (v);.  labelCmpr
12ea0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
12eb0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20  keLabel(v);...  
12ec0 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68 65 20  /* Patch up the 
12ed0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
12ee0 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f    */.  op = p->o
12ef0 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20  p;  .  pPrior = 
12f00 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73  p->pPrior;.  ass
12f10 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72  ert( pPrior->pOr
12f20 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f  derBy==0 );.  pO
12f30 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
12f40 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20  erBy;.  assert( 
12f50 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f  pOrderBy );.  nO
12f60 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
12f70 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20  y->nExpr;..  /* 
12f80 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74  For operators ot
12f90 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41  her than UNION A
12fa0 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61  LL we have to ma
12fb0 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a  ke sure that.  *
12fc0 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  * the ORDER BY c
12fd0 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65 76 65  lause covers eve
12fe0 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72  ry term of the r
12ff0 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a  esult set.  Add.
13000 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68    ** terms to th
13010 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
13020 65 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  e as necessary..
13030 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54    */.  if( op!=T
13040 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72  K_ALL ){.    for
13050 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63  (i=1; db->malloc
13060 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d  Failed==0 && i<=
13070 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
13080 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
13090 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
130a0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
130b0 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
130c0 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e  pOrderBy->a; j<n
130d0 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49  OrderBy; j++, pI
130e0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
130f0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69  assert( pItem->i
13100 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Col>0 );.       
13110 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 6f 6c   if( pItem->iCol
13120 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==i ) break;.   
13130 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
13140 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ==nOrderBy ){.  
13150 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
13160 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
13170 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  b, TK_INTEGER, 0
13180 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
13190 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
131a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
131b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
131c0 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65  s |= EP_IntValue
131d0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
131e0 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20  u.iValue = i;.  
131f0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
13200 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
13210 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
13220 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a  OrderBy, pNew);.
13230 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
13240 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e  ->a[nOrderBy++].
13250 69 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20  iCol = (u16)i;. 
13260 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
13270 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
13280 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65  he comparison pe
13290 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65  rmutation and ke
132a0 79 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73  yinfo that is us
132b0 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65  ed with.  ** the
132c0 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65   permutation use
132d0 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
132e0 66 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20  f the next.  ** 
132f0 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63  row of results c
13300 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  omes from select
13310 41 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41  A or selectB.  A
13320 6c 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74  lso add explicit
13330 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73  .  ** collations
13340 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
13350 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f   clause terms so
13360 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73   that when the s
13370 75 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74  ubqueries.  ** t
13380 6f 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20  o the right and 
13390 74 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61  the left are eva
133a0 6c 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65  luated, they use
133b0 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a   the correct.  *
133c0 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a  * collation..  *
133d0 2f 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73  /.  aPermute = s
133e0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
133f0 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74  w(db, sizeof(int
13400 29 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 69  )*nOrderBy);.  i
13410 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20  f( aPermute ){. 
13420 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
13430 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
13440 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
13450 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
13460 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c  i<nOrderBy; i++,
13470 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
13480 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
13490 69 43 6f 6c 3e 30 20 20 26 26 20 70 49 74 65 6d  iCol>0  && pItem
134a0 2d 3e 69 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73  ->iCol<=p->pELis
134b0 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
134c0 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20    aPermute[i] = 
134d0 70 49 74 65 6d 2d 3e 69 43 6f 6c 20 2d 20 31 3b  pItem->iCol - 1;
134e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d  .    }.    pKeyM
134f0 65 72 67 65 20 3d 0a 20 20 20 20 20 20 73 71 6c  erge =.      sql
13500 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
13510 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79  db, sizeof(*pKey
13520 4d 65 72 67 65 29 2b 6e 4f 72 64 65 72 42 79 2a  Merge)+nOrderBy*
13530 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
13540 29 2b 31 29 29 3b 0a 20 20 20 20 69 66 28 20 70  )+1));.    if( p
13550 4b 65 79 4d 65 72 67 65 20 29 7b 0a 20 20 20 20  KeyMerge ){.    
13560 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f    pKeyMerge->aSo
13570 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
13580 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c  pKeyMerge->aColl
13590 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20 20  [nOrderBy];.    
135a0 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 6e 46 69    pKeyMerge->nFi
135b0 65 6c 64 20 3d 20 28 75 31 36 29 6e 4f 72 64 65  eld = (u16)nOrde
135c0 72 42 79 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d  rBy;.      pKeyM
135d0 65 72 67 65 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  erge->enc = ENC(
135e0 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  db);.      for(i
135f0 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
13600 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  i++){.        Co
13610 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
13620 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72        Expr *pTer
13630 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  m = pOrderBy->a[
13640 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
13650 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61    if( pTerm->fla
13660 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
13670 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
13680 70 43 6f 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70  pColl = pTerm->p
13690 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65  Coll;.        }e
136a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
136b0 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
136c0 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
136d0 2c 20 70 2c 20 61 50 65 72 6d 75 74 65 5b 69 5d  , p, aPermute[i]
136e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  );.          pTe
136f0 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  rm->flags |= EP_
13700 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  ExpCollate;.    
13710 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 43 6f        pTerm->pCo
13720 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  ll = pColl;.    
13730 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4b      }.        pK
13740 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69  eyMerge->aColl[i
13750 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
13760 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53     pKeyMerge->aS
13770 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f  ortOrder[i] = pO
13780 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
13790 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a  tOrder;.      }.
137a0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
137b0 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30     pKeyMerge = 0
137c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74  ;.  }..  /* Reat
137d0 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  tach the ORDER B
137e0 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  Y clause to the 
137f0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d  query..  */.  p-
13800 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
13810 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  erBy;.  pPrior->
13820 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
13830 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50  e3ExprListDup(pP
13840 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72  arse->db, pOrder
13850 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c  By, 0);..  /* Al
13860 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f  locate a range o
13870 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  f temporary regi
13880 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65  sters and the Ke
13890 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a  yInfo needed.  *
138a0 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20  * for the logic 
138b0 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70  that removes dup
138c0 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f  licate result ro
138d0 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a  ws when the.  **
138e0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49   operator is UNI
138f0 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
13900 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f  NTERSECT (but no
13910 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20  t UNION ALL)..  
13920 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
13930 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72  ALL ){.    regPr
13940 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ev = 0;.  }else{
13950 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  .    int nExpr =
13960 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
13970 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  r;.    assert( n
13980 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c  OrderBy>=nExpr |
13990 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
139a0 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65  ed );.    regPre
139b0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  v = sqlite3GetTe
139c0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
139d0 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20 20 73 71  nExpr+1);.    sq
139e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
139f0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
13a00 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20  , regPrev);.    
13a10 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65  pKeyDup = sqlite
13a20 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
13a30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13a40 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79      sizeof(*pKey
13a50 44 75 70 29 20 2b 20 6e 45 78 70 72 2a 28 73 69  Dup) + nExpr*(si
13a60 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
13a70 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  ) );.    if( pKe
13a80 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 70 4b  yDup ){.      pK
13a90 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65  eyDup->aSortOrde
13aa0 72 20 3d 20 28 75 38 2a 29 26 70 4b 65 79 44 75  r = (u8*)&pKeyDu
13ab0 70 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b  p->aColl[nExpr];
13ac0 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e  .      pKeyDup->
13ad0 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 45  nField = (u16)nE
13ae0 78 70 72 3b 0a 20 20 20 20 20 20 70 4b 65 79 44  xpr;.      pKeyD
13af0 75 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62  up->enc = ENC(db
13b00 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
13b10 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ; i<nExpr; i++){
13b20 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
13b30 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c  ->aColl[i] = mul
13b40 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
13b50 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
13b60 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
13b70 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
13b80 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
13b90 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61  .  }. .  /* Sepa
13ba0 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e  rate the left an
13bb0 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72  d the right quer
13bc0 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68  y from one anoth
13bd0 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72  er.  */.  p->pPr
13be0 69 6f 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ior = 0;.  sqlit
13bf0 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
13c00 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c  oupBy(pParse, p,
13c10 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f   p->pOrderBy, "O
13c20 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50  RDER");.  if( pP
13c30 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  rior->pPrior==0 
13c40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
13c50 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
13c60 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  y(pParse, pPrior
13c70 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  , pPrior->pOrder
13c80 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
13c90 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
13ca0 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
13cb0 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65  ers */.  compute
13cc0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
13cd0 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45  Parse, p, labelE
13ce0 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
13cf0 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41  imit && op==TK_A
13d00 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d  LL ){.    regLim
13d10 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itA = ++pParse->
13d20 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d  nMem;.    regLim
13d30 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itB = ++pParse->
13d40 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
13d50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13d60 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73  P_Copy, p->iOffs
13d70 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b  et ? p->iOffset+
13d80 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20  1 : p->iLimit,. 
13d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13db0 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20   regLimitA);.   
13dc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13dd0 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
13de0 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d  egLimitA, regLim
13df0 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  itB);.  }else{. 
13e00 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72     regLimitA = r
13e10 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20  egLimitB = 0;.  
13e20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
13e30 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
13e40 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  mit);.  p->pLimi
13e50 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
13e60 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
13e70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d  ->pOffset);.  p-
13e80 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  >pOffset = 0;.. 
13e90 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50   regAddrA = ++pP
13ea0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
13eb0 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73 65  gEofA = ++pParse
13ec0 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64  ->nMem;.  regAdd
13ed0 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rB = ++pParse->n
13ee0 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20 3d  Mem;.  regEofB =
13ef0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
13f00 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70  .  regOutA = ++p
13f10 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
13f20 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73  egOutB = ++pPars
13f30 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
13f40 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
13f50 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72  (&destA, SRT_Cor
13f60 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
13f70 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
13f80 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
13f90 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  B, SRT_Coroutine
13fa0 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20  , regAddrB);..  
13fb0 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20 74 68 65  /* Jump past the
13fc0 20 76 61 72 69 6f 75 73 20 73 75 62 72 6f 75 74   various subrout
13fd0 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75 74 69  ines and corouti
13fe0 6e 65 73 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a  nes to the main.
13ff0 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70 0a    ** merge loop.
14000 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c 69    */.  j1 = sqli
14010 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
14020 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64 64   OP_Goto);.  add
14030 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74  rSelectA = sqlit
14040 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
14050 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65 6e  r(v);...  /* Gen
14060 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
14070 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
14080 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
14090 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c  nt to the.  ** l
140a0 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  eft of the compo
140b0 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74  und operator - t
140c0 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20  he "A" select.. 
140d0 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
140e0 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
140f0 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
14100 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  eft SELECT"));. 
14110 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20   pPrior->iLimit 
14120 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65  = regLimitA;.  e
14130 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
14140 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
14150 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
14160 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
14170 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
14180 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74  &destA);.  sqlit
14190 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
141a0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
141b0 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74  egEofA);.  sqlit
141c0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
141d0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
141e0 72 41 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43  rA);.  VdbeNoopC
141f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20  omment((v, "End 
14200 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65  coroutine for le
14210 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20  ft SELECT"));.. 
14220 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63   /* Generate a c
14230 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c  oroutine to eval
14240 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  uate the SELECT 
14250 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20  statement on .  
14260 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20 74  ** the right - t
14270 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20  he "B" select.  
14280 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42  */.  addrSelectB
14290 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
142a0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
142b0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
142c0 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75  (v, "Begin corou
142d0 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53  tine for right S
142e0 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65  ELECT"));.  save
142f0 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  dLimit = p->iLim
14300 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65  it;.  savedOffse
14310 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
14320 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65    p->iLimit = re
14330 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f  gLimitB;.  p->iO
14340 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 65  ffset = 0;  .  e
14350 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
14360 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
14370 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
14380 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
14390 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
143a0 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  B);.  p->iLimit 
143b0 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20  = savedLimit;.  
143c0 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76  p->iOffset = sav
143d0 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69  edOffset;.  sqli
143e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
143f0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
14400 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69  regEofB);.  sqli
14410 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
14420 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
14430 64 72 42 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70  drB);.  VdbeNoop
14440 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64  Comment((v, "End
14450 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72   coroutine for r
14460 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  ight SELECT"));.
14470 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
14480 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
14490 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
144a0 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
144b0 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  A.  ** select as
144c0 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
144d0 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
144e0 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
144f0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
14500 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
14510 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29  routine for A"))
14520 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67  ;.  addrOutA = g
14530 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
14540 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
14550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14560 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73   p, &destA, pDes
14570 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20  t, regOutA,.    
14580 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
14590 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 50  Prev, pKeyDup, P
145a0 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
145b0 46 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  F, labelEnd);.  
145c0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
145d0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
145e0 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
145f0 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
14600 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  B.  ** select as
14610 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
14620 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
14630 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
14640 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
14650 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
14660 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f  ON ){.    VdbeNo
14670 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
14680 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
14690 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72  r B"));.    addr
146a0 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutB = generateO
146b0 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
146c0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
146d0 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
146e0 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tB, pDest, regOu
146f0 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tB,.            
14700 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
14710 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46  eyDup, P4_KEYINF
14720 4f 5f 53 54 41 54 49 43 2c 20 6c 61 62 65 6c 45  O_STATIC, labelE
14730 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  nd);.  }..  /* G
14740 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
14750 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e  tine to run when
14760 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
14770 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20  m select A.  ** 
14780 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e  are exhausted an
14790 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73  d only data in s
147a0 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e  elect B remains.
147b0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
147c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
147d0 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -A subroutine"))
147e0 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45  ;.  if( op==TK_E
147f0 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  XCEPT || op==TK_
14800 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
14810 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69   addrEofA = sqli
14820 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14830 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
14840 65 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  elEnd);.  }else{
14850 20 20 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20    .    addrEofA 
14860 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14870 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
14880 67 45 6f 66 42 2c 20 6c 61 62 65 6c 45 6e 64 29  gEofB, labelEnd)
14890 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
148a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
148b0 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64  sub, regOutB, ad
148c0 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 73 71 6c  drOutB);.    sql
148d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
148e0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
148f0 64 64 72 42 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddrB);.    sqlit
14900 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14910 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
14920 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53  EofA);.    p->nS
14930 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69  electRow += pPri
14940 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
14950 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
14960 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
14970 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
14980 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
14990 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65  ect B.  ** are e
149a0 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
149b0 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
149c0 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   A remains..  */
149d0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
149e0 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
149f0 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f  ddrEofB = addrEo
14a00 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  fA;.    if( p->n
14a10 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69  SelectRow > pPri
14a20 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
14a30 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
14a40 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
14a50 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  Row;.  }else{  .
14a60 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
14a70 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73  ent((v, "eof-B s
14a80 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
14a90 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c    addrEofB = sql
14aa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14ab0 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41  , OP_If, regEofA
14ac0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20  , labelEnd);.   
14ad0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14ae0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
14af0 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
14b00 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
14b10 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
14b20 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
14b30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14b40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
14b50 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29  to, 0, addrEofB)
14b60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
14b70 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
14b80 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
14b90 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A<B.  */.  VdbeN
14ba0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
14bb0 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-lt-B subroutin
14bc0 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42  e"));.  addrAltB
14bd0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14be0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
14bf0 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
14c00 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  utA);.  sqlite3V
14c10 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
14c20 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
14c30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
14c40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
14c50 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66  regEofA, addrEof
14c60 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
14c70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
14c80 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72  to, 0, labelCmpr
14c90 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
14ca0 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
14cb0 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d   the case of A==
14cc0 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  B.  */.  if( op=
14cd0 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61  =TK_ALL ){.    a
14ce0 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
14cf0 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  tB;.  }else if( 
14d00 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
14d10 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
14d20 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20   = addrAltB;.   
14d30 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d   addrAltB++;.  }
14d40 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f  else{.    VdbeNo
14d50 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
14d60 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -eq-B subroutine
14d70 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71  "));.    addrAeq
14d80 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56  B =.    sqlite3V
14d90 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
14da0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
14db0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14dc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
14dd0 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45  , regEofA, addrE
14de0 6f 66 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ofA);.    sqlite
14df0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14e00 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
14e10 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Cmpr);.  }..  /*
14e20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
14e30 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
14e40 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20  e of A>B.  */.  
14e50 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
14e60 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72  (v, "A-gt-B subr
14e70 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
14e80 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAgtB = sqlite3V
14e90 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
14ea0 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
14eb0 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
14ec0 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ION ){.    sqlit
14ed0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14ee0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
14ef0 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
14f00 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
14f10 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
14f20 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20  d, regAddrB);.  
14f30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14f40 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
14f50 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  ofB, addrEofB);.
14f60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14f70 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
14f80 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  0, labelCmpr);..
14f90 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72    /* This code r
14fa0 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74  uns once to init
14fb0 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e  ialize everythin
14fc0 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  g..  */.  sqlite
14fd0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
14fe0 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   j1);.  sqlite3V
14ff0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15000 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45  Integer, 0, regE
15010 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofA);.  sqlite3V
15020 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15030 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45  Integer, 0, regE
15040 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofB);.  sqlite3V
15050 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15060 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72 41 2c  Gosub, regAddrA,
15070 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20   addrSelectA);. 
15080 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15090 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
150a0 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 53 65  regAddrB, addrSe
150b0 6c 65 63 74 42 29 3b 0a 20 20 73 71 6c 69 74 65  lectB);.  sqlite
150c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
150d0 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61  P_If, regEofA, a
150e0 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69  ddrEofA);.  sqli
150f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15100 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c   OP_If, regEofB,
15110 20 61 64 64 72 45 6f 66 42 29 3b 0a 0a 20 20 2f   addrEofB);..  /
15120 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  * Implement the 
15130 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a  main merge loop.
15140 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
15150 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
15160 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
15170 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15180 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74  4(v, OP_Permutat
15190 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  ion, 0, 0, 0, (c
151a0 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50  har*)aPermute, P
151b0 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73  4_INTARRAY);.  s
151c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
151d0 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
151e0 64 65 73 74 41 2e 69 4d 65 6d 2c 20 64 65 73 74  destA.iMem, dest
151f0 42 2e 69 4d 65 6d 2c 20 6e 4f 72 64 65 72 42 79  B.iMem, nOrderBy
15200 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15210 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
15220 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f  *)pKeyMerge, P4_
15230 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
15240 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
15250 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
15260 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72  , addrAltB, addr
15270 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b  AeqB, addrAgtB);
15280 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74  ..  /* Release t
15290 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
152a0 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  rs.  */.  if( re
152b0 67 50 72 65 76 20 29 7b 0a 20 20 20 20 73 71 6c  gPrev ){.    sql
152c0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
152d0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
152e0 50 72 65 76 2c 20 6e 4f 72 64 65 72 42 79 2b 31  Prev, nOrderBy+1
152f0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  );.  }..  /* Jum
15300 70 20 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f  p to the this po
15310 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  int in order to 
15320 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75  terminate the qu
15330 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ery..  */.  sqli
15340 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
15350 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29  bel(v, labelEnd)
15360 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
15370 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
15380 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20   columns.  */.  
15390 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  if( pDest->eDest
153a0 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
153b0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
153c0 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  st = pPrior;.   
153d0 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
153e0 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
153f0 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
15400 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  ;.    generateCo
15410 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
15420 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  , 0, pFirst->pEL
15430 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
15440 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63  Reassembly the c
15450 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f  ompound query so
15460 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
15470 20 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79   freed correctly
15480 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  .  ** by the cal
15490 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ling function */
154a0 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
154b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
154c0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
154d0 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a  p->pPrior);.  }.
154e0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
154f0 72 69 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42  rior;..  /*** TB
15500 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f  D:  Insert subro
15510 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63  utine calls to c
15520 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  lose cursors on 
15530 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a  incomplete.  ***
15540 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a  * subqueries ***
15550 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70  */.  explainComp
15560 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d  osite(pParse, p-
15570 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62  >op, iSub1, iSub
15580 32 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  2, 0);.  return 
15590 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
155a0 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
155b0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
155c0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
155d0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
155e0 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72 64  VIEW)./* Forward
155f0 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   Declarations */
15600 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
15610 73 74 45 78 70 72 4c 69 73 74 28 73 71 6c 69 74  stExprList(sqlit
15620 65 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20  e3*, ExprList*, 
15630 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b  int, ExprList*);
15640 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
15650 73 74 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33  stSelect(sqlite3
15660 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74  *, Select *, int
15670 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a  , ExprList *);..
15680 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75  /*.** Scan throu
15690 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  gh the expressio
156a0 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63  n pExpr.  Replac
156b0 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63  e every referenc
156c0 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e  e to.** a column
156d0 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72   in table number
156e0 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63   iTable with a c
156f0 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75  opy of the iColu
15700 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69  mn-th.** entry i
15710 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20  n pEList.  (But 
15720 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73  leave references
15730 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f   to the ROWID co
15740 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  lumn .** unchang
15750 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ed.).**.** This 
15760 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20  routine is part 
15770 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e  of the flattenin
15780 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20  g procedure.  A 
15790 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73  subquery.** whos
157a0 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20  e result set is 
157b0 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73  defined by pELis
157c0 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74  t appears as ent
157d0 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f  ry in the.** FRO
157e0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
157f0 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74  LECT such that t
15800 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61  he VDBE cursor a
15810 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a  ssigned to that.
15820 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65  ** FORM clause e
15830 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20  ntry is iTable. 
15840 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
15850 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ke the necessary
15860 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
15870 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74  pExpr so that it
15880 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
15890 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74   to the source t
158a0 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73  able.** of the s
158b0 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74  ubquery rather t
158c0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
158d0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a   the subquery..*
158e0 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73  /.static Expr *s
158f0 75 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c 69  ubstExpr(.  sqli
15900 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
15910 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
15920 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73 20   errors to this 
15930 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
15940 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
15950 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77      /* Expr in w
15960 68 69 63 68 20 73 75 62 73 74 69 74 75 74 69 6f  hich substitutio
15970 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e  n occurs */.  in
15980 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
15990 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
159a0 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a   substituted */.
159b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
159c0 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  st    /* Substit
159d0 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ute expressions 
159e0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70  */.){.  if( pExp
159f0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
15a00 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
15a10 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
15a20 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Expr->iTable==iT
15a30 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20  able ){.    if( 
15a40 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
15a50 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
15a60 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
15a70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15a80 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Expr *pNew;.    
15a90 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
15aa0 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43  !=0 && pExpr->iC
15ab0 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45  olumn<pEList->nE
15ac0 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  xpr );.      ass
15ad0 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
15ae0 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
15af0 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
15b00 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
15b10 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 4c 69  ExprDup(db, pELi
15b20 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f  st->a[pExpr->iCo
15b30 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b  lumn].pExpr, 0);
15b40 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20  .      if( pNew 
15b50 26 26 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20  && pExpr->pColl 
15b60 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
15b70 3e 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e  >pColl = pExpr->
15b80 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  pColl;.      }. 
15b90 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15ba0 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
15bb0 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d  );.      pExpr =
15bc0 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d   pNew;.    }.  }
15bd0 65 6c 73 65 7b 0a 20 20 20 20 70 45 78 70 72 2d  else{.    pExpr-
15be0 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78  >pLeft = substEx
15bf0 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c  pr(db, pExpr->pL
15c00 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  eft, iTable, pEL
15c10 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  ist);.    pExpr-
15c20 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73 74 45  >pRight = substE
15c30 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  xpr(db, pExpr->p
15c40 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70  Right, iTable, p
15c50 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20  EList);.    if( 
15c60 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
15c70 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
15c80 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75  ect) ){.      su
15c90 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45  bstSelect(db, pE
15ca0 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  xpr->x.pSelect, 
15cb0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
15cc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15cd0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
15ce0 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  db, pExpr->x.pLi
15cf0 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
15d00 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  st);.    }.  }. 
15d10 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d   return pExpr;.}
15d20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
15d30 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71  stExprList(.  sq
15d40 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
15d50 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c     /* Report mal
15d60 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20  loc errors here 
15d70 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
15d80 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73  List,     /* Lis
15d90 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e  t to scan and in
15da0 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73   which to make s
15db0 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20  ubstitutes */.  
15dc0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
15dd0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
15de0 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20   be substituted 
15df0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
15e00 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62  EList     /* Sub
15e10 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a  stitute values *
15e20 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
15e30 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
15e40 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
15e50 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
15e60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73  ; i++){.    pLis
15e70 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20  t->a[i].pExpr = 
15e80 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c  substExpr(db, pL
15e90 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
15ea0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
15eb0 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
15ec0 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
15ed0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
15ee0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72          /* Repor
15ef0 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  t malloc errors 
15f00 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  here */.  Select
15f10 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *p,           /
15f20 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
15f30 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d  nt in which to m
15f40 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ake substitution
15f50 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  s */.  int iTabl
15f60 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
15f70 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61  able to be repla
15f80 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ced */.  ExprLis
15f90 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a  t *pEList     /*
15fa0 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75   Substitute valu
15fb0 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69  es */.){.  SrcLi
15fc0 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75  st *pSrc;.  stru
15fd0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
15fe0 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  *pItem;.  int i;
15ff0 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
16000 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  rn;.  substExprL
16010 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  ist(db, p->pELis
16020 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
16030 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  t);.  substExprL
16040 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75  ist(db, p->pGrou
16050 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  pBy, iTable, pEL
16060 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
16070 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72  rList(db, p->pOr
16080 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70  derBy, iTable, p
16090 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 48 61  EList);.  p->pHa
160a0 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72  ving = substExpr
160b0 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
160c0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
160d0 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20  ;.  p->pWhere = 
160e0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
160f0 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c  >pWhere, iTable,
16100 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
16110 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70  tSelect(db, p->p
16120 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70  Prior, iTable, p
16130 45 4c 69 73 74 29 3b 0a 20 20 70 53 72 63 20 3d  EList);.  pSrc =
16140 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
16150 72 74 28 20 70 53 72 63 20 29 3b 20 20 2f 2a 20  rt( pSrc );  /* 
16160 45 76 65 6e 20 66 6f 72 20 28 53 45 4c 45 43 54  Even for (SELECT
16170 20 31 29 20 77 65 20 68 61 76 65 3a 20 70 53 72   1) we have: pSr
16180 63 21 3d 30 20 62 75 74 20 70 53 72 63 2d 3e 6e  c!=0 but pSrc->n
16190 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28 20  Src==0 */.  if( 
161a0 41 4c 57 41 59 53 28 70 53 72 63 29 20 29 7b 0a  ALWAYS(pSrc) ){.
161b0 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e      for(i=pSrc->
161c0 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63  nSrc, pItem=pSrc
161d0 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
161e0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73  Item++){.      s
161f0 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
16200 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69  Item->pSelect, i
16210 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
16220 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
16230 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
16240 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
16250 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
16260 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
16270 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  W) */..#if !defi
16280 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
16290 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
162a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
162b0 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68  T_VIEW)./*.** Th
162c0 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
162d0 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73  pts to flatten s
162e0 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72 64  ubqueries in ord
162f0 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65  er to speed.** e
16300 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72 65  xecution.  It re
16310 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61  turns 1 if it ma
16320 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20  kes changes and 
16330 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69  0 if no flatteni
16340 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a  ng.** occurs..**
16350 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e  .** To understan
16360 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66  d the concept of
16370 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e   flattening, con
16380 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
16390 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a  ing.** query:.**
163a0 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
163b0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b   FROM (SELECT x+
163c0 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
163d0 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52  HERE z<100) WHER
163e0 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E a>5.**.** The 
163f0 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69  default way of i
16400 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73  mplementing this
16410 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65   query is to exe
16420 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71  cute the.** subq
16430 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73  uery first and s
16440 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
16450 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
16460 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72  table, then.** r
16470 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  un the outer que
16480 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f  ry on that tempo
16490 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69  rary table.  Thi
164a0 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a  s requires two.*
164b0 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68  * passes over th
164c0 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72  e data.  Further
164d0 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68  more, because th
164e0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
164f0 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69  e.** has no indi
16500 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63  ces, the WHERE c
16510 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74  lause on the out
16520 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  er query cannot 
16530 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e  be.** optimized.
16540 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
16550 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
16560 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20  rewrite queries 
16570 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76  such as the abov
16580 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  e into.** a sing
16590 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20  le flat select, 
165a0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
165b0 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20       SELECT x+y 
165c0 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
165d0 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35  RE z<100 AND a>5
165e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
165f0 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
16600 69 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e  is simpification
16610 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20   gives the same 
16620 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e  result.** but on
16630 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74  ly has to scan t
16640 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41  he data once.  A
16650 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63  nd because indic
16660 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69  es might .** exi
16670 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  st on the table 
16680 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73  t1, a complete s
16690 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20  can of the data 
166a0 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69  might be.** avoi
166b0 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74  ded..**.** Flatt
166c0 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74  ening is only at
166d0 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f  tempted if all o
166e0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
166f0 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
16700 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75    (1)  The subqu
16710 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
16720 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
16730 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74  oth use aggregat
16740 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20  es..**.**   (2) 
16750 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
16760 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
16770 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  e or the outer q
16780 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
16790 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20  in..**.**   (3) 
167a0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
167b0 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f   not the right o
167c0 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74  perand of a left
167d0 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20   outer join.**  
167e0 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61 6c 6c        (Originall
167f0 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e 20 20  y ticket #306.  
16800 53 74 72 65 6e 67 74 68 65 6e 65 64 20 62 79 20  Strengthened by 
16810 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a 2a 2a  ticket #3300).**
16820 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
16830 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
16840 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20  ISTINCT..**.**  
16850 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69  (**)  At one poi
16860 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  nt restrictions 
16870 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66 69  (4) and (5) defi
16880 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66 20  ned a subset of 
16890 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20  DISTINCT.**     
168a0 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20 74     sub-queries t
168b0 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64 65  hat were exclude
168c0 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69  d from this opti
168d0 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69  mization. Restri
168e0 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20  ction .**       
168f0 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20 62   (4) has since b
16900 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20  een expanded to 
16910 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54  exclude all DIST
16920 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73 2e  INCT subqueries.
16930 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68  .**.**   (6)  Th
16940 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
16950 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
16960 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
16970 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20  query is not.** 
16980 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e         DISTINCT.
16990 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68  .**.**   (7)  Th
169a0 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61  e subquery has a
169b0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
169c0 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73  .**   (8)  The s
169d0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
169e0 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
169f0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
16a00 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
16a10 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75  **   (9)  The su
16a20 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
16a30 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
16a40 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
16a50 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
16a60 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
16a70 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65  **.**  (10)  The
16a80 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
16a90 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
16aa0 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
16ab0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  uery does not.**
16ac0 20 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49          use LIMI
16ad0 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20  T..**.**  (11)  
16ae0 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
16af0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
16b00 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76   do not both hav
16b10 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
16b20 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  es..**.**  (**) 
16b30 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64   Not implemented
16b40 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f  .  Subsumed into
16b50 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29   restriction (3)
16b60 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c  .  Was previousl
16b70 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65  y.**        a se
16b80 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74 69  parate restricti
16b90 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d  on deriving from
16ba0 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a   ticket #350..**
16bb0 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73  .**  (13)  The s
16bc0 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65  ubquery and oute
16bd0 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
16be0 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a  oth use LIMIT..*
16bf0 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20  *.**  (14)  The 
16c00 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
16c10 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a  t use OFFSET..**
16c20 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f  .**  (15)  The o
16c30 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
16c40 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  t part of a comp
16c50 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74  ound select or t
16c60 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  he.**        sub
16c70 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68  query does not h
16c80 61 76 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  ave a LIMIT clau
16c90 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53  se..**        (S
16ca0 65 65 20 74 69 63 6b 65 74 20 23 32 33 33 39 20  ee ticket #2339 
16cb0 61 6e 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38  and ticket [02a8
16cc0 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20  e81d44])..**.** 
16cd0 20 28 31 36 29 20 20 54 68 65 20 6f 75 74 65 72   (16)  The outer
16ce0 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e   query is not an
16cf0 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68   aggregate or th
16d00 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a  e subquery does.
16d10 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f  **        not co
16d20 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20  ntain ORDER BY. 
16d30 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29 20   (Ticket #2942) 
16d40 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f   This used to no
16d50 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20  t matter.**     
16d60 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72     until we intr
16d70 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75 70  oduced the group
16d80 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69  _concat() functi
16d90 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37  on.  .**.**  (17
16da0 29 20 20 54 68 65 20 73 75 62 2d 71 75 65 72 79  )  The sub-query
16db0 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75   is not a compou
16dc0 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72 20 69 74  nd select, or it
16dd0 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   is a UNION ALL 
16de0 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f  .**        compo
16df0 75 6e 64 20 63 6c 61 75 73 65 20 6d 61 64 65 20  und clause made 
16e00 75 70 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e  up entirely of n
16e10 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65  on-aggregate que
16e20 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20  ries, and .**   
16e30 20 20 20 20 20 74 68 65 20 70 61 72 65 6e 74 20       the parent 
16e40 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
16e50 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 69        * is not i
16e60 74 73 65 6c 66 20 70 61 72 74 20 6f 66 20 61 20  tself part of a 
16e70 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
16e80 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69  .**          * i
16e90 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
16ea0 74 65 20 6f 72 20 44 49 53 54 49 4e 43 54 20 71  te or DISTINCT q
16eb0 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  uery, and.**    
16ec0 20 20 20 20 20 20 2a 20 68 61 73 20 6e 6f 20 6f        * has no o
16ed0 74 68 65 72 20 74 61 62 6c 65 73 20 6f 72 20 73  ther tables or s
16ee0 75 62 2d 73 65 6c 65 63 74 73 20 69 6e 20 74 68  ub-selects in th
16ef0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
16f00 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20  *.**        The 
16f10 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71  parent and sub-q
16f20 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e  uery may contain
16f30 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20   WHERE clauses. 
16f40 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20  Subject to.**   
16f50 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c       rules (11),
16f60 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20   (13) and (14), 
16f70 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f  they may also co
16f80 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a  ntain ORDER BY,.
16f90 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20  **        LIMIT 
16fa0 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73  and OFFSET claus
16fb0 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20  es..**.**  (18) 
16fc0 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
16fd0 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
16fe0 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c  select, then all
16ff0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
17000 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 62 79          ORDER by
17010 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 70   clause of the p
17020 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73 69  arent must be si
17030 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20  mple references 
17040 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f  to .**        co
17050 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75 62  lumns of the sub
17060 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28  -query..**.**  (
17070 31 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  19)  The subquer
17080 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
17090 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
170a0 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
170b0 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20  .**        have 
170c0 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  a WHERE clause..
170d0 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20  **.**  (20)  If 
170e0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
170f0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
17100 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  ct, then it must
17110 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
17120 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63     an ORDER BY c
17130 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23  lause.  Ticket #
17140 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20  3773.  We could 
17150 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74  relax this const
17160 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  raint.**        
17170 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79 69  somewhat by sayi
17180 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72 6d  ng that the term
17190 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
171a0 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a  Y clause must.**
171b0 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20 61          appear a
171c0 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73  s unmodified res
171d0 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  ult columns in t
171e0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
171f0 20 42 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 68   But.**        h
17200 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69  ave other optimi
17210 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20  zations in mind 
17220 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61  to deal with tha
17230 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  t case..**.**  (
17240 32 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  21)  The subquer
17250 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
17260 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
17270 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a  r query is not.*
17280 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
17290 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74 20  T.  (See ticket 
172a0 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a  [752e1646fc])..*
172b0 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75  *.** In this rou
172c0 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61  tine, the "p" pa
172d0 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
172e0 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65  nter to the oute
172f0 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20  r query..** The 
17300 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70  subquery is p->p
17310 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20  Src->a[iFrom].  
17320 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66  isAgg is true if
17330 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
17340 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61  .** uses aggrega
17350 74 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79  tes and subquery
17360 49 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66  IsAgg is true if
17370 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
17380 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  es aggregates..*
17390 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  *.** If flatteni
173a0 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  ng is not attemp
173b0 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ted, this routin
173c0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64  e is a no-op and
173d0 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49   returns 0..** I
173e0 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
173f0 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72  attempted this r
17400 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31  outine returns 1
17410 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74  ..**.** All of t
17420 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
17430 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75  alysis must occu
17440 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75  r on both the ou
17450 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a  ter query and.**
17460 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65   the subquery be
17470 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
17480 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  e runs..*/.stati
17490 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62  c int flattenSub
174a0 71 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  query(.  Parse *
174b0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
174c0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
174d0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
174e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
174f0 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65  e parent or oute
17500 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
17510 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  nt */.  int iFro
17520 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m,           /* 
17530 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63  Index in p->pSrc
17540 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e  ->a[] of the inn
17550 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  er subquery */. 
17560 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20   int isAgg,     
17570 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
17580 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73   outer SELECT us
17590 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
175a0 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ctions */.  int 
175b0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 20 20  subqueryIsAgg   
175c0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
175d0 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67  subquery uses ag
175e0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
175f0 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  s */.){.  const 
17600 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68  char *zSavedAuth
17610 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65  Context = pParse
17620 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  ->zAuthContext;.
17630 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e    Select *pParen
17640 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  t;.  Select *pSu
17650 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b;       /* The 
17660 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22  inner query or "
17670 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53  subquery" */.  S
17680 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20  elect *pSub1;   
17690 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
176a0 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73   the rightmost s
176b0 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65  elect in sub-que
176c0 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
176d0 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54  *pSrc;      /* T
176e0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
176f0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
17700 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
17710 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68  pSubSrc;   /* Th
17720 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
17730 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
17740 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
17750 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65  st;    /* The re
17760 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
17770 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
17780 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
17790 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72       /* VDBE cur
177a0 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
177b0 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65  e pSub result se
177c0 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a  t temp table */.
177d0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
177e0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
177f0 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20  unter */.  Expr 
17800 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
17810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17820 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
17830 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
17840 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74  ist_item *pSubit
17850 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62  em;   /* The sub
17860 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
17870 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
17880 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  >db;..  /* Check
17890 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74   to see if flatt
178a0 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
178b0 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ed.  Return 0 if
178c0 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   not..  */.  ass
178d0 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
178e0 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72  ssert( p->pPrior
178f0 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c  ==0 );  /* Unabl
17900 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d  e to flatten com
17910 70 6f 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f  pound queries */
17920 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  .  if( db->flags
17930 20 26 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46   & SQLITE_QueryF
17940 6c 61 74 74 65 6e 65 72 20 29 20 72 65 74 75 72  lattener ) retur
17950 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  n 0;.  pSrc = p-
17960 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
17970 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d   pSrc && iFrom>=
17980 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d  0 && iFrom<pSrc-
17990 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69  >nSrc );.  pSubi
179a0 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
179b0 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74  From];.  iParent
179c0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75   = pSubitem->iCu
179d0 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70  rsor;.  pSub = p
179e0 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
179f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
17a00 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41  !=0 );.  if( isA
17a10 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49 73  gg && subqueryIs
17a20 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20  Agg ) return 0; 
17a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a40 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
17a50 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73 75 62  1)  */.  if( sub
17a60 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53  queryIsAgg && pS
17a70 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74  rc->nSrc>1 ) ret
17a80 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
17a90 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
17aa0 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53 72 63  2)  */.  pSubSrc
17ab0 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20   = pSub->pSrc;. 
17ac0 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63   assert( pSubSrc
17ad0 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74   );.  /* Prior t
17ae0 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c  o version 3.1.2,
17af0 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
17b00 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65  OFFSET had to be
17b10 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74   simple constant
17b20 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69  s,.  ** not arbi
17b30 74 72 61 72 79 20 65 78 70 72 65 73 73 73 69 6f  trary expresssio
17b40 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73  ns, we allowed s
17b50 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66  ome combining of
17b60 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
17b70 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74  T.  ** because t
17b80 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d  hey could be com
17b90 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  puted at compile
17ba0 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e  -time.  But when
17bb0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
17bc0 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72  T.  ** became ar
17bd0 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69  bitrary expressi
17be0 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72  ons, we were for
17bf0 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72  ced to add restr
17c00 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a  ictions (13).  *
17c10 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20  * and (14). */. 
17c20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
17c30 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29  t && p->pLimit )
17c40 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
17c50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
17c60 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20  iction (13) */. 
17c70 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73   if( pSub->pOffs
17c80 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  et ) return 0;  
17c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ca0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
17cb0 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20  iction (14) */. 
17cc0 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f   if( p->pRightmo
17cd0 73 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d  st && pSub->pLim
17ce0 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  it ){.    return
17cf0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
17d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17d20 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
17d30 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  5) */.  }.  if( 
17d40 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  pSubSrc->nSrc==0
17d50 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
17d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d70 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
17d80 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (7)  */.  if( 
17d90 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
17da0 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72   SF_Distinct ) r
17db0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
17dc0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
17dd0 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (5)  */.  if( 
17de0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
17df0 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c  (pSrc->nSrc>1 ||
17e00 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20   isAgg) ){.     
17e10 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
17e20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
17e30 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a  s (8)(9) */.  }.
17e40 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
17e50 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
17e60 29 21 3d 30 20 26 26 20 73 75 62 71 75 65 72 79  )!=0 && subquery
17e70 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 72 65  IsAgg ){.     re
17e80 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
17e90 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
17ea0 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  6)  */.  }.  if(
17eb0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20   p->pOrderBy && 
17ec0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
17ed0 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
17ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
17f10 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a  striction (11) *
17f20 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67  /.  }.  if( isAg
17f30 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  g && pSub->pOrde
17f40 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20  rBy ) return 0; 
17f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17f60 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
17f70 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  6) */.  if( pSub
17f80 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70  ->pLimit && p->p
17f90 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
17fa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
17fb0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
17fc0 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  9) */.  if( pSub
17fd0 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e  ->pLimit && (p->
17fe0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
17ff0 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20  stinct)!=0 ){.  
18000 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
18010 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
18020 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a  ion (21) */.  }.
18030 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20 43  .  /* OBSOLETE C
18040 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20 52  OMMENT 1:.  ** R
18050 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49  estriction 3:  I
18060 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
18070 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73  s a join, make s
18080 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ure the subquery
18090 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73   is .  ** not us
180a0 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20  ed as the right 
180b0 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75  operand of an ou
180c0 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70  ter join.  Examp
180d0 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a  les of why this.
180e0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f    ** is not allo
180f0 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
18100 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
18110 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f  UTER JOIN (t2 JO
18120 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a  IN t3).  **.  **
18130 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
18140 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
18150 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
18160 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
18170 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
18180 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20   JOIN t3.  **.  
18190 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20  ** which is not 
181a0 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20  at all the same 
181b0 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  thing..  **.  **
181c0 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
181d0 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69  T 2:.  ** Restri
181e0 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68  ction 12:  If th
181f0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  e subquery is th
18200 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
18210 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a  of a left outer.
18220 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20    ** join, make 
18230 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
18240 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
18250 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65  lause..  ** An e
18260 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
18270 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  his is not allow
18280 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
18290 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
182a0 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54  TER JOIN (SELECT
182b0 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   * FROM t2 WHERE
182c0 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20   t2.x>0).  **.  
182d0 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
182e0 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
182f0 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
18300 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
18310 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
18320 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a  2) WHERE t2.x>0.
18330 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68    **.  ** But th
18340 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69  e t2.x>0 test wi
18350 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f  ll always fail o
18360 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20  n a NULL row of 
18370 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65  t2, which.  ** e
18380 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65  ffectively conve
18390 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f  rts the OUTER JO
183a0 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52  IN into an INNER
183b0 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   JOIN..  **.  **
183c0 20 54 48 49 53 20 4f 56 45 52 52 49 44 45 53 20   THIS OVERRIDES 
183d0 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54  OBSOLETE COMMENT
183e0 53 20 31 20 41 4e 44 20 32 20 41 42 4f 56 45 3a  S 1 AND 2 ABOVE:
183f0 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 33 33  .  ** Ticket #33
18400 30 30 20 73 68 6f 77 73 20 74 68 61 74 20 66 6c  00 shows that fl
18410 61 74 74 65 6e 69 6e 67 20 74 68 65 20 72 69 67  attening the rig
18420 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46  ht term of a LEF
18430 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20 66  T JOIN.  ** is f
18440 72 61 75 67 68 74 20 77 69 74 68 20 64 61 6e 67  raught with dang
18450 65 72 2e 20 20 42 65 73 74 20 74 6f 20 61 76 6f  er.  Best to avo
18460 69 64 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69  id the whole thi
18470 6e 67 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a  ng.  If the.  **
18480 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
18490 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
184a0 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e   LEFT JOIN, then
184b0 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e   do not flatten.
184c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75  .  */.  if( (pSu
184d0 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  bitem->jointype 
184e0 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29  & JT_OUTER)!=0 )
184f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
18500 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69    }..  /* Restri
18510 63 74 69 6f 6e 20 31 37 3a 20 49 66 20 74 68 65  ction 17: If the
18520 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
18530 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c  compound SELECT,
18540 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20   then it must.  
18550 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20  ** use only the 
18560 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
18570 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20  or. And none of 
18580 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63  the simple selec
18590 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74  t queries.  ** t
185a0 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20  hat make up the 
185b0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
185c0 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62  are allowed to b
185d0 65 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 64  e aggregate or d
185e0 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65  istinct.  ** que
185f0 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ries..  */.  if(
18600 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b   pSub->pPrior ){
18610 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
18620 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
18630 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52   return 0;  /* R
18640 65 73 74 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f  estriction 20 */
18650 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
18660 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46  sAgg || (p->selF
18670 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
18680 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e  ct)!=0 || pSrc->
18690 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  nSrc!=1 ){.     
186a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
186b0 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70  .    for(pSub1=p
186c0 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62  Sub; pSub1; pSub
186d0 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29  1=pSub1->pPrior)
186e0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
186f0 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
18700 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
18710 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
18720 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  ==SF_Distinct );
18730 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18740 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
18750 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
18760 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
18770 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b  =SF_Aggregate );
18780 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62  .      if( (pSub
18790 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
187a0 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
187b0 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20 20 20  gregate))!=0.   
187c0 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70      || (pSub1->p
187d0 50 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e  Prior && pSub1->
187e0 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20  op!=TK_ALL) .   
187f0 20 20 20 20 7c 7c 20 4e 45 56 45 52 28 70 53 75      || NEVER(pSu
18800 62 31 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20  b1->pSrc==0) || 
18810 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72  pSub1->pSrc->nSr
18820 63 21 3d 31 0a 20 20 20 20 20 20 29 7b 0a 20 20  c!=1.      ){.  
18830 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
18840 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
18850 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
18860 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28  n 18. */.    if(
18870 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
18880 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
18890 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
188a0 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  <p->pOrderBy->nE
188b0 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  xpr; ii++){.    
188c0 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
188d0 72 42 79 2d 3e 61 5b 69 69 5d 2e 69 43 6f 6c 3d  rBy->a[ii].iCol=
188e0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
188f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18900 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65  ..  /***** If we
18910 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
18920 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  t, flattening is
18930 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a   permitted. ****
18940 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69  */..  /* Authori
18950 7a 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ze the subquery 
18960 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  */.  pParse->zAu
18970 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62  thContext = pSub
18980 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73  item->zName;.  s
18990 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
189a0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
189b0 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b  ELECT, 0, 0, 0);
189c0 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  .  pParse->zAuth
189d0 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64  Context = zSaved
189e0 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  AuthContext;..  
189f0 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  /* If the sub-qu
18a00 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
18a10 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
18a20 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73  nt, then (by res
18a30 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31  trictions.  ** 1
18a40 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20  7 and 18 above) 
18a50 69 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49  it must be a UNI
18a60 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70  ON ALL and the p
18a70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74  arent query must
18a80 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65   .  ** be of the
18a90 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   form:.  **.  **
18aa0 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70       SELECT <exp
18ab0 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73  r-list> FROM (<s
18ac0 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72  ub-query>) <wher
18ad0 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a  e-clause> .  **.
18ae0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79    ** followed by
18af0 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c   any ORDER BY, L
18b00 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53  IMIT and/or OFFS
18b10 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73  ET clauses. This
18b20 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61   block.  ** crea
18b30 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f  tes N-1 copies o
18b40 66 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  f the parent que
18b50 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f  ry without any O
18b60 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f  RDER BY, LIMIT o
18b70 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63  r .  ** OFFSET c
18b80 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73  lauses and joins
18b90 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66   them to the lef
18ba0 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74  t-hand-side of t
18bb0 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  he original.  **
18bc0 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c   using UNION ALL
18bd0 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74   operators. In t
18be0 68 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68  his case N is th
18bf0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70  e number of simp
18c00 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73  le.  ** select s
18c10 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65  tatements in the
18c20 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75   compound sub-qu
18c30 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ery..  **.  ** E
18c40 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
18c50 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31  *     SELECT a+1
18c60 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20   FROM (.  **    
18c70 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
18c80 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20  M tab.  **      
18c90 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
18ca0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79          SELECT y
18cb0 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
18cc0 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
18cd0 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
18ce0 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d  CT abs(z*2) FROM
18cf0 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29   tab2.  **     )
18d00 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45   WHERE a!=5 ORDE
18d10 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a  R BY 1.  **.  **
18d20 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   Transformed int
18d30 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
18d40 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d   SELECT x+1 FROM
18d50 20 74 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d   tab WHERE x+1!=
18d60 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e  5.  **     UNION
18d70 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45   ALL.  **     SE
18d80 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61  LECT y+1 FROM ta
18d90 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20  b WHERE y+1!=5. 
18da0 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c   **     UNION AL
18db0 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  L.  **     SELEC
18dc0 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f  T abs(z*2)+1 FRO
18dd0 4d 20 74 61 62 32 20 57 48 45 52 45 20 61 62 73  M tab2 WHERE abs
18de0 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20  (z*2)+1!=5.  ** 
18df0 20 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20      ORDER BY 1. 
18e00 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c   **.  ** We call
18e10 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f   this the "compo
18e20 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61  und-subquery fla
18e30 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20  ttening"..  */. 
18e40 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e   for(pSub=pSub->
18e50 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53  pPrior; pSub; pS
18e60 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
18e70 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e  {.    Select *pN
18e80 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  ew;.    ExprList
18e90 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
18ea0 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78  pOrderBy;.    Ex
18eb0 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  pr *pLimit = p->
18ec0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65  pLimit;.    Sele
18ed0 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ct *pPrior = p->
18ee0 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70  pPrior;.    p->p
18ef0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
18f00 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20   p->pSrc = 0;.  
18f10 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
18f20 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
18f30 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73   0;.    pNew = s
18f40 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
18f50 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70  db, p, 0);.    p
18f60 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
18f70 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  t;.    p->pOrder
18f80 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
18f90 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72     p->pSrc = pSr
18fa0 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54  c;.    p->op = T
18fb0 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70 2d 3e 70 52  K_ALL;.    p->pR
18fc0 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20  ightmost = 0;.  
18fd0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
18fe0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 50  .      pNew = pP
18ff0 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rior;.    }else{
19000 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72  .      pNew->pPr
19010 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
19020 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74      pNew->pRight
19030 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  most = 0;.    }.
19040 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
19050 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 64 62  pNew;.    if( db
19060 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
19070 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
19080 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74    /* Begin flatt
19090 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d  ening the iFrom-
190a0 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  th entry of the 
190b0 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a  FROM clause .  *
190c0 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  * in the outer q
190d0 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75  uery..  */.  pSu
190e0 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62  b = pSub1 = pSub
190f0 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a  item->pSelect;..
19100 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
19110 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
19120 73 74 72 75 63 74 75 72 65 20 61 73 73 6f 63 69  structure associ
19130 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
19140 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f  ** subquery.  */
19150 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
19160 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
19170 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c  Database);.  sql
19180 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
19190 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  Subitem->zName);
191a0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
191b0 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
191c0 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74  Alias);.  pSubit
191d0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
191e0 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  0;.  pSubitem->z
191f0 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62  Name = 0;.  pSub
19200 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30  item->zAlias = 0
19210 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  ;.  pSubitem->pS
19220 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  elect = 0;..  /*
19230 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20   Defer deleting 
19240 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
19250 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
19260 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
19270 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65  ry until code ge
19280 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  neration is.  **
19290 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65   complete, since
192a0 20 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c   there may still
192b0 20 65 78 69 73 74 20 45 78 70 72 2e 70 54 61 62   exist Expr.pTab
192c0 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20   entries that.  
192d0 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  ** refer to the 
192e0 73 75 62 71 75 65 72 79 20 65 76 65 6e 20 61 66  subquery even af
192f0 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20  ter flattening. 
19300 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20   Ticket #3346.. 
19310 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65   **.  ** pSubite
19320 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79  m->pTab is alway
19330 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65  s non-NULL by te
19340 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  st restrictions 
19350 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e  and tests above.
19360 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41  .  */.  if( ALWA
19370 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  YS(pSubitem->pTa
19380 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62  b!=0) ){.    Tab
19390 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20  le *pTabToDel = 
193a0 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a  pSubitem->pTab;.
193b0 20 20 20 20 69 66 28 20 70 54 61 62 54 6f 44 65      if( pTabToDe
193c0 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20  l->nRef==1 ){.  
193d0 20 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c      Parse *pTopl
193e0 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
193f0 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
19400 73 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62 54  se);.      pTabT
19410 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69  oDel->pNextZombi
19420 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70  e = pToplevel->p
19430 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20  ZombieTab;.     
19440 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d   pToplevel->pZom
19450 62 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f 44  bieTab = pTabToD
19460 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  el;.    }else{. 
19470 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
19480 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  nRef--;.    }.  
19490 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62    pSubitem->pTab
194a0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
194b0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f  The following lo
194c0 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  op runs once for
194d0 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20   each term in a 
194e0 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
194f0 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e  y.  ** flattenin
19500 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64 20  g (as described 
19510 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61  above).  If we a
19520 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65  re doing a diffe
19530 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f  rent kind.  ** o
19540 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61  f flattening - a
19550 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65   flattening othe
19560 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e  r than a compoun
19570 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
19580 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65  ening -.  ** the
19590 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79  n this loop only
195a0 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a   runs once..  **
195b0 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
195c0 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65  moves all of the
195d0 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f   FROM elements o
195e0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
195f0 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  nto the.  ** the
19600 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
19610 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
19620 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74    Before doing t
19630 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20  his, remember.  
19640 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  ** the cursor nu
19650 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69  mber for the ori
19660 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72  ginal outer quer
19670 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69  y FROM element i
19680 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20  n.  ** iParent. 
19690 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72   The iParent cur
196a0 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  sor will never b
196b0 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75  e used.  Subsequ
196c0 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69  ent code.  ** wi
196d0 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69  ll scan expressi
196e0 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ons looking for 
196f0 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63  iParent referenc
19700 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20  es and replace. 
19710 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65   ** those refere
19720 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73  nces with expres
19730 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c  sions that resol
19740 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  ve to the subque
19750 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65  ry FROM.  ** ele
19760 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77  ments we are now
19770 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a   copying in..  *
19780 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d  /.  for(pParent=
19790 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72  p; pParent; pPar
197a0 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72  ent=pParent->pPr
197b0 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e  ior, pSub=pSub->
197c0 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74  pPrior){.    int
197d0 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38   nSubSrc;.    u8
197e0 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
197f0 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75     pSubSrc = pSu
19800 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  b->pSrc;     /* 
19810 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73  FROM clause of s
19820 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e  ubquery */.    n
19830 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63  SubSrc = pSubSrc
19840 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62  ->nSrc;  /* Numb
19850 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73  er of terms in s
19860 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61  ubquery FROM cla
19870 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20  use */.    pSrc 
19880 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b  = pParent->pSrc;
19890 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
198a0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
198b0 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69   query */..    i
198c0 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20  f( pSrc ){.     
198d0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
198e0 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74  ==p );  /* First
198f0 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68   time through th
19900 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
19910 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69  jointype = pSubi
19920 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20  tem->jointype;. 
19930 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19940 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21  assert( pParent!
19950 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e  =p );  /* 2nd an
19960 64 20 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d  d subsequent tim
19970 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  es through the l
19980 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72  oop */.      pSr
19990 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  c = pParent->pSr
199a0 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
199b0 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20  stAppend(db, 0, 
199c0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
199d0 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   pSrc==0 ){.    
199e0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
199f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
19a00 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
19a10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
19a20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
19a30 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20  y uses a single 
19a40 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  slot of the FROM
19a50 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
19a60 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72  uter.    ** quer
19a70 79 2e 20 20 49 66 20 74 68 65 20 73 75 62 71 75  y.  If the subqu
19a80 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61  ery has more tha
19a90 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e  n one element in
19aa0 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65   its FROM clause
19ab0 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78  ,.    ** then ex
19ac0 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71  pand the outer q
19ad0 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61  uery to make spa
19ae0 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c  ce for it to hol
19af0 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20  d all elements. 
19b00 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62     ** of the sub
19b10 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20  query..    **.  
19b20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
19b30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53    **.    **    S
19b40 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62  ELECT * FROM tab
19b50 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  A, (SELECT * FRO
19b60 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74  M sub1, sub2), t
19b70 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  abB;.    **.    
19b80 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  ** The outer que
19b90 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69  ry has 3 slots i
19ba0 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73  n its FROM claus
19bb0 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20  e.  One slot of 
19bc0 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
19bd0 20 71 75 65 72 79 20 28 74 68 65 20 6d 69 64 64   query (the midd
19be0 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64  le slot) is used
19bf0 20 62 79 20 74 68 65 20 73 75 62 71 75 65 72 79   by the subquery
19c00 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20  .  The next.    
19c10 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ** block of code
19c20 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65   will expand the
19c30 20 6f 75 74 20 71 75 65 72 79 20 74 6f 20 34 20   out query to 4 
19c40 73 6c 6f 74 73 2e 20 20 54 68 65 20 6d 69 64 64  slots.  The midd
19c50 6c 65 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69  le.    ** slot i
19c60 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77  s expanded to tw
19c70 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72  o slots in order
19c80 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
19c90 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 77  or the.    ** tw
19ca0 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  o elements in th
19cb0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
19cc0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
19cd0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53     */.    if( nS
19ce0 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  ubSrc>1 ){.     
19cf0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
19d00 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53   pSrc = sqlite3S
19d10 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
19d20 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d  , pSrc, nSubSrc-
19d30 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20  1,iFrom+1);.    
19d40 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
19d50 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
19d60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
19d70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
19d80 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d  ransfer the FROM
19d90 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72   clause terms fr
19da0 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20  om the subquery 
19db0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
19dc0 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
19dd0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
19de0 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29   i<nSubSrc; i++)
19df0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
19e00 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
19e10 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
19e20 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20  .pUsing);.      
19e30 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
19e40 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d   = pSubSrc->a[i]
19e50 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
19e60 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30  pSubSrc->a[i], 0
19e70 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63  , sizeof(pSubSrc
19e80 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a  ->a[i]));.    }.
19e90 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f      pSrc->a[iFro
19ea0 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f  m].jointype = jo
19eb0 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f  intype;.  .    /
19ec0 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73  * Now begin subs
19ed0 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72  tituting subquer
19ee0 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70  y result set exp
19ef0 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20  ressions for .  
19f00 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20    ** references 
19f10 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69  to the iParent i
19f20 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
19f30 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  y..    ** .    *
19f40 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
19f50 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43  *.    **   SELEC
19f60 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d  T a+5, b*10 FROM
19f70 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20   (SELECT x*3 AS 
19f80 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f  a, y+10 AS b FRO
19f90 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b  M t1) WHERE a>b;
19fa0 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20  .    **   \     
19fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fc0 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73  \_____________ s
19fd0 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  ubquery ________
19fe0 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20  __/          /. 
19ff0 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f     **    \______
1a000 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20  _______________ 
1a010 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f  outer query ____
1a020 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1a030 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20  __________/.    
1a040 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f  **.    ** We loo
1a050 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65  k at every expre
1a060 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74  ssion in the out
1a070 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65  er query and eve
1a080 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a  ry place we see.
1a090 20 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75      ** "a" we su
1a0a0 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61  bstitute "x*3" a
1a0b0 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
1a0c0 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62  e see "b" we sub
1a0d0 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a  stitute "y+10"..
1a0e0 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74      */.    pList
1a0f0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69   = pParent->pELi
1a100 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  st;.    for(i=0;
1a110 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
1a120 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
1a130 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
1a140 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
1a150 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70   const char *zSp
1a160 61 6e 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  an = pList->a[i]
1a170 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20  .zSpan;.        
1a180 69 66 28 20 41 4c 57 41 59 53 28 7a 53 70 61 6e  if( ALWAYS(zSpan
1a190 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
1a1a0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1a1b0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
1a1c0 75 70 28 64 62 2c 20 7a 53 70 61 6e 29 3b 0a 20  up(db, zSpan);. 
1a1d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1a1e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73 74  .    }.    subst
1a1f0 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61  ExprList(db, pPa
1a200 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c 20 69 50  rent->pEList, iP
1a210 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1a220 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 69 73  ist);.    if( is
1a230 41 67 67 20 29 7b 0a 20 20 20 20 20 20 73 75 62  Agg ){.      sub
1a240 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
1a250 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79  Parent->pGroupBy
1a260 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
1a270 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
1a280 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1a290 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1a2a0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1a2b0 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
1a2c0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  ->pEList);.    }
1a2d0 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
1a2e0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1a2f0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
1a300 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
1a310 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1a320 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d  pOrderBy = pSub-
1a330 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
1a340 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1a350 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
1a360 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  f( pParent->pOrd
1a370 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 75  erBy ){.      su
1a380 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1a390 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
1a3a0 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
1a3b0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  ->pEList);.    }
1a3c0 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
1a3d0 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 70  Where ){.      p
1a3e0 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
1a3f0 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  xprDup(db, pSub-
1a400 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20  >pWhere, 0);.   
1a410 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57   }else{.      pW
1a420 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  here = 0;.    }.
1a430 20 20 20 20 69 66 28 20 73 75 62 71 75 65 72 79      if( subquery
1a440 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20 61  IsAgg ){.      a
1a450 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1a460 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20  pHaving==0 );.  
1a470 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
1a480 76 69 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e  ving = pParent->
1a490 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50  pWhere;.      pP
1a4a0 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
1a4b0 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50  pWhere;.      pP
1a4c0 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d  arent->pHaving =
1a4d0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1a4e0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c  Parent->pHaving,
1a4f0 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
1a500 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  pEList);.      p
1a510 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20  Parent->pHaving 
1a520 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
1a530 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48  (db, pParent->pH
1a540 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20 20 20  aving, .        
1a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a560 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1a570 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75  3ExprDup(db, pSu
1a580 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 29 3b  b->pHaving, 0));
1a590 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a5a0 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79  Parent->pGroupBy
1a5b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
1a5c0 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20 3d  rent->pGroupBy =
1a5d0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1a5e0 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 47  Dup(db, pSub->pG
1a5f0 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20 20  roupBy, 0);.    
1a600 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
1a610 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73  rent->pWhere = s
1a620 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
1a630 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 69 50  rent->pWhere, iP
1a640 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1a650 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
1a660 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  ent->pWhere = sq
1a670 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
1a680 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
1a690 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d  , pWhere);.    }
1a6a0 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  .  .    /* The f
1a6b0 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69  lattened query i
1a6c0 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69  s distinct if ei
1a6d0 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f  ther the inner o
1a6e0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  r the.    ** out
1a6f0 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74  er query is dist
1a700 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  inct. .    */.  
1a710 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c    pParent->selFl
1a720 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c  ags |= pSub->sel
1a730 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1a740 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20  nct;.  .    /*. 
1a750 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e     ** SELECT ...
1a760 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
1a770 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54  . LIMIT a OFFSET
1a780 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53   b) LIMIT x OFFS
1a790 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  ET y;.    **.   
1a7a0 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74   ** One is tempt
1a7b0 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64  ed to try to add
1a7c0 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62   a and b to comb
1a7d0 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20  ine the limits. 
1a7e0 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a   But this.    **
1a7f0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69   does not work i
1a800 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69  f either limit i
1a810 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20  s negative..    
1a820 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
1a830 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >pLimit ){.     
1a840 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74   pParent->pLimit
1a850 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b   = pSub->pLimit;
1a860 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69  .      pSub->pLi
1a870 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  mit = 0;.    }. 
1a880 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c   }..  /* Finiall
1a890 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69  y, delete what i
1a8a0 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75  s left of the su
1a8b0 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72  bquery and retur
1a8c0 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a  n.  ** success..
1a8d0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65    */.  sqlite3Se
1a8e0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1a8f0 53 75 62 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Sub1);..  return
1a900 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
1a910 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1a920 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1a930 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1a940 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
1a950 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74  ./*.** Analyze t
1a960 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1a970 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ent passed as an
1a980 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65   argument to see
1a990 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 6d   if it.** is a m
1a9a0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
1a9b0 65 72 79 2e 20 52 65 74 75 72 6e 20 57 48 45 52  ery. Return WHER
1a9c0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72  E_ORDERBY_MIN or
1a9d0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
1a9e0 41 58 20 69 66 20 0a 2a 2a 20 69 74 20 69 73 2c  AX if .** it is,
1a9f0 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e   or 0 otherwise.
1aa00 20 41 74 20 70 72 65 73 65 6e 74 2c 20 61 20 71   At present, a q
1aa10 75 65 72 79 20 69 73 20 63 6f 6e 73 69 64 65 72  uery is consider
1aa20 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 6d 69  ed to be.** a mi
1aa30 6e 28 29 2f 6d 61 78 28 29 20 71 75 65 72 79 20  n()/max() query 
1aa40 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54  if:.**.**   1. T
1aa50 68 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65  here is a single
1aa60 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 46   object in the F
1aa70 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
1aa80 2a 20 20 20 32 2e 20 54 68 65 72 65 20 69 73 20  *   2. There is 
1aa90 61 20 73 69 6e 67 6c 65 20 65 78 70 72 65 73 73  a single express
1aaa0 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ion in the resul
1aab0 74 20 73 65 74 2c 20 61 6e 64 20 69 74 20 69 73  t set, and it is
1aac0 0a 2a 2a 20 20 20 20 20 20 65 69 74 68 65 72 20  .**      either 
1aad0 6d 69 6e 28 78 29 20 6f 72 20 6d 61 78 28 78 29  min(x) or max(x)
1aae0 2c 20 77 68 65 72 65 20 78 20 69 73 20 61 20 63  , where x is a c
1aaf0 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 2e  olumn reference.
1ab00 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69  .*/.static u8 mi
1ab10 6e 4d 61 78 51 75 65 72 79 28 53 65 6c 65 63 74  nMaxQuery(Select
1ab20 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 45   *p){.  Expr *pE
1ab30 78 70 72 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  xpr;.  ExprList 
1ab40 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c  *pEList = p->pEL
1ab50 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 4c 69  ist;..  if( pELi
1ab60 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
1ab70 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45  eturn WHERE_ORDE
1ab80 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70 45  RBY_NORMAL;.  pE
1ab90 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  xpr = pEList->a[
1aba0 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  0].pExpr;.  if( 
1abb0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
1abc0 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74  G_FUNCTION ) ret
1abd0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56  urn 0;.  if( NEV
1abe0 45 52 28 45 78 70 72 48 61 73 50 72 6f 70 65 72  ER(ExprHasProper
1abf0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
1ac00 53 65 6c 65 63 74 29 29 20 29 20 72 65 74 75 72  Select)) ) retur
1ac10 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  n 0;.  pEList = 
1ac20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
1ac30 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
1ac40 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  || pEList->nExpr
1ac50 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
1ac60 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
1ac70 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  0].pExpr->op!=TK
1ac80 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  _AGG_COLUMN ) re
1ac90 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  turn WHERE_ORDER
1aca0 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 61 73 73  BY_NORMAL;.  ass
1acb0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1acc0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1acd0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 69  IntValue) );.  i
1ace0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1acf0 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
1ad00 6e 2c 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20  n,"min")==0 ){. 
1ad10 20 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f     return WHERE_
1ad20 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d  ORDERBY_MIN;.  }
1ad30 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
1ad40 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75  StrICmp(pExpr->u
1ad50 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 78 22 29 3d 3d  .zToken,"max")==
1ad60 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1ad70 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
1ad80 58 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  X;.  }.  return 
1ad90 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
1ada0 52 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  RMAL;.}../*.** T
1adb0 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
1adc0 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
1add0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1ade0 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
1adf0 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
1ae00 65 63 6f 6e 64 20 61 72 67 6d 65 6e 74 20 69 73  econd argment is
1ae10 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
1ae20 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f  aggregate-info o
1ae30 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20  bject. This .** 
1ae40 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69  function tests i
1ae50 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20  f the SELECT is 
1ae60 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
1ae70 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
1ae80 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
1ae90 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c  **.** where tabl
1aea0 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  e is a database 
1aeb0 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62  table, not a sub
1aec0 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
1aed0 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a   If the query.**
1aee0 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73   does match this
1aef0 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61   pattern, then a
1af00 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1af10 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70  Table object rep
1af20 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62  resenting.** <tb
1af30 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  l> is returned. 
1af40 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20  Otherwise, 0 is 
1af50 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1af60 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d  tic Table *isSim
1af70 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20  pleCount(Select 
1af80 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  *p, AggInfo *pAg
1af90 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20  gInfo){.  Table 
1afa0 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70  *pTab;.  Expr *p
1afb0 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Expr;..  assert(
1afc0 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b   !p->pGroupBy );
1afd0 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  ..  if( p->pWher
1afe0 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  e || p->pEList->
1aff0 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20  nExpr!=1 .   || 
1b000 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  p->pSrc->nSrc!=1
1b010 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30   || p->pSrc->a[0
1b020 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20  ].pSelect.  ){. 
1b030 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1b040 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  .  pTab = p->pSr
1b050 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
1b060 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
1b070 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
1b080 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
1b090 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20   !pTab->pSelect 
1b0a0 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69  && pExpr );..  i
1b0b0 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
1b0c0 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  b) ) return 0;. 
1b0d0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
1b0e0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
1b0f0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1b100 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  ( (pAggInfo->aFu
1b110 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 6c 61  nc[0].pFunc->fla
1b120 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  gs&SQLITE_FUNC_C
1b130 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72  OUNT)==0 ) retur
1b140 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
1b150 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69  ->flags&EP_Disti
1b160 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  nct ) return 0;.
1b170 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
1b180 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
1b190 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d  source-list item
1b1a0 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
1b1b0 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65  gument was augme
1b1c0 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20  nted with an.** 
1b1d0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
1b1e0 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c  e, then try to l
1b1f0 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66  ocate the specif
1b200 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ied index. If th
1b210 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20  ere.** was such 
1b220 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  a clause and the
1b230 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e   named index can
1b240 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  not be found, re
1b250 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
1b260 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20  ERROR and leave 
1b270 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
1b280 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70  se. Otherwise, p
1b290 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f  opulate .** pFro
1b2a0 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65  m->pIndex and re
1b2b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
1b2c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
1b2d0 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61  dexedByLookup(Pa
1b2e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
1b2f0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1b300 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
1b310 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70  pFrom->pTab && p
1b320 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a  From->zIndex ){.
1b330 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
1b340 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
1b350 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 20     char *zIndex 
1b360 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b  = pFrom->zIndex;
1b370 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
1b380 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
1b390 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20  Tab->pIndex; .  
1b3a0 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73 71        pIdx && sq
1b3b0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 64  lite3StrICmp(pId
1b3c0 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78  x->zName, zIndex
1b3d0 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  ); .        pIdx
1b3e0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20  =pIdx->pNext.   
1b3f0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64   );.    if( !pId
1b400 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  x ){.      sqlit
1b410 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1b420 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
1b430 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c 20  x: %s", zIndex, 
1b440 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
1b450 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
1b460 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1b470 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1b480 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70    }.    pFrom->p
1b490 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20  Index = pIdx;.  
1b4a0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1b4b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1b4c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1b4d0 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
1b4e0 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22   for "expanding"
1b4f0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
1b500 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69  ent..** "Expandi
1b510 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20  ng" means to do 
1b520 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
1b530 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b  *.**    (1)  Mak
1b540 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73  e sure VDBE curs
1b550 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
1b560 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
1b570 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20   every.**       
1b580 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65    element of the
1b590 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
1b5a0 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c  .**    (2)  Fill
1b5b0 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
1b5c0 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64  ->a[].pTab field
1b5d0 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  s in the SrcList
1b5e0 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20   that .**       
1b5f0 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63    defines FROM c
1b600 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65  lause.  When vie
1b610 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ws appear in the
1b620 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a   FROM clause,.**
1b630 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54           fill pT
1b640 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c  abList->a[].pSel
1b650 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20  ect with a copy 
1b660 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
1b670 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
1b680 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e     that implemen
1b690 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20  ts the view.  A 
1b6a0 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
1b6b0 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43  the view's SELEC
1b6c0 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61  T.**         sta
1b6d0 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77  tement so that w
1b6e0 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64  e can freely mod
1b6f0 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68  ify or delete th
1b700 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  at statement.** 
1b710 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20          without 
1b720 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d  worrying about m
1b730 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 72  essing up the pr
1b740 65 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65  esistent represe
1b750 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  ntation.**      
1b760 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a     of the view..
1b770 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64  **.**    (3)  Ad
1b780 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57  d terms to the W
1b790 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61  HERE clause to a
1b7a0 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41  ccomodate the NA
1b7b0 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a  TURAL keyword.**
1b7c0 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e           on join
1b7d0 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64  s and the ON and
1b7e0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
1b7f0 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   joins..**.**   
1b800 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c   (4)  Scan the l
1b810 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ist of columns i
1b820 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
1b830 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e   (pEList) lookin
1b840 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72  g.**         for
1b850 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
1b860 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f  e "*" operator o
1b870 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70  r the TABLE.* op
1b880 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20  erator..**      
1b890 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70     If found, exp
1b8a0 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20  and each "*" to 
1b8b0 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
1b8c0 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a  in every table.*
1b8d0 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41  *         and TA
1b8e0 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72  BLE.* to be ever
1b8f0 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c  y column in TABL
1b900 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  E..**.*/.static 
1b910 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64  int selectExpand
1b920 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  er(Walker *pWalk
1b930 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
1b940 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
1b950 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
1b960 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  e;.  int i, j, k
1b970 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
1b980 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
1b990 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72  t *pEList;.  str
1b9a0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1b9b0 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74   *pFrom;.  sqlit
1b9c0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1b9d0 3e 64 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e  >db;..  if( db->
1b9e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b  mallocFailed  ){
1b9f0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
1ba00 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28  Abort;.  }.  if(
1ba10 20 4e 45 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d   NEVER(p->pSrc==
1ba20 30 29 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61  0) || (p->selFla
1ba30 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64  gs & SF_Expanded
1ba40 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
1ba50 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
1ba60 7d 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  }.  p->selFlags 
1ba70 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a  |= SF_Expanded;.
1ba80 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
1ba90 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
1baa0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f   p->pEList;..  /
1bab0 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73  * Make sure curs
1bac0 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
1bad0 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
1bae0 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a   all entries in.
1baf0 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
1bb00 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45  ause of the SELE
1bb10 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
1bb20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  */.  sqlite3SrcL
1bb30 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
1bb40 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
1bb50 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75  t);..  /* Look u
1bb60 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61  p every table na
1bb70 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
1bb80 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65  clause of the se
1bb90 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61  lect.  If.  ** a
1bba0 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  n entry of the F
1bbb0 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20  ROM clause is a 
1bbc0 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64  subquery instead
1bbd0 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76   of a table or v
1bbe0 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63  iew,.  ** then c
1bbf0 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e  reate a transien
1bc00 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  t table structur
1bc10 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  e to describe th
1bc20 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f  e subquery..  */
1bc30 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f  .  for(i=0, pFro
1bc40 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
1bc50 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
1bc60 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
1bc70 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
1bc80 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
1bc90 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20  pTab!=0 ){.     
1bca0 20 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65   /* This stateme
1bcb0 6e 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  nt has already b
1bcc0 65 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54  een prepared.  T
1bcd0 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
1bce0 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66        ** to go f
1bcf0 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20  urther. */.     
1bd00 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b   assert( i==0 );
1bd10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
1bd20 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20  C_Prune;.    }. 
1bd30 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e     if( pFrom->zN
1bd40 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  ame==0 ){.#ifnde
1bd50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1bd60 42 51 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c  BQUERY.      Sel
1bd70 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
1bd80 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
1bd90 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
1bda0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1bdb0 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
1bdc0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1bdd0 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20   pSel!=0 );.    
1bde0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
1bdf0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
1be00 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
1be10 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
1be20 6c 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d  l);.      pFrom-
1be30 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
1be40 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1be50 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
1be60 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ble));.      if(
1be70 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
1be80 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
1be90 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20     pTab->nRef = 
1bea0 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  1;.      pTab->z
1beb0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
1bec0 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74  rintf(db, "sqlit
1bed0 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c  e_subquery_%p_",
1bee0 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20   (void*)pTab);. 
1bef0 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c       while( pSel
1bf00 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c  ->pPrior ){ pSel
1bf10 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
1bf20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 43   }.      selectC
1bf30 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
1bf40 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  st(pParse, pSel-
1bf50 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e  >pEList, &pTab->
1bf60 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
1bf70 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  l);.      pTab->
1bf80 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20  iPKey = -1;.    
1bf90 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20    pTab->nRowEst 
1bfa0 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 20 20 20  = 1000000;.     
1bfb0 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
1bfc0 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b  |= TF_Ephemeral;
1bfd0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
1bfe0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f  e{.      /* An o
1bff0 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72  rdinary table or
1c000 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68   view name in th
1c010 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
1c020 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c030 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
1c040 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
1c050 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20  ab = pTab = .   
1c060 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61       sqlite3Loca
1c070 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 30  teTable(pParse,0
1c080 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46  ,pFrom->zName,pF
1c090 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  rom->zDatabase);
1c0a0 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
1c0b0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
1c0c0 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61  Abort;.      pTa
1c0d0 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21  b->nRef++;.#if !
1c0e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1c0f0 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
1c100 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d  fined (SQLITE_OM
1c110 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
1c120 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
1c130 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69  >pSelect || IsVi
1c140 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
1c150 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61         /* We rea
1c160 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e  ch here if the n
1c170 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20  amed table is a 
1c180 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f  really a view */
1c190 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1c1a0 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
1c1b0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
1c1c0 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52  Tab) ) return WR
1c1d0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20  C_Abort;.       
1c1e0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
1c1f0 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20  pSelect==0 );.  
1c200 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65        pFrom->pSe
1c210 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
1c220 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
1c230 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
1c240 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
1c250 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
1c260 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  , pFrom->pSelect
1c270 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
1c280 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
1c290 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  Locate the index
1c2a0 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e   named by the IN
1c2b0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
1c2c0 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
1c2d0 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
1c2e0 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73  edByLookup(pPars
1c2f0 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
1c300 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
1c310 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ort;.    }.  }..
1c320 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
1c330 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
1c340 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
1c350 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
1c360 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
1c370 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
1c380 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
1c390 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  in(pParse, p) ){
1c3a0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
1c3b0 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Abort;.  }..  /*
1c3c0 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
1c3d0 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
1c3e0 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
1c3f0 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
1c400 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
1c410 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
1c420 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72  s.  And for ever
1c430 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74  y TABLE.* insert
1c440 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
1c450 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
1c460 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61  n TABLE.  The pa
1c470 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20  rser inserted a 
1c480 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
1c490 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  on.  ** with the
1c4a0 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72   TK_ALL operator
1c4b0 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68   for each "*" th
1c4c0 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74  at it found in t
1c4d0 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a  he column list..
1c4e0 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
1c4f0 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73  ng code just has
1c500 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54   to locate the T
1c510 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e  K_ALL expression
1c520 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a  s and expand.  *
1c530 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68  * each one to th
1c540 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f  e list of all co
1c550 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
1c560 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
1c570 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75  he first loop ju
1c580 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
1c590 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
1c5a0 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a  y "*" operators.
1c5b0 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65    ** that need e
1c5c0 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  xpanding..  */. 
1c5d0 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
1c5e0 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
1c5f0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20  .    Expr *pE = 
1c600 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78  pEList->a[k].pEx
1c610 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  pr;.    if( pE->
1c620 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65  op==TK_ALL ) bre
1c630 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ak;.    assert( 
1c640 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
1c650 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20  | pE->pRight!=0 
1c660 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1c670 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
1c680 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26   (pE->pLeft!=0 &
1c690 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
1c6a0 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69  =TK_ID) );.    i
1c6b0 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
1c6c0 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  T && pE->pRight-
1c6d0 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
1c6e0 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b  eak;.  }.  if( k
1c6f0 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
1c700 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
1c710 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
1c720 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
1c730 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
1c740 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
1c750 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
1c760 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
1c770 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
1c780 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
1c790 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
1c7a0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
1c7b0 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
1c7c0 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
1c7d0 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
1c7e0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
1c7f0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
1c800 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
1c810 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c   = 0;.    int fl
1c820 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ags = pParse->db
1c830 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74  ->flags;.    int
1c840 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c   longNames = (fl
1c850 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
1c860 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20  lColNames)!=0.  
1c870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c880 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20      && (flags & 
1c890 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
1c8a0 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66  ames)==0;..    f
1c8b0 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
1c8c0 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
1c8d0 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
1c8e0 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
1c8f0 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
1c900 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
1c910 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
1c920 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54     if( pE->op!=T
1c930 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70  K_ALL && (pE->op
1c940 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
1c950 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41  pRight->op!=TK_A
1c960 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  LL) ){.        /
1c970 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
1c980 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  r expression doe
1c990 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
1c9a0 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20   expanded..     
1c9b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e     */.        pN
1c9c0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
1c9d0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
1c9e0 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45  e, pNew, a[k].pE
1c9f0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
1ca00 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
1ca10 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
1ca20 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
1ca30 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20   = a[k].zName;. 
1ca40 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
1ca50 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
1ca60 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70  zSpan = a[k].zSp
1ca70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b  an;.          a[
1ca80 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  k].zName = 0;.  
1ca90 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70          a[k].zSp
1caa0 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  an = 0;.        
1cab0 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70  }.        a[k].p
1cac0 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
1cad0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
1cae0 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  * This expressio
1caf0 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20  n is a "*" or a 
1cb00 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65  "TABLE.*" and ne
1cb10 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20  eds to be.      
1cb20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a    ** expanded. *
1cb30 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61  /.        int ta
1cb40 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20  bleSeen = 0;    
1cb50 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68    /* Set to 1 wh
1cb60 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73  en TABLE matches
1cb70 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
1cb80 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20   *zTName;       
1cb90 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20       /* text of 
1cba0 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f  name of TABLE */
1cbb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d  .        if( pE-
1cbc0 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
1cbd0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1cbe0 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b   pE->pLeft!=0 );
1cbf0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1cc00 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1cc10 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45  rty(pE->pLeft, E
1cc20 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1cc30 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
1cc40 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a  = pE->pLeft->u.z
1cc50 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d  Token;.        }
1cc60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1cc70 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  zTName = 0;.    
1cc80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
1cc90 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
1cca0 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
1ccb0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1ccc0 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
1ccd0 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
1cce0 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
1ccf0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1cd00 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d  zTabName = pFrom
1cd10 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ->zAlias;.      
1cd20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
1cd30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1cd40 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54     zTabName = pT
1cd50 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
1cd60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1cd70 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1cd80 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20  ailed ) break;. 
1cd90 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
1cda0 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74  ame && sqlite3St
1cdb0 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54  rICmp(zTName, zT
1cdc0 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  abName)!=0 ){.  
1cdd0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1cde0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
1cdf0 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
1ce00 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
1ce10 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
1ce20 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
1ce30 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
1ce40 20 2a 70 45 78 70 72 2c 20 2a 70 52 69 67 68 74   *pExpr, *pRight
1ce50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
1ce60 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62  ar *zName = pTab
1ce70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
1ce80 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
1ce90 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  r *zColname;  /*
1cea0 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f   The computed co
1ceb0 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  lumn name */.   
1cec0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
1ced0 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c  ToFree;   /* Mal
1cee0 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68 61  loced string tha
1cef0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
1cf00 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  eed */.         
1cf10 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d     Token sColnam
1cf20 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20  e;  /* Computed 
1cf30 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61  column name as a
1cf40 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20   token */..     
1cf50 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63         /* If a c
1cf60 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20  olumn is marked 
1cf70 61 73 20 27 68 69 64 64 65 6e 27 20 28 63 75 72  as 'hidden' (cur
1cf80 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73  rently only poss
1cf90 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  ible.           
1cfa0 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20   ** for virtual 
1cfb0 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20  tables), do not 
1cfc0 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68  include it in th
1cfd0 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20  e expanded.     
1cfe0 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74         ** result
1cff0 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20  -set list..     
1d000 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1d010 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64        if( IsHidd
1d020 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
1d030 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  aCol[j]) ){.    
1d040 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1d050 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  (IsVirtual(pTab)
1d060 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1d070 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1d080 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1d090 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
1d0a0 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20   zTName==0 ){.  
1d0b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1d0c0 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70 65  (pFrom->jointype
1d0d0 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
1d0e0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
1d0f0 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c    && tableAndCol
1d100 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73  umnIndex(pTabLis
1d110 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20  t, i, zName, 0, 
1d120 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
1d130 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d140 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55      /* In a NATU
1d150 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74  RAL join, omit t
1d160 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20  he join columns 
1d170 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
1d180 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
1d190 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  le to the right 
1d1a0 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  of the join */. 
1d1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
1d1c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1d1d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d1e0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1d1f0 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46  e3IdListIndex(pF
1d200 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61  rom->pUsing, zNa
1d210 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
1d220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
1d230 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53  a join with a US
1d240 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74  ING clause, omit
1d250 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a   columns in the.
1d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d270 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20  ** using clause 
1d280 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f  from the table o
1d290 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a  n the right. */.
1d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1d2c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d2d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d2e0 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c      pRight = sql
1d2f0 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
1d300 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ID, zName);.    
1d310 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65          zColname
1d320 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20   = zName;.      
1d330 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
1d340 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
1d350 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20  f( longNames || 
1d360 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
1d370 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d380 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20    Expr *pLeft;. 
1d390 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
1d3a0 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
1d3b0 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62  (db, TK_ID, zTab
1d3c0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
1d3d0 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
1d3e0 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
1d3f0 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
1d400 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
1d410 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
1d420 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
1d430 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
1d440 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  name = sqlite3MP
1d450 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
1d460 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
1d470 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
1d480 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a       zToFree = z
1d490 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
1d4a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d4b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d4c0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
1d4d0 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
1d4e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d4f0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1d500 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
1d510 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
1d520 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
1d530 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20     sColname.z = 
1d540 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
1d550 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e        sColname.n
1d560 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1d570 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  30(zColname);.  
1d580 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1d590 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
1d5a0 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26  (pParse, pNew, &
1d5b0 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  sColname, 0);.  
1d5c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1d5d0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46  3DbFree(db, zToF
1d5e0 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
1d5f0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1d600 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
1d610 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
1d620 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
1d630 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1d640 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1d650 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
1d660 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
1d670 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1d680 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1d690 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1d6a0 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
1d6b0 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
1d6c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d6d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1d6e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1d6f0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1d700 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
1d710 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
1d720 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
1d730 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d  _COLUMN.  if( p-
1d740 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45  >pEList && p->pE
1d750 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  List->nExpr>db->
1d760 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
1d770 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
1d780 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1d790 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
1d7a0 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
1d7b0 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20  result set");.  
1d7c0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
1d7d0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1d7e0 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72  }../*.** No-op r
1d7f0 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70  outine for the p
1d800 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72  arse-tree walker
1d810 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
1d820 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
1d830 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
1d840 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65  lback then expre
1d850 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61  ssion trees.** a
1d860 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75  re walked withou
1d870 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65  t any actions be
1d880 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63  ing taken at eac
1d890 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61  h node.  Presuma
1d8a0 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69  bly,.** when thi
1d8b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
1d8c0 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78  d for Walker.xEx
1d8d0 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
1d8e0 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65  .** Walker.xSele
1d8f0 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65  ctCallback is se
1d900 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e  t to do somethin
1d910 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65  g useful for eve
1d920 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ry .** subquery 
1d930 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72  in the parser tr
1d940 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
1d950 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57  t exprWalkNoop(W
1d960 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20  alker *NotUsed, 
1d970 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b  Expr *NotUsed2){
1d980 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1d990 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
1d9a0 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
1d9b0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1d9c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1d9d0 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20  utine "expands" 
1d9e0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
1d9f0 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  nt and all of it
1da00 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  s subqueries..**
1da10 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   For additional 
1da20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77  information on w
1da30 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20  hat it means to 
1da40 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43  "expand" a SELEC
1da50 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20  T.** statement, 
1da60 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
1da70 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70  on the selectExp
1da80 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62  and worker callb
1da90 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  ack above..**.**
1daa0 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c   Expanding a SEL
1dab0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ECT statement is
1dac0 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20   the first step 
1dad0 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a  in processing a.
1dae0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
1daf0 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54  ent.  The SELECT
1db00 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20   statement must 
1db10 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f  be expanded befo
1db20 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c  re.** name resol
1db30 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d  ution is perform
1db40 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ed..**.** If any
1db50 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
1db60 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
1db70 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
1db80 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68  to pParse..** Th
1db90 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1dba0 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68  on can detect th
1dbb0 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f  e problem by loo
1dbc0 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e  king at pParse->
1dbd0 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70  nErr.** and/or p
1dbe0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1dbf0 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74  cFailed..*/.stat
1dc00 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
1dc10 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73  electExpand(Pars
1dc20 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
1dc30 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57  t *pSelect){.  W
1dc40 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65  alker w;.  w.xSe
1dc50 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
1dc60 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20  electExpander;. 
1dc70 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
1dc80 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b   = exprWalkNoop;
1dc90 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
1dca0 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
1dcb0 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
1dcc0 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e  elect);.}...#ifn
1dcd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1dce0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
1dcf0 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e  his is a Walker.
1dd00 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
1dd10 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
1dd20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79   sqlite3SelectTy
1dd30 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65  peInfo().** inte
1dd40 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  rface..**.** For
1dd50 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73   each FROM-claus
1dd60 65 20 73 75 62 71 75 65 72 79 2c 20 61 64 64 20  e subquery, add 
1dd70 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64  Column.zType and
1dd80 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a   Column.zColl.**
1dd90 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
1dda0 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
1ddb0 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
1ddc0 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
1ddd0 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75  et.** of that su
1dde0 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  bquery..**.** Th
1ddf0 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
1de00 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
1de10 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
1de20 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64   was constructed
1de30 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70  .** by selectExp
1de40 61 6e 64 65 72 28 29 20 62 75 74 20 74 68 65 20  ander() but the 
1de50 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
1de60 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  on information w
1de70 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74  as omitted.** at
1de80 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61   that point beca
1de90 75 73 65 20 69 64 65 6e 74 69 66 69 65 72 73 20  use identifiers 
1dea0 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  had not yet been
1deb0 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73   resolved.  This
1dec0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
1ded0 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e  alled after iden
1dee0 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f  tifier resolutio
1def0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1df00 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
1df10 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65  ryTypeInfo(Walke
1df20 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
1df30 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
1df40 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69  *pParse;.  int i
1df50 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
1df60 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  bList;.  struct 
1df70 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
1df80 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rom;..  assert( 
1df90 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1dfa0 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69  _Resolved );.  i
1dfb0 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
1dfc0 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
1dfd0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73  )==0 ){.    p->s
1dfe0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61  elFlags |= SF_Ha
1dff0 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 20 20 70  sTypeInfo;.    p
1e000 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
1e010 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 70 54 61  >pParse;.    pTa
1e020 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
1e030 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  .    for(i=0, pF
1e040 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
1e050 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
1e060 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
1e070 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
1e080 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
1e090 62 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  b;.      if( ALW
1e0a0 41 59 53 28 70 54 61 62 21 3d 30 29 20 26 26 20  AYS(pTab!=0) && 
1e0b0 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
1e0c0 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21  & TF_Ephemeral)!
1e0d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1e0e0 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
1e0f0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1e100 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
1e110 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
1e120 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
1e130 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 61 73  lect;.        as
1e140 73 65 72 74 28 20 70 53 65 6c 20 29 3b 0a 20 20  sert( pSel );.  
1e150 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
1e160 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  l->pPrior ) pSel
1e170 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
1e180 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 41  .        selectA
1e190 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
1e1a0 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
1e1b0 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61   pTab->nCol, pTa
1e1c0 62 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c 29 3b 0a  b->aCol, pSel);.
1e1d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e1e0 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
1e1f0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 23 65 6e 64 69  ontinue;.}.#endi
1e200 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
1e210 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61  outine adds data
1e220 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
1e230 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f  ng sequence info
1e240 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68  rmation to.** th
1e250 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
1e260 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63  es of all FROM-c
1e270 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
1e280 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20   in a.** SELECT 
1e290 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
1e2a0 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   Use this routin
1e2b0 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  e after name res
1e2c0 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  olution..*/.stat
1e2d0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
1e2e0 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f  electAddTypeInfo
1e2f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1e300 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
1e310 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1e320 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1e330 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78   Walker w;.  w.x
1e340 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
1e350 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
1e360 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e  ryTypeInfo;.  w.
1e370 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
1e380 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  exprWalkNoop;.  
1e390 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
1e3a0 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  e;.  sqlite3Walk
1e3b0 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
1e3c0 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a  ct);.#endif.}...
1e3d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1e3e0 6e 65 20 73 65 74 73 20 6f 66 20 61 20 53 45 4c  ne sets of a SEL
1e3f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  ECT statement fo
1e400 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54  r processing.  T
1e410 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
1e420 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a  is accomplished:
1e430 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44  .**.**     *  VD
1e440 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE Cursor number
1e450 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  s are assigned t
1e460 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  o all FROM-claus
1e470 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20  e terms..**     
1e480 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62  *  Ephemeral Tab
1e490 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63  le objects are c
1e4a0 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46  reated for all F
1e4b0 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
1e4c0 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  eries..**     * 
1e4d0 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1e4e0 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74 65  auses are shifte
1e4f0 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61  d into WHERE sta
1e500 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a  tements.**     *
1e510 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20    Wildcards "*" 
1e520 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e  and "TABLE.*" in
1e530 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72 65   result sets are
1e540 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20   expanded..**   
1e550 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73    *  Identifiers
1e560 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61   in expression a
1e570 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61  re matched to ta
1e580 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  bles..**.** This
1e590 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65   routine acts re
1e5a0 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c  cursively on all
1e5b0 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68   subqueries with
1e5c0 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  in the SELECT..*
1e5d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
1e5e0 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72 73  lectPrep(.  Pars
1e5f0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1e600 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
1e610 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
1e620 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
1e630 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
1e640 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
1e650 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e  ng coded. */.  N
1e660 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74  ameContext *pOut
1e670 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  erNC  /* Name co
1e680 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69  ntext for contai
1e690 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ner */.){.  sqli
1e6a0 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e  te3 *db;.  if( N
1e6b0 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74  EVER(p==0) ) ret
1e6c0 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  urn;.  db = pPar
1e6d0 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d  se->db;.  if( p-
1e6e0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48  >selFlags & SF_H
1e6f0 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74  asTypeInfo ) ret
1e700 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  urn;.  sqlite3Se
1e710 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61 72 73  lectExpand(pPars
1e720 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61  e, p);.  if( pPa
1e730 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
1e740 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1e750 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
1e760 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61  3ResolveSelectNa
1e770 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  mes(pParse, p, p
1e780 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20  OuterNC);.  if( 
1e790 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
1e7a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1e7b0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
1e7c0 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
1e7d0 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29  eInfo(pParse, p)
1e7e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  ;.}../*.** Reset
1e7f0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
1e800 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a  ccumulator..**.*
1e810 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20  * The aggregate 
1e820 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61  accumulator is a
1e830 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63   set of memory c
1e840 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a  ells that hold.*
1e850 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
1e860 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c  esults while cal
1e870 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72  culating an aggr
1e880 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20  egate.  This.** 
1e890 72 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79 20 73  routine simply s
1e8a0 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61  tores NULLs in a
1e8b0 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f  ll of those memo
1e8c0 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ry cells..*/.sta
1e8d0 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63  tic void resetAc
1e8e0 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20  cumulator(Parse 
1e8f0 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
1e900 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
1e910 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1e920 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
1e930 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
1e940 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20  o_func *pFunc;. 
1e950 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e   if( pAggInfo->n
1e960 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e  Func+pAggInfo->n
1e970 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20  Column==0 ){.   
1e980 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66   return;.  }.  f
1e990 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
1e9a0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  fo->nColumn; i++
1e9b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1e9c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1e9d0 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f  ull, 0, pAggInfo
1e9e0 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b  ->aCol[i].iMem);
1e9f0 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63  .  }.  for(pFunc
1ea00 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
1ea10 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  , i=0; i<pAggInf
1ea20 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
1ea30 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Func++){.    sql
1ea40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ea50 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46  , OP_Null, 0, pF
1ea60 75 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20  unc->iMem);.    
1ea70 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  if( pFunc->iDist
1ea80 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
1ea90 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e   Expr *pE = pFun
1eaa0 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  c->pExpr;.      
1eab0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1eac0 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
1ead0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
1eae0 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c      if( pE->x.pL
1eaf0 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e  ist==0 || pE->x.
1eb00 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  pList->nExpr!=1 
1eb10 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1eb20 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1eb30 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67 67  e, "DISTINCT agg
1eb40 72 65 67 61 74 65 73 20 6d 75 73 74 20 68 61 76  regates must hav
1eb50 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a  e exactly one ".
1eb60 20 20 20 20 20 20 20 20 20 20 20 22 61 72 67 75             "argu
1eb70 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20  ment");.        
1eb80 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
1eb90 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1eba0 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49  se{.        KeyI
1ebb0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
1ebc0 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
1ebd0 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e  ist(pParse, pE->
1ebe0 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
1ebf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ec00 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
1ec10 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e  hemeral, pFunc->
1ec20 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c  iDistinct, 0, 0,
1ec30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ec40 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1ec50 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
1ec60 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
1ec70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ec80 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
1ec90 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e  ke the OP_AggFin
1eca0 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72  alize opcode for
1ecb0 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65   every aggregate
1ecc0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
1ecd0 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75  the AggInfo stru
1ece0 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
1ecf0 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67   void finalizeAg
1ed00 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65  gFunctions(Parse
1ed10 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
1ed20 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
1ed30 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1ed40 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
1ed50 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
1ed60 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66  fo_func *pF;.  f
1ed70 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
1ed80 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
1ed90 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
1eda0 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45  ++, pF++){.    E
1edb0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
1edc0 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
1edd0 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
1ede0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1edf0 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
1ee00 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
1ee10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ee20 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e  Op4(v, OP_AggFin
1ee30 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c  al, pF->iMem, pL
1ee40 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
1ee50 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20  pr : 0, 0,.     
1ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee70 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
1ee80 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
1ee90 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64    }.}../*.** Upd
1eea0 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ate the accumula
1eeb0 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  tor memory cells
1eec0 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74   for an aggregat
1eed0 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68  e based on.** th
1eee0 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
1eef0 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   position..*/.st
1ef00 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65  atic void update
1ef10 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
1ef20 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
1ef30 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
1ef40 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1ef50 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
1ef60 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
1ef70 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
1ef80 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
1ef90 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49  ol *pC;..  pAggI
1efa0 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
1efb0 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  = 1;.  sqlite3Ex
1efc0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
1efd0 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  rse);.  for(i=0,
1efe0 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
1eff0 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
1f000 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
1f010 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67  +){.    int nArg
1f020 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65  ;.    int addrNe
1f030 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  xt = 0;.    int 
1f040 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72  regAgg;.    Expr
1f050 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
1f060 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ->pExpr->x.pList
1f070 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
1f080 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1f090 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  F->pExpr, EP_xIs
1f0a0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69  Select) );.    i
1f0b0 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
1f0c0 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e    nArg = pList->
1f0d0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67  nExpr;.      reg
1f0e0 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Agg = sqlite3Get
1f0f0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
1f100 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73  , nArg);.      s
1f110 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
1f120 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
1f130 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20 31 29  List, regAgg, 1)
1f140 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1f150 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20     nArg = 0;.   
1f160 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20     regAgg = 0;. 
1f170 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
1f180 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
1f190 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20  .      addrNext 
1f1a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1f1b0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1f1c0 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31   assert( nArg==1
1f1d0 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69   );.      codeDi
1f1e0 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
1f1f0 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64  F->iDistinct, ad
1f200 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67  drNext, 1, regAg
1f210 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  g);.    }.    if
1f220 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61  ( pF->pFunc->fla
1f230 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
1f240 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
1f250 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
1f260 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72  l = 0;.      str
1f270 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1f280 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
1f290 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73  int j;.      ass
1f2a0 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
1f2b0 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66    /* pList!=0 if
1f2c0 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e   pF->pFunc has N
1f2d0 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20  EEDCOLL */.     
1f2e0 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
1f2f0 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c  pList->a; !pColl
1f300 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c   && j<nArg; j++,
1f310 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1f320 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1f330 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
1f340 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
1f350 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
1f360 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
1f370 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
1f380 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
1f390 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
1f3a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f3b0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
1f3c0 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20  llSeq, 0, 0, 0, 
1f3d0 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
1f3e0 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
1f3f0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1f400 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67  eAddOp4(v, OP_Ag
1f410 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67  gStep, 0, regAgg
1f420 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20  , pF->iMem,.    
1f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f440 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75    (void*)pF->pFu
1f450 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
1f460 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1f470 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
1f480 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
1f490 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
1f4a0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
1f4b0 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b  , regAgg, nArg);
1f4c0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
1f4d0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
1f4e0 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
1f4f0 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72  g);.    if( addr
1f500 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71  Next ){.      sq
1f510 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1f520 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78  Label(v, addrNex
1f530 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1f540 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
1f550 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
1f560 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20   }..  /* Before 
1f570 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61  populating the a
1f580 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
1f590 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20  ters, clear the 
1f5a0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20  column cache..  
1f5b0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
1f5c0 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75   any of the requ
1f5d0 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ired column valu
1f5e0 65 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 70  es are already p
1f5f0 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20  resent .  ** in 
1f600 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74  registers, sqlit
1f610 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79  e3ExprCode() may
1f620 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f   use OP_SCopy to
1f630 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a   copy the value.
1f640 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d    ** to pC->iMem
1f650 2e 20 42 75 74 20 62 79 20 74 68 65 20 74 69 6d  . But by the tim
1f660 65 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 75  e the value is u
1f670 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  sed, the origina
1f680 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20  l register.  ** 
1f690 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 73  may have been us
1f6a0 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67  ed, invalidating
1f6b0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1f6c0 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74  buffer holding t
1f6d0 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20  he.  ** text or 
1f6e0 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20  blob value. See 
1f6f0 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63  ticket [883034dc
1f700 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  b5]..  **.  ** A
1f710 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20  nother solution 
1f720 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e  would be to chan
1f730 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20  ge the OP_SCopy 
1f740 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63  used to copy cac
1f750 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20  hed.  ** values 
1f760 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20  to an OP_Copy.. 
1f770 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
1f780 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
1f790 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  se);.  for(i=0, 
1f7a0 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  pC=pAggInfo->aCo
1f7b0 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  l; i<pAggInfo->n
1f7c0 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b  Accumulator; i++
1f7d0 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  , pC++){.    sql
1f7e0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1f7f0 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20  rse, pC->pExpr, 
1f800 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20  pC->iMem);.  }. 
1f810 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
1f820 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c  tMode = 0;.  sql
1f830 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
1f840 61 72 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 2f  ar(pParse);.}../
1f850 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c  *.** Add a singl
1f860 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73  e OP_Explain ins
1f870 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  truction to the 
1f880 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20  VDBE to explain 
1f890 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e  a simple.** coun
1f8a0 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c  t(*) query ("SEL
1f8b0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
1f8c0 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66  M pTab")..*/.#if
1f8d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f8e0 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20  _EXPLAIN.static 
1f8f0 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70  void explainSimp
1f900 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65  leCount(.  Parse
1f910 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1f920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1f930 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
1f940 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
1f950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f960 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20   /* Table being 
1f970 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64  queried */.  Ind
1f980 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
1f990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f9a0 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70  Index used to op
1f9b0 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20  timize scan, or 
1f9c0 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  NULL */.){.  if(
1f9d0 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
1f9e0 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==2 ){.    char 
1f9f0 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74 65 33 4d  *zEqp = sqlite3M
1fa00 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
1fa10 62 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25  b, "SCAN TABLE %
1fa20 73 20 25 73 25 73 28 7e 25 64 20 72 6f 77 73 29  s %s%s(~%d rows)
1fa30 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ",.        pTab-
1fa40 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  >zName, .       
1fa50 20 70 49 64 78 20 3f 20 22 55 53 49 4e 47 20 43   pIdx ? "USING C
1fa60 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20  OVERING INDEX " 
1fa70 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20 70 49  : "",.        pI
1fa80 64 78 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  dx ? pIdx->zName
1fa90 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20 70   : "",.        p
1faa0 54 61 62 2d 3e 6e 52 6f 77 45 73 74 0a 20 20 20  Tab->nRowEst.   
1fab0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
1fac0 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20  dbeAddOp4(.     
1fad0 20 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65     pParse->pVdbe
1fae0 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50  , OP_Explain, pP
1faf0 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
1fb00 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f   0, 0, zEqp, P4_
1fb10 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20  DYNAMIC.    );. 
1fb20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
1fb30 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c  ine explainSimpl
1fb40 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65  eCount(a,b,c).#e
1fb50 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
1fb60 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
1fb70 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1fb80 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  nt given in the 
1fb90 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a  p argument.  .**
1fba0 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
1fbb0 61 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20  are distributed 
1fbc0 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73 20  in various ways 
1fbd0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
1fbe0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
1fbf0 74 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73  the SelectDest s
1fc00 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
1fc10 20 74 6f 20 62 79 20 61 72 67 75 6d 65 6e 74 20   to by argument 
1fc20 70 44 65 73 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c  pDest.** as foll
1fc30 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70  ows:.**.**     p
1fc40 44 65 73 74 2d 3e 65 44 65 73 74 20 20 20 20 52  Dest->eDest    R
1fc50 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d  esult.**     ---
1fc60 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d  ---------    ---
1fc70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fc80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fc90 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
1fca0 53 52 54 5f 4f 75 74 70 75 74 20 20 20 20 20 20  SRT_Output      
1fcb0 47 65 6e 65 72 61 74 65 20 61 20 72 6f 77 20 6f  Generate a row o
1fcc0 66 20 6f 75 74 70 75 74 20 28 75 73 69 6e 67 20  f output (using 
1fcd0 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  the OP_ResultRow
1fce0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1fcf0 20 20 20 20 20 20 20 20 6f 70 63 6f 64 65 29 20          opcode) 
1fd00 66 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e 20  for each row in 
1fd10 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
1fd20 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65  **.**     SRT_Me
1fd30 6d 20 20 20 20 20 20 20 20 20 4f 6e 6c 79 20 76  m         Only v
1fd40 61 6c 69 64 20 69 66 20 74 68 65 20 72 65 73 75  alid if the resu
1fd50 6c 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20 63  lt is a single c
1fd60 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20 20 20  olumn..**       
1fd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74                St
1fd80 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63 6f  ore the first co
1fd90 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 69 72 73  lumn of the firs
1fda0 74 20 72 65 73 75 6c 74 20 72 6f 77 0a 2a 2a 20  t result row.** 
1fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdc0 20 20 20 20 69 6e 20 72 65 67 69 73 74 65 72 20      in register 
1fdd0 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 74 68 65  pDest->iParm the
1fde0 6e 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 65  n abandon the re
1fdf0 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  st.**           
1fe00 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
1fe10 20 71 75 65 72 79 2e 20 20 54 68 69 73 20 64 65   query.  This de
1fe20 73 74 69 6e 61 74 69 6f 6e 20 69 6d 70 6c 69 65  stination implie
1fe30 73 20 22 4c 49 4d 49 54 20 31 22 2e 0a 2a 2a 0a  s "LIMIT 1"..**.
1fe40 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20 20  **     SRT_Set  
1fe50 20 20 20 20 20 20 20 54 68 65 20 72 65 73 75 6c         The resul
1fe60 74 20 6d 75 73 74 20 62 65 20 61 20 73 69 6e 67  t must be a sing
1fe70 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20 53 74 6f 72  le column.  Stor
1fe80 65 20 65 61 63 68 0a 2a 2a 20 20 20 20 20 20 20  e each.**       
1fe90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f                ro
1fea0 77 20 6f 66 20 72 65 73 75 6c 74 20 61 73 20 74  w of result as t
1feb0 68 65 20 6b 65 79 20 69 6e 20 74 61 62 6c 65 20  he key in table 
1fec0 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a  pDest->iParm. .*
1fed0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1fee0 20 20 20 20 20 20 41 70 70 6c 79 20 74 68 65 20        Apply the 
1fef0 61 66 66 69 6e 69 74 79 20 70 44 65 73 74 2d 3e  affinity pDest->
1ff00 61 66 66 69 6e 69 74 79 20 62 65 66 6f 72 65 20  affinity before 
1ff10 73 74 6f 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20  storing.**      
1ff20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1ff30 65 73 75 6c 74 73 2e 20 20 55 73 65 64 20 74 6f  esults.  Used to
1ff40 20 69 6d 70 6c 65 6d 65 6e 74 20 22 49 4e 20 28   implement "IN (
1ff50 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a  SELECT ...)"..**
1ff60 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f  .**     SRT_Unio
1ff70 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  n       Store re
1ff80 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69  sults as a key i
1ff90 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
1ffa0 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ble pDest->iParm
1ffb0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1ffc0 45 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f  Except      Remo
1ffd0 76 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  ve results from 
1ffe0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
1fff0 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ble pDest->iParm
20000 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
20010 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72  Table       Stor
20020 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d  e results in tem
20030 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65  porary table pDe
20040 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 20 20 20  st->iParm..**   
20050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20060 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53    This is like S
20070 52 54 5f 45 70 68 65 6d 54 61 62 20 65 78 63 65  RT_EphemTab exce
20080 70 74 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  pt that the tabl
20090 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
200a0 20 20 20 20 20 20 20 20 20 69 73 20 61 73 73 75           is assu
200b0 6d 65 64 20 74 6f 20 61 6c 72 65 61 64 79 20 62  med to already b
200c0 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  e open..**.**   
200d0 20 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 20    SRT_EphemTab  
200e0 20 20 43 72 65 61 74 65 20 61 6e 20 74 65 6d 70    Create an temp
200f0 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73  orary table pDes
20100 74 2d 3e 69 50 61 72 6d 20 61 6e 64 20 73 74 6f  t->iParm and sto
20110 72 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  re.**           
20120 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65            the re
20130 73 75 6c 74 20 74 68 65 72 65 2e 20 54 68 65 20  sult there. The 
20140 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 6f  cursor is left o
20150 70 65 6e 20 61 66 74 65 72 0a 2a 2a 20 20 20 20  pen after.**    
20160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20170 20 72 65 74 75 72 6e 69 6e 67 2e 20 20 54 68 69   returning.  Thi
20180 73 20 69 73 20 6c 69 6b 65 20 53 52 54 5f 54 61  s is like SRT_Ta
20190 62 6c 65 20 65 78 63 65 70 74 20 74 68 61 74 0a  ble except that.
201a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
201b0 20 20 20 20 20 20 20 74 68 69 73 20 64 65 73 74         this dest
201c0 69 6e 61 74 69 6f 6e 20 75 73 65 73 20 4f 50 5f  ination uses OP_
201d0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 6f  OpenEphemeral to
201e0 20 63 72 65 61 74 65 0a 2a 2a 20 20 20 20 20 20   create.**      
201f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
20200 68 65 20 74 61 62 6c 65 20 66 69 72 73 74 2e 0a  he table first..
20210 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 6f  **.**     SRT_Co
20220 72 6f 75 74 69 6e 65 20 20 20 47 65 6e 65 72 61  routine   Genera
20230 74 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  te a co-routine 
20240 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 6e  that returns a n
20250 65 77 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20  ew row of.**    
20260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20270 20 72 65 73 75 6c 74 73 20 65 61 63 68 20 74 69   results each ti
20280 6d 65 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64  me it is invoked
20290 2e 20 20 54 68 65 20 65 6e 74 72 79 20 70 6f 69  .  The entry poi
202a0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nt.**           
202b0 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
202c0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 73 20 73   co-routine is s
202d0 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
202e0 72 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a  r pDest->iParm..
202f0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
20300 69 73 74 73 20 20 20 20 20 20 53 74 6f 72 65 20  ists      Store 
20310 61 20 31 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  a 1 in memory ce
20320 6c 6c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20  ll pDest->iParm 
20330 69 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  if the result.**
20340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20350 20 20 20 20 20 73 65 74 20 69 73 20 6e 6f 74 20       set is not 
20360 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  empty..**.**    
20370 20 53 52 54 5f 44 69 73 63 61 72 64 20 20 20 20   SRT_Discard    
20380 20 54 68 72 6f 77 20 74 68 65 20 72 65 73 75 6c   Throw the resul
20390 74 73 20 61 77 61 79 2e 20 20 54 68 69 73 20 69  ts away.  This i
203a0 73 20 75 73 65 64 20 62 79 20 53 45 4c 45 43 54  s used by SELECT
203b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
203c0 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
203d0 74 73 20 77 69 74 68 69 6e 20 74 72 69 67 67 65  ts within trigge
203e0 72 73 20 77 68 6f 73 65 20 6f 6e 6c 79 20 70 75  rs whose only pu
203f0 72 70 6f 73 65 20 69 73 0a 2a 2a 20 20 20 20 20  rpose is.**     
20400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20410 74 68 65 20 73 69 64 65 2d 65 66 66 65 63 74 73  the side-effects
20420 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a   of functions..*
20430 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
20440 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
20450 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
20460 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
20470 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  re.** encountere
20480 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  d, then an appro
20490 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
204a0 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a  sage is left in.
204b0 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
204c0 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sg..**.** This r
204d0 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20  outine does NOT 
204e0 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20  free the Select 
204f0 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
20500 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c   in.  The.** cal
20510 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65  ling function ne
20520 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  eds to do that..
20530 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
20540 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
20550 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
20560 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
20570 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
20580 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
20590 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
205a0 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
205b0 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  oded. */.  Selec
205c0 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
205d0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
205e0 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72  with the query r
205f0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
20600 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
20610 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
20620 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
20630 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
20640 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f     /* Return fro
20650 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  m sqlite3WhereBe
20660 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20  gin() */.  Vdbe 
20670 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
20680 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
20690 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63   machine under c
206a0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
206b0 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20   int isAgg;     
206c0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
206d0 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73  for select lists
206e0 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22   like "count(*)"
206f0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
20700 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20  pEList;      /* 
20710 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
20720 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20  to extract. */. 
20730 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
20740 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st;     /* List 
20750 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c  of tables to sel
20760 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78  ect from */.  Ex
20770 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
20780 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
20790 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
207a0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
207b0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
207c0 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
207d0 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
207e0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
207f0 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
20800 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50      /* The GROUP
20810 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79   BY clause.  May
20820 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
20830 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20  pr *pHaving;    
20840 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49       /* The HAVI
20850 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  NG clause.  May 
20860 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
20870 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20   isDistinct;    
20880 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
20890 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
208a0 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
208b0 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74  /.  int distinct
208c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ;          /* Ta
208d0 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74  ble to use for t
208e0 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 20  he distinct set 
208f0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  */.  int rc = 1;
20900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
20910 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66  alue to return f
20920 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
20930 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  n */.  int addrS
20940 6f 72 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a  ortIndex;     /*
20950 20 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f   Address of an O
20960 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
20970 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  instruction */. 
20980 20 69 6e 74 20 61 64 64 72 44 69 73 74 69 6e 63   int addrDistinc
20990 74 49 6e 64 65 78 3b 20 2f 2a 20 41 64 64 72 65  tIndex; /* Addre
209a0 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e  ss of an OP_Open
209b0 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
209c0 63 74 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e  ction */.  AggIn
209d0 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20  fo sAggInfo;    
209e0 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
209f0 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61   used by aggrega
20a00 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  te queries */.  
20a10 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20  int iEnd;       
20a20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
20a30 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20  s of the end of 
20a40 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73  the query */.  s
20a50 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
20a60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
20a70 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
20a80 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
20a90 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
20aa0 0a 20 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53  .  int iRestoreS
20ab0 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65  electId = pParse
20ac0 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70  ->iSelectId;.  p
20ad0 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
20ae0 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74   = pParse->iNext
20af0 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64  SelectId++;.#end
20b00 69 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  if..  db = pPars
20b10 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d  e->db;.  if( p==
20b20 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
20b30 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
20b40 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74  >nErr ){.    ret
20b50 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
20b60 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
20b70 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
20b80 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
20b90 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
20ba0 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f  memset(&sAggInfo
20bb0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67  , 0, sizeof(sAgg
20bc0 49 6e 66 6f 29 29 3b 0a 0a 20 20 69 66 28 20 49  Info));..  if( I
20bd0 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
20be0 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73  pDest) ){.    as
20bf0 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73  sert(pDest->eDes
20c00 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c  t==SRT_Exists ||
20c10 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
20c20 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20  RT_Union || .   
20c30 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
20c40 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74  Dest==SRT_Except
20c50 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
20c60 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 29 3b 0a  ==SRT_Discard);.
20c70 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20      /* If ORDER 
20c80 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66  BY makes no diff
20c90 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75  erence in the ou
20ca0 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65  tput then neithe
20cb0 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49  r does.    ** DI
20cc0 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e  STINCT so it can
20cd0 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e   be removed too.
20ce0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
20cf0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
20d00 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
20d10 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
20d20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46  = 0;.    p->selF
20d30 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
20d40 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  inct;.  }.  sqli
20d50 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
20d60 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 70  arse, p, 0);.  p
20d70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
20d80 64 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73  derBy;.  pTabLis
20d90 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  t = p->pSrc;.  p
20da0 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
20db0 74 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  t;.  if( pParse-
20dc0 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
20dd0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
20de0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
20df0 3b 0a 20 20 7d 0a 20 20 69 73 41 67 67 20 3d 20  ;.  }.  isAgg = 
20e00 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
20e10 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b  F_Aggregate)!=0;
20e20 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73  .  assert( pELis
20e30 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65  t!=0 );..  /* Be
20e40 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63  gin generating c
20e50 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ode..  */.  v = 
20e60 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
20e70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
20e80 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
20e90 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  _end;..  /* If w
20ea0 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79  riting to memory
20eb0 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61   or generating a
20ec0 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61   set.  ** only a
20ed0 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d   single column m
20ee0 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  ay be output..  
20ef0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
20f00 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
20f10 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75    if( checkForMu
20f20 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45  ltiColumnSelectE
20f30 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65  rror(pParse, pDe
20f40 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  st, pEList->nExp
20f50 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  r) ){.    goto s
20f60 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23  elect_end;.  }.#
20f70 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
20f80 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c  rate code for al
20f90 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e  l sub-queries in
20fa0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
20fb0 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  .  */.#if !defin
20fc0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
20fd0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
20fe0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
20ff0 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30  _VIEW).  for(i=0
21000 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20  ; !p->pPrior && 
21010 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
21020 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
21030 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
21040 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
21050 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65  st->a[i];.    Se
21060 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
21070 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
21080 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  = pItem->pSelect
21090 3b 0a 20 20 20 20 69 6e 74 20 69 73 41 67 67 53  ;.    int isAggS
210a0 75 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 75  ub;..    if( pSu
210b0 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==0 ) continue;
210c0 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
210d0 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20  addrFillSub ){. 
210e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
210f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
21100 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ub, pItem->regRe
21110 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64  turn, pItem->add
21120 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20  rFillSub);.     
21130 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
21140 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65  ..    /* Increme
21150 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74  nt Parse.nHeight
21160 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f   by the height o
21170 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78  f the largest ex
21180 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
21190 74 72 65 65 20 72 65 66 65 72 65 64 20 74 6f 20  tree refered to 
211a0 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72  by this, the par
211b0 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20  ent select. The 
211c0 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20  child select.   
211d0 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   ** may contain 
211e0 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
211f0 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20   of at most.    
21200 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ** (SQLITE_MAX_E
21210 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e  XPR_DEPTH-Parse.
21220 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e  nHeight) height.
21230 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20   This is a bit. 
21240 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65     ** more conse
21250 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63  rvative than nec
21260 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68  essary, but much
21270 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66   easier than enf
21280 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  orcing.    ** an
21290 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20   exact limit..  
212a0 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d    */.    pParse-
212b0 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69  >nHeight += sqli
212c0 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
212d0 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 69 73 41  ght(p);..    isA
212e0 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73  ggSub = (pSub->s
212f0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
21300 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20  regate)!=0;.    
21310 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75  if( flattenSubqu
21320 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ery(pParse, p, i
21330 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67 53 75  , isAgg, isAggSu
21340 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  b) ){.      /* T
21350 68 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e  his subquery can
21360 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74   be absorbed int
21370 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f  o its parent. */
21380 0a 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67  .      if( isAgg
21390 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Sub ){.        i
213a0 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
213b0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
213c0 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20   SF_Aggregate;. 
213d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d       }.      i =
213e0 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
213f0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
21400 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
21410 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e  hat will fill an
21420 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
21430 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74   with.      ** t
21440 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
21450 69 73 20 73 75 62 71 75 65 72 79 2e 20 20 70 49  is subquery.  pI
21460 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
21470 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20   will point.    
21480 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72    ** to the addr
21490 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ess of the gener
214a0 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e  ated subroutine.
214b0 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
214c0 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  rn.      ** is a
214d0 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61   register alloca
214e0 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
214f0 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72  subroutine retur
21500 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20 20 20  n address.      
21510 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70  */.      int top
21520 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Addr;.      int 
21530 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20  onceAddr = 0;.  
21540 20 20 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b      int retAddr;
21550 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21560 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
21570 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49  b==0 );.      pI
21580 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
21590 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
215a0 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d  .      topAddr =
215b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
215c0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
215d0 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  , 0, pItem->regR
215e0 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49  eturn);.      pI
215f0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
21600 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20   = topAddr+1;.  
21610 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
21620 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61  ent((v, "materia
21630 6c 69 7a 65 20 25 73 22 2c 20 70 49 74 65 6d 2d  lize %s", pItem-
21640 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
21650 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
21660 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30  >isCorrelated==0
21670 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
21680 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
21690 73 20 6e 6f 20 63 6f 72 72 65 6c 61 74 65 64 20  s no correlated 
216a0 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f  and if we are no
216b0 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20  t inside of.    
216c0 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72      ** a trigger
216d0 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e  , then we only n
216e0 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
216f0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
21700 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20  subquery.       
21710 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20   ** once. */.   
21720 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20       onceAddr = 
21730 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
21740 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
21750 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
21760 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
21770 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62  st, SRT_EphemTab
21780 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
21790 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
217a0 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
217b0 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38  ->iSelectId, (u8
217c0 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65  )pParse->iNextSe
217d0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73  lectId);.      s
217e0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
217f0 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
21800 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
21810 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20  pTab->nRowEst = 
21820 28 75 6e 73 69 67 6e 65 64 29 70 53 75 62 2d 3e  (unsigned)pSub->
21830 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
21840 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29    if( onceAddr )
21850 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
21860 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72  Here(v, onceAddr
21870 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72  );.      retAddr
21880 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
21890 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
218a0 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  n, pItem->regRet
218b0 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65  urn);.      Vdbe
218c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
218d0 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61   %s", pItem->pTa
218e0 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
218f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
21900 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72  ngeP1(v, topAddr
21910 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20  , retAddr);.    
21920 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
21930 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
21940 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
21950 28 20 2f 2a 70 50 61 72 73 65 2d 3e 6e 45 72 72  ( /*pParse->nErr
21960 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c 6c 6f 63   ||*/ db->malloc
21970 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
21980 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
21990 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
219a0 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71  e->nHeight -= sq
219b0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
219c0 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 54  eight(p);.    pT
219d0 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
219e0 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72  ;.    if( !Ignor
219f0 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
21a00 74 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64  t) ){.      pOrd
21a10 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
21a20 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  By;.    }.  }.  
21a30 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
21a40 73 74 3b 0a 23 65 6e 64 69 66 0a 20 20 70 57 68  st;.#endif.  pWh
21a50 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
21a60 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
21a70 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
21a80 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
21a90 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20  g;.  isDistinct 
21aa0 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  = (p->selFlags &
21ab0 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
21ac0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
21ad0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
21ae0 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74  SELECT.  /* If t
21af0 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65  here is are a se
21b00 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65  quence of querie
21b10 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65  s, do the earlie
21b20 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20  r ones first..  
21b30 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
21b40 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  or ){.    if( p-
21b50 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29  >pRightmost==0 )
21b60 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  {.      Select *
21b70 70 4c 6f 6f 70 2c 20 2a 70 52 69 67 68 74 20 3d  pLoop, *pRight =
21b80 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e   0;.      int cn
21b90 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
21ba0 20 6d 78 53 65 6c 65 63 74 3b 0a 20 20 20 20 20   mxSelect;.     
21bb0 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
21bc0 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
21bd0 2d 3e 70 50 72 69 6f 72 2c 20 63 6e 74 2b 2b 29  ->pPrior, cnt++)
21be0 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  {.        pLoop-
21bf0 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b  >pRightmost = p;
21c00 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
21c10 70 4e 65 78 74 20 3d 20 70 52 69 67 68 74 3b 0a  pNext = pRight;.
21c20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
21c30 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a   pLoop;.      }.
21c40 20 20 20 20 20 20 6d 78 53 65 6c 65 63 74 20 3d        mxSelect =
21c50 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49   db->aLimit[SQLI
21c60 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
21c70 44 5f 53 45 4c 45 43 54 5d 3b 0a 20 20 20 20 20  D_SELECT];.     
21c80 20 69 66 28 20 6d 78 53 65 6c 65 63 74 20 26 26   if( mxSelect &&
21c90 20 63 6e 74 3e 6d 78 53 65 6c 65 63 74 20 29 7b   cnt>mxSelect ){
21ca0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21cb0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
21cc0 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73   "too many terms
21cd0 20 69 6e 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c   in compound SEL
21ce0 45 43 54 22 29 3b 0a 20 20 20 20 20 20 20 20 67  ECT");.        g
21cf0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
21d00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
21d10 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65    rc = multiSele
21d20 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  ct(pParse, p, pD
21d30 65 73 74 29 3b 0a 20 20 20 20 65 78 70 6c 61 69  est);.    explai
21d40 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50 61 72  nSetInteger(pPar
21d50 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69  se->iSelectId, i
21d60 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29  RestoreSelectId)
21d70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
21d80 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
21d90 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f  * If there is bo
21da0 74 68 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e  th a GROUP BY an
21db0 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  d an ORDER BY cl
21dc0 61 75 73 65 20 61 6e 64 20 74 68 65 79 20 61 72  ause and they ar
21dd0 65 0a 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c  e.  ** identical
21de0 2c 20 74 68 65 6e 20 64 69 73 61 62 6c 65 20 74  , then disable t
21df0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
21e00 73 65 20 73 69 6e 63 65 20 74 68 65 20 47 52 4f  se since the GRO
21e10 55 50 20 42 59 0a 20 20 2a 2a 20 77 69 6c 6c 20  UP BY.  ** will 
21e20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20 74  cause elements t
21e30 6f 20 63 6f 6d 65 20 6f 75 74 20 69 6e 20 74 68  o come out in th
21e40 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e  e correct order.
21e50 20 20 54 68 69 73 20 69 73 0a 20 20 2a 2a 20 61    This is.  ** a
21e60 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d  n optimization -
21e70 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
21e80 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c  wer should resul
21e90 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20  t regardless..  
21ea0 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c 49 54  ** Use the SQLIT
21eb0 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20 66  E_GroupByOrder f
21ec0 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f  lag with SQLITE_
21ed0 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
21ee0 45 52 0a 20 20 2a 2a 20 74 6f 20 64 69 73 61 62  ER.  ** to disab
21ef0 6c 65 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  le this optimiza
21f00 74 69 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e 67  tion for testing
21f10 20 70 75 72 70 6f 73 65 73 2e 0a 20 20 2a 2f 0a   purposes..  */.
21f20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
21f30 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 2d 3e  rListCompare(p->
21f40 70 47 72 6f 75 70 42 79 2c 20 70 4f 72 64 65 72  pGroupBy, pOrder
21f50 42 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  By)==0.         
21f60 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  && (db->flags & 
21f70 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
21f80 64 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  der)==0 ){.    p
21f90 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
21fa0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75  ..  /* If the qu
21fb0 65 72 79 20 69 73 20 44 49 53 54 49 4e 43 54 20  ery is DISTINCT 
21fc0 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
21fd0 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61   but is not an a
21fe0 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20  ggregate, and . 
21ff0 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63   ** if the selec
22000 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73 61  t-list is the sa
22010 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45 52 20  me as the ORDER 
22020 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68  BY list, then th
22030 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61  is query.  ** ca
22040 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61  n be rewritten a
22050 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e  s a GROUP BY. In
22060 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
22070 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
22080 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
22090 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f  T xyz FROM ... O
220a0 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a  RDER BY xyz.  **
220b0 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f  .  ** is transfo
220c0 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  rmed to:.  **.  
220d0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 79  **     SELECT xy
220e0 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50  z FROM ... GROUP
220f0 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a   BY xyz.  **.  *
22100 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  * The second for
22110 6d 20 69 73 20 70 72 65 66 65 72 72 65 64 20 61  m is preferred a
22120 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78  s a single index
22130 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65 29   (or temp-table)
22140 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75 73   may be .  ** us
22150 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20  ed for both the 
22160 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44 49 53  ORDER BY and DIS
22170 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e 67  TINCT processing
22180 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20  . As originally 
22190 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 68  .  ** written th
221a0 65 20 71 75 65 72 79 20 6d 75 73 74 20 75 73 65  e query must use
221b0 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f   a temp-table fo
221c0 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  r at least one o
221d0 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20 2a  f the ORDER .  *
221e0 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  * BY and DISTINC
221f0 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20  T, and an index 
22200 6f 72 20 73 65 70 61 72 61 74 65 20 74 65 6d 70  or separate temp
22210 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6f  -table for the o
22220 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ther..  */.  if(
22230 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
22240 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
22250 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
22260 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26 20  Distinct .   && 
22270 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
22280 6f 6d 70 61 72 65 28 70 4f 72 64 65 72 42 79 2c  ompare(pOrderBy,
22290 20 70 2d 3e 70 45 4c 69 73 74 29 3d 3d 30 0a 20   p->pEList)==0. 
222a0 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   ){.    p->selFl
222b0 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
222c0 6e 63 74 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f  nct;.    p->pGro
222d0 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
222e0 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
222f0 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20  >pEList, 0);.   
22300 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
22310 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 4f 72  GroupBy;.    pOr
22320 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a  derBy = 0;.  }..
22330 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
22340 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
22350 75 73 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73  use, then this s
22360 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65  orting.  ** inde
22370 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62  x might end up b
22380 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74  eing unused if t
22390 68 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a  he data can be .
223a0 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69    ** extracted i
223b0 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64  n pre-sorted ord
223c0 65 72 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  er.  If that is 
223d0 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
223e0 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45  he.  ** OP_OpenE
223f0 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
22400 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61  tion will be cha
22410 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f  nged to an OP_No
22420 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20  op once.  ** we 
22430 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20  figure out that 
22440 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
22450 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e  x is not needed.
22460 20 20 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e    The addrSortIn
22470 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  dex.  ** variabl
22480 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63  e is used to fac
22490 69 6c 69 74 61 74 65 20 74 68 61 74 20 63 68 61  ilitate that cha
224a0 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nge..  */.  if( 
224b0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
224c0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
224d0 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  o;.    pKeyInfo 
224e0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
224f0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
22500 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72  rderBy);.    pOr
22510 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20  derBy->iECursor 
22520 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
22530 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  ;.    p->addrOpe
22540 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53  nEphm[2] = addrS
22550 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20  ortIndex =.     
22560 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22570 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
22580 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20  emeral,.        
22590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225a0 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43     pOrderBy->iEC
225b0 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d  ursor, pOrderBy-
225c0 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20  >nExpr+2, 0,.   
225d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225e0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
225f0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
22600 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
22610 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 53  }else{.    addrS
22620 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20  ortIndex = -1;. 
22630 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
22640 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
22650 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
22660 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
22670 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
22680 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
22690 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
226a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
226b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
226c0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
226d0 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 70 45 4c  Dest->iParm, pEL
226e0 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d  ist->nExpr);.  }
226f0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c  ..  /* Set the l
22700 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  imiter..  */.  i
22710 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
22720 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
22730 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
22740 20 28 64 6f 75 62 6c 65 29 4c 41 52 47 45 53 54   (double)LARGEST
22750 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74  _INT64;.  comput
22760 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
22770 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29  pParse, p, iEnd)
22780 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
22790 74 3d 3d 30 20 26 26 20 61 64 64 72 53 6f 72 74  t==0 && addrSort
227a0 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20  Index>=0 ){.    
227b0 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
227c0 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65  (v, addrSortInde
227d0 78 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  x)->opcode = OP_
227e0 53 6f 72 74 65 72 4f 70 65 6e 3b 0a 20 20 20 20  SorterOpen;.    
227f0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
22800 46 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d  F_UseSorter;.  }
22810 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69  ..  /* Open a vi
22820 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75  rtual index to u
22830 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
22840 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
22850 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
22860 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b  & SF_Distinct ){
22870 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
22880 65 79 49 6e 66 6f 3b 0a 20 20 20 20 64 69 73 74  eyInfo;.    dist
22890 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
228a0 54 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49  Tab++;.    pKeyI
228b0 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
228c0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
228d0 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
228e0 20 20 61 64 64 72 44 69 73 74 69 6e 63 74 49 6e    addrDistinctIn
228f0 64 65 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dex = sqlite3Vdb
22900 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
22910 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 69 73  enEphemeral, dis
22920 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  tinct, 0, 0,.   
22930 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
22940 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
22950 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 73  _HANDOFF);.    s
22960 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
22970 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52  P5(v, BTREE_UNOR
22980 44 45 52 45 44 29 3b 0a 20 20 7d 65 6c 73 65 7b  DERED);.  }else{
22990 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20  .    distinct = 
229a0 61 64 64 72 44 69 73 74 69 6e 63 74 49 6e 64 65  addrDistinctInde
229b0 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  x = -1;.  }..  /
229c0 2a 20 41 67 67 72 65 67 61 74 65 20 61 6e 64 20  * Aggregate and 
229d0 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75  non-aggregate qu
229e0 65 72 69 65 73 20 61 72 65 20 68 61 6e 64 6c 65  eries are handle
229f0 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 2a 2f  d differently */
22a00 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26  .  if( !isAgg &&
22a10 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
22a20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44      ExprList *pD
22a30 69 73 74 20 3d 20 28 69 73 44 69 73 74 69 6e 63  ist = (isDistinc
22a40 74 20 3f 20 70 2d 3e 70 45 4c 69 73 74 20 3a 20  t ? p->pEList : 
22a50 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69  0);..    /* Begi
22a60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  n the database s
22a70 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e  can. */.    pWIn
22a80 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
22a90 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
22aa0 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
22ab0 20 26 70 4f 72 64 65 72 42 79 2c 20 70 44 69 73   &pOrderBy, pDis
22ac0 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  t, 0);.    if( p
22ad0 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
22ae0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
22af0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  if( pWInfo->nRow
22b00 4f 75 74 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74  Out < p->nSelect
22b10 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  Row ) p->nSelect
22b20 52 6f 77 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52  Row = pWInfo->nR
22b30 6f 77 4f 75 74 3b 0a 0a 20 20 20 20 2f 2a 20 49  owOut;..    /* I
22b40 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  f sorting index 
22b50 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64  that was created
22b60 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f   by a prior OP_O
22b70 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20  penEphemeral .  
22b80 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
22b90 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65   ended up not be
22ba0 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e  ing needed, then
22bb0 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f   change the OP_O
22bc0 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20  penEphemeral.   
22bd0 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e   ** into an OP_N
22be0 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
22bf0 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e 64 65  if( addrSortInde
22c00 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79  x>=0 && pOrderBy
22c10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
22c20 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
22c30 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74  Noop(v, addrSort
22c40 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d  Index);.      p-
22c50 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
22c60 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20   = -1;.    }..  
22c70 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 44    if( pWInfo->eD
22c80 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
22c90 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20   VdbeOp *pOp;   
22ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22cb0 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72  No longer requir
22cc0 65 64 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  ed OpenEphemeral
22cd0 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20 20 20 20   instr. */.     
22ce0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
22cf0 64 64 72 44 69 73 74 69 6e 63 74 49 6e 64 65 78  ddrDistinctIndex
22d00 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4f 70  >=0 );.      pOp
22d10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
22d20 74 4f 70 28 76 2c 20 61 64 64 72 44 69 73 74 69  tOp(v, addrDisti
22d30 6e 63 74 49 6e 64 65 78 29 3b 0a 0a 20 20 20 20  nctIndex);..    
22d40 20 20 61 73 73 65 72 74 28 20 69 73 44 69 73 74    assert( isDist
22d50 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73  inct );.      as
22d60 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 65 44  sert( pWInfo->eD
22d70 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44  istinct==WHERE_D
22d80 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 20  ISTINCT_ORDERED 
22d90 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
22da0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
22db0 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  ==WHERE_DISTINCT
22dc0 5f 55 4e 49 51 55 45 20 0a 20 20 20 20 20 20 29  _UNIQUE .      )
22dd0 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63 74  ;.      distinct
22de0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28   = -1;.      if(
22df0 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
22e00 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e  ct==WHERE_DISTIN
22e10 43 54 5f 4f 52 44 45 52 45 44 20 29 7b 0a 20 20  CT_ORDERED ){.  
22e20 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b        int iJump;
22e30 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 45 78  .        int iEx
22e40 70 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  pr;.        int 
22e50 69 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  iFlag = ++pParse
22e60 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
22e70 69 6e 74 20 69 42 61 73 65 20 3d 20 70 50 61 72  int iBase = pPar
22e80 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
22e90 20 20 20 20 69 6e 74 20 69 42 61 73 65 32 20 3d      int iBase2 =
22ea0 20 69 42 61 73 65 20 2b 20 70 45 4c 69 73 74 2d   iBase + pEList-
22eb0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
22ec0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
22ed0 28 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2a 32  (pEList->nExpr*2
22ee0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  );..        /* C
22ef0 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65  hange the OP_Ope
22f00 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64  nEphemeral coded
22f10 20 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f   earlier to an O
22f20 50 5f 49 6e 74 65 67 65 72 2e 20 54 68 65 0a 20  P_Integer. The. 
22f30 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 49 6e 74         ** OP_Int
22f40 65 67 65 72 20 69 6e 69 74 69 61 6c 69 7a 65 73  eger initializes
22f50 20 74 68 65 20 22 66 69 72 73 74 20 72 6f 77 22   the "first row"
22f60 20 66 6c 61 67 2e 20 20 2a 2f 0a 20 20 20 20 20   flag.  */.     
22f70 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
22f80 20 4f 50 5f 49 6e 74 65 67 65 72 3b 0a 20 20 20   OP_Integer;.   
22f90 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31       pOp->p1 = 1
22fa0 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
22fb0 32 20 3d 20 69 46 6c 61 67 3b 0a 0a 20 20 20 20  2 = iFlag;..    
22fc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
22fd0 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
22fe0 73 65 2c 20 70 45 4c 69 73 74 2c 20 69 42 61 73  se, pEList, iBas
22ff0 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 1);.        i
23000 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Jump = sqlite3Vd
23010 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
23020 20 2b 20 31 20 2b 20 70 45 4c 69 73 74 2d 3e 6e   + 1 + pEList->n
23030 45 78 70 72 20 2b 20 31 20 2b 20 31 3b 0a 20 20  Expr + 1 + 1;.  
23040 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23050 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
23060 2c 20 69 46 6c 61 67 2c 20 69 4a 75 6d 70 2d 31  , iFlag, iJump-1
23070 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
23080 45 78 70 72 3d 30 3b 20 69 45 78 70 72 3c 70 45  Expr=0; iExpr<pE
23090 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 45 78  List->nExpr; iEx
230a0 70 72 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  pr++){.         
230b0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
230c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
230d0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 4c  lSeq(pParse, pEL
230e0 69 73 74 2d 3e 61 5b 69 45 78 70 72 5d 2e 70 45  ist->a[iExpr].pE
230f0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
23100 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23110 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 69 42 61 73  3(v, OP_Ne, iBas
23120 65 2b 69 45 78 70 72 2c 20 69 4a 75 6d 70 2c 20  e+iExpr, iJump, 
23130 69 42 61 73 65 32 2b 69 45 78 70 72 29 3b 0a 20  iBase2+iExpr);. 
23140 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23150 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
23160 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  -1, (const char 
23170 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
23180 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20  SEQ);.          
23190 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
231a0 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55  eP5(v, SQLITE_NU
231b0 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d  LLEQ);.        }
231c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
231d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
231e0 5f 47 6f 74 6f 2c 20 30 2c 20 70 57 49 6e 66 6f  _Goto, 0, pWInfo
231f0 2d 3e 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20  ->iContinue);.. 
23200 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
23210 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
23220 6e 74 65 67 65 72 2c 20 30 2c 20 69 46 6c 61 67  nteger, 0, iFlag
23230 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
23240 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t( sqlite3VdbeCu
23250 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a  rrentAddr(v)==iJ
23260 75 6d 70 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ump );.        s
23270 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
23280 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 42 61  (v, OP_Move, iBa
23290 73 65 2c 20 69 42 61 73 65 32 2c 20 70 45 4c 69  se, iBase2, pELi
232a0 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
232b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
232c0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
232d0 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a  P_Noop;.      }.
232e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73      }..    /* Us
232f0 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  e the standard i
23300 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20  nner loop. */.  
23310 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
23320 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
23330 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
23340 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 70  rBy, distinct, p
23350 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
23360 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
23370 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49  ->iContinue, pWI
23380 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20  nfo->iBreak);.. 
23390 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61     /* End the da
233a0 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70  tabase scan loop
233b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
233c0 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
233d0 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nfo);.  }else{. 
233e0 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
233f0 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  e processing for
23400 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
23410 65 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f  es */.    NameCo
23420 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a  ntext sNC;    /*
23430 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
23440 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67  r processing agg
23450 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69  regate informati
23460 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  on */.    int iA
23470 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
23480 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
23490 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63  ss for storing c
234a0 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
234b0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d  */.    int iBMem
234c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
234d0 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
234e0 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f  for previous GRO
234f0 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
23500 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20   iUseFlag;      
23510 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
23520 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64  holding flag ind
23530 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20  icating that at 
23540 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20  least.          
23550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
23560 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
23570 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67  input to the agg
23580 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e  regator has been
23590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
235a0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
235b0 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  essed */.    int
235c0 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20   iAbortFlag;    
235d0 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
235e0 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65  which causes que
235f0 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69  ry abort if posi
23600 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tive */.    int 
23610 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20  groupBySort;    
23620 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f  /* Rows come fro
23630 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55  m source in GROU
23640 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20  P BY order */.  
23650 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20    int addrEnd;  
23660 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
23670 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74  processing for t
23680 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
23690 20 20 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d    int sortPTab =
236a0 20 30 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74   0;   /* Pseudot
236b0 61 62 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63  able used to dec
236c0 6f 64 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75  ode sorting resu
236d0 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lts */.    int s
236e0 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f  ortOut = 0;    /
236f0 2a 20 4f 75 74 70 75 74 20 72 65 67 69 73 74 65  * Output registe
23700 72 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  r from the sorte
23710 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  r */..    /* Rem
23720 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20  ove any and all 
23730 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20  aliases between 
23740 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
23750 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52  nd the.    ** GR
23760 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  OUP BY clause.. 
23770 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
23780 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
23790 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20  int k;          
237a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
237b0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
237c0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
237d0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
237e0 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  em;  /* For loop
237f0 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73  ing over express
23800 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f  ion in a list */
23810 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d  ..      for(k=p-
23820 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
23830 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d  pItem=p->pEList-
23840 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
23850 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
23860 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20  pItem->iAlias = 
23870 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
23880 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d   for(k=pGroupBy-
23890 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47  >nExpr, pItem=pG
238a0 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20  roupBy->a; k>0; 
238b0 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
238c0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41         pItem->iA
238d0 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
238e0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  }.      if( p->n
238f0 53 65 6c 65 63 74 52 6f 77 3e 28 64 6f 75 62 6c  SelectRow>(doubl
23900 65 29 31 30 30 20 29 20 70 2d 3e 6e 53 65 6c 65  e)100 ) p->nSele
23910 63 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29  ctRow = (double)
23920 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  100;.    }else{.
23930 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
23940 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b  Row = (double)1;
23950 0a 20 20 20 20 7d 0a 0a 20 0a 20 20 20 20 2f 2a  .    }.. .    /*
23960 20 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20   Create a label 
23970 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20  to jump to when 
23980 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74  we want to abort
23990 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
239a0 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69    addrEnd = sqli
239b0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
239c0 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  (v);..    /* Con
239d0 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e  vert TK_COLUMN n
239e0 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47  odes into TK_AGG
239f0 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65  _COLUMN and make
23a00 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20   entries in.    
23a10 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20  ** sAggInfo for 
23a20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  all TK_AGG_FUNCT
23a30 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70  ION nodes in exp
23a40 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a  ressions of the.
23a50 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74      ** SELECT st
23a60 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a  atement..    */.
23a70 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c      memset(&sNC,
23a80 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
23a90 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65  ;.    sNC.pParse
23aa0 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73   = pParse;.    s
23ab0 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
23ac0 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e  abList;.    sNC.
23ad0 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67  pAggInfo = &sAgg
23ae0 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e  Info;.    sAggIn
23af0 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
23b00 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70  n = pGroupBy ? p
23b10 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31  GroupBy->nExpr+1
23b20 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e   : 0;.    sAggIn
23b30 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  fo.pGroupBy = pG
23b40 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69  roupBy;.    sqli
23b50 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
23b60 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69  gList(&sNC, pELi
23b70 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
23b80 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
23b90 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42  st(&sNC, pOrderB
23ba0 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76  y);.    if( pHav
23bb0 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
23bc0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
23bd0 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20  ggregates(&sNC, 
23be0 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a  pHaving);.    }.
23bf0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63      sAggInfo.nAc
23c00 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67  cumulator = sAgg
23c10 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Info.nColumn;.  
23c20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
23c30 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b  gInfo.nFunc; i++
23c40 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
23c50 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
23c60 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  y(sAggInfo.aFunc
23c70 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49  [i].pExpr, EP_xI
23c80 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
23c90 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
23ca0 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
23cb0 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
23cc0 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  [i].pExpr->x.pLi
23cd0 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  st);.    }.    i
23ce0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
23cf0 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  led ) goto selec
23d00 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50  t_end;..    /* P
23d10 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67  rocessing for ag
23d20 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52  gregates with GR
23d30 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64  OUP BY is very d
23d40 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20  ifferent and.   
23d50 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f   ** much more co
23d60 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65  mplex than aggre
23d70 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20  gates without a 
23d80 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f  GROUP BY..    */
23d90 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
23da0 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e  y ){.      KeyIn
23db0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f  fo *pKeyInfo;  /
23dc0 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61  * Keying informa
23dd0 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f  tion for the gro
23de0 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  up by clause */.
23df0 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 20 20 20        int j1;   
23e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76            /* A-v
23e10 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20  s-B comparision 
23e20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e  jump */.      in
23e30 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b  t addrOutputRow;
23e40 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75    /* Start of su
23e50 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
23e60 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72  tputs a result r
23e70 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ow */.      int 
23e80 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20  regOutputRow;   
23e90 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73  /* Return addres
23ea0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f  s register for o
23eb0 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
23ec0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
23ed0 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a  drSetAbort;   /*
23ee0 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66   Set the abort f
23ef0 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a  lag and return *
23f00 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
23f10 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54  TopOfLoop;  /* T
23f20 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  op of the input 
23f30 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e  loop */.      in
23f40 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  t addrSortingIdx
23f50 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e  ; /* The OP_Open
23f60 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68  Ephemeral for th
23f70 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
23f80 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
23f90 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
23fa0 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72  Subroutine for r
23fb0 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63  esetting the acc
23fc0 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20  umulator */.    
23fd0 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20    int regReset; 
23fe0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
23ff0 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
24000 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f   for reset subro
24010 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20  utine */..      
24020 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
24030 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
24040 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61   we might need a
24050 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
24060 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65  o.      ** imple
24070 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61  ment it.  Alloca
24080 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20  te that sorting 
24090 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69  index now.  If i
240a0 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20  t turns out.    
240b0 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
240c0 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65  not need it afte
240d0 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f  r all, the OP_So
240e0 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63  rterOpen instruc
240f0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69  tion.      ** wi
24100 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ll be converted 
24110 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20  into a Noop.  . 
24120 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41       */.      sA
24130 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
24140 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
24150 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  ++;.      pKeyIn
24160 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
24170 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
24180 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20   pGroupBy);.    
24190 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78    addrSortingIdx
241a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
241b0 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp4(v, OP_Sorte
241c0 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20  rOpen, .        
241d0 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
241e0 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e  ngIdx, sAggInfo.
241f0 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20  nSortingColumn, 
24200 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63  .          0, (c
24210 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
24220 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
24230 46 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e  F);..      /* In
24240 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20  itialize memory 
24250 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62  locations used b
24260 79 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65  y GROUP BY aggre
24270 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a  gate processing.
24280 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
24290 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  UseFlag = ++pPar
242a0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
242b0 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70  iAbortFlag = ++p
242c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
242d0 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20     regOutputRow 
242e0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
242f0 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70  ;.      addrOutp
24300 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  utRow = sqlite3V
24310 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
24320 0a 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20  .      regReset 
24330 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
24340 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65  ;.      addrRese
24350 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
24360 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
24370 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73     iAMem = pPars
24380 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
24390 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
243a0 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
243b0 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20  pr;.      iBMem 
243c0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
243d0 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
243e0 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
243f0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
24400 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24410 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
24420 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29  , 0, iAbortFlag)
24430 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
24440 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61  ent((v, "clear a
24450 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
24460 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
24470 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
24480 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67  ger, 0, iUseFlag
24490 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
244a0 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61  ment((v, "indica
244b0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65  te accumulator e
244c0 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73  mpty"));.      s
244d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
244e0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
244f0 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72  iAMem, iAMem+pGr
24500 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b  oupBy->nExpr-1);
24510 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e  ..      /* Begin
24520 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
24530 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f  l extract all so
24540 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f  urce rows in GRO
24550 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20  UP BY order..   
24560 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
24570 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70   involve two sep
24580 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68  arate loops with
24590 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62   an OP_Sort in b
245a0 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20  etween, or.     
245b0 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
245c0 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68  a single loop th
245d0 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  at uses an index
245e0 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f   to extract info
245f0 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  rmation.      **
24600 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72   in the right or
24610 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74  der to begin wit
24620 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
24630 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24640 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
24650 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
24660 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49  eset);.      pWI
24670 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
24680 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
24690 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
246a0 2c 20 26 70 47 72 6f 75 70 42 79 2c 20 30 2c 20  , &pGroupBy, 0, 
246b0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  0);.      if( pW
246c0 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
246d0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
246e0 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30   if( pGroupBy==0
246f0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
24700 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20  he optimizer is 
24710 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20  able to deliver 
24720 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79  rows in group by
24730 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20   order so.      
24740 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68    ** we do not h
24750 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68  ave to sort.  Th
24760 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
24770 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  al table will be
24780 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63  .        ** canc
24790 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61  elled later beca
247a0 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  use we still nee
247b0 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65  d to use the pKe
247c0 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f  yInfo.        */
247d0 0a 20 20 20 20 20 20 20 20 70 47 72 6f 75 70 42  .        pGroupB
247e0 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
247f0 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
24800 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sort = 0;.      
24810 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
24820 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e  * Rows are comin
24830 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72  g out in undeter
24840 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65  mined order.  We
24850 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20   have to push.  
24860 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f        ** each ro
24870 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67  w into a sorting
24880 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74   index, terminat
24890 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  e the first loop
248a0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
248b0 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20  n loop over the 
248c0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e  sorting index in
248d0 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
248e0 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20  e output.       
248f0 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72   ** in sorted or
24900 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  der.        */. 
24910 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42 61         int regBa
24920 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se;.        int 
24930 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20  regRecord;.     
24940 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
24950 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42       int nGroupB
24960 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c  y;..        expl
24970 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
24980 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
24990 20 20 69 73 44 69 73 74 69 6e 63 74 20 26 26 20    isDistinct && 
249a0 21 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46  !(p->selFlags&SF
249b0 5f 44 69 73 74 69 6e 63 74 29 3f 22 44 49 53 54  _Distinct)?"DIST
249c0 49 4e 43 54 22 3a 22 47 52 4f 55 50 20 42 59 22  INCT":"GROUP BY"
249d0 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75  );..        grou
249e0 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20  pBySort = 1;.   
249f0 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20       nGroupBy = 
24a00 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
24a10 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  .        nCol = 
24a20 6e 47 72 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20  nGroupBy + 1;.  
24a30 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
24a40 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f  By+1;.        fo
24a50 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
24a60 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
24a70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
24a80 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e  AggInfo.aCol[i].
24a90 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
24aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24ab0 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nCol++;.        
24ac0 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
24ad0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
24ae0 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
24af0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
24b00 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
24b10 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
24b20 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
24b30 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
24b40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
24b50 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
24b60 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67  e, pGroupBy, reg
24b70 42 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Base, 0);.      
24b80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24b90 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e  Op2(v, OP_Sequen
24ba0 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  ce, sAggInfo.sor
24bb0 74 69 6e 67 49 64 78 2c 72 65 67 42 61 73 65 2b  tingIdx,regBase+
24bc0 6e 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20  nGroupBy);.     
24bd0 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b     j = nGroupBy+
24be0 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  1;.        for(i
24bf0 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
24c00 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
24c10 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
24c20 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
24c30 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f   = &sAggInfo.aCo
24c40 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[i];.          
24c50 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
24c60 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
24c70 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
24c80 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a   = j + regBase;.
24c90 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
24ca0 72 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  r2;..           
24cb0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
24cc0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
24cd0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
24ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cf0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
24d00 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e  b, pCol->iColumn
24d10 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20  , pCol->iTable, 
24d20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
24d30 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20   if( r1!=r2 ){. 
24d40 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
24d50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
24d60 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20  , OP_SCopy, r2, 
24d70 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
24d80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a   }.            j
24d90 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
24da0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24db0 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
24dc0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
24dd0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
24de0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24df0 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
24e00 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  ord, regBase, nC
24e10 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ol, regRecord);.
24e20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
24e30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
24e40 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41  SorterInsert, sA
24e50 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
24e60 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  x, regRecord);. 
24e70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
24e80 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
24e90 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
24ea0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24eb0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
24ec0 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
24ed0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
24ee0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
24ef0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
24f00 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
24f10 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74  ngIdxPTab = sort
24f20 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  PTab = pParse->n
24f30 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73  Tab++;.        s
24f40 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ortOut = sqlite3
24f50 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
24f60 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
24f70 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
24f80 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
24f90 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75  sortPTab, sortOu
24fa0 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, nCol);.      
24fb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24fc0 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
24fd0 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Sort, sAggInfo.s
24fe0 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45  ortingIdx, addrE
24ff0 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  nd);.        Vdb
25000 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52  eComment((v, "GR
25010 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a  OUP BY sort"));.
25020 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
25030 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d  .useSortingIdx =
25040 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   1;.        sqli
25050 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
25060 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
25070 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61   }..      /* Eva
25080 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e  luate the curren
25090 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  t GROUP BY terms
250a0 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30   and store in b0
250b0 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20  , b1, b2....    
250c0 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f    ** (b0 is memo
250d0 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65  ry location iBMe
250e0 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d  m+0, b1 is iBMem
250f0 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  +1, and so forth
25100 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20  ).      ** Then 
25110 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72  compare the curr
25120 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
25130 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47  ms against the G
25140 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20  ROUP BY terms.  
25150 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
25160 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72  previous row cur
25170 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
25180 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20   a0, a1, a2.... 
25190 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
251a0 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71  drTopOfLoop = sq
251b0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
251c0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
251d0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
251e0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
251f0 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
25200 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ort ){.        s
25210 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
25220 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
25230 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  a, sAggInfo.sort
25240 69 6e 67 49 64 78 2c 20 73 6f 72 74 4f 75 74 29  ingIdx, sortOut)
25250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25260 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75  for(j=0; j<pGrou
25270 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  pBy->nExpr; j++)
25280 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72  {.        if( gr
25290 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
252a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
252b0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
252c0 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c  olumn, sortPTab,
252d0 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20   j, iBMem+j);.  
252e0 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30          if( j==0
252f0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   ) sqlite3VdbeCh
25300 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
25310 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a 20 20  _CLEARCACHE);.  
25320 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25330 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
25340 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
25350 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25360 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
25370 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d  , pGroupBy->a[j]
25380 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29  .pExpr, iBMem+j)
25390 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
253a0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
253b0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
253c0 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d  P_Compare, iAMem
253d0 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42  , iBMem, pGroupB
253e0 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  y->nExpr,.      
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25400 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
25410 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
25420 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c  ;.      j1 = sql
25430 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
25440 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
25450 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
25460 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31  v, OP_Jump, j1+1
25470 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a 20 20 20  , 0, j1+1);..   
25480 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
25490 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68  ode that runs wh
254a0 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55 50  enever the GROUP
254b0 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20   BY changes..   
254c0 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e     ** Changes in
254d0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 72   the GROUP BY ar
254e0 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68  e detected by th
254f0 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a  e previous code.
25500 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20        ** block. 
25510 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e   If there were n
25520 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20  o changes, this 
25530 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64  block is skipped
25540 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
25550 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f   ** This code co
25560 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f  pies current gro
25570 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62  up by terms in b
25580 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20  0,b1,b2,....    
25590 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c    ** over to a0,
255a0 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20  a1,a2.  It then 
255b0 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74  calls the output
255c0 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
255d0 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20    ** and resets 
255e0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
255f0 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
25600 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74 69  ers in preparati
25610 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  on.      ** for 
25620 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42  the next GROUP B
25630 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a  Y batch..      *
25640 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
25650 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
25660 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d  se, iBMem, iAMem
25670 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  , pGroupBy->nExp
25680 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
25690 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
256a0 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70  P_Gosub, regOutp
256b0 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75  utRow, addrOutpu
256c0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62  tRow);.      Vdb
256d0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75  eComment((v, "ou
256e0 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b  tput one row"));
256f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
25700 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
25710 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67  fPos, iAbortFlag
25720 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
25730 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
25740 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66  , "check abort f
25750 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
25760 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
25770 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
25780 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74  Reset, addrReset
25790 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
257a0 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20  ment((v, "reset 
257b0 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
257c0 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
257d0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
257e0 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65  ccumulators base
257f0 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d on the content
25800 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
25810 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20   current row.   
25820 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
25830 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
25840 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 75 70  v, j1);.      up
25850 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
25860 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
25870 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
25880 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
25890 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55  P_Integer, 1, iU
258a0 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  seFlag);.      V
258b0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
258c0 69 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e  indicate data in
258d0 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
258e0 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f  ..      /* End o
258f0 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20  f the loop.     
25900 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72   */.      if( gr
25910 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
25920 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25930 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
25940 74 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66  terNext, sAggInf
25950 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
25960 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20  drTopOfLoop);.  
25970 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25980 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
25990 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
259a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
259b0 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
259c0 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a  ddrSortingIdx);.
259d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
259e0 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e  * Output the fin
259f0 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  al row of result
25a00 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
25a10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25a20 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
25a30 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
25a40 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
25a50 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
25a60 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c  v, "output final
25a70 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20   row"));..      
25a80 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65  /* Jump over the
25a90 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20   subroutines.   
25aa0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
25ab0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
25ac0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
25ad0 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  rEnd);..      /*
25ae0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
25af0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
25b00 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  uts a single row
25b10 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20   of the result. 
25b20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68       ** set.  Th
25b30 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69  is subroutine fi
25b40 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65  rst looks at the
25b50 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69   iUseFlag.  If i
25b60 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a  UseFlag.      **
25b70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
25b80 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20   equal to zero, 
25b90 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69  the subroutine i
25ba0 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20  s a no-op.  If. 
25bb0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63       ** the proc
25bc0 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72  essing calls for
25bd0 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62   the query to ab
25be0 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75  ort, this subrou
25bf0 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tine.      ** in
25c00 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62  crements the iAb
25c10 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c  ortFlag memory l
25c20 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72  ocation before r
25c30 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20  eturning in.    
25c40 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69    ** order to si
25c50 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20  gnal the caller 
25c60 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20  to abort..      
25c70 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74  */.      addrSet
25c80 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Abort = sqlite3V
25c90 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
25ca0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25cb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
25cc0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62  _Integer, 1, iAb
25cd0 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
25ce0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
25cf0 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22  "set abort flag"
25d00 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
25d10 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
25d20 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
25d30 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73  putRow);.      s
25d40 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
25d50 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75  eLabel(v, addrOu
25d60 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
25d70 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
25d80 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
25d90 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
25da0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
25db0 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p2(v, OP_IfPos, 
25dc0 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75  iUseFlag, addrOu
25dd0 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20  tputRow+2);.    
25de0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
25df0 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c  , "Groupby resul
25e00 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72  t generator entr
25e10 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20  y point"));.    
25e20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25e30 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
25e40 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
25e50 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41  .      finalizeA
25e60 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
25e70 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
25e80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25e90 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
25ea0 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75   pHaving, addrOu
25eb0 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54  tputRow+1, SQLIT
25ec0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
25ed0 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
25ee0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
25ef0 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p->pEList, 0, 0,
25f00 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   pOrderBy,.     
25f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f20 20 64 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74   distinct, pDest
25f30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25f40 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70          addrOutp
25f50 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74  utRow+1, addrSet
25f60 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71  Abort);.      sq
25f70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
25f80 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
25f90 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
25fa0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
25fb0 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20  v, "end groupby 
25fc0 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72  result generator
25fd0 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  "));..      /* G
25fe0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
25ff0 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72  tine that will r
26000 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62  eset the group-b
26010 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20  y accumulator.  
26020 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
26030 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
26040 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65  abel(v, addrRese
26050 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41  t);.      resetA
26060 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
26070 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
26080 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26090 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
260a0 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a  urn, regReset);.
260b0 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65       .    } /* e
260c0 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20  ndif pGroupBy.  
260d0 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65 20  Begin aggregate 
260e0 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 20  queries without 
260f0 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20  GROUP BY: */.   
26100 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78   else {.      Ex
26110 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30  prList *pDel = 0
26120 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
26130 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
26140 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
26150 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ab;.      if( (p
26160 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f  Tab = isSimpleCo
26170 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f  unt(p, &sAggInfo
26180 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
26190 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43   /* If isSimpleC
261a0 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61  ount() returns a
261b0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61   pointer to a Ta
261c0 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 74  ble structure, t
261d0 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  hen.        ** t
261e0 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
261f0 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
26200 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
26210 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
26220 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74  count(*) FROM <t
26230 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  bl>.        **. 
26240 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20         ** where 
26250 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
26260 75 72 65 20 72 65 74 75 72 6e 65 64 20 72 65 70  ure returned rep
26270 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74  resents table <t
26280 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  bl>..        **.
26290 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
262a0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20  statement is so 
262b0 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69  common that it i
262c0 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63  s optimized spec
262d0 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20  ially. The.     
262e0 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69     ** OP_Count i
262f0 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78  nstruction is ex
26300 65 63 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e  ecuted either on
26310 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c   the intkey tabl
26320 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  e that.        *
26330 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
26340 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74  ata for table <t
26350 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66  bl> or on one of
26360 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74   its indexes. It
26370 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62  .        ** is b
26380 65 74 74 65 72 20 74 6f 20 65 78 65 63 75 74 65  etter to execute
26390 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e   the op on an in
263a0 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20  dex, as indexes 
263b0 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20  are almost.     
263c0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72     ** always spr
263d0 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20  ead across less 
263e0 70 61 67 65 73 20 74 68 61 6e 20 74 68 65 69 72  pages than their
263f0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
26400 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  ables..        *
26410 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  /.        const 
26420 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
26430 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
26440 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
26450 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
26460 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73     const int iCs
26470 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
26480 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ++;     /* Curso
26490 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65  r to scan b-tree
264a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65   */.        Inde
264b0 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
264c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264d0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
264e0 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  iable */.       
264f0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
26500 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  fo = 0;         
26510 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f        /* Keyinfo
26520 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64   for scanned ind
26530 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e  ex */.        In
26540 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20  dex *pBest = 0; 
26550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26560 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78     /* Best index
26570 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f   found so far */
26580 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f  .        int iRo
26590 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b  ot = pTab->tnum;
265a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
265b0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63   Root page of sc
265c0 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a  anned b-tree */.
265d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
265e0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
265f0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
26600 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61         sqlite3Ta
26610 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
26620 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
26630 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
26640 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ;..        /* Se
26650 61 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64  arch for the ind
26660 65 78 20 74 68 61 74 20 68 61 73 20 74 68 65 20  ex that has the 
26670 6c 65 61 73 74 20 61 6d 6f 75 6e 74 20 6f 66 20  least amount of 
26680 63 6f 6c 75 6d 6e 73 2e 20 49 66 0a 20 20 20 20  columns. If.    
26690 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20      ** there is 
266a0 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2c 20 61  such an index, a
266b0 6e 64 20 69 74 20 68 61 73 20 6c 65 73 73 20 63  nd it has less c
266c0 6f 6c 75 6d 6e 73 20 74 68 61 6e 20 74 68 65 20  olumns than the 
266d0 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a  table.        **
266e0 20 64 6f 65 73 2c 20 74 68 65 6e 20 77 65 20 63   does, then we c
266f0 61 6e 20 61 73 73 75 6d 65 20 74 68 61 74 20 69  an assume that i
26700 74 20 63 6f 6e 73 75 6d 65 73 20 6c 65 73 73 20  t consumes less 
26710 73 70 61 63 65 20 6f 6e 20 64 69 73 6b 20 61 6e  space on disk an
26720 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c  d.        ** wil
26730 6c 20 74 68 65 72 65 66 6f 72 65 20 62 65 20 63  l therefore be c
26740 68 65 61 70 65 72 20 74 6f 20 73 63 61 6e 20 74  heaper to scan t
26750 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
26760 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 20 20  query result..  
26770 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
26780 20 63 61 73 65 20 73 65 74 20 69 52 6f 6f 74 20   case set iRoot 
26790 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
267a0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
267b0 6e 64 65 78 20 62 2d 74 72 65 65 0a 20 20 20 20  ndex b-tree.    
267c0 20 20 20 20 2a 2a 20 61 6e 64 20 70 4b 65 79 49      ** and pKeyI
267d0 6e 66 6f 20 74 6f 20 74 68 65 20 4b 65 79 49 6e  nfo to the KeyIn
267e0 66 6f 20 73 74 72 75 63 74 75 72 65 20 72 65 71  fo structure req
267f0 75 69 72 65 64 20 74 6f 20 6e 61 76 69 67 61 74  uired to navigat
26800 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  e the.        **
26810 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
26820 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32  **.        ** (2
26830 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f  011-04-15) Do no
26840 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e  t do a full scan
26850 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64   of an unordered
26860 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
26870 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  **.        ** In
26880 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65   practice the Ke
26890 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
268a0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64  will not be used
268b0 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20  . It is only .  
268c0 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20        ** passed 
268d0 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52  to keep OP_OpenR
268e0 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20  ead happy..     
268f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f     */.        fo
26900 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
26910 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
26920 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
26930 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
26940 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 20  ->bUnordered==0 
26950 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49  && (!pBest || pI
26960 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 42 65 73  dx->nColumn<pBes
26970 74 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 7b 0a 20  t->nColumn) ){. 
26980 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74             pBest
26990 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20   = pIdx;.       
269a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
269b0 20 20 20 20 20 20 20 69 66 28 20 70 42 65 73 74         if( pBest
269c0 20 26 26 20 70 42 65 73 74 2d 3e 6e 43 6f 6c 75   && pBest->nColu
269d0 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  mn<pTab->nCol ){
269e0 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74  .          iRoot
269f0 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a   = pBest->tnum;.
26a00 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
26a10 66 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  fo = sqlite3Inde
26a20 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
26a30 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20   pBest);.       
26a40 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   }..        /* O
26a50 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  pen a read-only 
26a60 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20  cursor, execute 
26a70 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c  the OP_Count, cl
26a80 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ose the cursor. 
26a90 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
26aa0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
26ab0 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 73  OP_OpenRead, iCs
26ac0 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 29 3b 0a  r, iRoot, iDb);.
26ad0 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
26ae0 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
26af0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
26b00 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
26b10 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  ar *)pKeyInfo, P
26b20 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
26b30 46 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  F);.        }.  
26b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26b50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
26b60 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49  unt, iCsr, sAggI
26b70 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65  nfo.aFunc[0].iMe
26b80 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
26b90 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
26ba0 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29   OP_Close, iCsr)
26bb0 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ;.        explai
26bc0 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61  nSimpleCount(pPa
26bd0 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74  rse, pTab, pBest
26be0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
26bf0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
26c00 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20  OMIT_BTREECOUNT 
26c10 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  */.      {.     
26c20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
26c30 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f  he query is of o
26c40 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
26c50 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20  ing forms:.     
26c60 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
26c70 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29     SELECT min(x)
26c80 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20   FROM ....      
26c90 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61    **   SELECT ma
26ca0 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  x(x) FROM ....  
26cb0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
26cc0 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68   ** If it is, th
26cd0 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20  en ask the code 
26ce0 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74  in where.c to at
26cf0 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65  tempt to sort re
26d00 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  sults.        **
26d10 20 61 73 20 69 66 20 74 68 65 72 65 20 77 61 73   as if there was
26d20 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22   an "ORDER ON x"
26d30 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20   or "ORDER ON x 
26d40 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20  DESC" clause. . 
26d50 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65         ** If whe
26d60 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20  re.c is able to 
26d70 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20  produce results 
26d80 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f  sorted in this o
26d90 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20  rder, then.     
26da0 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63     ** add vdbe c
26db0 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ode to break out
26dc0 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69   of the processi
26dd0 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68  ng loop after th
26de0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  e .        ** fi
26df0 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73  rst iteration (s
26e00 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69  ince the first i
26e10 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
26e20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20  loop is .       
26e30 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74   ** guaranteed t
26e40 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
26e50 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69   row with the mi
26e60 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d  nimum or maximum
26e70 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c   .        ** val
26e80 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c  ue of x, the onl
26e90 79 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e  y row required).
26ea0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
26eb0 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c      ** A special
26ec0 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61   flag must be pa
26ed0 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
26ee0 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73  hereBegin() to s
26ef0 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20  lightly.        
26f00 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69  ** modify behavi
26f10 6f 75 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  our as follows:.
26f20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
26f30 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65     **   + If the
26f40 20 71 75 65 72 79 20 69 73 20 61 20 22 53 45 4c   query is a "SEL
26f50 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65  ECT min(x)", the
26f60 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64  n the loop coded
26f70 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   by.        **  
26f80 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c     where.c shoul
26f90 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76  d not iterate ov
26fa0 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69  er any values wi
26fb0 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a  th a NULL value.
26fc0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66          **     f
26fd0 6f 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  or x..        **
26fe0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  .        **   + 
26ff0 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f  The optimizer co
27000 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74  de in where.c (t
27010 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 64 65  he thing that de
27020 63 69 64 65 73 20 77 68 69 63 68 0a 20 20 20 20  cides which.    
27030 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78      **     index
27040 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75   or indices to u
27050 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65  se) should place
27060 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 69   a different pri
27070 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20  ority on .      
27080 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79    **     satisfy
27090 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20 42  ing the 'ORDER B
270a0 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69  Y' clause than i
270b0 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20  t does in other 
270c0 63 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  cases..        *
270d0 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f 20 63  *     Refer to c
270e0 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73  ode and comments
270f0 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20   in where.c for 
27100 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20  details..       
27110 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
27120 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20  List *pMinMax = 
27130 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c  0;.        u8 fl
27140 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79  ag = minMaxQuery
27150 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
27160 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20   flag ){.       
27170 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
27180 48 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e 70  HasProperty(p->p
27190 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
271a0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
271b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d   );.          pM
271c0 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45  inMax = sqlite3E
271d0 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
271e0 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
271f0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 30 29  Expr->x.pList,0)
27200 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 65 6c  ;.          pDel
27210 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20   = pMinMax;.    
27220 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61        if( pMinMa
27230 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  x && !db->malloc
27240 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
27250 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
27260 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
27270 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45  flag!=WHERE_ORDE
27280 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20  RBY_MIN ?1:0;.  
27290 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
272a0 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  x->a[0].pExpr->o
272b0 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
272c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
272d0 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
272e0 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e  /* This case run
272f0 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61  s if the aggrega
27300 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20  te has no GROUP 
27310 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a  BY clause.  The.
27320 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
27330 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69  ssing is much si
27340 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72  mpler since ther
27350 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  e is only a sing
27360 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a  le row.        *
27370 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20  * of output..   
27380 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
27390 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
273a0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
273b0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49  fo);.        pWI
273c0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
273d0 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
273e0 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
273f0 2c 20 26 70 4d 69 6e 4d 61 78 2c 20 30 2c 20 66  , &pMinMax, 0, f
27400 6c 61 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66  lag);.        if
27410 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  ( pWInfo==0 ){. 
27420 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27430 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
27440 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20  b, pDel);.      
27450 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
27460 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
27470 20 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63         updateAcc
27480 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
27490 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
274a0 20 20 20 20 20 69 66 28 20 21 70 4d 69 6e 4d 61       if( !pMinMa
274b0 78 20 26 26 20 66 6c 61 67 20 29 7b 0a 20 20 20  x && flag ){.   
274c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
274d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
274e0 6f 74 6f 2c 20 30 2c 20 70 57 49 6e 66 6f 2d 3e  oto, 0, pWInfo->
274f0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
27500 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
27510 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65  v, "%s() by inde
27520 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
27530 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45      (flag==WHERE
27540 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69  _ORDERBY_MIN?"mi
27550 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20  n":"max")));.   
27560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
27570 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
27580 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
27590 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
275a0 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
275b0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d  ggInfo);.      }
275c0 0a 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ..      pOrderBy
275d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
275e0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
275f0 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
27600 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f  addrEnd, SQLITE_
27610 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
27620 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
27630 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
27640 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30  >pEList, 0, 0, 0
27650 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20  , -1, .         
27660 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
27670 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64  st, addrEnd, add
27680 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  rEnd);.      sql
27690 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
276a0 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20  te(db, pDel);.  
276b0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
276c0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
276d0 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  v, addrEnd);.   
276e0 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61   .  } /* endif a
276f0 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
27700 2f 0a 0a 20 20 69 66 28 20 64 69 73 74 69 6e 63  /..  if( distinc
27710 74 3e 3d 30 20 29 7b 0a 20 20 20 20 65 78 70 6c  t>=0 ){.    expl
27720 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
27730 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 22 29  rse, "DISTINCT")
27740 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
27750 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
27760 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
27770 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74   we need to sort
27780 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a   the results.  *
27790 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20  * and send them 
277a0 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
277b0 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f  one by one..  */
277c0 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
277d0 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
277e0 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  mpTable(pParse, 
277f0 22 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20  "ORDER BY");.   
27800 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
27810 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20  l(pParse, p, v, 
27820 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
27830 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Dest);.  }..  /*
27840 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
27850 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20  ip this query.  
27860 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
27870 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
27880 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  iEnd);..  /* The
27890 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63   SELECT was succ
278a0 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20  essfully coded. 
278b0 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e    Set the return
278c0 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20   code to 0.  ** 
278d0 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65  to indicate no e
278e0 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  rrors..  */.  rc
278f0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74   = 0;..  /* Cont
27900 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72  rol jumps to her
27910 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
27920 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f   encountered abo
27930 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a  ve, or upon.  **
27940 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69   successful codi
27950 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ng of the SELECT
27960 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e  ..  */.select_en
27970 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49  d:.  explainSetI
27980 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69  nteger(pParse->i
27990 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f  SelectId, iResto
279a0 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20  reSelectId);..  
279b0 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75  /* Identify colu
279c0 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75  mn names if resu
279d0 6c 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  lts of the SELEC
279e0 54 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70  T are to be outp
279f0 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ut..  */.  if( r
27a00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
27a10 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
27a20 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
27a30 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
27a40 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
27a50 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20  List, pEList);. 
27a60 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46   }..  sqlite3DbF
27a70 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f  ree(db, sAggInfo
27a80 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  .aCol);.  sqlite
27a90 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67  3DbFree(db, sAgg
27aa0 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72  Info.aFunc);.  r
27ab0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
27ac0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
27ad0 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c  ENABLE_TREE_EXPL
27ae0 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  AIN)./*.** Gener
27af0 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64  ate a human-read
27b00 61 62 6c 65 20 64 65 73 63 72 69 70 74 69 6f 6e  able description
27b10 20 6f 66 20 61 20 74 68 65 20 53 65 6c 65 63 74   of a the Select
27b20 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
27b30 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f  ic void explainO
27b40 6e 65 53 65 6c 65 63 74 28 56 64 62 65 20 2a 70  neSelect(Vdbe *p
27b50 56 64 62 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  Vdbe, Select *p)
27b60 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  {.  sqlite3Expla
27b70 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
27b80 22 53 45 4c 45 43 54 20 22 29 3b 0a 20 20 69 66  "SELECT ");.  if
27b90 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
27ba0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
27bb0 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20  Aggregate) ){.  
27bc0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
27bd0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
27be0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
27bf0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
27c00 64 62 65 2c 20 22 44 49 53 54 49 4e 43 54 20 22  dbe, "DISTINCT "
27c10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
27c20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
27c30 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20  F_Aggregate ){. 
27c40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
27c50 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
27c60 20 22 61 67 67 5f 66 6c 61 67 20 22 29 3b 0a 20   "agg_flag ");. 
27c70 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
27c80 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
27c90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
27ca0 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
27cb0 2c 20 22 20 20 20 22 29 3b 0a 20 20 7d 0a 20 20  , "   ");.  }.  
27cc0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
27cd0 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d  prList(pVdbe, p-
27ce0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  >pEList);.  sqli
27cf0 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
27d00 62 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53  be);.  if( p->pS
27d10 72 63 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e  rc && p->pSrc->n
27d20 53 72 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Src ){.    int i
27d30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
27d40 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
27d50 2c 20 22 46 52 4f 4d 20 22 29 3b 0a 20 20 20 20  , "FROM ");.    
27d60 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75  sqlite3ExplainPu
27d70 73 68 28 70 56 64 62 65 29 3b 0a 20 20 20 20 66  sh(pVdbe);.    f
27d80 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72  or(i=0; i<p->pSr
27d90 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
27da0 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
27db0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
27dc0 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d  = &p->pSrc->a[i]
27dd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
27de0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
27df0 62 65 2c 20 22 7b 25 64 2c 2a 7d 20 3d 20 22 2c  be, "{%d,*} = ",
27e00 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
27e10 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
27e20 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
27e30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27e40 6c 61 69 6e 53 65 6c 65 63 74 28 70 56 64 62 65  lainSelect(pVdbe
27e50 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
27e60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
27e70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20  Item->pTab ){.  
27e80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
27e90 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
27ea0 62 65 2c 20 22 20 28 74 61 62 6e 61 6d 65 3d 25  be, " (tabname=%
27eb0 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  s)", pItem->pTab
27ec0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
27ed0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
27ee0 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  if( pItem->zName
27ef0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
27f00 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
27f10 28 70 56 64 62 65 2c 20 22 25 73 22 2c 20 70 49  (pVdbe, "%s", pI
27f20 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
27f30 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
27f40 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a  Item->zAlias ){.
27f50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
27f60 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
27f70 62 65 2c 20 22 20 28 41 53 20 25 73 29 22 2c 20  be, " (AS %s)", 
27f80 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
27f90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
27fa0 28 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  ( pItem->jointyp
27fb0 65 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20  e & JT_LEFT ){. 
27fc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
27fd0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
27fe0 65 2c 20 22 20 4c 45 46 54 2d 4a 4f 49 4e 22 29  e, " LEFT-JOIN")
27ff0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28000 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
28010 28 70 56 64 62 65 29 3b 0a 20 20 20 20 7d 0a 20  (pVdbe);.    }. 
28020 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
28030 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 20 20 7d  nPop(pVdbe);.  }
28040 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
28050 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
28060 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
28070 62 65 2c 20 22 57 48 45 52 45 20 22 29 3b 0a 20  be, "WHERE ");. 
28080 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
28090 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e  nExpr(pVdbe, p->
280a0 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c  pWhere);.    sql
280b0 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
280c0 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  dbe);.  }.  if( 
280d0 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  p->pGroupBy ){. 
280e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
280f0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
28100 47 52 4f 55 50 42 59 20 22 29 3b 0a 20 20 20 20  GROUPBY ");.    
28110 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
28120 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d  prList(pVdbe, p-
28130 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
28140 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
28150 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69  (pVdbe);.  }.  i
28160 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b  f( p->pHaving ){
28170 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
28180 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
28190 20 22 48 41 56 49 4e 47 20 22 29 3b 0a 20 20 20   "HAVING ");.   
281a0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
281b0 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 48  xpr(pVdbe, p->pH
281c0 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
281d0 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
281e0 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  be);.  }.  if( p
281f0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
28200 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
28210 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4f  Printf(pVdbe, "O
28220 52 44 45 52 42 59 20 22 29 3b 0a 20 20 20 20 73  RDERBY ");.    s
28230 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
28240 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e  rList(pVdbe, p->
28250 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73  pOrderBy);.    s
28260 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
28270 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pVdbe);.  }.  if
28280 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ( p->pLimit ){. 
28290 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
282a0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
282b0 4c 49 4d 49 54 20 22 29 3b 0a 20 20 20 20 73 71  LIMIT ");.    sq
282c0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
282d0 28 70 56 64 62 65 2c 20 70 2d 3e 70 4c 69 6d 69  (pVdbe, p->pLimi
282e0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
282f0 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
28300 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f  .  }.  if( p->pO
28310 66 66 73 65 74 20 29 7b 0a 20 20 20 20 73 71 6c  ffset ){.    sql
28320 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
28330 66 28 70 56 64 62 65 2c 20 22 4f 46 46 53 45 54  f(pVdbe, "OFFSET
28340 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
28350 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62  ExplainExpr(pVdb
28360 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a  e, p->pOffset);.
28370 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
28380 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d  inNL(pVdbe);.  }
28390 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  .}.void sqlite3E
283a0 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 56 64 62  xplainSelect(Vdb
283b0 65 20 2a 70 56 64 62 65 2c 20 53 65 6c 65 63 74  e *pVdbe, Select
283c0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30   *p){.  if( p==0
283d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
283e0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
283f0 62 65 2c 20 22 28 6e 75 6c 6c 2d 73 65 6c 65 63  be, "(null-selec
28400 74 29 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  t)");.    return
28410 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
28420 2d 3e 70 50 72 69 6f 72 20 29 20 70 20 3d 20 70  ->pPrior ) p = p
28430 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 73 71 6c 69  ->pPrior;.  sqli
28440 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70  te3ExplainPush(p
28450 56 64 62 65 29 3b 0a 20 20 77 68 69 6c 65 28 20  Vdbe);.  while( 
28460 70 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  p ){.    explain
28470 4f 6e 65 53 65 6c 65 63 74 28 70 56 64 62 65 2c  OneSelect(pVdbe,
28480 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e   p);.    p = p->
28490 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
284a0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
284b0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
284c0 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73 71  L(pVdbe);.    sq
284d0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
284e0 74 66 28 70 56 64 62 65 2c 20 22 25 73 5c 6e 22  tf(pVdbe, "%s\n"
284f0 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
28500 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 20 20 73 71  ->op));.  }.  sq
28510 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
28520 74 66 28 70 56 64 62 65 2c 20 22 45 4e 44 22 29  tf(pVdbe, "END")
28530 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  ;.  sqlite3Expla
28540 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 7d 0a  inPop(pVdbe);.}.
28550 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73  ./* End of the s
28560 74 72 75 63 74 75 72 65 20 64 65 62 75 67 20 70  tructure debug p
28570 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a  rinting code.***
28580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
285a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
285b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
285c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64  **********/.#end
285d0 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
285e0 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
285f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
28600 55 47 29 20 2a 2f 0a                             UG) */.