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

Artifact a88ad1cb4af99e47548760d4dd400d2405baff3c:


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 70 4e 65 77 20 3d 20  0 ){.    pNew = 
0870: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65  &standin;.    me
0880: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
0890: 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
08a0: 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  }.  if( pEList==
08b0: 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20  0 ){.    pEList 
08c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
08d0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
08e0: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
08f0: 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20  b,TK_ALL,0));.  
0900: 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  }.  pNew->pEList
0910: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65   = pEList;.  pNe
0920: 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  w->pSrc = pSrc;.
0930: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
0940: 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d   pWhere;.  pNew-
0950: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
0960: 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  upBy;.  pNew->pH
0970: 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b  aving = pHaving;
0980: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
0990: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
09a0: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
09b0: 20 69 73 44 69 73 74 69 6e 63 74 20 3f 20 53 46   isDistinct ? SF
09c0: 5f 44 69 73 74 69 6e 63 74 20 3a 20 30 3b 0a 20  _Distinct : 0;. 
09d0: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53   pNew->op = TK_S
09e0: 45 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70  ELECT;.  pNew->p
09f0: 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
0a00: 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
0a10: 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73  = pOffset;.  ass
0a20: 65 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20  ert( pOffset==0 
0a30: 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a  || pLimit!=0 );.
0a40: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0a50: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
0a60: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0a70: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
0a80: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0a90: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  [2] = -1;.  if( 
0aa0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
0ab0: 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65   ) {.    clearSe
0ac0: 6c 65 63 74 28 64 62 2c 20 70 4e 65 77 29 3b 0a  lect(db, pNew);.
0ad0: 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 26 73      if( pNew!=&s
0ae0: 74 61 6e 64 69 6e 20 29 20 73 71 6c 69 74 65 33  tandin ) sqlite3
0af0: 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29  DbFree(db, pNew)
0b00: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
0b10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
0b20: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  w;.}../*.** Dele
0b30: 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c  te the given Sel
0b40: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e  ect structure an
0b50: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
0b60: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
0b70: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0b80: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
0b90: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  *db, Select *p){
0ba0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
0bb0: 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20  clearSelect(db, 
0bc0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
0bd0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
0be0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
0bf0: 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69   1 to 3 identifi
0c00: 65 72 73 20 70 72 65 63 65 65 64 69 6e 67 20 74  ers preceeding t
0c10: 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c  he JOIN keyword,
0c20: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a   determine the.*
0c30: 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20  * type of join. 
0c40: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
0c50: 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74  er constant that
0c60: 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20   expresses that 
0c70: 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73  type.** in terms
0c80: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0c90: 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a  g bit values:.**
0ca0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52  .**     JT_INNER
0cb0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53  .**     JT_CROSS
0cc0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52  .**     JT_OUTER
0cd0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52  .**     JT_NATUR
0ce0: 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46  AL.**     JT_LEF
0cf0: 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48  T.**     JT_RIGH
0d00: 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f  T.**.** A full o
0d10: 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65  uter join is the
0d20: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
0d30: 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52  JT_LEFT and JT_R
0d40: 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  IGHT..**.** If a
0d50: 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73  n illegal or uns
0d60: 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79  upported join ty
0d70: 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e  pe is seen, then
0d80: 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a   still return.**
0d90: 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75   a join type, bu
0da0: 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69  t put an error i
0db0: 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
0dc0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
0dd0: 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50  qlite3JoinType(P
0de0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
0df0: 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a  ken *pA, Token *
0e00: 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a  pB, Token *pC){.
0e10: 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d    int jointype =
0e20: 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41   0;.  Token *apA
0e30: 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a  ll[3];.  Token *
0e40: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p;.             
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e60: 2f 2a 20 20 20 30 31 32 33 34 35 36 37 38 39 20  /*   0123456789 
0e70: 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36  123456789 123456
0e80: 37 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61  789 123 */.  sta
0e90: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
0ea0: 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74  KeyText[] = "nat
0eb0: 75 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74  uraleftouteright
0ec0: 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b  fullinnercross";
0ed0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
0ee0: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20  struct {.    u8 
0ef0: 69 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67  i;        /* Beg
0f00: 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72  inning of keywor
0f10: 64 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65  d text in zKeyTe
0f20: 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e  xt[] */.    u8 n
0f30: 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67  Char;    /* Leng
0f40: 74 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72  th of the keywor
0f50: 64 20 69 6e 20 63 68 61 72 61 63 74 65 72 73 20  d in characters 
0f60: 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20  */.    u8 code; 
0f70: 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65      /* Join type
0f80: 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65   mask */.  } aKe
0f90: 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  yword[] = {.    
0fa0: 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20  /* natural */ { 
0fb0: 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41  0,  7, JT_NATURA
0fc0: 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L               
0fd0: 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20   },.    /* left 
0fe0: 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a     */ { 6,  4, J
0ff0: 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20  T_LEFT|JT_OUTER 
1000: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1010: 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20  /* outer   */ { 
1020: 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20  10, 5, JT_OUTER 
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1040: 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74   },.    /* right
1050: 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a     */ { 14, 5, J
1060: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
1070: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1080: 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20  /* full    */ { 
1090: 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a  19, 4, JT_LEFT|J
10a0: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
10b0: 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72   },.    /* inner
10c0: 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a     */ { 23, 5, J
10d0: 54 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20  T_INNER         
10e0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
10f0: 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20  /* cross   */ { 
1100: 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c  28, 5, JT_INNER|
1110: 4a 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20  JT_CROSS        
1120: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
1130: 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20  , j;.  apAll[0] 
1140: 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d  = pA;.  apAll[1]
1150: 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32   = pB;.  apAll[2
1160: 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d  ] = pC;.  for(i=
1170: 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b  0; i<3 && apAll[
1180: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  i]; i++){.    p 
1190: 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20  = apAll[i];.    
11a0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79  for(j=0; j<Array
11b0: 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20  Size(aKeyword); 
11c0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
11d0: 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a  p->n==aKeyword[j
11e0: 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20  ].nChar .       
11f0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
1200: 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e  NICmp((char*)p->
1210: 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65  z, &zKeyText[aKe
1220: 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e  yword[j].i], p->
1230: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  n)==0 ){.       
1240: 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65   jointype |= aKe
1250: 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20  yword[j].code;. 
1260: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1270: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1280: 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c  testcase( j==0 |
1290: 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c  | j==1 || j==2 |
12a0: 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c  | j==3 || j==4 |
12b0: 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29  | j==5 || j==6 )
12c0: 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72  ;.    if( j>=Arr
12d0: 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29  aySize(aKeyword)
12e0: 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   ){.      jointy
12f0: 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a  pe |= JT_ERROR;.
1300: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1310: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20   }.  }.  if(.   
1320: 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a    (jointype & (J
1330: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
1340: 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54  ))==(JT_INNER|JT
1350: 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20  _OUTER) ||.     
1360: 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45  (jointype & JT_E
1370: 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20  RROR)!=0.  ){.  
1380: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1390: 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73  p = " ";.    ass
13a0: 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20  ert( pB!=0 );.  
13b0: 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a    if( pC==0 ){ z
13c0: 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69  Sp++; }.    sqli
13d0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13e0: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20  se, "unknown or 
13f0: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
1400: 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20   type: ".       
1410: 22 25 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c  "%T %T%s%T", pA,
1420: 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20   pB, zSp, pC);. 
1430: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
1440: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20  _INNER;.  }else 
1450: 69 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20  if( (jointype & 
1460: 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20  JT_OUTER)!=0 .  
1470: 20 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74         && (joint
1480: 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  ype & (JT_LEFT|J
1490: 54 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45  T_RIGHT))!=JT_LE
14a0: 46 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  FT ){.    sqlite
14b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14c0: 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48 54 20  , .      "RIGHT 
14d0: 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a  and FULL OUTER J
14e0: 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72  OINs are not cur
14f0: 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64  rently supported
1500: 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65  ");.    jointype
1510: 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d   = JT_INNER;.  }
1520: 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79  .  return jointy
1530: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  pe;.}../*.** Ret
1540: 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
1550: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74   a column in a t
1560: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31  able.  Return -1
1570: 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a   if the column.*
1580: 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  * is not contain
1590: 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ed in the table.
15a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
15b0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65  olumnIndex(Table
15c0: 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68   *pTab, const ch
15d0: 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74  ar *zCol){.  int
15e0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
15f0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
1600: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1610: 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e  e3StrICmp(pTab->
1620: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  aCol[i].zName, z
1630: 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Col)==0 ) return
1640: 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
1650: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   -1;.}../*.** Se
1660: 61 72 63 68 20 74 68 65 20 66 69 72 73 74 20 4e  arch the first N
1670: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c   tables in pSrc,
1680: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
1690: 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ght, looking for
16a0: 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74   a.** table that
16b0: 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61   has a column na
16c0: 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a  med zCol.  .**.*
16d0: 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65  * When found, se
16e0: 74 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69  t *piTab and *pi
16f0: 43 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65  Col to the table
1700: 20 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d   index and colum
1710: 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68  n index.** of th
1720: 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  e matching colum
1730: 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55  n and return TRU
1740: 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20  E..**.** If not 
1750: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41  found, return FA
1760: 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LSE..*/.static i
1770: 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  nt tableAndColum
1780: 6e 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73  nIndex(.  SrcLis
1790: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f  t *pSrc,       /
17a0: 2a 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65  * Array of table
17b0: 73 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  s to search */. 
17c0: 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
17d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17e0: 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72  of tables in pSr
17f0: 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68  c->a[] to search
1800: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1810: 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61   *zCol,    /* Na
1820: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
1830: 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20   we are looking 
1840: 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  for */.  int *pi
1850: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Tab,          /*
1860: 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20   Write index of 
1870: 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a  pSrc->a[] here *
1880: 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20  /.  int *piCol  
1890: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
18a0: 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d  e index of pSrc-
18b0: 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d  >a[*piTab].pTab-
18c0: 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a  >aCol[] here */.
18d0: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
18e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
18f0: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61   looping over ta
1900: 62 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a  bles in pSrc */.
1910: 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
1920: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1930: 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69  of column matchi
1940: 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73  ng zCol */..  as
1950: 73 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29  sert( (piTab==0)
1960: 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20  ==(piCol==0) ); 
1970: 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74   /* Both or neit
1980: 68 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a  her are NULL */.
1990: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20    for(i=0; i<N; 
19a0: 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  i++){.    iCol =
19b0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72   columnIndex(pSr
19c0: 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43  c->a[i].pTab, zC
19d0: 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  ol);.    if( iCo
19e0: 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  l>=0 ){.      if
19f0: 28 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20  ( piTab ){.     
1a00: 20 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20     *piTab = i;. 
1a10: 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20         *piCol = 
1a20: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iCol;.      }.  
1a30: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1a40: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1a50: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
1a60: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
1a70: 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20  ed to add terms 
1a80: 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20  implied by JOIN 
1a90: 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a  syntax to the.**
1aa0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78   WHERE clause ex
1ab0: 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45  pression of a SE
1ac0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
1ad0: 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68  The new term, wh
1ae0: 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20  ich.** is ANDed 
1af0: 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69 6e  with the existin
1b00: 67 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  g WHERE clause, 
1b10: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
1b20: 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63  **.**    (tab1.c
1b30: 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29  ol1 = tab2.col2)
1b40: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62  .**.** where tab
1b50: 31 20 69 73 20 74 68 65 20 69 53 72 63 27 74 68  1 is the iSrc'th
1b60: 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73   table in SrcLis
1b70: 74 20 70 53 72 63 20 61 6e 64 20 74 61 62 32 20  t pSrc and tab2 
1b80: 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63  is the .** (iSrc
1b90: 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63  +1)'th. Column c
1ba0: 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43  ol1 is column iC
1bb0: 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20  olLeft of tab1, 
1bc0: 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63  and col2 is.** c
1bd0: 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20  olumn iColRight 
1be0: 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74  of tab2..*/.stat
1bf0: 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72 65  ic void addWhere
1c00: 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
1c10: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
1c20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1c30: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1c40: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
1c70: 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65  s in FROM clause
1c80: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c   */.  int iLeft,
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1cb0: 66 20 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f  f first table to
1cc0: 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f   join in pSrc */
1cd0: 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c  .  int iColLeft,
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
1d00: 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74  olumn in first t
1d10: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
1d20: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
1d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1d40: 65 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62  ex of second tab
1d50: 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  le in pSrc */.  
1d60: 69 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20  int iColRight,  
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
1d90: 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62  mn in second tab
1da0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75  le */.  int isOu
1db0: 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20  terJoin,        
1dc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1dd0: 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55  if this is an OU
1de0: 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78  TER join */.  Ex
1df0: 70 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20  pr **ppWhere    
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e10: 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45   IN/OUT: The WHE
1e20: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64  RE clause to add
1e30: 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69   to */.){.  sqli
1e40: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1e50: 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  ->db;.  Expr *pE
1e60: 31 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a  1;.  Expr *pE2;.
1e70: 20 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20    Expr *pEq;..  
1e80: 61 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52  assert( iLeft<iR
1e90: 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74  ight );.  assert
1ea0: 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69  ( pSrc->nSrc>iRi
1eb0: 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ght );.  assert(
1ec0: 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e   pSrc->a[iLeft].
1ed0: 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74  pTab );.  assert
1ee0: 28 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74  ( pSrc->a[iRight
1ef0: 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31  ].pTab );..  pE1
1f00: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
1f10: 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70  ColumnExpr(db, p
1f20: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c  Src, iLeft, iCol
1f30: 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73  Left);.  pE2 = s
1f40: 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75  qlite3CreateColu
1f50: 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c  mnExpr(db, pSrc,
1f60: 20 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67   iRight, iColRig
1f70: 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71  ht);..  pEq = sq
1f80: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1f90: 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70  e, TK_EQ, pE1, p
1fa0: 45 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45  E2, 0);.  if( pE
1fb0: 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e  q && isOuterJoin
1fc0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
1fd0: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
1fe0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
1ff0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41  ssert( !ExprHasA
2000: 6e 79 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  nyProperty(pEq, 
2010: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
2020: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
2030: 45 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62  ExprSetIrreducib
2040: 6c 65 28 70 45 71 29 3b 0a 20 20 20 20 70 45 71  le(pEq);.    pEq
2050: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2060: 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69 54  e = (i16)pE2->iT
2070: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 57  able;.  }.  *ppW
2080: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
2090: 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68 65  prAnd(db, *ppWhe
20a0: 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a  re, pEq);.}../*.
20b0: 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72  ** Set the EP_Fr
20c0: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
20d0: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  on all terms of 
20e0: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
20f0: 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74  sion..** And set
2100: 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   the Expr.iRight
2110: 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61  JoinTable to iTa
2120: 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65  ble for every te
2130: 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70  rm in the.** exp
2140: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ression..**.** T
2150: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
2160: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
2170: 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65  on terms of an e
2180: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c  xpression to tel
2190: 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55  l.** the LEFT OU
21a0: 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73  TER JOIN process
21b0: 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74  ing logic that t
21c0: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
21d0: 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20   of the.** join 
21e0: 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63  restriction spec
21f0: 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  ified in the ON 
2200: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
2210: 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a  and not a part.*
2220: 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65  * of the more ge
2230: 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75  neral WHERE clau
2240: 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73  se.  These terms
2250: 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20   are moved over 
2260: 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  to the.** WHERE 
2270: 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f  clause during jo
2280: 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75  in processing bu
2290: 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d  t we need to rem
22a0: 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a  ember that they.
22b0: 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e  ** originated in
22c0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
22d0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54   clause..**.** T
22e0: 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  he Expr.iRightJo
22f0: 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68  inTable tells th
2300: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
2310: 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74  rocessing that t
2320: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
2330: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c   depends on tabl
2340: 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  e iRightJoinTabl
2350: 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74  e even if that t
2360: 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65  able is not.** e
2370: 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f  xplicitly mentio
2380: 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65  ned in the expre
2390: 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66  ssion.  That inf
23a0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64  ormation is need
23b0: 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20  ed.** for cases 
23c0: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
23d0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
23e0: 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
23f0: 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41  2 ON t1.a=t2.b A
2400: 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20  ND t1.x=5.**.** 
2410: 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  The where clause
2420: 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20   needs to defer 
2430: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
2440: 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65  the t1.x=5.** te
2450: 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74  rm until after t
2460: 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68  he t2 loop of th
2470: 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74  e join.  In that
2480: 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20   way, a.** NULL 
2490: 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69  t2 row will be i
24a0: 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72  nserted whenever
24b0: 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65   t1.x!=5.  If we
24c0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72   do not.** defer
24d0: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
24e0: 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c   t1.x=5, it will
24f0: 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d   be processed im
2500: 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74  mediately.** aft
2510: 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61  er the t1 loop a
2520: 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e  nd rows with t1.
2530: 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20  x!=5 will never 
2540: 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65  appear in.** the
2550: 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69   output, which i
2560: 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a  s incorrect..*/.
2570: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a  static void setJ
2580: 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c  oinExpr(Expr *p,
2590: 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
25a0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
25b0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
25c0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  p, EP_FromJoin);
25d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
25e0: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
25f0: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
2600: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
2610: 20 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64      ExprSetIrred
2620: 75 63 69 62 6c 65 28 70 29 3b 0a 20 20 20 20 70  ucible(p);.    p
2630: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2640: 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b  e = (i16)iTable;
2650: 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72  .    setJoinExpr
2660: 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  (p->pLeft, iTabl
2670: 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  e);.    p = p->p
2680: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
2690: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26a0: 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  e processes the 
26b0: 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  join information
26c0: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
26d0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61  atement..** ON a
26e0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
26f0: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
2700: 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20  nto extra terms 
2710: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
2720: 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20  use..** NATURAL 
2730: 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74  joins also creat
2740: 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  e extra WHERE cl
2750: 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a  ause terms..**.*
2760: 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61  * The terms of a
2770: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65   FROM clause are
2780: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
2790: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74  e Select.pSrc st
27a0: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20  ructure..** The 
27b0: 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20  left most table 
27c0: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  is the first ent
27d0: 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72  ry in Select.pSr
27e0: 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  c.  The right-mo
27f0: 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74  st.** table is t
2800: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20  he last entry.  
2810: 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  The join operato
2820: 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65  r is held in the
2830: 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65   entry to.** the
2840: 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74   left.  Thus ent
2850: 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68  ry 0 contains th
2860: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
2870: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74  for the join bet
2880: 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ween.** entries 
2890: 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e  0 and 1.  Any ON
28a0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
28b0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
28c0: 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a  h the join are.*
28d0: 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20  * also attached 
28e0: 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72  to the left entr
28f0: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
2900: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
2910: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
2920: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  rs encountered..
2930: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
2940: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
2950: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
2960: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
2970: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2990: 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  All tables in th
29a0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
29b0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
29e0: 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ers */.  struct 
29f0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
2a00: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74  eft;     /* Left
2a10: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
2a20: 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
2a30: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52  SrcList_item *pR
2a40: 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68  ight;    /* Righ
2a50: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
2a60: 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20  ined */..  pSrc 
2a70: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65  = p->pSrc;.  pLe
2a80: 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d  ft = &pSrc->a[0]
2a90: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c  ;.  pRight = &pL
2aa0: 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  eft[1];.  for(i=
2ab0: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
2ac0: 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b  1; i++, pRight++
2ad0: 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20  , pLeft++){.    
2ae0: 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20  Table *pLeftTab 
2af0: 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20  = pLeft->pTab;. 
2b00: 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74     Table *pRight
2b10: 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54  Tab = pRight->pT
2b20: 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75  ab;.    int isOu
2b30: 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45  ter;..    if( NE
2b40: 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d 30 20  VER(pLeftTab==0 
2b50: 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29  || pRightTab==0)
2b60: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2b70: 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67   isOuter = (pRig
2b80: 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ht->jointype & J
2b90: 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20  T_OUTER)!=0;..  
2ba0: 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41    /* When the NA
2bb0: 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73  TURAL keyword is
2bc0: 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48   present, add WH
2bd0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
2be0: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72   for.    ** ever
2bf0: 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68  y column that th
2c00: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76  e two tables hav
2c10: 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20  e in common..   
2c20: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
2c30: 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ht->jointype & J
2c40: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
2c50: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
2c60: 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55  On || pRight->pU
2c70: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  sing ){.        
2c80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2c90: 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52  pParse, "a NATUR
2ca0: 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20  AL join may not 
2cb0: 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20  have ".         
2cc0: 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e    "an ON or USIN
2cd0: 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20  G clause", 0);. 
2ce0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
2cf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2d00: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74  or(j=0; j<pRight
2d10: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
2d20: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
2d30: 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
2d40: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  of column in the
2d50: 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a   right table */.
2d60: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
2d70: 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69  t;     /* Matchi
2d80: 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f  ng left table */
2d90: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
2da0: 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68  ftCol;  /* Match
2db0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ing column in th
2dc0: 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  e left table */.
2dd0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
2de0: 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c   pRightTab->aCol
2df0: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
2e00: 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43     if( tableAndC
2e10: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c  olumnIndex(pSrc,
2e20: 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c   i+1, zName, &iL
2e30: 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20  eft, &iLeftCol) 
2e40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
2e50: 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65  WhereTerm(pParse
2e60: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
2e70: 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c  LeftCol, i+1, j,
2e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e90: 20 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c          isOuter,
2ea0: 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   &p->pWhere);.  
2eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2ec0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
2ed0: 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61  sallow both ON a
2ee0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
2ef0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
2f00: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  n.    */.    if(
2f10: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20   pRight->pOn && 
2f20: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
2f30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2f40: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2f50: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
2f60: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
2f70: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
2f80: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
2f90: 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  in");.      retu
2fa0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
2fb0: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
2fc0: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
2fd0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2fe0: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
2ff0: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44  by.    ** an AND
3000: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
3010: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3020: 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  ->pOn ){.      i
3030: 66 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74  f( isOuter ) set
3040: 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d  JoinExpr(pRight-
3050: 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43  >pOn, pRight->iC
3060: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d  ursor);.      p-
3070: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
3080: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
3090: 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  >db, p->pWhere, 
30a0: 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20  pRight->pOn);.  
30b0: 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20      pRight->pOn 
30c0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
30d0: 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20  /* Create extra 
30e0: 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45  terms on the WHE
30f0: 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61  RE clause for ea
3100: 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a  ch column named.
3110: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53      ** in the US
3120: 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61  ING clause.  Exa
3130: 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f  mple: If the two
3140: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3150: 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a  ined are .    **
3160: 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65   A and B and the
3170: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61   USING clause na
3180: 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c  mes X, Y, and Z,
3190: 20 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20   then add this. 
31a0: 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45     ** to the WHE
31b0: 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e  RE clause:    A.
31c0: 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e  X=B.X AND A.Y=B.
31d0: 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20  Y AND A.Z=B.Z.  
31e0: 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65    ** Report an e
31f0: 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75  rror if any colu
3200: 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  mn mentioned in 
3210: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3220: 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63   is.    ** not c
3230: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68  ontained in both
3240: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3250: 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ined..    */.   
3260: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73   if( pRight->pUs
3270: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c  ing ){.      IdL
3280: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69  ist *pList = pRi
3290: 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20  ght->pUsing;.   
32a0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
32b0: 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a  ist->nId; j++){.
32c0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
32d0: 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame;     /* Name
32e0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20   of the term in 
32f0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3300: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3310: 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20  iLeft;       /* 
3320: 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66  Table on the lef
3330: 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20  t with matching 
3340: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
3350: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
3360: 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col;    /* Colum
3370: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  n number of matc
3380: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74  hing column on t
3390: 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20  he left */.     
33a0: 20 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c     int iRightCol
33b0: 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75  ;   /* Column nu
33c0: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67  mber of matching
33d0: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72   column on the r
33e0: 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ight */..       
33f0: 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e   zName = pList->
3400: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
3410: 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20      iRightCol = 
3420: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67  columnIndex(pRig
3430: 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  htTab, zName);. 
3440: 20 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68         if( iRigh
3450: 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20  tCol<0.         
3460: 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75  || !tableAndColu
3470: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b  mnIndex(pSrc, i+
3480: 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74  1, zName, &iLeft
3490: 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20  , &iLeftCol).   
34a0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
34b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
34c0: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
34d0: 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c  t join using col
34e0: 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20  umn %s - column 
34f0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e  ".            "n
3500: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f  ot present in bo
3510: 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d  th tables", zNam
3520: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
3530: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
3540: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65  }.        addWhe
3550: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  reTerm(pParse, p
3560: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66  Src, iLeft, iLef
3570: 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68  tCol, i+1, iRigh
3580: 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tCol,.          
3590: 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74             isOut
35a0: 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b  er, &p->pWhere);
35b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
35c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
35d0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63  ../*.** Insert c
35e0: 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61  ode into "v" tha
35f0: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
3600: 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f  record on the to
3610: 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63  p of the.** stac
3620: 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65  k into the sorte
3630: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
3640: 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72  d pushOntoSorter
3650: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3660: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
3670: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
3680: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
3690: 65 72 42 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  erBy,    /* The 
36a0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
36b0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
36c0: 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  lect,       /* T
36d0: 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20  he whole SELECT 
36e0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
36f0: 6e 74 20 72 65 67 44 61 74 61 20 20 20 20 20 20  nt regData      
3700: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
3710: 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 74  r holding data t
3720: 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 29  o be sorted */.)
3730: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
3740: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
3750: 6e 74 20 6e 45 78 70 72 20 3d 20 70 4f 72 64 65  nt nExpr = pOrde
3760: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e  rBy->nExpr;.  in
3770: 74 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69  t regBase = sqli
3780: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
3790: 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 32 29  pParse, nExpr+2)
37a0: 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  ;.  int regRecor
37b0: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
37c0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
37d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
37e0: 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
37f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
3800: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
3810: 2c 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42  , pOrderBy, regB
3820: 61 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ase, 0);.  sqlit
3830: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3840: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72  OP_Sequence, pOr
3850: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
3860: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
3870: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
3880: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
3890: 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b  egData, regBase+
38a0: 6e 45 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73  nExpr+1, 1);.  s
38b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
38c0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
38d0: 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70  d, regBase, nExp
38e0: 72 20 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64  r + 2, regRecord
38f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3900: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
3910: 49 6e 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79  Insert, pOrderBy
3920: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52  ->iECursor, regR
3930: 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
3940: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
3950: 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
3960: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  d);.  sqlite3Rel
3970: 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
3980: 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
3990: 45 78 70 72 2b 32 29 3b 0a 20 20 69 66 28 20 70  Expr+2);.  if( p
39a0: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29  Select->iLimit )
39b0: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c  {.    int addr1,
39c0: 20 61 64 64 72 32 3b 0a 20 20 20 20 69 6e 74 20   addr2;.    int 
39d0: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66 28 20  iLimit;.    if( 
39e0: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
39f0: 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74   ){.      iLimit
3a00: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66   = pSelect->iOff
3a10: 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  set+1;.    }else
3a20: 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d  {.      iLimit =
3a30: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
3a40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72  ;.    }.    addr
3a50: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
3a60: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp1(v, OP_IfZe
3a70: 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  ro, iLimit);.   
3a80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3a90: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
3aa0: 20 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20   iLimit, -1);.  
3ab0: 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
3ac0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
3ad0: 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c  P_Goto);.    sql
3ae0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
3af0: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
3b00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3b10: 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f  1(v, OP_Last, pO
3b20: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
3b30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3b40: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44  beAddOp1(v, OP_D
3b50: 65 6c 65 74 65 2c 20 70 4f 72 64 65 72 42 79 2d  elete, pOrderBy-
3b60: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
3b70: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
3b80: 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20  ere(v, addr2);. 
3b90: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
3ba0: 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
3bb0: 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a  t the OFFSET.*/.
3bc0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
3bd0: 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a  Offset(.  Vdbe *
3be0: 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47  v,          /* G
3bf0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
3c00: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53  o this VM */.  S
3c10: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
3c20: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
3c30: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
3c40: 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  oded */.  int iC
3c50: 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a  ontinue     /* J
3c60: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
3c70: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
3c80: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ord */.){.  if( 
3c90: 70 2d 3e 69 4f 66 66 73 65 74 20 26 26 20 69 43  p->iOffset && iC
3ca0: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20  ontinue!=0 ){.  
3cb0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
3cc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3cd0: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
3ce0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 2d 31 29 3b  p->iOffset, -1);
3cf0: 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
3d00: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
3d10: 20 4f 50 5f 49 66 4e 65 67 2c 20 70 2d 3e 69 4f   OP_IfNeg, p->iO
3d20: 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  ffset);.    sqli
3d30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3d40: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f   OP_Goto, 0, iCo
3d50: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62  ntinue);.    Vdb
3d60: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b  eComment((v, "sk
3d70: 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64  ip OFFSET record
3d80: 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  s"));.    sqlite
3d90: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
3da0: 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   addr);.  }.}../
3db0: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68  *.** Add code th
3dc0: 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f  at will check to
3dd0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e   make sure the N
3de0: 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
3df0: 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66  ing at iMem.** f
3e00: 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65  orm a distinct e
3e10: 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61  ntry.  iTab is a
3e20: 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
3e30: 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f  hat holds previo
3e40: 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d  usly.** seen com
3e50: 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  binations of the
3e60: 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65   N values.  A ne
3e70: 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20  w entry is made 
3e80: 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68  in iTab.** if th
3e90: 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75  e current N valu
3ea0: 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a  es are new..**.*
3eb0: 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72  * A jump to addr
3ec0: 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61  Repeat is made a
3ed0: 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65  nd the N+1 value
3ee0: 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f  s are popped fro
3ef0: 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69  m the.** stack i
3f00: 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d  f the top N elem
3f10: 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73  ents are not dis
3f20: 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  tinct..*/.static
3f30: 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e   void codeDistin
3f40: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
3f50: 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
3f60: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
3f70: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
3f80: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
3f90: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72          /* A sor
3fa0: 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20  ting index used 
3fb0: 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74  to test for dist
3fc0: 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e  inctness */.  in
3fd0: 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20  t addrRepeat,   
3fe0: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
3ff0: 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74   if not distinct
4000: 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20   */.  int N,    
4010: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4020: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a  er of elements *
4030: 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20  /.  int iMem    
4040: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
4050: 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  element */.){.  
4060: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72  Vdbe *v;.  int r
4070: 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65  1;..  v = pParse
4080: 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20  ->pVdbe;.  r1 = 
4090: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
40a0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
40b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
40c0: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
40d0: 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c  Tab, addrRepeat,
40e0: 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c   iMem, N);.  sql
40f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4100: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
4110: 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20   iMem, N, r1);. 
4120: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4130: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
4140: 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20  rt, iTab, r1);. 
4150: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
4160: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
4170: 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  1);.}..#ifndef S
4180: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
4190: 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ERY./*.** Genera
41a0: 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
41b0: 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c 45 43  age when a SELEC
41c0: 54 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e  T is used within
41d0: 20 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e   a subexpression
41e0: 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20 20 22  .** (example:  "
41f0: 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  a IN (SELECT * F
4200: 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62 75 74  ROM table)") but
4210: 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74 68 61   it has more tha
4220: 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f  n 1 result.** co
4230: 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74 68 69  lumn.  We do thi
4240: 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e  s in a subroutin
4250: 65 20 62 65 63 61 75 73 65 20 74 68 65 20 65 72  e because the er
4260: 72 6f 72 20 75 73 65 64 20 74 6f 20 6f 63 63 75  ror used to occu
4270: 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65  r.** in multiple
4280: 20 70 6c 61 63 65 73 2e 20 20 28 54 68 65 20 65   places.  (The e
4290: 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73  rror only occurs
42a0: 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f   in one place no
42b0: 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20 72 65 74  w, but we.** ret
42c0: 61 69 6e 20 74 68 65 20 73 75 62 72 6f 75 74 69  ain the subrouti
42d0: 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63  ne to minimize c
42e0: 6f 64 65 20 64 69 73 72 75 70 74 69 6f 6e 2e 29  ode disruption.)
42f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
4300: 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
4310: 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 0a 20  mnSelectError(. 
4320: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4330: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
4340: 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c  ontext. */.  Sel
4350: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
4360: 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
4370: 20 6f 66 20 53 45 4c 45 43 54 20 72 65 73 75 6c   of SELECT resul
4380: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70  ts */.  int nExp
4390: 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
43a0: 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  Number of result
43b0: 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
43c0: 64 20 62 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29  d by SELECT */.)
43d0: 7b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  {.  int eDest = 
43e0: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20  pDest->eDest;.  
43f0: 69 66 28 20 6e 45 78 70 72 3e 31 20 26 26 20 28  if( nExpr>1 && (
4400: 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c  eDest==SRT_Mem |
4410: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74  | eDest==SRT_Set
4420: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
4430: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4440: 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20   "only a single 
4450: 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66  result allowed f
4460: 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61 20 53  or ".       "a S
4470: 45 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61  ELECT that is pa
4480: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
4490: 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ion");.    retur
44a0: 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 1;.  }else{.  
44b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
44c0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
44d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
44e0: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
44f0: 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f  for the inside o
4500: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
4510: 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e  .** of a SELECT.
4520: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62  .**.** If srcTab
4530: 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65   and nColumn are
4540: 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e   both zero, then
4550: 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70 72   the pEList expr
4560: 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65  essions.** are e
4570: 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65  valuated in orde
4580: 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74  r to get the dat
4590: 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20  a for this row. 
45a0: 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a   If nColumn>0.**
45b0: 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75   then data is pu
45c0: 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62  lled from srcTab
45d0: 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75   and pEList is u
45e0: 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20  sed only to get 
45f0: 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73  the.** datatypes
4600: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
4610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4620: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
4630: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4640: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
4650: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
4660: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
4670: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4680: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
4690: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
46a0: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
46b0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
46c0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
46d0: 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67   of values being
46e0: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20   extracted */.  
46f0: 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20  int srcTab,     
4700: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20          /* Pull 
4710: 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74  data from this t
4720: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
4730: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
4740: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
4750: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f  olumns in the so
4760: 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  urce table */.  
4770: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
4780: 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  By,     /* If no
4790: 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73  t NULL, sort res
47a0: 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73 20  ults using this 
47b0: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  key */.  int dis
47c0: 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20  tinct,          
47d0: 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65   /* If >=0, make
47e0: 20 73 75 72 65 20 72 65 73 75 6c 74 73 20 61 72   sure results ar
47f0: 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  e distinct */.  
4800: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
4810: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
4820: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
4830: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
4840: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
4850: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4860: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
4870: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
4880: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
4890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
48a0: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
48b0: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
48c0: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
48d0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
48e0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
48f0: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
4900: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
4910: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
4920: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
4930: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  sent */.  int re
4940: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
4950: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
4960: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
4970: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
4980: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
4990: 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20  st->eDest;   /* 
49a0: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
49b0: 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  f results */.  i
49c0: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
49d0: 2d 3e 69 50 61 72 6d 3b 20 20 20 2f 2a 20 46 69  ->iParm;   /* Fi
49e0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
49f0: 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
4a00: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  */.  int nResult
4a10: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
4a20: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
4a30: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
4a40: 0a 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a  .  assert( v );.
4a50: 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
4a60: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  ) ) return;.  as
4a70: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
4a80: 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74  );.  hasDistinct
4a90: 20 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30 3b 0a   = distinct>=0;.
4aa0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
4ab0: 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63  0 && !hasDistinc
4ac0: 74 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66  t ){.    codeOff
4ad0: 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69  set(v, p, iConti
4ae0: 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nue);.  }..  /* 
4af0: 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74  Pull the request
4b00: 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f  ed columns..  */
4b10: 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30  .  if( nColumn>0
4b20: 20 29 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43   ){.    nResultC
4b30: 6f 6c 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  ol = nColumn;.  
4b40: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 75  }else{.    nResu
4b50: 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e  ltCol = pEList->
4b60: 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28  nExpr;.  }.  if(
4b70: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20   pDest->iMem==0 
4b80: 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 4d  ){.    pDest->iM
4b90: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
4ba0: 6d 2b 31 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e  m+1;.    pDest->
4bb0: 6e 4d 65 6d 20 3d 20 6e 52 65 73 75 6c 74 43 6f  nMem = nResultCo
4bc0: 6c 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  l;.    pParse->n
4bd0: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
4be0: 6c 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20  l;.  }else{ .   
4bf0: 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e   assert( pDest->
4c00: 6e 4d 65 6d 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c  nMem==nResultCol
4c10: 20 29 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 73   );.  }.  regRes
4c20: 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 4d 65  ult = pDest->iMe
4c30: 6d 3b 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e  m;.  if( nColumn
4c40: 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  >0 ){.    for(i=
4c50: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
4c60: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
4c70: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4c80: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
4c90: 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  , i, regResult+i
4ca0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
4cb0: 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
4cc0: 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a  Exists ){.    /*
4cd0: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
4ce0: 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53  ion is an EXISTS
4cf0: 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
4d00: 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20  , the actual.   
4d10: 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72   ** values retur
4d20: 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
4d30: 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72  T are not requir
4d40: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
4d50: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
4d60: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
4d70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
4d80: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
4d90: 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73  , pEList, regRes
4da0: 75 6c 74 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f  ult, eDest==SRT_
4db0: 4f 75 74 70 75 74 29 3b 0a 20 20 7d 0a 20 20 6e  Output);.  }.  n
4dc0: 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74  Column = nResult
4dd0: 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Col;..  /* If th
4de0: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
4df0: 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f  rd was present o
4e00: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
4e10: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20  tement.  ** and 
4e20: 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65  this row has bee
4e30: 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74  n seen before, t
4e40: 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20  hen do not make 
4e50: 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61  this row.  ** pa
4e60: 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
4e70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73  ..  */.  if( has
4e80: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
4e90: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
4ea0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
4eb0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
4ec0: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 63  nColumn );.    c
4ed0: 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
4ee0: 73 65 2c 20 64 69 73 74 69 6e 63 74 2c 20 69 43  se, distinct, iC
4ef0: 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e  ontinue, nColumn
4f00: 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  , regResult);.  
4f10: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
4f20: 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f  0 ){.      codeO
4f30: 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e  ffset(v, p, iCon
4f40: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
4f50: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
4f60: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
4f70: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
4f80: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
4f90: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
4fa0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
4fb0: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
4fc0: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
4fd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
4fe0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
4ff0: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
5000: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
5010: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
5020: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
5030: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
5040: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5050: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
5060: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
5070: 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20  lumn, r1);.     
5080: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5090: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
50a0: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a  rt, iParm, r1);.
50b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
50c0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
50d0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
50e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
50f0: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20   /* Construct a 
5100: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
5110: 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75  query result, bu
5120: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20  t instead of.   
5130: 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20   ** saving that 
5140: 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61  record, use it a
5150: 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74  s a key to delet
5160: 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a  e elements from.
5170: 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f      ** the tempo
5180: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
5190: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
51a0: 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a  e SRT_Except: {.
51b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
51c0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64  eAddOp3(v, OP_Id
51d0: 78 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20  xDelete, iParm, 
51e0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
51f0: 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
5200: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
5210: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
5220: 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
5230: 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
5240: 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
5250: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
5260: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
5270: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
5280: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
5290: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
52a0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
52b0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62  ( eDest==SRT_Tab
52c0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  le );.      test
52d0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
52e0: 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20  _EphemTab );.   
52f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5300: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
5310: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
5320: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a  , nColumn, r1);.
5330: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
5340: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  By ){.        pu
5350: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
5360: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
5370: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , r1);.      }el
5380: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
5390: 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
53a0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
53b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
53c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
53d0: 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c  NewRowid, iParm,
53e0: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r2);.        sq
53f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5400: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50  v, OP_Insert, iP
5410: 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20  arm, r1, r2);.  
5420: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5430: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
5440: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
5450: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
5460: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5470: 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r2);.      }.
5480: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
5490: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
54a0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
54b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
54c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
54d0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a  _SUBQUERY.    /*
54e0: 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74   If we are creat
54f0: 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e  ing a set for an
5500: 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43   "expr IN (SELEC
5510: 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63  T ...)" construc
5520: 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  t,.    ** then t
5530: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
5540: 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20   single item on 
5550: 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74  the stack.  Writ
5560: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74  e this.    ** it
5570: 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20  em into the set 
5580: 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73  table with bogus
5590: 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
55a0: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
55b0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
55c0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
55d0: 20 20 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20      p->affinity 
55e0: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
55f0: 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d  Affinity(pEList-
5600: 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65  >a[0].pExpr, pDe
5610: 73 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20  st->affinity);. 
5620: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
5630: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  y ){.        /* 
5640: 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20  At first glance 
5650: 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20  you would think 
5660: 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a  we could optimiz
5670: 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20  e out the.      
5680: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e    ** ORDER BY in
5690: 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65   this case since
56a0: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e   the order of en
56b0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74  tries in the set
56c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
56d0: 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75   not matter.  Bu
56e0: 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  t there might be
56f0: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c   a LIMIT clause,
5700: 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   in which.      
5710: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72    ** case the or
5720: 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20  der does matter 
5730: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  */.        pushO
5740: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
5750: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72  , pOrderBy, p, r
5760: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
5770: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5780: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
5790: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
57a0: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
57b0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
57c0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
57d0: 72 65 67 52 65 73 75 6c 74 2c 20 31 2c 20 72 31  regResult, 1, r1
57e0: 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20  , &p->affinity, 
57f0: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
5800: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
5810: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
5820: 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31 29  e, regResult, 1)
5830: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5840: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5850: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
5860: 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  rm, r1);.       
5870: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5880: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5890: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
58a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
58b0: 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f      /* If any ro
58c0: 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72  w exist in the r
58d0: 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72  esult set, recor
58e0: 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20  d that fact and 
58f0: 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  abort..    */.  
5900: 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74    case SRT_Exist
5910: 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s: {.      sqlit
5920: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5930: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
5940: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Parm);.      /* 
5950: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
5960: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
5970: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
5980: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
5990: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
59a0: 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
59b0: 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
59c0: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
59d0: 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
59e0: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
59f0: 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
5a00: 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
5a10: 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
5a20: 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
5a30: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
5a40: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
5a50: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
5a60: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
5a70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
5a80: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
5a90: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
5aa0: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
5ab0: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b  , p, regResult);
5ac0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5ad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
5ae0: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
5af0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 69 50 61  , regResult, iPa
5b00: 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  rm, 1);.        
5b10: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
5b20: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
5b30: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
5b40: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r us */.      }.
5b50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5b60: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
5b70: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5b80: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
5b90: 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61    /* Send the da
5ba0: 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ta to the callba
5bb0: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74  ck function or t
5bc0: 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  o a subroutine. 
5bd0: 20 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   In the.    ** c
5be0: 61 73 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ase of a subrout
5bf0: 69 6e 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ine, the subrout
5c00: 69 6e 65 20 69 74 73 65 6c 66 20 69 73 20 72 65  ine itself is re
5c10: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20  sponsible for.  
5c20: 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65    ** popping the
5c30: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73   data from the s
5c40: 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tack..    */.   
5c50: 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
5c60: 69 6e 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ine:.    case SR
5c70: 54 5f 4f 75 74 70 75 74 3a 20 7b 0a 20 20 20 20  T_Output: {.    
5c80: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
5c90: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
5ca0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
5cb0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  se( eDest==SRT_O
5cc0: 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69  utput );.      i
5cd0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
5ce0: 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
5cf0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
5d00: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
5d10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5d20: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
5d30: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
5d40: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a  , nColumn, r1);.
5d50: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
5d60: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
5d70: 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b  OrderBy, p, r1);
5d80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5d90: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5da0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
5db0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
5dc0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
5dd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
5de0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
5df0: 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
5e00: 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  ->iParm);.      
5e10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5e20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5e30: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
5e40: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
5e50: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  lumn);.        s
5e60: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
5e70: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
5e80: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
5e90: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
5ea0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
5eb0: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
5ec0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
5ed0: 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20  TRIGGER).    /* 
5ee0: 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75  Discard the resu
5ef0: 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  lts.  This is us
5f00: 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74  ed for SELECT st
5f10: 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a  atements inside.
5f20: 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20      ** the body 
5f30: 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54  of a TRIGGER.  T
5f40: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75  he purpose of su
5f50: 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f  ch selects is to
5f60: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   call.    ** use
5f70: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
5f80: 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69  ons that have si
5f90: 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20  de effects.  We 
5fa0: 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20  do not care.    
5fb0: 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74  ** about the act
5fc0: 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74  ual results of t
5fd0: 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a  he select..    *
5fe0: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
5ff0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
6000: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
6010: 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d );.      break
6020: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
6030: 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
6040: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
6050: 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49  loop if the LIMI
6060: 54 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 45  T is reached.  E
6070: 78 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74  xcept, if.  ** t
6080: 68 65 72 65 20 69 73 20 61 20 73 6f 72 74 65 72  here is a sorter
6090: 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  , in which case 
60a0: 74 68 65 20 73 6f 72 74 65 72 20 68 61 73 20 61  the sorter has a
60b0: 6c 72 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20  lready limited. 
60c0: 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66   ** the output f
60d0: 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  or us..  */.  if
60e0: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ( pOrderBy==0 &&
60f0: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
6100: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6110: 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op3(v, OP_IfZero
6120: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
6130: 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d 0a 7d 0a  eak, -1);.  }.}.
6140: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  ./*.** Given an 
6150: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
6160: 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49   generate a KeyI
6170: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
6180: 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68  at records.** th
6190: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
61a0: 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78  ence for each ex
61b0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74  pression in that
61c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
61d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
61e0: 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52  xprList is an OR
61f0: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
6200: 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74  BY clause then t
6210: 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20  he resulting.** 
6220: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
6230: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
6240: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
6250: 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  g a virtual inde
6260: 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  x to.** implemen
6270: 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20  t that clause.  
6280: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
6290: 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  is the result se
62a0: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a  t of a SELECT.**
62b0: 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66   then the KeyInf
62c0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
62d0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
62e0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
62f0: 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74  rtual.** index t
6300: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49  o implement a DI
6310: 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a  STINCT test..**.
6320: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
6330: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
6340: 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
6350: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54   from malloc.  T
6360: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
6370: 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
6380: 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67  sible for seeing
6390: 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63   that this struc
63a0: 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c  ture is eventual
63b0: 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20 41 64  ly.** freed.  Ad
63c0: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
63d0: 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 50  ructure to the P
63e0: 34 20 66 69 65 6c 64 20 6f 66 20 61 6e 20 6f 70  4 field of an op
63f0: 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20 50 34  code using.** P4
6400: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
6410: 20 69 73 20 74 68 65 20 75 73 75 61 6c 20 77 61   is the usual wa
6420: 79 20 6f 66 20 64 65 61 6c 69 6e 67 20 77 69 74  y of dealing wit
6430: 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  h this..*/.stati
6440: 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e  c KeyInfo *keyIn
6450: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 50  foFromExprList(P
6460: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
6470: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
6480: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
6490: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
64a0: 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e  t nExpr;.  KeyIn
64b0: 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72  fo *pInfo;.  str
64c0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
64d0: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
64e0: 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c  i;..  nExpr = pL
64f0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
6500: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
6510: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
6520: 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20 6e  zeof(*pInfo) + n
6530: 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  Expr*(sizeof(Col
6540: 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69  lSeq*)+1) );.  i
6550: 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20  f( pInfo ){.    
6560: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
6570: 72 20 3d 20 28 75 38 2a 29 26 70 49 6e 66 6f 2d  r = (u8*)&pInfo-
6580: 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20  >aColl[nExpr];. 
6590: 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64     pInfo->nField
65a0: 20 3d 20 28 75 31 36 29 6e 45 78 70 72 3b 0a 20   = (u16)nExpr;. 
65b0: 20 20 20 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20     pInfo->enc = 
65c0: 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 49 6e  ENC(db);.    pIn
65d0: 66 6f 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  fo->db = db;.   
65e0: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
65f0: 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70  pList->a; i<nExp
6600: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
6610: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
6620: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43  *pColl;.      pC
6630: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
6640: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
6650: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
6660: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
6670: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
6680: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
6690: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
66a0: 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d   pInfo->aColl[i]
66b0: 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
66c0: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
66d0: 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f  r[i] = pItem->so
66e0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
66f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66   }.  return pInf
6700: 6f 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  o;.}..#ifndef SQ
6710: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
6720: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
6730: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e  Name of the conn
6740: 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c  ection operator,
6750: 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20   used for error 
6760: 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61  messages..*/.sta
6770: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
6780: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74  selectOpName(int
6790: 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b   id){.  char *z;
67a0: 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b  .  switch( id ){
67b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
67c0: 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49  :       z = "UNI
67d0: 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b  ON ALL";   break
67e0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  ;.    case TK_IN
67f0: 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e  TERSECT: z = "IN
6800: 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61  TERSECT";   brea
6810: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
6820: 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45  XCEPT:    z = "E
6830: 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65  XCEPT";      bre
6840: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
6850: 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22             z = "
6860: 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72  UNION";       br
6870: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
6880: 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n z;.}.#endif /*
6890: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
68a0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
68b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
68c0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
68d0: 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58  ** Unless an "EX
68e0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
68f0: 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69  " command is bei
6900: 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68  ng processed, th
6910: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
6920: 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
6930: 77 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20  wise, it adds a 
6940: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75  single row of ou
6950: 74 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20  tput to the EQP 
6960: 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65  result,.** where
6970: 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20   the caption is 
6980: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
6990: 2a 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20 42  **   "USE TEMP B
69a0: 2d 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a  -TREE FOR xxx".*
69b0: 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69  *.** where xxx i
69c0: 73 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e  s one of "DISTIN
69d0: 43 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20  CT", "ORDER BY" 
69e0: 6f 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45  or "GROUP BY". E
69f0: 78 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20  xactly which.** 
6a00: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
6a10: 20 74 68 65 20 7a 55 73 61 67 65 20 61 72 67 75   the zUsage argu
6a20: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
6a30: 76 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70  void explainTemp
6a40: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
6a50: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
6a60: 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69 66 28 20  *zUsage){.  if( 
6a70: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
6a80: 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =2 ){.    Vdbe *
6a90: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
6aa0: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  e;.    char *zMs
6ab0: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
6ac0: 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
6ad0: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
6ae0: 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29  FOR %s", zUsage)
6af0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6b00: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
6b10: 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
6b20: 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
6b30: 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
6b40: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6b50: 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41  Unless an "EXPLA
6b60: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63  IN QUERY PLAN" c
6b70: 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20  ommand is being 
6b80: 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20  processed, this 
6b90: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  function.** is a
6ba0: 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
6bb0: 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e  e, it adds a sin
6bc0: 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  gle row of outpu
6bd0: 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73  t to the EQP res
6be0: 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68  ult,.** where th
6bf0: 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20  e caption is of 
6c00: 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20 66  one of the two f
6c10: 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43  orms:.**.**   "C
6c20: 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52  OMPOSITE SUBQUER
6c30: 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53  IES iSub1 and iS
6c40: 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22  ub2 (op)".**   "
6c50: 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45  COMPOSITE SUBQUE
6c60: 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69  RIES iSub1 and i
6c70: 53 75 62 32 20 55 53 49 4e 47 20 54 45 4d 50 20  Sub2 USING TEMP 
6c80: 42 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a  B-TREE (op)".**.
6c90: 2a 2a 20 77 68 65 72 65 20 69 53 75 62 31 20 61  ** where iSub1 a
6ca0: 6e 64 20 69 53 75 62 32 20 61 72 65 20 74 68 65  nd iSub2 are the
6cb0: 20 69 6e 74 65 67 65 72 73 20 70 61 73 73 65 64   integers passed
6cc0: 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f   as the correspo
6cd0: 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  nding.** functio
6ce0: 6e 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61 6e  n parameters, an
6cf0: 64 20 6f 70 20 69 73 20 74 68 65 20 74 65 78 74  d op is the text
6d00: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
6d10: 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  of the parameter
6d20: 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20  .** of the same 
6d30: 6e 61 6d 65 2e 20 54 68 65 20 70 61 72 61 6d 65  name. The parame
6d40: 74 65 72 20 22 6f 70 22 20 6d 75 73 74 20 62 65  ter "op" must be
6d50: 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e   one of TK_UNION
6d60: 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20  , TK_EXCEPT,.** 
6d70: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f 72 20  TK_INTERSECT or 
6d80: 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72 73  TK_ALL. The firs
6d90: 74 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20 69  t form is used i
6da0: 66 20 61 72 67 75 6d 65 6e 74 20 62 55 73 65 54  f argument bUseT
6db0: 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c  mp is .** false,
6dc0: 20 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 66   or the second f
6dd0: 6f 72 6d 20 69 66 20 69 74 20 69 73 20 74 72 75  orm if it is tru
6de0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
6df0: 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69  d explainComposi
6e00: 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  te(.  Parse *pPa
6e10: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
6e20: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
6e30: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
6e40: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
6e60: 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20  ne of TK_UNION, 
6e70: 54 4b 5f 45 58 43 45 50 54 20 65 74 63 2e 20 2a  TK_EXCEPT etc. *
6e80: 2f 0a 20 20 69 6e 74 20 69 53 75 62 31 2c 20 20  /.  int iSub1,  
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ea0: 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20      /* Subquery 
6eb0: 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53  id 1 */.  int iS
6ec0: 75 62 32 2c 20 20 20 20 20 20 20 20 20 20 20 20  ub2,            
6ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
6ee0: 71 75 65 72 79 20 69 64 20 32 20 2a 2f 0a 20 20  query id 2 */.  
6ef0: 69 6e 74 20 62 55 73 65 54 6d 70 20 20 20 20 20  int bUseTmp     
6f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f10: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74 65 6d  /* True if a tem
6f20: 70 20 74 61 62 6c 65 20 77 61 73 20 75 73 65 64  p table was used
6f30: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
6f40: 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c   op==TK_UNION ||
6f50: 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c   op==TK_EXCEPT |
6f60: 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  | op==TK_INTERSE
6f70: 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c  CT || op==TK_ALL
6f80: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
6f90: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
6fa0: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
6fb0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
6fc0: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
6fd0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20  lite3MPrintf(.  
6fe0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62        pParse->db
6ff0: 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51  , "COMPOUND SUBQ
7000: 55 45 52 49 45 53 20 25 64 20 41 4e 44 20 25 64  UERIES %d AND %d
7010: 20 25 73 28 25 73 29 22 2c 20 69 53 75 62 31 2c   %s(%s)", iSub1,
7020: 20 69 53 75 62 32 2c 0a 20 20 20 20 20 20 20 20   iSub2,.        
7030: 62 55 73 65 54 6d 70 3f 22 55 53 49 4e 47 20 54  bUseTmp?"USING T
7040: 45 4d 50 20 42 2d 54 52 45 45 20 22 3a 22 22 2c  EMP B-TREE ":"",
7050: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70   selectOpName(op
7060: 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  ).    );.    sql
7070: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
7080: 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50  , OP_Explain, pP
7090: 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
70a0: 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f   0, 0, zMsg, P4_
70b0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
70c0: 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78  ./*.** Assign ex
70d0: 70 72 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76  pression b to lv
70e0: 61 6c 75 65 20 61 2e 20 41 20 73 65 63 6f 6e 64  alue a. A second
70f0: 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e  , no-op, version
7100: 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a   of this macro.*
7110: 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20 77 68  * is provided wh
7120: 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  en SQLITE_OMIT_E
7130: 58 50 4c 41 49 4e 20 69 73 20 64 65 66 69 6e 65  XPLAIN is define
7140: 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  d. This allows t
7150: 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71  he code.** in sq
7160: 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 74 6f  lite3Select() to
7170: 20 61 73 73 69 67 6e 20 76 61 6c 75 65 73 20 74   assign values t
7180: 6f 20 73 74 72 75 63 74 75 72 65 20 6d 65 6d 62  o structure memb
7190: 65 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  er variables tha
71a0: 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20  t.** only exist 
71b0: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  if SQLITE_OMIT_E
71c0: 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64 65  XPLAIN is not de
71d0: 66 69 6e 65 64 20 77 69 74 68 6f 75 74 20 70 6f  fined without po
71e0: 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63  lluting the.** c
71f0: 6f 64 65 20 77 69 74 68 20 23 69 66 6e 64 65 66  ode with #ifndef
7200: 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a   directives..*/.
7210: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
7220: 53 65 74 49 6e 74 65 67 65 72 28 61 2c 20 62 29  SetInteger(a, b)
7230: 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a   a = b..#else./*
7240: 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20   No-op versions 
7250: 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58  of the explainXX
7260: 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  X() functions an
7270: 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64  d macros. */.# d
7280: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d  efine explainTem
7290: 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65  pTable(y,z).# de
72a0: 66 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d 70  fine explainComp
72b0: 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a 29  osite(v,w,x,y,z)
72c0: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
72d0: 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29  nSetInteger(y,z)
72e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
72f0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
7300: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75   was generated u
7310: 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20  sing a non-null 
7320: 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e  pOrderBy argumen
7330: 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  t,.** then the r
7340: 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63  esults were plac
7350: 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20  ed in a sorter. 
7360: 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20   After the loop 
7370: 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  is terminated.**
7380: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20   we need to run 
7390: 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f  the sorter and o
73a0: 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74  utput the result
73b0: 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
73c0: 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  g.** routine gen
73d0: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
73e0: 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61  needed to do tha
73f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
7400: 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61  d generateSortTa
7410: 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  il(.  Parse *pPa
7420: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
7430: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
7440: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
7450: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
7460: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56  statement */.  V
7470: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
7480: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
7490: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45  e into this VDBE
74a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
74b0: 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  n,      /* Numbe
74c0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
74d0: 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
74e0: 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57  Dest *pDest /* W
74f0: 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20  rite the sorted 
7500: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
7510: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65  ){.  int addrBre
7520: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
7530: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 20  MakeLabel(v);   
7540: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
7550: 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20  o exit loop */. 
7560: 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75   int addrContinu
7570: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
7580: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a  akeLabel(v);  /*
7590: 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e   Jump here for n
75a0: 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  ext cycle */.  i
75b0: 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69  nt addr;.  int i
75c0: 54 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64  Tab;.  int pseud
75d0: 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72  oTab = 0;.  Expr
75e0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
75f0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20   p->pOrderBy;.. 
7600: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
7610: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74  st->eDest;.  int
7620: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
7630: 69 50 61 72 6d 3b 0a 0a 20 20 69 6e 74 20 72 65  iParm;..  int re
7640: 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52  gRow;.  int regR
7650: 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62 20 3d 20  owid;..  iTab = 
7660: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
7670: 6f 72 3b 0a 20 20 72 65 67 52 6f 77 20 3d 20 73  or;.  regRow = s
7680: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
7690: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
76a0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
76b0: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
76c0: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
76d0: 20 70 73 65 75 64 6f 54 61 62 20 3d 20 70 50 61   pseudoTab = pPa
76e0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
76f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7700: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
7710: 75 64 6f 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  udo, pseudoTab, 
7720: 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29  regRow, nColumn)
7730: 3b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d  ;.    regRowid =
7740: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
7750: 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69   regRowid = sqli
7760: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
7770: 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 61 64 64  arse);.  }.  add
7780: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
7790: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
77a0: 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Sort, iTab, addr
77b0: 42 72 65 61 6b 29 3b 0a 20 20 63 6f 64 65 4f 66  Break);.  codeOf
77c0: 66 73 65 74 28 76 2c 20 70 2c 20 61 64 64 72 43  fset(v, p, addrC
77d0: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69  ontinue);.  sqli
77e0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
77f0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
7800: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
7810: 72 20 2b 20 31 2c 20 72 65 67 52 6f 77 29 3b 0a  r + 1, regRow);.
7820: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
7830: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
7840: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
7850: 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
7860: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7870: 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65  eDest==SRT_Table
7880: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7890: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45  se( eDest==SRT_E
78a0: 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
78b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
78c0: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
78d0: 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  d, iParm, regRow
78e0: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
78f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7900: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
7910: 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77  , regRow, regRow
7920: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
7930: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
7940: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
7950: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7960: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
7970: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
7980: 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  Y.    case SRT_S
7990: 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  et: {.      asse
79a0: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
79b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
79c0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
79d0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
79e0: 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c  ow, 1, regRowid,
79f0: 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31   &p->affinity, 1
7a00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7a10: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
7a20: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
7a30: 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20  regRow, 1);.    
7a40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7a50: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
7a60: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
7a70: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65  owid);.      bre
7a80: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7a90: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
7aa0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
7ab0: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
7ac0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
7ad0: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  ove(pParse, regR
7ae0: 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  ow, iParm, 1);. 
7af0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
7b00: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
7b10: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
7b20: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
7b30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
7b40: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
7b50: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  : {.      int i;
7b60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
7b70: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
7b80: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
7b90: 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20  oroutine ); .   
7ba0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
7bb0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
7bc0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7bd0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
7be0: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
7bf0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
7c00: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
7c10: 20 20 61 73 73 65 72 74 28 20 72 65 67 52 6f 77    assert( regRow
7c20: 21 3d 70 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 20  !=pDest->iMem+i 
7c30: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7c40: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7c50: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64  OP_Column, pseud
7c60: 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74 2d 3e  oTab, i, pDest->
7c70: 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20 20 20 20  iMem+i);.       
7c80: 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20   if( i==0 ){.   
7c90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7ca0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
7cb0: 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29  FLAG_CLEARCACHE)
7cc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7cd0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44    }.      if( eD
7ce0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
7cf0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7d00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7d10: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44  OP_ResultRow, pD
7d20: 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75  est->iMem, nColu
7d30: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  mn);.        sql
7d40: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
7d50: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
7d60: 73 65 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c  se, pDest->iMem,
7d70: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
7d80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7d90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7da0: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
7db0: 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20  Dest->iParm);.  
7dc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7dd0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
7de0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
7df0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
7e00: 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  Row);.  sqlite3R
7e10: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
7e20: 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b  arse, regRowid);
7e30: 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f  ..  /* The botto
7e40: 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  m of the loop.  
7e50: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
7e60: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
7e70: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
7e80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7e90: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
7ea0: 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 73 71  Tab, addr);.  sq
7eb0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
7ec0: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65  Label(v, addrBre
7ed0: 61 6b 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74  ak);.  if( eDest
7ee0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
7ef0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
7f00: 74 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  tine ){.    sqli
7f10: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7f20: 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64   OP_Close, pseud
7f30: 6f 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  oTab, 0);.  }.}.
7f40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
7f50: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
7f60: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
7f70: 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20  he 'declaration 
7f80: 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20  type' of the.** 
7f90: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
7fa0: 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79  . The string may
7fb0: 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73   be treated as s
7fc0: 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c  tatic by the cal
7fd0: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ler..**.** The d
7fe0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
7ff0: 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74  is the exact dat
8000: 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e  atype definition
8010: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
8020: 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
8030: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
8040: 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78  tement if the ex
8050: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
8060: 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63  lumn. The.** dec
8070: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
8080: 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20  r a ROWID field 
8090: 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63  is INTEGER. Exac
80a0: 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72  tly when an expr
80b0: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e  ession.** is con
80c0: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
80d0: 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20   can be complex 
80e0: 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  in the presence 
80f0: 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54  of subqueries. T
8100: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74  he.** result-set
8110: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
8120: 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
8130: 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65  ing SELECT state
8140: 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e  ments is .** con
8150: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
8160: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
8170: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  n..**.**   SELEC
8180: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
8190: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
81a0: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
81b0: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53  ;.**   SELECT (S
81c0: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
81d0: 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  bl);.**   SELECT
81e0: 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43   abc FROM (SELEC
81f0: 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f  T col AS abc FRO
8200: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54  M tbl);.** .** T
8210: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
8220: 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72  ype for any expr
8230: 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  ession other tha
8240: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55  n a column is NU
8250: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  LL..*/.static co
8260: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e  nst char *column
8270: 54 79 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74  Type(.  NameCont
8280: 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70  ext *pNC, .  Exp
8290: 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73  r *pExpr,.  cons
82a0: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69  t char **pzOrigi
82b0: 6e 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  nDb,.  const cha
82c0: 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c  r **pzOriginTab,
82d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
82e0: 70 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20  pzOriginCol.){. 
82f0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79   char const *zTy
8300: 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  pe = 0;.  char c
8310: 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20  onst *zOriginDb 
8320: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
8330: 74 20 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20  t *zOriginTab = 
8340: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
8350: 2a 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b  *zOriginCol = 0;
8360: 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20  .  int j;.  if( 
8370: 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20  NEVER(pExpr==0) 
8380: 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  || pNC->pSrcList
8390: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
83a0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
83b0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
83c0: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
83d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
83e0: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  MN: {.      /* T
83f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
8400: 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74   a column. Locat
8410: 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20  e the table the 
8420: 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a  column is being.
8430: 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74        ** extract
8440: 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43  ed from in NameC
8450: 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e  ontext.pSrcList.
8460: 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20   This table may 
8470: 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a  be real.      **
8480: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
8490: 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20  or a subquery.. 
84a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61       */.      Ta
84b0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
84c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
84d0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c  le structure col
84e0: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
84f0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53   from */.      S
8500: 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20  elect *pS = 0;  
8510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
8520: 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lect the column 
8530: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
8540: 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  m */.      int i
8550: 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
8560: 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20  lumn;  /* Index 
8570: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61  of column in pTa
8580: 62 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  b */.      testc
8590: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
85a0: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
85b0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
85c0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
85d0: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77  OLUMN );.      w
85e0: 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54  hile( pNC && !pT
85f0: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72  ab ){.        Sr
8600: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
8610: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
8620: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
8630: 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ;j<pTabList->nSr
8640: 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61  c && pTabList->a
8650: 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78  [j].iCursor!=pEx
8660: 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b  pr->iTable;j++);
8670: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70  .        if( j<p
8680: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b  TabList->nSrc ){
8690: 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20  .          pTab 
86a0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
86b0: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  .pTab;.         
86c0: 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e   pS = pTabList->
86d0: 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  a[j].pSelect;.  
86e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
86f0: 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43         pNC = pNC
8700: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
8710: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
8720: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
8730: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f  .        /* At o
8740: 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75  ne time, code su
8750: 63 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65  ch as "SELECT ne
8760: 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74 72  w.x" within a tr
8770: 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20  igger would.    
8780: 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69      ** cause thi
8790: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72  s condition to r
87a0: 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c  un.  Since then,
87b0: 20 77 65 20 68 61 76 65 20 72 65 73 74 72 75 63   we have restruc
87c0: 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20  tured how.      
87d0: 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64    ** trigger cod
87e0: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  e is generated a
87f0: 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69  nd so this condi
8800: 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  tion is no longe
8810: 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  r .        ** po
8820: 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c  ssible. However,
8830: 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65   it can still be
8840: 20 74 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d   true for statem
8850: 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20  ents like.      
8860: 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
8870: 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ng:.        **. 
8880: 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41         **   CREA
8890: 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20  TE TABLE t1(col 
88a0: 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20  INTEGER);.      
88b0: 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53    **   SELECT (S
88c0: 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52  ELECT t1.col) FR
88d0: 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  OM FROM t1;.    
88e0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
88f0: 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70  * when columnTyp
8900: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
8910: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
8920: 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20  "t1.col" in the 
8930: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d  .        ** sub-
8940: 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20  select. In this 
8950: 63 61 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f  case, set the co
8960: 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c  lumn type to NUL
8970: 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20  L, even.        
8980: 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f  ** though it sho
8990: 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49  uld really be "I
89a0: 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20  NTEGER"..       
89b0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
89c0: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f  his is not a pro
89d0: 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c  blem, as the col
89e0: 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e  umn type of "t1.
89f0: 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20  col" is never.  
8a00: 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57        ** used. W
8a10: 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29  hen columnType()
8a20: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
8a30: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20  e expression .  
8a40: 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43        ** "(SELEC
8a50: 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20  T t1.col)", the 
8a60: 63 6f 72 72 65 63 74 20 74 79 70 65 20 69 73 20  correct type is 
8a70: 72 65 74 75 72 6e 65 64 20 28 73 65 65 20 74 68  returned (see th
8a80: 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20  e TK_SELECT.    
8a90: 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65      ** branch be
8aa0: 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  low.  */.       
8ab0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
8ac0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8ad0: 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54  Tab && pExpr->pT
8ae0: 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  ab==pTab );.    
8af0: 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20    if( pS ){.    
8b00: 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c      /* The "tabl
8b10: 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  e" is actually a
8b20: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61   sub-select or a
8b30: 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f   view in the FRO
8b40: 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  M clause.       
8b50: 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43   ** of the SELEC
8b60: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74  T statement. Ret
8b70: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
8b80: 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69  ion type and ori
8b90: 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  gin.        ** d
8ba0: 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75  ata for the resu
8bb0: 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66  lt-set column of
8bc0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
8bd0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
8be0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
8bf0: 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70  && ALWAYS(iCol<p
8c00: 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  S->pEList->nExpr
8c10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
8c20: 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73  * If iCol is les
8c30: 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
8c40: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
8c50: 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20   requests the.  
8c60: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64          ** rowid
8c70: 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65   of the sub-sele
8c80: 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73  ct or view. This
8c90: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c   expression is l
8ca0: 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20  egal (see .     
8cb0: 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73       ** test cas
8cc0: 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69  e misc2.2.2) - i
8cd0: 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74  t always evaluat
8ce0: 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20  es to NULL..    
8cf0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
8d00: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
8d10: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  NC;.          Ex
8d20: 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69  pr *p = pS->pELi
8d30: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
8d40: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  r;.          sNC
8d50: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
8d60: 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  pSrc;.          
8d70: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
8d80: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
8d90: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
8da0: 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  rse;.          z
8db0: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
8dc0: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
8dd0: 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54  ginDb, &zOriginT
8de0: 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29  ab, &zOriginCol)
8df0: 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
8e00: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57     }else if( ALW
8e10: 41 59 53 28 70 54 61 62 2d 3e 70 53 63 68 65 6d  AYS(pTab->pSchem
8e20: 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  a) ){.        /*
8e30: 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f   A real table */
8e40: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8e50: 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20   !pS );.        
8e60: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
8e70: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
8e80: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8e90: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
8ea0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
8eb0: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
8ec0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
8ed0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
8ee0: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
8ef0: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69            zOrigi
8f00: 6e 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  nCol = "rowid";.
8f10: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
8f20: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
8f30: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
8f40: 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20  ].zType;.       
8f50: 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20     zOriginCol = 
8f60: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
8f70: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
8f80: 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69  }.        zOrigi
8f90: 6e 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  nTab = pTab->zNa
8fa0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
8fb0: 70 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20  pNC->pParse ){. 
8fc0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62           int iDb
8fd0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
8fe0: 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61  ToIndex(pNC->pPa
8ff0: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
9000: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
9010: 20 20 20 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70     zOriginDb = p
9020: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e  NC->pParse->db->
9030: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
9040: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9050: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
9060: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
9070: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
9080: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  Y.    case TK_SE
9090: 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LECT: {.      /*
90a0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
90b0: 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e  is a sub-select.
90c0: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
90d0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
90e0: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  .      ** origin
90f0: 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69   info for the si
9100: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ngle column in t
9110: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
9120: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
9130: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a    ** statement..
9140: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e        */.      N
9150: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
9160: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
9170: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
9180: 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ect;.      Expr 
9190: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
91a0: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
91b0: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
91c0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
91d0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
91e0: 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72  );.      sNC.pSr
91f0: 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63  cList = pS->pSrc
9200: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78  ;.      sNC.pNex
9210: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73  t = pNC;.      s
9220: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  NC.pParse = pNC-
9230: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a  >pParse;.      z
9240: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
9250: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
9260: 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54  ginDb, &zOriginT
9270: 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29  ab, &zOriginCol)
9280: 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
9290: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
92a0: 0a 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67  .  .  if( pzOrig
92b0: 69 6e 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65  inDb ){.    asse
92c0: 72 74 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20  rt( pzOriginTab 
92d0: 26 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29  && pzOriginCol )
92e0: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44  ;.    *pzOriginD
92f0: 62 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20  b = zOriginDb;. 
9300: 20 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20     *pzOriginTab 
9310: 3d 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20  = zOriginTab;.  
9320: 20 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d    *pzOriginCol =
9330: 20 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d   zOriginCol;.  }
9340: 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b  .  return zType;
9350: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
9360: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
9370: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
9380: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
9390: 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  types of columns
93a0: 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c  .** in the resul
93b0: 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  t set..*/.static
93c0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
93d0: 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72  lumnTypes(.  Par
93e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
93f0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
9400: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
9410: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
9420: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
9430: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
9440: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
9450: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
9460: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
9470: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
9480: 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
9490: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
94a0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
94b0: 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t i;.  NameConte
94c0: 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53  xt sNC;.  sNC.pS
94d0: 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
94e0: 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20  t;.  sNC.pParse 
94f0: 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28  = pParse;.  for(
9500: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
9510: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
9520: 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74  Expr *p = pEList
9530: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
9540: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
9550: 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ype;.#ifdef SQLI
9560: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
9570: 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f  _METADATA.    co
9580: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44  nst char *zOrigD
9590: 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  b = 0;.    const
95a0: 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20   char *zOrigTab 
95b0: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
95c0: 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20  har *zOrigCol = 
95d0: 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63  0;.    zType = c
95e0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
95f0: 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f  p, &zOrigDb, &zO
9600: 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f  rigTab, &zOrigCo
9610: 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  l);..    /* The 
9620: 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69  vdbe must make i
9630: 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74  ts own copy of t
9640: 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61  he column-type a
9650: 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a  nd other .    **
9660: 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63   column specific
9670: 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73   strings, in cas
9680: 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  e the schema is 
9690: 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69  reset before thi
96a0: 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c  s.    ** virtual
96b0: 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65   machine is dele
96c0: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
96d0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
96e0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
96f0: 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f  AME_DATABASE, zO
9700: 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52  rigDb, SQLITE_TR
9710: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
9720: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
9730: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
9740: 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61  E_TABLE, zOrigTa
9750: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
9760: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
9770: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
9780: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f  v, i, COLNAME_CO
9790: 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20  LUMN, zOrigCol, 
97a0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
97b0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79  );.#else.    zTy
97c0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
97d0: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
97e0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
97f0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
9800: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
9810: 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70  E_DECLTYPE, zTyp
9820: 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  e, SQLITE_TRANSI
9830: 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ENT);.  }.#endif
9840: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
9850: 44 45 43 4c 54 59 50 45 20 2a 2f 0a 7d 0a 0a 2f  DECLTYPE */.}../
9860: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
9870: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
9880: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e  l the VDBE the n
9890: 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ames of columns.
98a0: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
98b0: 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f   set.  This info
98c0: 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
98d0: 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a  to provide the.*
98e0: 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73  * azCol[] values
98f0: 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   in the callback
9900: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9910: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
9920: 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ames(.  Parse *p
9930: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
9940: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
9950: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
9960: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
9970: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
9980: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
9990: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
99a0: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
99b0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20  sult set */.){. 
99c0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
99d0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
99e0: 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20  i, j;.  sqlite3 
99f0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9a00: 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65  ;.  int fullName
9a10: 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a  s, shortNames;..
9a20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9a30: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a  MIT_EXPLAIN.  /*
9a40: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45   If this is an E
9a50: 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69  XPLAIN, skip thi
9a60: 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20  s step */.  if( 
9a70: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
9a80: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
9a90: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
9aa0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
9ab0: 73 53 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d  sSet || NEVER(v=
9ac0: 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  =0) || db->mallo
9ad0: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
9ae0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  ;.  pParse->colN
9af0: 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66  amesSet = 1;.  f
9b00: 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e  ullNames = (db->
9b10: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
9b20: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ullColNames)!=0;
9b30: 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20  .  shortNames = 
9b40: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
9b50: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
9b60: 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33  s)!=0;.  sqlite3
9b70: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
9b80: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
9b90: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
9ba0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
9bb0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b  +){.    Expr *p;
9bc0: 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d  .    p = pEList-
9bd0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
9be0: 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
9bf0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9c00: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
9c10: 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
9c20: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
9c30: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
9c40: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
9c50: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
9c60: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
9c70: 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  E, zName, SQLITE
9c80: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
9c90: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f   }else if( (p->o
9ca0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
9cb0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  p->op==TK_AGG_CO
9cc0: 4c 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73  LUMN) && pTabLis
9cd0: 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  t ){.      Table
9ce0: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68   *pTab;.      ch
9cf0: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
9d00: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
9d10: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72  olumn;.      for
9d20: 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70  (j=0; ALWAYS(j<p
9d30: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20  TabList->nSrc); 
9d40: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
9d50: 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  ( pTabList->a[j]
9d60: 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61  .iCursor==p->iTa
9d70: 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ble ) break;.   
9d80: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
9d90: 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  t( j<pTabList->n
9da0: 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61  Src );.      pTa
9db0: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
9dc0: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  j].pTab;.      i
9dd0: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
9de0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
9df0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
9e00: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
9e10: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
9e20: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
9e30: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
9e40: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f        zCol = "ro
9e50: 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  wid";.      }els
9e60: 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  e{.        zCol 
9e70: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
9e80: 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l].zName;.      
9e90: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f  }.      if( !sho
9ea0: 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c  rtNames && !full
9eb0: 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
9ec0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
9ed0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
9ee0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20  NAME_NAME, .    
9ef0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
9f00: 62 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69  bStrDup(db, pELi
9f10: 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c  st->a[i].zSpan),
9f20: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
9f30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
9f40: 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20  ( fullNames ){. 
9f50: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
9f60: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
9f70: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
9f80: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
9f90: 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  s", pTab->zName,
9fa0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   zCol);.        
9fb0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
9fc0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
9fd0: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c  AME_NAME, zName,
9fe0: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
9ff0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a000: 20 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 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52   zCol, SQLITE_TR
a040: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
a050: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
a060: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
a070: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
a080: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20  OLNAME_NAME, .  
a090: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
a0a0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69  bStrDup(db, pELi
a0b0: 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c  st->a[i].zSpan),
a0c0: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
a0d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65  ;.    }.  }.  ge
a0e0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
a0f0: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
a100: 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a  st, pEList);.}..
a110: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 61 6e  /*.** Given a an
a120: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
a130: 20 28 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c   (which is reall
a140: 79 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78  y the list of ex
a150: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
a160: 74 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c  t form the resul
a170: 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
a180: 54 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d  T statement) com
a190: 70 75 74 65 20 61 70 70 72 6f 70 72 69 61 74 65  pute appropriate
a1a0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  .** column names
a1b0: 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61   for a table tha
a1c0: 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  t would hold the
a1d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
a1e0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75  ..**.** All colu
a1f0: 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65  mn names will be
a200: 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f   unique..**.** O
a210: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
a220: 61 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65  ames are compute
a230: 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  d.  Column.zType
a240: 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a  , Column.zColl,.
a250: 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65  ** and other fie
a260: 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72  lds of Column ar
a270: 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20  e zeroed..**.** 
a280: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
a290: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
a2a0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
a2b0: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
a2c0: 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c  s,.** store NULL
a2d0: 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30   in *paCol and 0
a2e0: 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72   in *pnCol and r
a2f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
a300: 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EM..*/.static in
a310: 74 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46  t selectColumnsF
a320: 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50  romExprList(.  P
a330: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
a340: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
a350: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
a360: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
a370: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c         /* Expr l
a380: 69 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ist from which t
a390: 6f 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20  o derive column 
a3a0: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  names */.  int *
a3b0: 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  pnCol,          
a3c0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
a3d0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
a3e0: 73 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75  s here */.  Colu
a3f0: 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20  mn **paCol      
a400: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
a410: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   new column list
a420: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71   here */.){.  sq
a430: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a440: 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74  se->db;   /* Dat
a450: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
a460: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
a470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a480: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
a490: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b  rs */.  int cnt;
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4b0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64      /* Index add
a4c0: 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e  ed to make the n
a4d0: 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20  ame unique */.  
a4e0: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70  Column *aCol, *p
a4f0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  Col;        /* F
a500: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
a510: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a  result columns *
a520: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20  /.  int nCol;   
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a540: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
a550: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
a560: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72  lt set */.  Expr
a570: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
a580: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
a590: 73 73 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67  ssion for a sing
a5a0: 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  le result column
a5b0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
a5c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
a5d0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
a5e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
a5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a600: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d    /* Size of nam
a610: 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a  e in zName[] */.
a620: 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  .  *pnCol = nCol
a630: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
a640: 3b 0a 20 20 61 43 6f 6c 20 3d 20 2a 70 61 43 6f  ;.  aCol = *paCo
a650: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  l = sqlite3DbMal
a660: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
a670: 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c  of(aCol[0])*nCol
a680: 29 3b 0a 20 20 69 66 28 20 61 43 6f 6c 3d 3d 30  );.  if( aCol==0
a690: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
a6a0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 66 6f 72 28 69 3d  _NOMEM;.  for(i=
a6b0: 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c  0, pCol=aCol; i<
a6c0: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
a6d0: 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61  +){.    /* Get a
a6e0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61  n appropriate na
a6f0: 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  me for the colum
a700: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d  n.    */.    p =
a710: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
a720: 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
a730: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c   p->pRight==0 ||
a740: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
a750: 28 70 2d 3e 70 52 69 67 68 74 2c 20 45 50 5f 49  (p->pRight, EP_I
a760: 6e 74 56 61 6c 75 65 29 0a 20 20 20 20 20 20 20  ntValue).       
a770: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 70 52          || p->pR
a780: 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d  ight->u.zToken==
a790: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e  0 || p->pRight->
a7a0: 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29  u.zToken[0]!=0 )
a7b0: 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65  ;.    if( (zName
a7c0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
a7d0: 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
a7e0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
a7f0: 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  umn contains an 
a800: 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61  "AS <name>" phra
a810: 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61  se, use <name> a
a820: 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  s the name */.  
a830: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
a840: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
a850: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
a860: 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
a870: 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a  ColExpr = p;  /*
a880: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
a890: 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73 75  that is the resu
a8a0: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  lt column name *
a8b0: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
a8c0: 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab;         /* 
a8d0: 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  Table associated
a8e0: 20 77 69 74 68 20 74 68 69 73 20 65 78 70 72 65   with this expre
a8f0: 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77  ssion */.      w
a900: 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e  hile( pColExpr->
a910: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 20 70 43 6f  op==TK_DOT ) pCo
a920: 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72  lExpr = pColExpr
a930: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
a940: 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
a950: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41  ==TK_COLUMN && A
a960: 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e  LWAYS(pColExpr->
a970: 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
a980: 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d      /* For colum
a990: 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d  ns use the colum
a9a0: 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20  n name name */. 
a9b0: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
a9c0: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c  = pColExpr->iCol
a9d0: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61  umn;.        pTa
a9e0: 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54  b = pColExpr->pT
a9f0: 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ab;.        if( 
aa00: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
aa10: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
aa20: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
aa30: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
aa40: 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  "%s",.          
aa50: 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f         iCol>=0 ?
aa60: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
aa70: 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64  ].zName : "rowid
aa80: 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ");.      }else 
aa90: 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
aaa0: 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20  ==TK_ID ){.     
aab0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
aac0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c  HasProperty(pCol
aad0: 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
aae0: 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e  e) );.        zN
aaf0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
ab00: 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70  intf(db, "%s", p
ab10: 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ColExpr->u.zToke
ab20: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
ab30: 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  .        /* Use 
ab40: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78  the original tex
ab50: 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
ab60: 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74  expression as it
ab70: 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  s name */.      
ab80: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
ab90: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
aba0: 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ", pEList->a[i].
abb0: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  zSpan);.      }.
abc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
abd0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
abe0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
abf0: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
ac00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ac10: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b     }..    /* Mak
ac20: 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d  e sure the colum
ac30: 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65  n name is unique
ac40: 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69  .  If the name i
ac50: 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20  s not unique,.  
ac60: 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e    ** append a in
ac70: 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d  teger to the nam
ac80: 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63  e so that it bec
ac90: 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20  omes unique..   
aca0: 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20   */.    nName = 
acb0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
acc0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28  zName);.    for(
acd0: 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  j=cnt=0; j<i; j+
ace0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
acf0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f  lite3StrICmp(aCo
ad00: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  l[j].zName, zNam
ad10: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
ad20: 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b   char *zNewName;
ad30: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e  .        zName[n
ad40: 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20  Name] = 0;.     
ad50: 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71     zNewName = sq
ad60: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
ad70: 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c   "%s:%d", zName,
ad80: 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20   ++cnt);.       
ad90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
ada0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
adb0: 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e     zName = zNewN
adc0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  ame;.        j =
add0: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28   -1;.        if(
ade0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61   zName==0 ) brea
adf0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
ae00: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  .    pCol->zName
ae10: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20   = zName;.  }.  
ae20: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
ae30: 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28  iled ){.    for(
ae40: 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  j=0; j<i; j++){.
ae50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
ae60: 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e  ree(db, aCol[j].
ae70: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
ae80: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
ae90: 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a  db, aCol);.    *
aea0: 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a  paCol = 0;.    *
aeb0: 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72  pnCol = 0;.    r
aec0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
aed0: 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  EM;.  }.  return
aee0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
aef0: 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e  *.** Add type an
af00: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
af10: 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c  rmation to a col
af20: 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f  umn list based o
af30: 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74  n.** a SELECT st
af40: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20  atement..** .** 
af50: 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  The column list 
af60: 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20  presumably came 
af70: 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d  from selectColum
af80: 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69  nNamesFromExprLi
af90: 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c  st()..** The col
afa0: 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c  umn list has onl
afb0: 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70  y names, not typ
afc0: 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73  es or collations
afd0: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
afe0: 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20  ne goes through 
aff0: 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70  and adds the typ
b000: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
b010: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
b020: 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74  utine requires t
b030: 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69  hat all identifi
b040: 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ers in the SELEC
b050: 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62  T.** statement b
b060: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73  e resolved..*/.s
b070: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
b080: 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
b090: 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61  dCollation(.  Pa
b0a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
b0b0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
b0c0: 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 69 6e 74  ontexts */.  int
b0d0: 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   nCol,          
b0e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b0f0: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 43 6f 6c  columns */.  Col
b100: 75 6d 6e 20 2a 61 43 6f 6c 2c 20 20 20 20 20 20  umn *aCol,      
b110: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
b120: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 53 65 6c 65 63  lumns */.  Selec
b130: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
b140: 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20   /* SELECT used 
b150: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70  to determine typ
b160: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
b170: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
b180: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
b190: 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  db;.  NameContex
b1a0: 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20  t sNC;.  Column 
b1b0: 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71  *pCol;.  CollSeq
b1c0: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pColl;.  int i
b1d0: 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73  ;.  Expr *p;.  s
b1e0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
b1f0: 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72  tem *a;..  asser
b200: 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b  t( pSelect!=0 );
b210: 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c  .  assert( (pSel
b220: 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ect->selFlags & 
b230: 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20  SF_Resolved)!=0 
b240: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f  );.  assert( nCo
b250: 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  l==pSelect->pELi
b260: 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d  st->nExpr || db-
b270: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
b280: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
b290: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
b2a0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c  ;.  memset(&sNC,
b2b0: 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
b2c0: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
b2d0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
b2e0: 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d  ;.  a = pSelect-
b2f0: 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f  >pEList->a;.  fo
b300: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
b310: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ; i<nCol; i++, p
b320: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  Col++){.    p = 
b330: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
b340: 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71  pCol->zType = sq
b350: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
b360: 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  , columnType(&sN
b370: 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b  C, p, 0, 0, 0));
b380: 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
b390: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
b3a0: 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20  rAffinity(p);.  
b3b0: 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69    if( pCol->affi
b3c0: 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e  nity==0 ) pCol->
b3d0: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
b3e0: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
b3f0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
b400: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
b410: 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e, p);.    if( p
b420: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43  Coll ){.      pC
b430: 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ol->zColl = sqli
b440: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
b450: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
b460: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
b470: 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54  * Given a SELECT
b480: 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65   statement, gene
b490: 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72  rate a Table str
b4a0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
b4b0: 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73  ribes.** the res
b4c0: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20  ult set of that 
b4d0: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65  SELECT..*/.Table
b4e0: 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53   *sqlite3ResultS
b4f0: 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65  etOfSelect(Parse
b500: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
b510: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61   *pSelect){.  Ta
b520: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c  ble *pTab;.  sql
b530: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
b540: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76  e->db;.  int sav
b550: 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65  edFlags;..  save
b560: 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61  dFlags = db->fla
b570: 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  gs;.  db->flags 
b580: 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43  &= ~SQLITE_FullC
b590: 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66  olNames;.  db->f
b5a0: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
b5b0: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  hortColNames;.  
b5c0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
b5d0: 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  p(pParse, pSelec
b5e0: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61  t, 0);.  if( pPa
b5f0: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
b600: 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70  rn 0;.  while( p
b610: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
b620: 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
b630: 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62  ct->pPrior;.  db
b640: 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46  ->flags = savedF
b650: 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73  lags;.  pTab = s
b660: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
b670: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
b680: 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
b690: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ab==0 ){.    ret
b6a0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20  urn 0;.  }.  /* 
b6b0: 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c  The sqlite3Resul
b6c0: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69  tSetOfSelect() i
b6d0: 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f  s only used n co
b6e0: 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f  ntexts where loo
b6f0: 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64  kaside.  ** is d
b700: 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73  isabled */.  ass
b710: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
b720: 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29  de.bEnabled==0 )
b730: 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d  ;.  pTab->nRef =
b740: 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d   1;.  pTab->zNam
b750: 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e  e = 0;.  pTab->n
b760: 52 6f 77 45 73 74 20 3d 20 31 30 30 30 30 30 30  RowEst = 1000000
b770: 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  ;.  selectColumn
b780: 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
b790: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70  arse, pSelect->p
b7a0: 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43  EList, &pTab->nC
b7b0: 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29  ol, &pTab->aCol)
b7c0: 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c  ;.  selectAddCol
b7d0: 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
b7e0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
b7f0: 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43  ->nCol, pTab->aC
b800: 6f 6c 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  ol, pSelect);.  
b810: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
b820: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
b830: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
b840: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
b850: 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
b860: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
b870: 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
b880: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44  ../*.** Get a VD
b890: 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  BE for the given
b8a0: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e   parser context.
b8b0: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
b8c0: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
b8d0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
b8e0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
b8f0: 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20  ULL and leave a 
b900: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
b910: 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
b920: 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65  te3GetVdbe(Parse
b930: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
b940: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
b950: 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30  Vdbe;.  if( v==0
b960: 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72   ){.    v = pPar
b970: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
b980: 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50  te3VdbeCreate(pP
b990: 61 72 73 65 2d 3e 64 62 29 3b 0a 23 69 66 6e 64  arse->db);.#ifnd
b9a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
b9b0: 52 41 43 45 0a 20 20 20 20 69 66 28 20 76 20 29  RACE.    if( v )
b9c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
b9d0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
b9e0: 54 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65  Trace);.    }.#e
b9f0: 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72  ndif.  }.  retur
ba00: 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  n v;.}.../*.** C
ba10: 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69  ompute the iLimi
ba20: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69  t and iOffset fi
ba30: 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45  elds of the SELE
ba40: 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  CT based on the.
ba50: 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  ** pLimit and pO
ba60: 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  ffset expression
ba70: 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  s.  pLimit and p
ba80: 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20  Offset hold the 
ba90: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74  expressions.** t
baa0: 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  hat appear in th
bab0: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73  e original SQL s
bac0: 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74  tatement after t
bad0: 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
bae0: 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e  SET.** keywords.
baf0: 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f    Or NULL if tho
bb00: 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  se keywords are 
bb10: 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20  omitted. iLimit 
bb20: 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20  and iOffset .** 
bb30: 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  are the integer 
bb40: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20  memory register 
bb50: 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e  numbers for coun
bb60: 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ters used to com
bb70: 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d  pute .** the lim
bb80: 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20  it and offset.  
bb90: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c  If there is no l
bba0: 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73  imit and/or offs
bbb0: 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69  et, then .** iLi
bbc0: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
bbd0: 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  are negative..**
bbe0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
bbf0: 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c   changes the val
bc00: 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e  ues of iLimit an
bc10: 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69  d iOffset only i
bc20: 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20  f.** a limit or 
bc30: 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65  offset is define
bc40: 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20  d by pLimit and 
bc50: 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74  pOffset.  iLimit
bc60: 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20   and.** iOffset 
bc70: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
bc80: 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f   preset to appro
bc90: 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76  priate default v
bca0: 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c  alues.** (usuall
bcb0: 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73  y but not always
bcc0: 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61   -1) prior to ca
bcd0: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
bce0: 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70  ne..** Only if p
bcf0: 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66  Limit!=0 or pOff
bd00: 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69  set!=0 do the li
bd10: 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65  mit registers ge
bd20: 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20  t.** redefined. 
bd30: 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
bd40: 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69  perator uses thi
bd50: 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f  s property to fo
bd60: 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65  rce.** the reuse
bd70: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d   of the same lim
bd80: 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65  it and offset re
bd90: 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d  gisters across m
bda0: 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43  ultiple.** SELEC
bdb0: 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  T statements..*/
bdc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d  .static void com
bdd0: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
bde0: 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
bdf0: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
be00: 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65   iBreak){.  Vdbe
be10: 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *v = 0;.  int i
be20: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  Limit = 0;.  int
be30: 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20   iOffset;.  int 
be40: 61 64 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20  addr1, n;.  if( 
be50: 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75  p->iLimit ) retu
be60: 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  rn;..  /* .  ** 
be70: 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79  "LIMIT -1" alway
be80: 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73  s shows all rows
be90: 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65  .  There is some
bea0: 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73  .  ** contravers
beb0: 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65  y about what the
bec0: 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
bed0: 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a  r should be..  *
bee0: 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d  * The current im
bef0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74  plementation int
bf00: 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30  erprets "LIMIT 0
bf10: 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e  " to mean.  ** n
bf20: 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73  o rows..  */.  s
bf30: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
bf40: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
bf50: 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73  assert( p->pOffs
bf60: 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d  et==0 || p->pLim
bf70: 69 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  it!=0 );.  if( p
bf80: 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
bf90: 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d  p->iLimit = iLim
bfa0: 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  it = ++pParse->n
bfb0: 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c  Mem;.    v = sql
bfc0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
bfd0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  se);.    if( NEV
bfe0: 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
bff0: 6e 3b 20 20 2f 2a 20 56 44 42 45 20 73 68 6f 75  n;  /* VDBE shou
c000: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
c010: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a  been allocated *
c020: 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
c030: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
c040: 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b  ->pLimit, &n) ){
c050: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c060: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
c070: 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69  nteger, n, iLimi
c080: 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
c090: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
c0a0: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
c0b0: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
c0c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c0d0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
c0e0: 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b  oto, 0, iBreak);
c0f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
c100: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
c110: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
c120: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69  , p->pLimit, iLi
c130: 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  mit);.      sqli
c140: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
c150: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
c160: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64  Limit);.      Vd
c170: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
c180: 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
c190: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c1a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
c1b0: 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69  fZero, iLimit, i
c1c0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  Break);.    }.  
c1d0: 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74    if( p->pOffset
c1e0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66   ){.      p->iOf
c1f0: 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d  fset = iOffset =
c200: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
c210: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
c220: 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f  Mem++;   /* Allo
c230: 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72 65  cate an extra re
c240: 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74  gister for limit
c250: 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  +offset */.     
c260: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c270: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66  (pParse, p->pOff
c280: 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  set, iOffset);. 
c290: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c2a0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
c2b0: 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29  tBeInt, iOffset)
c2c0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
c2d0: 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20  ent((v, "OFFSET 
c2e0: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
c2f0: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
c300: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
c310: 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65 74  P_IfPos, iOffset
c320: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c330: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c340: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f 66  _Integer, 0, iOf
c350: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
c360: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
c370: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
c380: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c390: 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69  Op3(v, OP_Add, i
c3a0: 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c 20  Limit, iOffset, 
c3b0: 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20  iOffset+1);.    
c3c0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
c3d0: 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22  , "LIMIT+OFFSET"
c3e0: 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20  ));.      addr1 
c3f0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c400: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
c410: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
c420: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c430: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
c440: 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b   -1, iOffset+1);
c450: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c460: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
c470: 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  dr1);.    }.  }.
c480: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
c490: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
c4a0: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74  SELECT./*.** Ret
c4b0: 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
c4c0: 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ate collating se
c4d0: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69  quence for the i
c4e0: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
c4f0: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
c500: 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  et for the compo
c510: 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65  und-select state
c520: 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72  ment "p".  Retur
c530: 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65  n NULL if.** the
c540: 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64   column has no d
c550: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
c560: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a   sequence..**.**
c570: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
c580: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
c590: 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
c5a0: 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  is taken from th
c5b0: 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
c5c0: 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63  erm of the selec
c5d0: 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c  t that has a col
c5e0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
c5f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
c600: 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43  eq *multiSelectC
c610: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
c620: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
c630: 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f   int iCol){.  Co
c640: 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69  llSeq *pRet;.  i
c650: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
c660: 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69      pRet = multi
c670: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
c680: 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  arse, p->pPrior,
c690: 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b   iCol);.  }else{
c6a0: 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
c6b0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f   }.  assert( iCo
c6c0: 6c 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  l>=0 );.  if( pR
c6d0: 65 74 3d 3d 30 20 26 26 20 69 43 6f 6c 3c 70 2d  et==0 && iCol<p-
c6e0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
c6f0: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  {.    pRet = sql
c700: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
c710: 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
c720: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
c730: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
c740: 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pRet;.}.#endif /
c750: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
c760: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
c770: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
c780: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
c790: 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
c7a0: 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
c7b0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
c7c0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
c7d0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
c7e0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
c7f0: 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
c800: 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
c810: 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
c820: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
c830: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
c840: 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
c850: 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 23 69 66 6e  lts */.);...#ifn
c860: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c870: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
c880: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
c890: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
c8a0: 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75  process a compou
c8b0: 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72  nd query form fr
c8c0: 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72  om.** two or mor
c8d0: 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69  e separate queri
c8e0: 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20  es using UNION, 
c8f0: 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50  UNION ALL, EXCEP
c900: 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45  T, or.** INTERSE
c910: 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69  CT.**.** "p" poi
c920: 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74  nts to the right
c930: 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f  -most of the two
c940: 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71   queries.  the q
c950: 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c  uery on the.** l
c960: 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72  eft is p->pPrior
c970: 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72  .  The left quer
c980: 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20  y could also be 
c990: 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
c9a0: 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73  .** in which cas
c9b0: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
c9c0: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65  ill be called re
c9d0: 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a  cursively. .**.*
c9e0: 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  * The results of
c9f0: 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
ca00: 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74   are to be writt
ca10: 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e  en into a destin
ca20: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65  ation.** of type
ca30: 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61   eDest with para
ca40: 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a  meter iParm..**.
ca50: 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43  ** Example 1:  C
ca60: 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d  onsider a three-
ca70: 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c  way compound SQL
ca80: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
ca90: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
caa0: 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM t1 UNION SEL
cab0: 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e  ECT b FROM t2 UN
cac0: 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f  ION SELECT c FRO
cad0: 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  M t3.**.** This 
cae0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
caf0: 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77  sed up as follow
cb00: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
cb10: 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
cb20: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
cb30: 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  `----->  SELECT 
cb40: 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20  b FROM t2.**    
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb70: 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54  `------>  SELECT
cb80: 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a   a FROM t1.**.**
cb90: 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74   The arrows in t
cba0: 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65  he diagram above
cbb0: 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53   represent the S
cbc0: 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69  elect.pPrior poi
cbd0: 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74  nter..** So if t
cbe0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
cbf0: 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75  alled with p equ
cc00: 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65  al to the t3 que
cc10: 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69  ry, then.** pPri
cc20: 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74  or will be the t
cc30: 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20  2 query.  p->op 
cc40: 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e  will be TK_UNION
cc50: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
cc60: 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74  *.** Notice that
cc70: 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
cc80: 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65  way SQLite parse
cc90: 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  s compound SELEC
cca0: 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  Ts, the.** indiv
ccb0: 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c  idual selects al
ccc0: 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20  ways group from 
ccd0: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a  left to right..*
cce0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
ccf0: 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  tiSelect(.  Pars
cd00: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
cd10: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
cd20: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
cd30: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
cd40: 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
cd50: 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
cd60: 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
cd70: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
cd80: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
cd90: 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
cda0: 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
cdb0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
cdc0: 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f     /* Success co
cdd0: 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75  de from a subrou
cde0: 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tine */.  Select
cdf0: 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
ce00: 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
ce10: 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
ce20: 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
ce30: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
ce40: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
ce50: 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
ce60: 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  BE */.  SelectDe
ce70: 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a  st dest;      /*
ce80: 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74   Alternative dat
ce90: 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f  a destination */
cea0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65  .  Select *pDele
ceb0: 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69  te = 0;  /* Chai
cec0: 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65  n of simple sele
ced0: 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  cts to delete */
cee0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
cef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
cf00: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
cf10: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
cf20: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
cf30: 20 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20   int iSub1;     
cf40: 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
cf50: 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75   of left-hand qu
cf60: 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  ery */.  int iSu
cf70: 62 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b2;            /
cf80: 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68  * EQP id of righ
cf90: 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
cfa0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b  #endif..  /* Mak
cfb0: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
cfc0: 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  no ORDER BY or L
cfd0: 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70  IMIT clause on p
cfe0: 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f  rior SELECTs.  O
cff0: 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73  nly.  ** the las
d000: 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53  t (right-most) S
d010: 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72  ELECT in the ser
d020: 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20  ies may have an 
d030: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
d040: 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  T..  */.  assert
d050: 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  ( p && p->pPrior
d060: 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20   );  /* Calling 
d070: 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74  function guarant
d080: 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f  ees this much */
d090: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
d0a0: 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  db;.  pPrior = p
d0b0: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65  ->pPrior;.  asse
d0c0: 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67  rt( pPrior->pRig
d0d0: 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20 29  htmost!=pPrior )
d0e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
d0f0: 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d  or->pRightmost==
d100: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29 3b  p->pRightmost );
d110: 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74  .  dest = *pDest
d120: 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
d130: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
d140: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d150: 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59  pParse,"ORDER BY
d160: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
d170: 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
d180: 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
d190: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
d1a0: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
d1b0: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
d1c0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
d1d0: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
d1e0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
d1f0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
d200: 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73  rse,"LIMIT claus
d210: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
d220: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
d230: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
d240: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
d250: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
d260: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
d270: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20  t_end;.  }..  v 
d280: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
d290: 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
d2a0: 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20  rt( v!=0 );  /* 
d2b0: 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79  The VDBE already
d2c0: 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c   created by call
d2d0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
d2e0: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
d2f0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d   destination tem
d300: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20  porary table if 
d310: 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20  necessary.  */. 
d320: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
d330: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
d340: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
d350: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71  pEList );.    sq
d360: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d370: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
d380: 72 61 6c 2c 20 64 65 73 74 2e 69 50 61 72 6d 2c  ral, dest.iParm,
d390: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
d3a0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
d3b0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42  dbeChangeP5(v, B
d3c0: 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b  TREE_UNORDERED);
d3d0: 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20  .    dest.eDest 
d3e0: 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d  = SRT_Table;.  }
d3f0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
d400: 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20   all SELECTs in 
d410: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61  the statement ha
d420: 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
d430: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20  er of elements. 
d440: 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73   ** in their res
d450: 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20  ult sets..  */. 
d460: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
d470: 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45  st && pPrior->pE
d480: 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d  List );.  if( p-
d490: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
d4a0: 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e  pPrior->pEList->
d4b0: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
d4c0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
d4d0: 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f  rse, "SELECTs to
d4e0: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
d4f0: 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20  ght of %s".     
d500: 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74   " do not have t
d510: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
d520: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
d530: 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
d540: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
d550: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
d560: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
d570: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75    }..  /* Compou
d580: 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61 74 20  nd SELECTs that 
d590: 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
d5a0: 20 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64   clause are hand
d5b0: 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a  led separately..
d5c0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f    */.  if( p->pO
d5d0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65  rderBy ){.    re
d5e0: 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  turn multiSelect
d5f0: 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20  OrderBy(pParse, 
d600: 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a  p, pDest);.  }..
d610: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
d620: 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20  de for the left 
d630: 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54  and right SELECT
d640: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
d650: 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  /.  switch( p->o
d660: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
d670: 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _ALL: {.      in
d680: 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  t addr = 0;.    
d690: 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
d6a0: 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20  r->pLimit );.   
d6b0: 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69     pPrior->pLimi
d6c0: 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
d6d0: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66       pPrior->pOf
d6e0: 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
d6f0: 74 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  t;.      explain
d700: 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
d710: 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
d720: 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
d730: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
d740: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
d750: 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  r, &dest);.     
d760: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
d770: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
d780: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
d790: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
d7a0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
d7b0: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
d7c0: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
d7d0: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69  ;.      p->iLimi
d7e0: 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  t = pPrior->iLim
d7f0: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66  it;.      p->iOf
d800: 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  fset = pPrior->i
d810: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66  Offset;.      if
d820: 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
d830: 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
d840: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
d850: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
d860: 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >iLimit);.      
d870: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
d880: 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66  , "Jump ahead if
d890: 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22 29   LIMIT reached")
d8a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d8b0: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
d8c0: 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
d8d0: 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
d8e0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d8f0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
d900: 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
d910: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
d920: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
d930: 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
d940: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
d950: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
d960: 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64  or;.      if( ad
d970: 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dr ){.        sq
d980: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d990: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
d9a0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
d9b0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
d9c0: 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63  TK_EXCEPT:.    c
d9d0: 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a  ase TK_UNION: {.
d9e0: 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54        int unionT
d9f0: 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ab;    /* Cursor
da00: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74   number of the t
da10: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68  emporary table h
da20: 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f  olding result */
da30: 0a 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30  .      u8 op = 0
da40: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  ;       /* One o
da50: 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61  f the SRT_ opera
da60: 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74  tions to apply t
da70: 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20  o self */.      
da80: 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20  int priorOp;    
da90: 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65   /* The SRT_ ope
daa0: 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20  ration to apply 
dab0: 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73  to prior selects
dac0: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
dad0: 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74  pLimit, *pOffset
dae0: 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65  ; /* Saved value
daf0: 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61  s of p->nLimit a
db00: 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f  nd p->nOffset */
db10: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
db20: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
db30: 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20  t uniondest;..  
db40: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
db50: 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29  >op==TK_EXCEPT )
db60: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
db70: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
db80: 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72  N );.      prior
db90: 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a  Op = SRT_Union;.
dba0: 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
dbb0: 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26  Dest==priorOp &&
dbc0: 20 41 4c 57 41 59 53 28 21 70 2d 3e 70 4c 69 6d   ALWAYS(!p->pLim
dbd0: 69 74 20 26 26 21 70 2d 3e 70 4f 66 66 73 65 74  it &&!p->pOffset
dbe0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
dbf0: 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74  We can reuse a t
dc00: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67  emporary table g
dc10: 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45  enerated by a SE
dc20: 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20  LECT to our.    
dc30: 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20      ** right..  
dc40: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
dc50: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
dc60: 68 74 6d 6f 73 74 21 3d 70 20 29 3b 20 20 2f 2a  htmost!=p );  /*
dc70: 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   Can only happen
dc80: 20 66 6f 72 20 6c 65 66 74 77 61 72 64 20 65 6c   for leftward el
dc90: 65 6d 65 6e 74 73 0a 20 20 20 20 20 20 20 20 20  ements.         
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
dcc0: 66 20 61 20 33 2d 77 61 79 20 6f 72 20 6d 6f 72  f a 3-way or mor
dcd0: 65 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20  e compound */.  
dce0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
dcf0: 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20  >pLimit==0 );   
dd00: 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65     /* Not allowe
dd10: 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c  d on leftward el
dd20: 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  ements */.      
dd30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66    assert( p->pOf
dd40: 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f  fset==0 );     /
dd50: 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  * Not allowed on
dd60: 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e   leftward elemen
dd70: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e  ts */.        un
dd80: 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 50  ionTab = dest.iP
dd90: 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  arm;.      }else
dda0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
ddb0: 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65  will need to cre
ddc0: 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70  ate our own temp
ddd0: 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68  orary table to h
dde0: 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  old the.        
ddf0: 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
de00: 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20  results..       
de10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
de20: 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nTab = pParse->n
de30: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Tab++;.        a
de40: 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
de50: 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By==0 );.       
de60: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
de70: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
de80: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75  OpenEphemeral, u
de90: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
dea0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
deb0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
dec0: 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  == -1 );.       
ded0: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
dee0: 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [0] = addr;.    
def0: 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73      p->pRightmos
df00: 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  t->selFlags |= S
df10: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
df20: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
df30: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
df40: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
df50: 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20  Code the SELECT 
df60: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75  statements to ou
df70: 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a  r left.      */.
df80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
df90: 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
dfa0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
dfb0: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
dfc0: 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72  uniondest, prior
dfd0: 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20  Op, unionTab);. 
dfe0: 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
dff0: 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
e000: 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
e010: 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
e020: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
e030: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
e040: 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20  uniondest);.    
e050: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
e060: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
e070: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
e080: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
e090: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
e0a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
e0b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
e0c0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45  ( p->op==TK_EXCE
e0d0: 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70  PT ){.        op
e0e0: 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20   = SRT_Except;. 
e0f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e100: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
e110: 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
e120: 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f         op = SRT_
e130: 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  Union;.      }. 
e140: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
e150: 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
e160: 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
e170: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
e180: 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
e190: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
e1a0: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
e1b0: 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e  = 0;.      union
e1c0: 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b  dest.eDest = op;
e1d0: 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
e1e0: 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
e1f0: 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
e200: 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
e210: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
e220: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69  (pParse, p, &uni
e230: 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  ondest);.      t
e240: 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
e250: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
e260: 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e  /* Query flatten
e270: 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65  ing in sqlite3Se
e280: 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66  lect() might ref
e290: 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e  ill p->pOrderBy.
e2a0: 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72  .      ** Be sur
e2b0: 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70  e to delete p->p
e2c0: 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f  OrderBy, therefo
e2d0: 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  re, to avoid a m
e2e0: 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20  emory leak. */. 
e2f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e300: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
e310: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
e320: 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
e330: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
e340: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
e350: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
e360: 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  rBy = 0;.      s
e370: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
e380: 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
e390: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
e3a0: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
e3b0: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
e3c0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
e3d0: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
e3e0: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
e3f0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ;..      /* Conv
e400: 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20  ert the data in 
e410: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
e420: 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ble into whateve
e430: 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  r form.      ** 
e440: 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75  it is that we cu
e450: 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20  rrently need..  
e460: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
e470: 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64  ert( unionTab==d
e480: 65 73 74 2e 69 50 61 72 6d 20 7c 7c 20 64 65 73  est.iParm || des
e490: 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
e4a0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65   );.      if( de
e4b0: 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
e4c0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  p ){.        int
e4d0: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
e4e0: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20  iStart;.        
e4f0: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
e500: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t );.        if(
e510: 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
e520: 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
e530: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
e540: 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
e550: 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
e560: 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
e570: 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
e580: 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65  or;.          ge
e590: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
e5a0: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
e5b0: 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
e5c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e5d0: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
e5e0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
e5f0: 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20  ;.        iCont 
e600: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
e610: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
e620: 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
e630: 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
e640: 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
e650: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e660: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
e670: 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
e680: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
e690: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
e6a0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
e6b0: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65  v);.        sele
e6c0: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
e6d0: 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
e6e0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70  , unionTab, p->p
e6f0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 20 20 20 20 20 20 30 2c 20 2d 31 2c 20 26 64 65        0, -1, &de
e720: 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
e730: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
e740: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
e750: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
e760: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e770: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
e780: 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ext, unionTab, i
e790: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20  Start);.        
e7a0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
e7b0: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
e7c0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
e7d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e7e0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e   OP_Close, union
e7f0: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Tab, 0);.      }
e800: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e810: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
e820: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
e830: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20  TK_INTERSECT ); 
e840: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31  {.      int tab1
e850: 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e  , tab2;.      in
e860: 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
e870: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45   iStart;.      E
e880: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
e890: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74  ffset;.      int
e8a0: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
e8b0: 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63  ectDest intersec
e8c0: 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  tdest;.      int
e8d0: 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49   r1;..      /* I
e8e0: 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
e8f0: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
e900: 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
e910: 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
e920: 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
e930: 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
e940: 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
e950: 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
e960: 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
e970: 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
e980: 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
e990: 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20  */.      tab1 = 
e9a0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
e9b0: 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
e9c0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
e9d0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
e9e0: 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20  rderBy==0 );..  
e9f0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
ea00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ea10: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
ea20: 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
ea30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
ea40: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
ea50: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
ea60: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
ea70: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
ea80: 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46  pRightmost->selF
ea90: 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
eaa0: 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
eab0: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
eac0: 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  t );..      /* C
ead0: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
eae0: 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
eaf0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
eb00: 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
eb10: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  /.      sqlite3S
eb20: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69  electDestInit(&i
eb30: 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52  ntersectdest, SR
eb40: 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a  T_Union, tab1);.
eb50: 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
eb60: 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
eb70: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
eb80: 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
eb90: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
eba0: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
ebb0: 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
ebc0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
ebd0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
ebe0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
ebf0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
ec00: 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
ec10: 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
ec20: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
ec30: 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
ec40: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
ec50: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ec60: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
ec70: 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  l, tab2, 0);.   
ec80: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
ec90: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d  drOpenEphm[1] ==
eca0: 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
ecb0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
ecc0: 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d  = addr;.      p-
ecd0: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
ece0: 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
ecf0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
ed00: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
ed10: 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
ed20: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
ed30: 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
ed40: 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73      intersectdes
ed50: 74 2e 69 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a  t.iParm = tab2;.
ed60: 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
ed70: 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
ed80: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
ed90: 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
eda0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
edb0: 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65  pParse, p, &inte
edc0: 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20  rsectdest);.    
edd0: 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
ede0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
edf0: 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
ee00: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
ee10: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
ee20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
ee30: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
ee40: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
ee50: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
ee60: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
ee70: 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
ee80: 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
ee90: 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20  te code to take 
eea0: 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e  the intersection
eeb0: 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70   of the two temp
eec0: 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74  orary.      ** t
eed0: 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  ables..      */.
eee0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
eef0: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
ef00: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
ef10: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
ef20: 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
ef30: 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  First = p;.     
ef40: 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
ef50: 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
ef60: 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
ef70: 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65  or;.        gene
ef80: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
ef90: 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73  pParse, 0, pFirs
efa0: 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  t->pEList);.    
efb0: 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b    }.      iBreak
efc0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
efd0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
efe0: 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
eff0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
f000: 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65  );.      compute
f010: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
f020: 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b  Parse, p, iBreak
f030: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f040: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f050: 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
f060: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 72 31  Break);.      r1
f070: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
f080: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
f090: 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
f0a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f0b0: 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62  , OP_RowKey, tab
f0c0: 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  1, r1);.      sq
f0d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
f0e0: 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  nt(v, OP_NotFoun
f0f0: 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20  d, tab2, iCont, 
f100: 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  r1, 0);.      sq
f110: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
f120: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
f130: 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
f140: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
f150: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62  , p->pEList, tab
f160: 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  1, p->pEList->nE
f170: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
f180: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 2d 31             0, -1
f190: 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20  , &dest, iCont, 
f1a0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
f1b0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
f1c0: 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
f1d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f1e0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f1f0: 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61  Next, tab1, iSta
f200: 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
f210: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
f220: 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
f230: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f240: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
f250: 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
f260: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f270: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
f280: 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  e, tab1, 0);.   
f290: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f2a0: 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f    }..  explainCo
f2b0: 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20  mposite(pParse, 
f2c0: 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53  p->op, iSub1, iS
f2d0: 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41  ub2, p->op!=TK_A
f2e0: 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  LL);..  /* Compu
f2f0: 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
f300: 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a  uences used by .
f310: 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74    ** temporary t
f320: 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20  ables needed to 
f330: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
f340: 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
f350: 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b   ** Attach the K
f360: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
f370: 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72   to all temporar
f380: 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  y tables..  **. 
f390: 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   ** This section
f3a0: 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72   is run by the r
f3b0: 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  ight-most SELECT
f3c0: 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e   statement only.
f3d0: 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  .  ** SELECT sta
f3e0: 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c  tements to the l
f3f0: 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20  eft always skip 
f400: 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20  this part.  The 
f410: 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20  right-most.  ** 
f420: 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73  SELECT might als
f430: 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  o skip this part
f440: 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52   if it has no OR
f450: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
f460: 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74  d.  ** no temp t
f470: 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72  ables are requir
f480: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
f490: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
f4a0: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b  UsesEphemeral ){
f4b0: 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4d0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
f4e0: 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  er */.    KeyInf
f4f0: 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20  o *pKeyInfo;    
f500: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
f510: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
f520: 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
f530: 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   */.    Select *
f540: 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
f550: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
f560: 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c  ping through SEL
f570: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  ECT statements *
f580: 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a  /.    CollSeq **
f590: 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  apColl;         
f5a0: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
f5b0: 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49  ng through pKeyI
f5c0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a  nfo->aColl[] */.
f5d0: 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20      int nCol;   
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
f600: 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74  olumns in result
f610: 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73   set */..    ass
f620: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f  ert( p->pRightmo
f630: 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 43 6f  st==p );.    nCo
f640: 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
f650: 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e  Expr;.    pKeyIn
f660: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
f670: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20  llocZero(db,.   
f680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f690: 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79      sizeof(*pKey
f6a0: 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 28 73 69 7a 65  Info)+nCol*(size
f6b0: 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 31  of(CollSeq*) + 1
f6c0: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65  ));.    if( !pKe
f6d0: 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72  yInfo ){.      r
f6e0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
f6f0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c  ;.      goto mul
f700: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
f710: 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e     }..    pKeyIn
f720: 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62  fo->enc = ENC(db
f730: 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d  );.    pKeyInfo-
f740: 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e  >nField = (u16)n
f750: 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  Col;..    for(i=
f760: 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e  0, apColl=pKeyIn
f770: 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f  fo->aColl; i<nCo
f780: 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b  l; i++, apColl++
f790: 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  ){.      *apColl
f7a0: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
f7b0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
f7c0: 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30   i);.      if( 0
f7d0: 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  ==*apColl ){.   
f7e0: 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64       *apColl = d
f7f0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
f800: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
f810: 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
f820: 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
f830: 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
f840: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
f850: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
f860: 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61   addr = pLoop->a
f870: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a  ddrOpenEphm[i];.
f880: 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72          if( addr
f890: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
f8a0: 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75  /* If [0] is unu
f8b0: 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20  sed then [1] is 
f8c0: 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f  also unused.  So
f8d0: 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20   we can.        
f8e0: 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65    ** always safe
f8f0: 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e  ly abort as soon
f900: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e   as the first un
f910: 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75  used slot is fou
f920: 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
f930: 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61  assert( pLoop->a
f940: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30  ddrOpenEphm[1]<0
f950: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   );.          br
f960: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
f970: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f980: 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
f990: 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  dr, nCol);.     
f9a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
f9b0: 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20  angeP4(v, addr, 
f9c0: 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
f9d0: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
f9e0: 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64        pLoop->add
f9f0: 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d  rOpenEphm[i] = -
fa00: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
fa10: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
fa20: 65 65 28 64 62 2c 20 70 4b 65 79 49 6e 66 6f 29  ee(db, pKeyInfo)
fa30: 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c  ;.  }..multi_sel
fa40: 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74  ect_end:.  pDest
fa50: 2d 3e 69 4d 65 6d 20 3d 20 64 65 73 74 2e 69 4d  ->iMem = dest.iM
fa60: 65 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 4d 65  em;.  pDest->nMe
fa70: 6d 20 3d 20 64 65 73 74 2e 6e 4d 65 6d 3b 0a 20  m = dest.nMem;. 
fa80: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
fa90: 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65  lete(db, pDelete
faa0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
fab0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
fac0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
fad0: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a  _SELECT */../*.*
fae0: 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74  * Code an output
faf0: 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   subroutine for 
fb00: 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c  a coroutine impl
fb10: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a  ementation of a.
fb20: 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65  ** SELECT statme
fb30: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61  nt..**.** The da
fb40: 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20  ta to be output 
fb50: 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
fb60: 70 49 6e 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 72  pIn->iMem.  Ther
fb70: 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 4d  e are.** pIn->nM
fb80: 65 6d 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  em columns to be
fb90: 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74 20   output.  pDest 
fba0: 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75 74  is where the out
fbb0: 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  put should.** be
fbc0: 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67   sent..**.** reg
fbd0: 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75  Return is the nu
fbe0: 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67 69  mber of the regi
fbf0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65  ster holding the
fc00: 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72   subroutine.** r
fc10: 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a  eturn address..*
fc20: 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e  *.** If regPrev>
fc30: 30 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  0 then it is the
fc40: 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
fc50: 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61 74  in a vector that
fc60: 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20  .** records the 
fc70: 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e  previous output.
fc80: 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69    mem[regPrev] i
fc90: 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 73  s a flag that is
fca0: 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65   false.** if the
fcb0: 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70  re has been no p
fcc0: 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20  revious output. 
fcd0: 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68   If regPrev>0 th
fce0: 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65  en code is.** ge
fcf0: 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70 70 72  nerated to suppr
fd00: 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20  ess duplicates. 
fd10: 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65   pKeyInfo is use
fd20: 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a  d for comparing.
fd30: 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49  ** keys..**.** I
fd40: 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e  f the LIMIT foun
fd50: 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69  d in p->iLimit i
fd60: 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20  s reached, jump 
fd70: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a  immediately to.*
fd80: 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61  * iBreak..*/.sta
fd90: 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65  tic int generate
fda0: 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
fdb0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
fdc0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
fdd0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
fde0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
fdf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
fe00: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
fe10: 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ent */.  SelectD
fe20: 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20  est *pIn,       
fe30: 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75   /* Coroutine su
fe40: 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a  pplying data */.
fe50: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
fe60: 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65  est,      /* Whe
fe70: 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64  re to send the d
fe80: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ata */.  int reg
fe90: 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20  Return,         
fea0: 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61   /* The return a
feb0: 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
fec0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76  */.  int regPrev
fed0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
fee0: 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20  Previous result 
fef0: 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e  register.  No un
ff00: 69 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f  iqueness if 0 */
ff10: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
ff20: 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f  Info,      /* Fo
ff30: 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68  r comparing with
ff40: 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
ff50: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 2c  */.  int p4type,
ff60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ff70: 54 68 65 20 70 34 20 74 79 70 65 20 66 6f 72 20  The p4 type for 
ff80: 70 4b 65 79 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e  pKeyInfo */.  in
ff90: 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
ffa0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
ffb0: 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68 65  re if we hit the
ffc0: 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56   LIMIT */.){.  V
ffd0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
ffe0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43  >pVdbe;.  int iC
fff0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61  ontinue;.  int a
10000 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73  ddr;..  addr = s
10010 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
10020 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e  tAddr(v);.  iCon
10030 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
10040 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
10050 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
10060 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55  duplicates for U
10070 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
10080 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a  d INTERSECT .  *
10090 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20  /.  if( regPrev 
100a0 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a  ){.    int j1, j
100b0 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  2;.    j1 = sqli
100c0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
100d0 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72   OP_IfNot, regPr
100e0 65 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71  ev);.    j2 = sq
100f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
10100 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70  v, OP_Compare, p
10110 49 6e 2d 3e 69 4d 65 6d 2c 20 72 65 67 50 72 65  In->iMem, regPre
10120 76 2b 31 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 0a  v+1, pIn->nMem,.
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
10150 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 70  har*)pKeyInfo, p
10160 34 74 79 70 65 29 3b 0a 20 20 20 20 73 71 6c 69  4type);.    sqli
10170 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10180 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20   OP_Jump, j2+2, 
10190 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b 32 29  iContinue, j2+2)
101a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
101b0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
101c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
101d0 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65  rCodeCopy(pParse
101e0 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 72 65 67  , pIn->iMem, reg
101f0 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 4d 65  Prev+1, pIn->nMe
10200 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  m);.    sqlite3V
10210 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10220 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50  Integer, 1, regP
10230 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rev);.  }.  if( 
10240 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
10250 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
10260 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72  n 0;..  /* Suppr
10270 65 73 73 20 74 68 65 20 74 68 65 20 66 69 72 73  ess the the firs
10280 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73  t OFFSET entries
10290 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
102a0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20  OFFSET clause.  
102b0 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28  */.  codeOffset(
102c0 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29  v, p, iContinue)
102d0 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 44 65  ;..  switch( pDe
102e0 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20  st->eDest ){.   
102f0 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
10300 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
10310 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
10320 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
10330 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
10340 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
10350 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  b: {.      int r
10360 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
10370 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
10380 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
10390 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
103a0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74  pParse);.      t
103b0 65 73 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e  estcase( pDest->
103c0 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65  eDest==SRT_Table
103d0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
103e0 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  se( pDest->eDest
103f0 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
10400 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10410 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
10420 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d  MakeRecord, pIn-
10430 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d  >iMem, pIn->nMem
10440 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
10450 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10460 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70  , OP_NewRowid, p
10470 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72 32 29  Dest->iParm, r2)
10480 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10490 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
104a0 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69  Insert, pDest->i
104b0 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20  Parm, r1, r2);. 
104c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
104d0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
104e0 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
104f0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
10500 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
10510 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
10520 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
10530 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
10540 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10550 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10560 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
10570 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
10580 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66  creating a set f
10590 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28  or an "expr IN (
105a0 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e  SELECT ...)" con
105b0 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74  struct,.    ** t
105c0 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64  hen there should
105d0 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65   be a single ite
105e0 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  m on the stack. 
105f0 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20   Write this.    
10600 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65  ** item into the
10610 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20   set table with 
10620 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20  bogus data..    
10630 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
10640 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Set: {.      int
10650 20 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72   r1;.      asser
10660 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20  t( pIn->nMem==1 
10670 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69  );.      p->affi
10680 6e 69 74 79 20 3d 20 0a 20 20 20 20 20 20 20 20  nity = .        
10690 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
106a0 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73  ffinity(p->pELis
106b0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70  t->a[0].pExpr, p
106c0 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b  Dest->affinity);
106d0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
106e0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
106f0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
10700 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
10710 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
10720 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 2c 20 72   pIn->iMem, 1, r
10730 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c  1, &p->affinity,
10740 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
10750 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
10760 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
10770 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 29 3b  , pIn->iMem, 1);
10780 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10790 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
107a0 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  dxInsert, pDest-
107b0 3e 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20  >iParm, r1);.   
107c0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
107d0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
107e0 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
107f0 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 20  k;.    }..#if 0 
10800 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63 75 72 73   /* Never occurs
10810 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   on an ORDER BY 
10820 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20  query */.    /* 
10830 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74  If any row exist
10840 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
10850 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20  et, record that 
10860 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a  fact and abort..
10870 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
10880 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20  SRT_Exists: {.  
10890 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
108a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
108b0 67 65 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69  ger, 1, pDest->i
108c0 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Parm);.      /* 
108d0 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
108e0 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
108f0 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
10900 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
10910 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
10920 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
10930 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
10940 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
10950 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
10960 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
10970 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
10980 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
10990 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
109a0 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
109b0 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
109c0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
109d0 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
109e0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
109f0 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20 20  >nMem==1 );.    
10a00 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
10a10 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
10a20 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e  n->iMem, pDest->
10a30 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  iParm, 1);.     
10a40 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
10a50 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f  ause will jump o
10a60 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66  ut of the loop f
10a70 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
10a80 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
10a90 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
10aa0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
10ab0 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68  RY */..    /* Th
10ac0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  e results are st
10ad0 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e  ored in a sequen
10ae0 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a  ce of registers.
10af0 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
10b00 61 74 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2e 20  at pDest->iMem. 
10b10 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75   Then the co-rou
10b20 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20  tine yields..   
10b30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
10b40 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20  _Coroutine: {.  
10b50 20 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69      if( pDest->i
10b60 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Mem==0 ){.      
10b70 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20    pDest->iMem = 
10b80 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
10b90 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
10ba0 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  >nMem);.        
10bb0 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 70 49  pDest->nMem = pI
10bc0 6e 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d  n->nMem;.      }
10bd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10be0 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
10bf0 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44  e, pIn->iMem, pD
10c00 65 73 74 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74  est->iMem, pDest
10c10 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73  ->nMem);.      s
10c20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
10c30 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44  (v, OP_Yield, pD
10c40 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20  est->iParm);.   
10c50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10c60 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20  .    /* If none 
10c70 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68  of the above, th
10c80 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64 65  en the result de
10c90 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62  stination must b
10ca0 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74  e.    ** SRT_Out
10cb0 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  put.  This routi
10cc0 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
10cd0 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65  ed with any othe
10ce0 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61  r.    ** destina
10cf0 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  tion other than 
10d00 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64  the ones handled
10d10 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75   above or SRT_Ou
10d20 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  tput..    **.   
10d30 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70   ** For SRT_Outp
10d40 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20  ut, results are 
10d50 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
10d60 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
10d70 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e  s.  .    ** Then
10d80 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f   the OP_ResultRo
10d90 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64  w opcode is used
10da0 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65   to cause sqlite
10db0 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20  3_step() to.    
10dc0 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65  ** return the ne
10dd0 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  xt row of result
10de0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
10df0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
10e00 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65  sert( pDest->eDe
10e10 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
10e20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10e30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10e40 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e  ResultRow, pIn->
10e50 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29  iMem, pIn->nMem)
10e60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
10e70 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
10e80 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
10e90 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e  In->iMem, pIn->n
10ea0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Mem);.      brea
10eb0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
10ec0 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
10ed0 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
10ee0 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
10ef0 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  eached..  */.  i
10f00 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
10f10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10f20 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp3(v, OP_IfZe
10f30 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69  ro, p->iLimit, i
10f40 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d 0a  Break, -1);.  }.
10f50 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
10f60 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
10f70 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  turn.  */.  sqli
10f80 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
10f90 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65  bel(v, iContinue
10fa0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
10fb0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
10fc0 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b  urn, regReturn);
10fd0 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ..  return addr;
10fe0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e  .}../*.** Altern
10ff0 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73  ative compound s
11000 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72  elect code gener
11010 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77  ator for cases w
11020 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20  hen there.** is 
11030 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
11040 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73  se..**.** We ass
11050 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20 74  ume a query of t
11060 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
11070 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73  m:.**.**      <s
11080 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74  electA>  <operat
11090 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20  or>  <selectB>  
110a0 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62  ORDER BY <orderb
110b0 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70  ylist>.**.** <op
110c0 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f  erator> is one o
110d0 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49  f UNION ALL, UNI
110e0 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
110f0 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65 20 69  NTERSECT.  The i
11100 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64  dea.** is to cod
11110 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e  e both <selectA>
11120 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77   and <selectB> w
11130 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ith the ORDER BY
11140 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f   clause as.** co
11150 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e  -routines.  Then
11160 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74   run the co-rout
11170 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c  ines in parallel
11180 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72   and merge the r
11190 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74  esults.** into t
111a0 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61  he output.  In a
111b0 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74  ddition to the t
111c0 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63  wo coroutines (c
111d0 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e  alled selectA an
111e0 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68  d.** selectB) th
111f0 65 72 65 20 61 72 65 20 37 20 73 75 62 72 6f 75  ere are 7 subrou
11200 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tines:.**.**    
11210 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68  outA:    Move th
11220 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
11230 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e  selectA coroutin
11240 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
11250 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
11260 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
11270 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20   query..**.**   
11280 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74   outB:    Move t
11290 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
112a0 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69   selectB corouti
112b0 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ne into the outp
112c0 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
112d0 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e    of the compoun
112e0 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20  d query.  (Only 
112f0 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e  generated for UN
11300 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ION and.**      
11310 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
11320 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e  .  EXCEPT and IN
11330 53 45 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f  SERTSECT never o
11340 75 74 70 75 74 20 61 20 72 6f 77 20 74 68 61 74  utput a row that
11350 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11360 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20  appears only in 
11370 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74  B.).**.**    Alt
11380 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
11390 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
113a0 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
113b0 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a  ines and A<B..**
113c0 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20  .**    AeqB:    
113d0 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
113e0 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
113f0 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
11400 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20  nd A==B..**.**  
11410 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65    AgtB:    Calle
11420 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
11430 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
11440 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e  oroutines and A>
11450 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41  B..**.**    EofA
11460 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
11470 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
11480 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e  ed from selectA.
11490 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20  .**.**    EofB: 
114a0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64     Called when d
114b0 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
114c0 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a   from selectB..*
114d0 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
114e0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  ntation of the l
114f0 61 74 74 65 72 20 66 69 76 65 20 73 75 62 72 6f  atter five subro
11500 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e  utines depend on
11510 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72   which .** <oper
11520 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a  ator> is used:.*
11530 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  *.**.**         
11540 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20      UNION ALL   
11550 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20        UNION     
11560 20 20 20 20 20 20 20 45 58 43 45 50 54 20 20 20         EXCEPT   
11570 20 20 20 20 20 20 20 49 4e 54 45 52 53 45 43 54         INTERSECT
11580 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d  .**          ---
11590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
115a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
115b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
115c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
115d0 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75  .**   AltB:   ou
115e0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f  tA, nextA      o
115f0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
11600 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
11610 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a       nextA.**.**
11620 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c     AeqB:   outA,
11630 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e   nextA         n
11640 65 78 74 41 20 20 20 20 20 20 20 20 20 20 20 20  extA            
11650 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6f   nextA         o
11660 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a  utA, nextA.**.**
11670 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c     AgtB:   outB,
11680 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
11690 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
116a0 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
116b0 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20    nextB.**.**   
116c0 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65  EofA:   outB, ne
116d0 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e  xtB      outB, n
116e0 65 78 74 42 20 20 20 20 20 20 20 20 20 20 68 61  extB          ha
116f0 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 68  lt             h
11700 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42  alt.**.**   EofB
11710 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
11720 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
11730 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
11740 74 41 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a  tA         halt.
11750 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74  **.** In the Alt
11760 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74  B, AeqB, and Agt
11770 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61  B subroutines, a
11780 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f  n EOF on A follo
11790 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61  wing nextA.** ca
117a0 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  uses an immediat
117b0 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61  e jump to EofA a
117c0 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66  nd an EOF on B f
117d0 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63  ollowing nextB c
117e0 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65  auses.** an imme
117f0 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
11800 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41  fB.  Within EofA
11810 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45   and EofB, and E
11820 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a  OF on entry or.*
11830 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  * following next
11840 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20  X causes a jump 
11850 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
11860 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73  e select process
11870 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69  ing..**.** Dupli
11880 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20  cate removal in 
11890 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  the UNION, EXCEP
118a0 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
118b0 20 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65   cases is handle
118c0 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  d.** within the 
118d0 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
118e0 65 2e 20 20 54 68 65 20 72 65 67 50 72 65 76 20  e.  The regPrev 
118f0 72 65 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c  register set hol
11900 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  ds the previousl
11910 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75  y.** output valu
11920 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e  e.  A comparison
11930 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74   is made against
11940 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20   this value and 
11950 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73  the output.** is
11960 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
11970 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75  next results wou
11980 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ld be the same a
11990 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a  s the previous..
119a0 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  **.** The implem
119b0 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73  entation plan is
119c0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
119d0 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
119e0 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75   and seven.** su
119f0 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c  broutines first,
11a00 20 74 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f   then put the co
11a10 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74  ntrol logic at t
11a20 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65  he bottom.  Like
11a30 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
11a40 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a        goto Init.
11a50 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f  **     coA: coro
11a60 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71  utine for left q
11a70 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20  uery (A).**     
11a80 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66  coB: coroutine f
11a90 6f 72 20 72 69 67 68 74 20 71 75 65 72 79 20 28  or right query (
11aa0 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f  B).**    outA: o
11ab0 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
11ac0 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f   A.**    outB: o
11ad0 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
11ae0 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e   B (UNION and UN
11af0 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a  ION ALL only).**
11b00 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a      EofA: ....**
11b10 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a      EofB: ....**
11b20 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a      AltB: ....**
11b30 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a      AeqB: ....**
11b40 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a      AgtB: ....**
11b50 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61      Init: initia
11b60 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72  lize coroutine r
11b70 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20  egisters.**     
11b80 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a       yield coA.*
11b90 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f  *          if eo
11ba0 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a  f(A) goto EofA.*
11bb0 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64  *          yield
11bc0 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20   coB.**         
11bd0 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20   if eof(B) goto 
11be0 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a  EofB.**    Cmpr:
11bf0 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a   Compare A, B.**
11c00 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41            Jump A
11c10 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a  ltB, AeqB, AgtB.
11c20 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a  **     End: ....
11c30 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c  **.** We call Al
11c40 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20  tB, AeqB, AgtB, 
11c50 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22  EofA, and EofB "
11c60 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74  subroutines" but
11c70 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a   they are not.**
11c80 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64   actually called
11c90 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64   using Gosub and
11ca0 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74   they do not Ret
11cb0 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45  urn.  EofA and E
11cc0 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69  ofB loop.** unti
11cd0 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78  l all data is ex
11ce0 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d  hausted then jum
11cf0 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c  p to the "end" l
11d00 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42  abe.  AltB, AeqB
11d10 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75  ,.** and AgtB ju
11d20 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20  mp to either L2 
11d30 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66  or to one of Eof
11d40 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69  A or EofB..*/.#i
11d50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11d60 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
11d70 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  T.static int mul
11d80 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
11d90 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11da0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
11db0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
11dc0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
11dd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
11de0 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
11df0 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
11e00 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
11e10 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
11e20 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
11e30 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
11e40 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
11e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
11e60 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
11e70 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
11e80 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
11e90 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74   SELECT immediat
11ea0 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  ely to our left 
11eb0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
11ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
11ed0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
11ee0 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65  his VDBE */.  Se
11ef0 6c 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20  lectDest destA; 
11f00 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
11f10 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
11f20 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65   A */.  SelectDe
11f30 73 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a  st destB;     /*
11f40 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
11f50 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a   coroutine B */.
11f60 20 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20    int regAddrA; 
11f70 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
11f80 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
11f90 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69  select-A corouti
11fa0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45  ne */.  int regE
11fb0 6f 66 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ofA;          /*
11fc0 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74   Flag to indicat
11fd0 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 41 20  e when select-A 
11fe0 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20  is complete */. 
11ff0 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20   int regAddrB;  
12000 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
12010 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  s register for s
12020 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e  elect-B coroutin
12030 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f  e */.  int regEo
12040 66 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fB;          /* 
12050 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65  Flag to indicate
12060 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 42 20 69   when select-B i
12070 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20  s complete */.  
12080 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b  int addrSelectA;
12090 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
120a0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41   of the select-A
120b0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
120c0 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b  int addrSelectB;
120d0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
120e0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
120f0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
12100 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20  int regOutA;    
12110 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
12120 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
12130 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
12140 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
12150 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20  egOutB;         
12160 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
12170 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74  ster for the out
12180 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
12190 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75   */.  int addrOu
121a0 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tA;         /* A
121b0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75  ddress of the ou
121c0 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
121d0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
121e0 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  utB = 0;     /* 
121f0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
12200 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
12210 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
12220 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofA;         /*
12230 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
12240 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74  select-A-exhaust
12250 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
12260 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b  .  int addrEofB;
12270 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
12280 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
12290 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-B-exhausted su
122a0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
122b0 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20  t addrAltB;     
122c0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
122d0 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75  f the A<B subrou
122e0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
122f0 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20 20  drAeqB;         
12300 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
12310 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e  e A==B subroutin
12320 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
12330 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  gtB;         /* 
12340 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
12350 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  >B subroutine */
12360 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41  .  int regLimitA
12370 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
12380 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
12390 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
123a0 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20   regLimitB;     
123b0 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
123c0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
123d0 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  A */.  int regPr
123e0 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev;          /* 
123f0 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  A range of regis
12400 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65  ters to hold pre
12410 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a  vious output */.
12420 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74    int savedLimit
12430 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
12440 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69   value of p->iLi
12450 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  mit */.  int sav
12460 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  edOffset;      /
12470 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
12480 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20   p->iOffset */. 
12490 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20   int labelCmpr; 
124a0 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
124b0 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
124c0 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72   the merge algor
124d0 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  ithm */.  int la
124e0 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20  belEnd;         
124f0 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
12500 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   end of the over
12510 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20  all SELECT stmt 
12520 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20 20  */.  int j1;    
12530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
12540 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  mp instructions 
12550 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65  that get retarge
12560 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tted */.  int op
12570 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12580 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c  /* One of TK_ALL
12590 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  , TK_UNION, TK_E
125a0 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53  XCEPT, TK_INTERS
125b0 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ECT */.  KeyInfo
125c0 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f   *pKeyDup = 0; /
125d0 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
125e0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  ormation for dup
125f0 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a  licate removal *
12600 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
12610 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d  yMerge;   /* Com
12620 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
12630 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20  ion for merging 
12640 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rows */.  sqlite
12650 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
12660 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
12670 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
12680 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
12690 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
126a0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
126b0 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
126c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
126d0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
126e0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
126f0 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65  .  int *aPermute
12700 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70  ;        /* Mapp
12710 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42  ing from ORDER B
12720 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c  Y terms to resul
12730 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  t set columns */
12740 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12750 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
12760 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20 20 20  nt iSub1;       
12770 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
12780 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72  f left-hand quer
12790 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  y */.  int iSub2
127a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
127b0 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d  EQP id of right-
127c0 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65  hand query */.#e
127d0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
127e0 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29  p->pOrderBy!=0 )
127f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
12800 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61  Dup==0 ); /* "Ma
12810 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64  naged" code need
12820 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20  s this.  Ticket 
12830 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d  #3382. */.  db =
12840 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76   pParse->db;.  v
12850 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
12860 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
12870 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 72   );       /* Alr
12880 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65 20  eady thrown the 
12890 65 72 72 6f 72 20 69 66 20 56 44 42 45 20 61 6c  error if VDBE al
128a0 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  loc failed */.  
128b0 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74  labelEnd = sqlit
128c0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
128d0 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20  v);.  labelCmpr 
128e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
128f0 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f  eLabel(v);...  /
12900 2a 20 50 61 74 63 68 20 75 70 20 74 68 65 20 4f  * Patch up the O
12910 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
12920 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70   */.  op = p->op
12930 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  ;  .  pPrior = p
12940 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65  ->pPrior;.  asse
12950 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  rt( pPrior->pOrd
12960 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72  erBy==0 );.  pOr
12970 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
12980 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rBy;.  assert( p
12990 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72  OrderBy );.  nOr
129a0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
129b0 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46  ->nExpr;..  /* F
129c0 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74 68  or operators oth
129d0 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c  er than UNION AL
129e0 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b  L we have to mak
129f0 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a  e sure that.  **
12a00 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
12a10 61 75 73 65 20 63 6f 76 65 72 73 20 65 76 65 72  ause covers ever
12a20 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65  y term of the re
12a30 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a 20  sult set.  Add. 
12a40 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68 65   ** terms to the
12a50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
12a60 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
12a70 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b   */.  if( op!=TK
12a80 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28  _ALL ){.    for(
12a90 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  i=1; db->mallocF
12aa0 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70  ailed==0 && i<=p
12ab0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
12ac0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
12ad0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
12ae0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
12af0 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
12b00 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f  OrderBy->a; j<nO
12b10 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74  rderBy; j++, pIt
12b20 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  em++){.        a
12b30 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69 43  ssert( pItem->iC
12b40 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ol>0 );.        
12b50 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3d  if( pItem->iCol=
12b60 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =i ) break;.    
12b70 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d    }.      if( j=
12b80 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  =nOrderBy ){.   
12b90 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
12ba0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
12bb0 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29  , TK_INTEGER, 0)
12bc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
12bd0 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
12be0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
12bf0 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
12c00 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
12c10 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
12c20 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20  .iValue = i;.   
12c30 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
12c40 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
12c50 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f  ppend(pParse, pO
12c60 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20  rderBy, pNew);. 
12c70 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
12c80 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 69  >a[nOrderBy++].i
12c90 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  Col = (u16)i;.  
12ca0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
12cb0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
12cc0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72  e comparison per
12cd0 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79  mutation and key
12ce0 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65  info that is use
12cf0 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
12d00 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64  permutation used
12d10 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
12d20 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72   the next.  ** r
12d30 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f  ow of results co
12d40 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  mes from selectA
12d50 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c   or selectB.  Al
12d60 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a  so add explicit.
12d70 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20    ** collations 
12d80 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
12d90 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20  clause terms so 
12da0 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75  that when the su
12db0 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f  bqueries.  ** to
12dc0 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74   the right and t
12dd0 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c  he left are eval
12de0 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20  uated, they use 
12df0 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a  the correct.  **
12e00 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f   collation..  */
12e10 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71  .  aPermute = sq
12e20 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
12e30 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  (db, sizeof(int)
12e40 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66  *nOrderBy);.  if
12e50 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20  ( aPermute ){.  
12e60 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
12e70 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
12e80 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
12e90 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69  m=pOrderBy->a; i
12ea0 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20  <nOrderBy; i++, 
12eb0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
12ec0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69  assert( pItem->i
12ed0 43 6f 6c 3e 30 20 20 26 26 20 70 49 74 65 6d 2d  Col>0  && pItem-
12ee0 3e 69 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74  >iCol<=p->pEList
12ef0 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
12f00 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70   aPermute[i] = p
12f10 49 74 65 6d 2d 3e 69 43 6f 6c 20 2d 20 31 3b 0a  Item->iCol - 1;.
12f20 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65      }.    pKeyMe
12f30 72 67 65 20 3d 0a 20 20 20 20 20 20 73 71 6c 69  rge =.      sqli
12f40 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
12f50 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 4d  b, sizeof(*pKeyM
12f60 65 72 67 65 29 2b 6e 4f 72 64 65 72 42 79 2a 28  erge)+nOrderBy*(
12f70 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
12f80 2b 31 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  +1));.    if( pK
12f90 65 79 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20  eyMerge ){.     
12fa0 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72   pKeyMerge->aSor
12fb0 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
12fc0 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b  KeyMerge->aColl[
12fd0 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20 20 20  nOrderBy];.     
12fe0 20 70 4b 65 79 4d 65 72 67 65 2d 3e 6e 46 69 65   pKeyMerge->nFie
12ff0 6c 64 20 3d 20 28 75 31 36 29 6e 4f 72 64 65 72  ld = (u16)nOrder
13000 42 79 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65  By;.      pKeyMe
13010 72 67 65 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64  rge->enc = ENC(d
13020 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  b);.      for(i=
13030 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
13040 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
13050 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
13060 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d       Expr *pTerm
13070 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
13080 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
13090 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67   if( pTerm->flag
130a0 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
130b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
130c0 43 6f 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 43  Coll = pTerm->pC
130d0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  oll;.        }el
130e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43  se{.          pC
130f0 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  oll = multiSelec
13100 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
13110 20 70 2c 20 61 50 65 72 6d 75 74 65 5b 69 5d 29   p, aPermute[i])
13120 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72  ;.          pTer
13130 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45  m->flags |= EP_E
13140 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20  xpCollate;.     
13150 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 43 6f 6c       pTerm->pCol
13160 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  l = pColl;.     
13170 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4b 65     }.        pKe
13180 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69 5d  yMerge->aColl[i]
13190 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
131a0 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f    pKeyMerge->aSo
131b0 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72  rtOrder[i] = pOr
131c0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
131d0 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20  Order;.      }. 
131e0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
131f0 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b    pKeyMerge = 0;
13200 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74  .  }..  /* Reatt
13210 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
13220 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71   clause to the q
13230 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  uery..  */.  p->
13240 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
13250 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  rBy;.  pPrior->p
13260 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
13270 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61  3ExprListDup(pPa
13280 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42  rse->db, pOrderB
13290 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  y, 0);..  /* All
132a0 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66  ocate a range of
132b0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
132c0 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79  ters and the Key
132d0 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a  Info needed.  **
132e0 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74   for the logic t
132f0 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c  hat removes dupl
13300 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77  icate result row
13310 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  s when the.  ** 
13320 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
13330 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
13340 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74  TERSECT (but not
13350 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a   UNION ALL)..  *
13360 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
13370 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65  LL ){.    regPre
13380 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v = 0;.  }else{.
13390 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
133a0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
133b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f  ;.    assert( nO
133c0 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c  rderBy>=nExpr ||
133d0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
133e0 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76  d );.    regPrev
133f0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
13400 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
13410 45 78 70 72 2b 31 29 3b 0a 20 20 20 20 73 71 6c  Expr+1);.    sql
13420 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13430 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
13440 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70   regPrev);.    p
13450 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33  KeyDup = sqlite3
13460 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
13470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13480 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 44     sizeof(*pKeyD
13490 75 70 29 20 2b 20 6e 45 78 70 72 2a 28 73 69 7a  up) + nExpr*(siz
134a0 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29  eof(CollSeq*)+1)
134b0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79   );.    if( pKey
134c0 44 75 70 20 29 7b 0a 20 20 20 20 20 20 70 4b 65  Dup ){.      pKe
134d0 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  yDup->aSortOrder
134e0 20 3d 20 28 75 38 2a 29 26 70 4b 65 79 44 75 70   = (u8*)&pKeyDup
134f0 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a  ->aColl[nExpr];.
13500 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 6e        pKeyDup->n
13510 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 45 78  Field = (u16)nEx
13520 70 72 3b 0a 20 20 20 20 20 20 70 4b 65 79 44 75  pr;.      pKeyDu
13530 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  p->enc = ENC(db)
13540 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
13550 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a   i<nExpr; i++){.
13560 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d          pKeyDup-
13570 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74  >aColl[i] = mult
13580 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
13590 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20  Parse, p, i);.  
135a0 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
135b0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30  SortOrder[i] = 0
135c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
135d0 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72    }. .  /* Separ
135e0 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64  ate the left and
135f0 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72 79   the right query
13600 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65   from one anothe
13610 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69  r.  */.  p->pPri
13620 6f 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  or = 0;.  sqlite
13630 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f  3ResolveOrderGro
13640 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  upBy(pParse, p, 
13650 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  p->pOrderBy, "OR
13660 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72  DER");.  if( pPr
13670 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ior->pPrior==0 )
13680 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
13690 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
136a0 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
136b0 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
136c0 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d  y, "ORDER");.  }
136d0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
136e0 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
136f0 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c  rs */.  computeL
13700 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
13710 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e  arse, p, labelEn
13720 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  d);.  if( p->iLi
13730 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c  mit && op==TK_AL
13740 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69  L ){.    regLimi
13750 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
13760 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69  Mem;.    regLimi
13770 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tB = ++pParse->n
13780 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
13790 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
137a0 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65  _Copy, p->iOffse
137b0 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31  t ? p->iOffset+1
137c0 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20   : p->iLimit,.  
137d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137f0 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20  regLimitA);.    
13800 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13810 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65  2(v, OP_Copy, re
13820 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69  gLimitA, regLimi
13830 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tB);.  }else{.  
13840 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65    regLimitA = re
13850 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d  gLimitB = 0;.  }
13860 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
13870 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
13880 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  it);.  p->pLimit
13890 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 0;.  sqlite3E
138a0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
138b0 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e  >pOffset);.  p->
138c0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20  pOffset = 0;..  
138d0 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61  regAddrA = ++pPa
138e0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
138f0 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  EofA = ++pParse-
13900 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72  >nMem;.  regAddr
13910 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
13920 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20 3d 20  em;.  regEofB = 
13930 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
13940 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50    regOutA = ++pP
13950 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
13960 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  gOutB = ++pParse
13970 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
13980 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
13990 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f  &destA, SRT_Coro
139a0 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29  utine, regAddrA)
139b0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
139c0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 42  tDestInit(&destB
139d0 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
139e0 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f   regAddrB);..  /
139f0 2a 20 4a 75 6d 70 20 70 61 73 74 20 74 68 65 20  * Jump past the 
13a00 76 61 72 69 6f 75 73 20 73 75 62 72 6f 75 74 69  various subrouti
13a10 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75 74 69 6e  nes and coroutin
13a20 65 73 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a 20  es to the main. 
13a30 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20   ** merge loop. 
13a40 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74   */.  j1 = sqlit
13a50 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
13a60 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64 64 72  OP_Goto);.  addr
13a70 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65  SelectA = sqlite
13a80 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
13a90 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65 6e 65  (v);...  /* Gene
13aa0 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65  rate a coroutine
13ab0 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
13ac0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
13ad0 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65  t to the.  ** le
13ae0 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ft of the compou
13af0 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68  nd operator - th
13b00 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20  e "A" select..  
13b10 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
13b20 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20  ment((v, "Begin 
13b30 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65  coroutine for le
13b40 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ft SELECT"));.  
13b50 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d  pPrior->iLimit =
13b60 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78   regLimitA;.  ex
13b70 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
13b80 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69  iSub1, pParse->i
13b90 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
13ba0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
13bb0 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
13bc0 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  destA);.  sqlite
13bd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13be0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65  P_Integer, 1, re
13bf0 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65  gEofA);.  sqlite
13c00 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
13c10 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
13c20 41 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f  A);.  VdbeNoopCo
13c30 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 63  mment((v, "End c
13c40 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66  oroutine for lef
13c50 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20  t SELECT"));..  
13c60 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f  /* Generate a co
13c70 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75  routine to evalu
13c80 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ate the SELECT s
13c90 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a  tatement on .  *
13ca0 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20 74 68  * the right - th
13cb0 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a  e "B" select.  *
13cc0 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42 20  /.  addrSelectB 
13cd0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
13ce0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 56  rentAddr(v);.  V
13cf0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
13d00 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74  v, "Begin corout
13d10 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53 45  ine for right SE
13d20 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64  LECT"));.  saved
13d30 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
13d40 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74  t;.  savedOffset
13d50 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
13d60 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67   p->iLimit = reg
13d70 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66  LimitB;.  p->iOf
13d80 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 65 78  fset = 0;  .  ex
13d90 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
13da0 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
13db0 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
13dc0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
13dd0 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42  Parse, p, &destB
13de0 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  );.  p->iLimit =
13df0 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70   savedLimit;.  p
13e00 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65  ->iOffset = save
13e10 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74  dOffset;.  sqlit
13e20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13e30 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
13e40 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74  egEofB);.  sqlit
13e50 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
13e60 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
13e70 72 42 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43  rB);.  VdbeNoopC
13e80 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20  omment((v, "End 
13e90 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
13ea0 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a  ght SELECT"));..
13eb0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
13ec0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
13ed0 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
13ee0 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41  ent row of the A
13ef0 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
13f00 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
13f10 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
13f20 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
13f30 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
13f40 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72  nt((v, "Output r
13f50 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b  outine for A"));
13f60 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65  .  addrOutA = ge
13f70 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
13f80 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
13f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fa0 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74  p, &destA, pDest
13fb0 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20  , regOutA,.     
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
13fd0 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 50 34  rev, pKeyDup, P4
13fe0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
13ff0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a  , labelEnd);.  .
14000 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
14010 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
14020 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
14030 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42  ent row of the B
14040 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
14050 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
14060 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
14070 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
14080 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
14090 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
140a0 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  N ){.    VdbeNoo
140b0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
140c0 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
140d0 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f   B"));.    addrO
140e0 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utB = generateOu
140f0 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
14100 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
14110 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
14120 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  B, pDest, regOut
14130 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  B,.             
14140 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
14150 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  yDup, P4_KEYINFO
14160 5f 53 54 41 54 49 43 2c 20 6c 61 62 65 6c 45 6e  _STATIC, labelEn
14170 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  d);.  }..  /* Ge
14180 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
14190 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
141a0 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
141b0 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61   select A.  ** a
141c0 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
141d0 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
141e0 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a  lect B remains..
141f0 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
14200 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  omment((v, "eof-
14210 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  A subroutine"));
14220 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58  .  if( op==TK_EX
14230 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  CEPT || op==TK_I
14240 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
14250 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74  addrEofA = sqlit
14260 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14270 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
14280 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 20  lEnd);.  }else{ 
14290 20 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d   .    addrEofA =
142a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
142b0 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
142c0 45 6f 66 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  EofB, labelEnd);
142d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
142e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
142f0 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
14300 72 4f 75 74 42 29 3b 0a 20 20 20 20 73 71 6c 69  rOutB);.    sqli
14310 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
14320 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
14330 64 72 42 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  drB);.    sqlite
14340 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14350 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45  P_Goto, 0, addrE
14360 6f 66 41 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ofA);.  }..  /* 
14370 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
14380 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
14390 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
143a0 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a  om select B.  **
143b0 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
143c0 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
143d0 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73  select A remains
143e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
143f0 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
14400 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20  .    addrEofB = 
14410 61 64 64 72 45 6f 66 41 3b 0a 20 20 7d 65 6c 73  addrEofA;.  }els
14420 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f  e{  .    VdbeNoo
14430 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
14440 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-B subroutine")
14450 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  );.    addrEofB 
14460 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14470 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
14480 67 45 6f 66 41 2c 20 6c 61 62 65 6c 45 6e 64 29  gEofA, labelEnd)
14490 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
144a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
144b0 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64  sub, regOutA, ad
144c0 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c  drOutA);.    sql
144d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
144e0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
144f0 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddrA);.    sqlit
14500 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14510 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
14520 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  EofB);.  }..  /*
14530 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
14540 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
14550 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20  e of A<B.  */.  
14560 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
14570 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72  (v, "A-lt-B subr
14580 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
14590 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAltB = sqlite3V
145a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
145b0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20  Gosub, regOutA, 
145c0 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c  addrOutA);.  sql
145d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
145e0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
145f0 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
14600 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14610 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64  _If, regEofA, ad
14620 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74  drEofA);.  sqlit
14630 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14640 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
14650 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65  lCmpr);..  /* Ge
14660 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
14670 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
14680 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66  f A==B.  */.  if
14690 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op==TK_ALL ){.
146a0 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61      addrAeqB = a
146b0 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65  ddrAltB;.  }else
146c0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45   if( op==TK_INTE
146d0 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
146e0 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42  rAeqB = addrAltB
146f0 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b  ;.    addrAltB++
14700 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56  ;.  }else{.    V
14710 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
14720 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f  v, "A-eq-B subro
14730 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
14740 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c  drAeqB =.    sql
14750 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
14760 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
14770 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddrA);.    sqlit
14780 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14790 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20  OP_If, regEofA, 
147a0 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 73  addrEofA);.    s
147b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
147c0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
147d0 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a  labelCmpr);.  }.
147e0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
147f0 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
14800 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20  e case of A>B.  
14810 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
14820 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42  ment((v, "A-gt-B
14830 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
14840 20 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c    addrAgtB = sql
14850 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
14860 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70  ddr(v);.  if( op
14870 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d  ==TK_ALL || op==
14880 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
14890 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
148a0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
148b0 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
148c0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
148d0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
148e0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
148f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14900 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
14910 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f   regEofB, addrEo
14920 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fB);.  sqlite3Vd
14930 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
14940 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
14950 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63  r);..  /* This c
14960 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f  ode runs once to
14970 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72   initialize ever
14980 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73  ything..  */.  s
14990 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
149a0 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73 71 6c  re(v, j1);.  sql
149b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
149c0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
149d0 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c   regEofA);.  sql
149e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
149f0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
14a00 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c   regEofB);.  sql
14a10 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14a20 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 41  , OP_Gosub, regA
14a30 64 64 72 41 2c 20 61 64 64 72 53 65 6c 65 63 74  ddrA, addrSelect
14a40 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
14a50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
14a60 73 75 62 2c 20 72 65 67 41 64 64 72 42 2c 20 61  sub, regAddrB, a
14a70 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 73  ddrSelectB);.  s
14a80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14a90 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
14aa0 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20  fA, addrEofA);. 
14ab0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14ac0 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
14ad0 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b  EofB, addrEofB);
14ae0 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74  ..  /* Implement
14af0 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20   the main merge 
14b00 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  loop.  */.  sqli
14b10 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
14b20 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72  bel(v, labelCmpr
14b30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14b40 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72  AddOp4(v, OP_Per
14b50 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20  mutation, 0, 0, 
14b60 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75  0, (char*)aPermu
14b70 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29  te, P4_INTARRAY)
14b80 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
14b90 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
14ba0 61 72 65 2c 20 64 65 73 74 41 2e 69 4d 65 6d 2c  are, destA.iMem,
14bb0 20 64 65 73 74 42 2e 69 4d 65 6d 2c 20 6e 4f 72   destB.iMem, nOr
14bc0 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14be0 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65  (char*)pKeyMerge
14bf0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
14c00 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74 65 33  DOFF);.  sqlite3
14c10 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
14c20 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c  _Jump, addrAltB,
14c30 20 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41   addrAeqB, addrA
14c40 67 74 42 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65  gtB);..  /* Rele
14c50 61 73 65 20 74 65 6d 70 6f 72 61 72 79 20 72 65  ase temporary re
14c60 67 69 73 74 65 72 73 0a 20 20 2a 2f 0a 20 20 69  gisters.  */.  i
14c70 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20  f( regPrev ){.  
14c80 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
14c90 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
14ca0 2c 20 72 65 67 50 72 65 76 2c 20 6e 4f 72 64 65  , regPrev, nOrde
14cb0 72 42 79 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rBy+1);.  }..  /
14cc0 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68  * Jump to the th
14cd0 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65  is point in orde
14ce0 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  r to terminate t
14cf0 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
14d00 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
14d10 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
14d20 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  lEnd);..  /* Set
14d30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
14d40 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20  utput columns.  
14d50 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  */.  if( pDest->
14d60 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
14d70 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  t ){.    Select 
14d80 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69 6f 72  *pFirst = pPrior
14d90 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 46 69  ;.    while( pFi
14da0 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
14db0 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
14dc0 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72  Prior;.    gener
14dd0 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
14de0 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74  Parse, 0, pFirst
14df0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  ->pEList);.  }..
14e00 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20    /* Reassembly 
14e10 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
14e20 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ry so that it wi
14e30 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72 72  ll be freed corr
14e40 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68  ectly.  ** by th
14e50 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
14e60 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  on */.  if( p->p
14e70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  Prior ){.    sql
14e80 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
14e90 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b  (db, p->pPrior);
14ea0 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72  .  }.  p->pPrior
14eb0 20 3d 20 70 50 72 69 6f 72 3b 0a 0a 20 20 2f 2a   = pPrior;..  /*
14ec0 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20  ** TBD:  Insert 
14ed0 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73  subroutine calls
14ee0 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72   to close cursor
14ef0 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a  s on incomplete.
14f00 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65    **** subquerie
14f10 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69  s ****/.  explai
14f20 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73  nComposite(pPars
14f30 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c  e, p->op, iSub1,
14f40 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72 65   iSub2, 0);.  re
14f50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14f60 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
14f70 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
14f80 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
14f90 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14fa0 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f  OMIT_VIEW)./* Fo
14fb0 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f  rward Declaratio
14fc0 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ns */.static voi
14fd0 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
14fe0 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69  sqlite3*, ExprLi
14ff0 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  st*, int, ExprLi
15000 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  st*);.static voi
15010 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73 71  d substSelect(sq
15020 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a  lite3*, Select *
15030 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20  , int, ExprList 
15040 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  *);../*.** Scan 
15050 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
15060 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
15070 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
15080 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
15090 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
150a0 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
150b0 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
150c0 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e  iColumn-th.** en
150d0 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
150e0 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72  (But leave refer
150f0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57  ences to the ROW
15100 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e  ID column .** un
15110 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20  changed.).**.** 
15120 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
15130 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74  part of the flat
15140 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65  tening procedure
15150 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a  .  A subquery.**
15160 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65   whose result se
15170 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
15180 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61  pEList appears a
15190 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  s entry in the.*
151a0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
151b0 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74   a SELECT such t
151c0 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72  hat the VDBE cur
151d0 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
151e0 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61  that.** FORM cla
151f0 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61  use entry is iTa
15200 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ble.  This routi
15210 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65  ne make the nece
15220 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65  ssary .** change
15230 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68  s to pExpr so th
15240 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72  at it refers dir
15250 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75  ectly to the sou
15260 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20  rce table.** of 
15270 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74  the subquery rat
15280 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  her the result s
15290 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  et of the subque
152a0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78  ry..*/.static Ex
152b0 70 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20  pr *substExpr(. 
152c0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
152d0 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
152e0 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20  alloc errors to 
152f0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
15300 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
15310 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  ,        /* Expr
15320 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69   in which substi
15330 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f  tution occurs */
15340 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
15350 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
15360 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
15370 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
15380 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75  *pEList    /* Su
15390 62 73 74 69 74 75 74 65 20 65 78 70 72 65 73 73  bstitute express
153a0 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ions */.){.  if(
153b0 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
153c0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
153d0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
153e0 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
153f0 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  e==iTable ){.   
15400 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
15410 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  umn<0 ){.      p
15420 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55  Expr->op = TK_NU
15430 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
15440 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
15450 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15460 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70  EList!=0 && pExp
15470 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73  r->iColumn<pELis
15480 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
15490 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
154a0 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
154b0 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
154c0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
154d0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
154e0 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72   pEList->a[pExpr
154f0 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
15500 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
15510 70 4e 65 77 20 26 26 20 70 45 78 70 72 2d 3e 70  pNew && pExpr->p
15520 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
15530 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 45  pNew->pColl = pE
15540 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20  xpr->pColl;.    
15550 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
15560 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
15570 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70 45  pExpr);.      pE
15580 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  xpr = pNew;.    
15590 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
155a0 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75  Expr->pLeft = su
155b0 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78 70  bstExpr(db, pExp
155c0 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  r->pLeft, iTable
155d0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  , pEList);.    p
155e0 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73  Expr->pRight = s
155f0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78  ubstExpr(db, pEx
15600 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  pr->pRight, iTab
15610 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
15620 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
15630 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
15640 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
15650 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64     substSelect(d
15660 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  b, pExpr->x.pSel
15670 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ect, iTable, pEL
15680 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ist);.    }else{
15690 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
156a0 4c 69 73 74 28 64 62 2c 20 70 45 78 70 72 2d 3e  List(db, pExpr->
156b0 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  x.pList, iTable,
156c0 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a   pEList);.    }.
156d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78    }.  return pEx
156e0 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  pr;.}.static voi
156f0 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
15700 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
15710 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72          /* Repor
15720 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  t malloc errors 
15730 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  here */.  ExprLi
15740 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
15750 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20 61  * List to scan a
15760 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d  nd in which to m
15770 61 6b 65 20 73 75 62 73 74 69 74 75 74 65 73 20  ake substitutes 
15780 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
15790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
157a0 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74  le to be substit
157b0 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uted */.  ExprLi
157c0 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f  st *pEList     /
157d0 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c  * Substitute val
157e0 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ues */.){.  int 
157f0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
15800 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
15810 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
15820 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
15830 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
15840 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  pr = substExpr(d
15850 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  b, pList->a[i].p
15860 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  Expr, iTable, pE
15870 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
15880 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
15890 6c 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20  lect(.  sqlite3 
158a0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
158b0 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
158c0 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53  rors here */.  S
158d0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
158e0 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
158f0 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68  atement in which
15900 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
15910 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  utions */.  int 
15920 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
15930 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
15940 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78  replaced */.  Ex
15950 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
15960 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
15970 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
15980 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
15990 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
159a0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
159b0 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29  nt i;.  if( !p )
159c0 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74   return;.  subst
159d0 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e  ExprList(db, p->
159e0 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20  pEList, iTable, 
159f0 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
15a00 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e  ExprList(db, p->
15a10 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65  pGroupBy, iTable
15a20 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
15a30 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
15a40 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62  ->pOrderBy, iTab
15a50 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70  le, pEList);.  p
15a60 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73  ->pHaving = subs
15a70 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48 61  tExpr(db, p->pHa
15a80 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70 45  ving, iTable, pE
15a90 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 57 68 65  List);.  p->pWhe
15aa0 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  re = substExpr(d
15ab0 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 54  b, p->pWhere, iT
15ac0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
15ad0 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
15ae0 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61 62   p->pPrior, iTab
15af0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70  le, pEList);.  p
15b00 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
15b10 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b   assert( pSrc );
15b20 20 20 2f 2a 20 45 76 65 6e 20 66 6f 72 20 28 53    /* Even for (S
15b30 45 4c 45 43 54 20 31 29 20 77 65 20 68 61 76 65  ELECT 1) we have
15b40 3a 20 70 53 72 63 21 3d 30 20 62 75 74 20 70 53  : pSrc!=0 but pS
15b50 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20  rc->nSrc==0 */. 
15b60 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63   if( ALWAYS(pSrc
15b70 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70  ) ){.    for(i=p
15b80 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d  Src->nSrc, pItem
15b90 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69  =pSrc->a; i>0; i
15ba0 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
15bb0 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
15bc0 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  db, pItem->pSele
15bd0 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ct, iTable, pELi
15be0 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  st);.    }.  }.}
15bf0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
15c00 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
15c10 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
15c20 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
15c30 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20  T_VIEW) */..#if 
15c40 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
15c50 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
15c60 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
15c70 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a  E_OMIT_VIEW)./*.
15c80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15c90 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74  attempts to flat
15ca0 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 69  ten subqueries i
15cb0 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65 65 64  n order to speed
15cc0 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  .** execution.  
15cd0 49 74 20 72 65 74 75 72 6e 73 20 31 20 69 66 20  It returns 1 if 
15ce0 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73  it makes changes
15cf0 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61   and 0 if no fla
15d00 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72  ttening.** occur
15d10 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65  s..**.** To unde
15d20 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65  rstand the conce
15d30 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  pt of flattening
15d40 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66  , consider the f
15d50 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72  ollowing.** quer
15d60 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  y:.**.**     SEL
15d70 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45  ECT a FROM (SELE
15d80 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
15d90 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29   t1 WHERE z<100)
15da0 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a   WHERE a>5.**.**
15db0 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79   The default way
15dc0 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   of implementing
15dd0 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74   this query is t
15de0 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a  o execute the.**
15df0 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20   subquery first 
15e00 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
15e10 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f  sults in a tempo
15e20 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  rary table, then
15e30 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65  .** run the oute
15e40 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20  r query on that 
15e50 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
15e60 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20    This requires 
15e70 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76  two.** passes ov
15e80 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75  er the data.  Fu
15e90 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75  rthermore, becau
15ea0 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  se the temporary
15eb0 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f   table.** has no
15ec0 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48   indices, the WH
15ed0 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  ERE clause on th
15ee0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61  e outer query ca
15ef0 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d  nnot be.** optim
15f00 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ized..**.** This
15f10 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
15f20 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65  s to rewrite que
15f30 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65  ries such as the
15f40 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61   above into.** a
15f50 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c   single flat sel
15f60 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ect, like this:.
15f70 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
15f80 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
15f90 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e  1 WHERE z<100 AN
15fa0 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  D a>5.**.** The 
15fb0 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66  code generated f
15fc0 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66 69 63  or this simpific
15fd0 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20  ation gives the 
15fe0 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62  same result.** b
15ff0 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73  ut only has to s
16000 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63  can the data onc
16010 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20  e.  And because 
16020 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a  indices might .*
16030 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74  * exist on the t
16040 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c  able t1, a compl
16050 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20  ete scan of the 
16060 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a  data might be.**
16070 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20   avoided..**.** 
16080 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e  Flattening is on
16090 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20  ly attempted if 
160a0 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
160b0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
160c0 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20  *.**   (1)  The 
160d0 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
160e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
160f0 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67  not both use agg
16100 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
16110 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65   (2)  The subque
16120 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
16130 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75  regate or the ou
16140 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
16150 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
16160 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65   (3)  The subque
16170 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69  ry is not the ri
16180 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
16190 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e   left outer join
161a0 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72 69 67  .**        (Orig
161b0 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20 23 33  inally ticket #3
161c0 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65 6e 65  06.  Strengthene
161d0 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 33 30  d by ticket #330
161e0 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20  0).**.**   (4)  
161f0 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
16200 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a  not DISTINCT..**
16210 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e  .**  (**)  At on
16220 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74  e point restrict
16230 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29  ions (4) and (5)
16240 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73 65   defined a subse
16250 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a  t of DISTINCT.**
16260 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72          sub-quer
16270 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65 78  ies that were ex
16280 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73  cluded from this
16290 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52   optimization. R
162a0 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20  estriction .**  
162b0 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73 69        (4) has si
162c0 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65  nce been expande
162d0 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c  d to exclude all
162e0 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75 65   DISTINCT subque
162f0 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36  ries..**.**   (6
16300 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
16310 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
16320 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
16330 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
16340 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54  t.**        DIST
16350 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37  INCT..**.**   (7
16360 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
16370 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73  has a FROM claus
16380 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20  e..**.**   (8)  
16390 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
163a0 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
163b0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
163c0 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
163d0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54  ..**.**   (9)  T
163e0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
163f0 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
16400 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
16410 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
16420 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
16430 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29  tes..**.**  (10)
16440 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
16450 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
16460 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
16470 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
16480 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65  ot.**        use
16490 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28   LIMIT..**.**  (
164a0 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  11)  The subquer
164b0 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
164c0 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
164d0 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20  h have ORDER BY 
164e0 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  clauses..**.**  
164f0 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d  (**)  Not implem
16500 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64  ented.  Subsumed
16510 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f   into restrictio
16520 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76  n (3).  Was prev
16530 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20  iously.**       
16540 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74   a separate rest
16550 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67  riction deriving
16560 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35   from ticket #35
16570 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20  0..**.**  (13)  
16580 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
16590 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
165a0 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d  not both use LIM
165b0 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20  IT..**.**  (14) 
165c0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
165d0 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45  es not use OFFSE
165e0 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20  T..**.**  (15)  
165f0 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
16600 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
16610 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
16620 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   or the.**      
16630 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20    subquery does 
16640 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54  not have a LIMIT
16650 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20   clause..**     
16660 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23     (See ticket #
16670 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74 20  2339 and ticket 
16680 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a  [02a8e81d44])..*
16690 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20  *.**  (16)  The 
166a0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
166b0 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
166c0 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20  or the subquery 
166d0 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e  does.**        n
166e0 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  ot contain ORDER
166f0 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32   BY.  (Ticket #2
16700 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20  942)  This used 
16710 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a  to not matter.**
16720 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65          until we
16730 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20   introduced the 
16740 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66  group_concat() f
16750 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a  unction.  .**.**
16760 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62 2d    (17)  The sub-
16770 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63  query is not a c
16780 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
16790 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e  or it is a UNION
167a0 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20   ALL .**        
167b0 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20  compound clause 
167c0 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79  made up entirely
167d0 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74   of non-aggregat
167e0 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a  e queries, and .
167f0 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61  **        the pa
16800 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  rent query:.**.*
16810 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
16820 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74 20  not itself part 
16830 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
16840 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20  lect,.**        
16850 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67    * is not an ag
16860 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54 49  gregate or DISTI
16870 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a  NCT query, and.*
16880 2a 20 20 20 20 20 20 20 20 20 20 2a 20 68 61 73  *          * has
16890 20 6e 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 73   no other tables
168a0 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 73 20   or sub-selects 
168b0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
168c0 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  se..**.**       
168d0 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20   The parent and 
168e0 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f  sub-query may co
168f0 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75  ntain WHERE clau
16900 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a  ses. Subject to.
16910 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20  **        rules 
16920 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28  (11), (13) and (
16930 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c  14), they may al
16940 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  so contain ORDER
16950 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c   BY,.**        L
16960 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
16970 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  clauses..**.**  
16980 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62  (18)  If the sub
16990 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
169a0 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
169b0 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
169c0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44  he.**        ORD
169d0 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20  ER by clause of 
169e0 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20  the parent must 
169f0 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65  be simple refere
16a00 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20  nces to .**     
16a10 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68     columns of th
16a20 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a  e sub-query..**.
16a30 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20 73 75  **  (19)  The su
16a40 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
16a50 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
16a60 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
16a70 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
16a80 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61  have a WHERE cla
16a90 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29  use..**.**  (20)
16aa0 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
16ab0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
16ac0 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74   select, then it
16ad0 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a   must not use.**
16ae0 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52          an ORDER
16af0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63   BY clause.  Tic
16b00 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65 20 63  ket #3773.  We c
16b10 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20  ould relax this 
16b20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20  constraint.**   
16b30 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79       somewhat by
16b40 20 73 61 79 69 6e 67 20 74 68 61 74 20 74 68 65   saying that the
16b50 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
16b60 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75  DER BY clause mu
16b70 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70  st.**        app
16b80 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65  ear as unmodifie
16b90 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  d result columns
16ba0 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
16bb0 65 72 79 2e 20 20 42 75 74 0a 2a 2a 20 20 20 20  ery.  But.**    
16bc0 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f      have other o
16bd0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20  ptimizations in 
16be0 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74  mind to deal wit
16bf0 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a  h that case..**.
16c00 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
16c10 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
16c20 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
16c30 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
16c40 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
16c50 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
16c60 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
16c70 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
16c80 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
16c90 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
16ca0 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73  s and subqueryIs
16cb0 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
16cc0 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
16cd0 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
16ce0 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
16cf0 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
16d00 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
16d10 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
16d20 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20  eturns 0..** If 
16d30 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74  flattening is at
16d40 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75  tempted this rou
16d50 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a  tine returns 1..
16d60 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
16d70 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
16d80 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20  ysis must occur 
16d90 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65  on both the oute
16da0 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74  r query and.** t
16db0 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f  he subquery befo
16dc0 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
16dd0 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  runs..*/.static 
16de0 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75  int flattenSubqu
16df0 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
16e00 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
16e10 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
16e20 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
16e30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16e40 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
16e50 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
16e60 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
16e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
16e80 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
16e90 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
16ea0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
16eb0 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20  nt isAgg,       
16ec0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
16ed0 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
16ee0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
16ef0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ions */.  int su
16f00 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f  bqueryIsAgg    /
16f10 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75  * True if the su
16f20 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
16f30 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
16f40 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
16f50 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
16f60 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
16f70 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
16f80 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b  Select *pParent;
16f90 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
16fa0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
16fb0 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75  ner query or "su
16fc0 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c  bquery" */.  Sel
16fd0 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20  ect *pSub1;     
16fe0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
16ff0 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c  he rightmost sel
17000 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79  ect in sub-query
17010 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
17020 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
17030 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
17040 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
17050 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
17060 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  ubSrc;   /* The 
17070 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
17080 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
17090 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
170a0 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  ;    /* The resu
170b0 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75  lt set of the ou
170c0 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
170d0 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  nt iParent;     
170e0 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
170f0 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
17100 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20  pSub result set 
17110 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
17120 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
17130 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
17140 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ter */.  Expr *p
17150 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
17160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17170 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
17180 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
17190 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d  t_item *pSubitem
171a0 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75  ;   /* The subqu
171b0 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
171c0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
171d0 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  b;..  /* Check t
171e0 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
171f0 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
17200 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
17210 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ot..  */.  asser
17220 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
17230 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
17240 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20  0 );  /* Unable 
17250 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f  to flatten compo
17260 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  und queries */. 
17270 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
17280 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61   SQLITE_QueryFla
17290 74 74 65 6e 65 72 20 29 20 72 65 74 75 72 6e 20  ttener ) return 
172a0 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  0;.  pSrc = p->p
172b0 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
172c0 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20  Src && iFrom>=0 
172d0 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e  && iFrom<pSrc->n
172e0 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65  Src );.  pSubite
172f0 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72  m = &pSrc->a[iFr
17300 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d  om];.  iParent =
17310 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73   pSubitem->iCurs
17320 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75  or;.  pSub = pSu
17330 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  bitem->pSelect;.
17340 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d    assert( pSub!=
17350 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67  0 );.  if( isAgg
17360 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
17370 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  g ) return 0;   
17380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17390 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29   Restriction (1)
173a0 20 20 2a 2f 0a 20 20 69 66 28 20 73 75 62 71 75    */.  if( subqu
173b0 65 72 79 49 73 41 67 67 20 26 26 20 70 53 72 63  eryIsAgg && pSrc
173c0 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72  ->nSrc>1 ) retur
173d0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  n 0;          /*
173e0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29   Restriction (2)
173f0 20 20 2a 2f 0a 20 20 70 53 75 62 53 72 63 20 3d    */.  pSubSrc =
17400 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61   pSub->pSrc;.  a
17410 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29  ssert( pSubSrc )
17420 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20  ;.  /* Prior to 
17430 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77  version 3.1.2, w
17440 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  hen LIMIT and OF
17450 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20 73  FSET had to be s
17460 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c  imple constants,
17470 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72  .  ** not arbitr
17480 61 72 79 20 65 78 70 72 65 73 73 73 69 6f 6e 73  ary expresssions
17490 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d  , we allowed som
174a0 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c  e combining of L
174b0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
174c0 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65    ** because the
174d0 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75  y could be compu
174e0 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ted at compile-t
174f0 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c  ime.  But when L
17500 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
17510 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69    ** became arbi
17520 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  trary expression
17530 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63 65  s, we were force
17540 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69 63  d to add restric
17550 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20  tions (13).  ** 
17560 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69  and (14). */.  i
17570 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
17580 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72  && p->pLimit ) r
17590 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
175a0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
175b0 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69  tion (13) */.  i
175c0 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74  f( pSub->pOffset
175d0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
175e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175f0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
17600 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69  tion (14) */.  i
17610 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  f( p->pRightmost
17620 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74   && pSub->pLimit
17630 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
17640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17670 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29  Restriction (15)
17680 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
17690 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29  ubSrc->nSrc==0 )
176a0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
176b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176c0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
176d0 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  (7)  */.  if( pS
176e0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
176f0 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74  F_Distinct ) ret
17700 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
17710 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
17720 28 35 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  (5)  */.  if( pS
17730 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70  ub->pLimit && (p
17740 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69  Src->nSrc>1 || i
17750 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65  sAgg) ){.     re
17760 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
17770 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20  /* Restrictions 
17780 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20  (8)(9) */.  }.  
17790 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
177a0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
177b0 3d 30 20 26 26 20 73 75 62 71 75 65 72 79 49 73  =0 && subqueryIs
177c0 41 67 67 20 29 7b 0a 20 20 20 20 20 72 65 74 75  Agg ){.     retu
177d0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
177e0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29   Restriction (6)
177f0 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70    */.  }.  if( p
17800 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 53  ->pOrderBy && pS
17810 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
17820 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
17830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17850 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
17860 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a  riction (11) */.
17870 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20    }.  if( isAgg 
17880 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
17890 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  y ) return 0;   
178a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
178b0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29  Restriction (16)
178c0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
178d0 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68  pLimit && p->pWh
178e0 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
178f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17900 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29  Restriction (19)
17910 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45   */..  /* OBSOLE
17920 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20  TE COMMENT 1:.  
17930 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33  ** Restriction 3
17940 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
17950 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61  ry is a join, ma
17960 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
17970 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f  uery is .  ** no
17980 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69  t used as the ri
17990 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
179a0 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45  n outer join.  E
179b0 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
179c0 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  his.  ** is not 
179d0 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
179e0 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
179f0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74  FT OUTER JOIN (t
17a00 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a  2 JOIN t3).  **.
17a10 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74    ** If we flatt
17a20 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65  en the above, we
17a30 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a   would get.  **.
17a40 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31    **         (t1
17a50 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
17a60 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a   t2) JOIN t3.  *
17a70 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20  *.  ** which is 
17a80 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73  not at all the s
17a90 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a  ame thing..  **.
17aa0 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f    ** OBSOLETE CO
17ab0 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65  MMENT 2:.  ** Re
17ac0 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49  striction 12:  I
17ad0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
17ae0 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
17af0 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
17b00 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d  ter.  ** join, m
17b10 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
17b20 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45  query has no WHE
17b30 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20  RE clause..  ** 
17b40 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77  An examples of w
17b50 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  hy this is not a
17b60 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
17b70 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
17b80 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45  T OUTER JOIN (SE
17b90 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57  LECT * FROM t2 W
17ba0 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a  HERE t2.x>0).  *
17bb0 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
17bc0 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
17bd0 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
17be0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
17bf0 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
17c00 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e  IN t2) WHERE t2.
17c10 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75  x>0.  **.  ** Bu
17c20 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73  t the t2.x>0 tes
17c30 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61  t will always fa
17c40 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77  il on a NULL row
17c50 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20   of t2, which.  
17c60 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63  ** effectively c
17c70 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45  onverts the OUTE
17c80 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49  R JOIN into an I
17c90 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a  NNER JOIN..  **.
17ca0 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49    ** THIS OVERRI
17cb0 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d  DES OBSOLETE COM
17cc0 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42  MENTS 1 AND 2 AB
17cd0 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74  OVE:.  ** Ticket
17ce0 20 23 33 33 30 30 20 73 68 6f 77 73 20 74 68 61   #3300 shows tha
17cf0 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65  t flattening the
17d00 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
17d10 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20   LEFT JOIN.  ** 
17d20 69 73 20 66 72 61 75 67 68 74 20 77 69 74 68 20  is fraught with 
17d30 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f  danger.  Best to
17d40 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65   avoid the whole
17d50 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a   thing.  If the.
17d60 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73    ** subquery is
17d70 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
17d80 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20  of a LEFT JOIN, 
17d90 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74  then do not flat
17da0 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ten..  */.  if( 
17db0 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74  (pSubitem->joint
17dc0 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
17dd0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
17de0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
17df0 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66  striction 17: If
17e00 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
17e10 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
17e20 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ECT, then it mus
17e30 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20  t.  ** use only 
17e40 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  the UNION ALL op
17e50 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65  erator. And none
17e60 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73   of the simple s
17e70 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20  elect queries.  
17e80 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ** that make up 
17e90 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
17ea0 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  ECT are allowed 
17eb0 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20  to be aggregate 
17ec0 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a  or distinct.  **
17ed0 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20   queries..  */. 
17ee0 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f   if( pSub->pPrio
17ef0 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75  r ){.    if( pSu
17f00 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
17f10 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
17f20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32  /* Restriction 2
17f30 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  0 */.    }.    i
17f40 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e  f( isAgg || (p->
17f50 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
17f60 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53  stinct)!=0 || pS
17f70 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20  rc->nSrc!=1 ){. 
17f80 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
17f90 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75     }.    for(pSu
17fa0 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20  b1=pSub; pSub1; 
17fb0 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72  pSub1=pSub1->pPr
17fc0 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74  ior){.      test
17fd0 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65  case( (pSub1->se
17fe0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
17ff0 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
18000 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
18010 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
18020 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
18030 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
18040 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
18050 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74  e))==SF_Aggregat
18060 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  e );.      if( (
18070 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
18080 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
18090 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30  F_Aggregate))!=0
180a0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62  .       || (pSub
180b0 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75  1->pPrior && pSu
180c0 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  b1->op!=TK_ALL) 
180d0 0a 20 20 20 20 20 20 20 7c 7c 20 4e 45 56 45 52  .       || NEVER
180e0 28 70 53 75 62 31 2d 3e 70 53 72 63 3d 3d 30 29  (pSub1->pSrc==0)
180f0 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d   || pSub1->pSrc-
18100 3e 6e 53 72 63 21 3d 31 0a 20 20 20 20 20 20 29  >nSrc!=1.      )
18110 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
18120 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
18130 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69  }..    /* Restri
18140 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20  ction 18. */.   
18150 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
18160 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
18170 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
18180 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79  ; ii<p->pOrderBy
18190 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a  ->nExpr; ii++){.
181a0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
181b0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 69  OrderBy->a[ii].i
181c0 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Col==0 ) return 
181d0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
181e0 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49  .  }..  /***** I
181f0 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
18200 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e  point, flattenin
18210 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
18220 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74  *****/..  /* Aut
18230 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75  horize the subqu
18240 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d  ery */.  pParse-
18250 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
18260 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b  pSubitem->zName;
18270 0a 20 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  .  sqlite3AuthCh
18280 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
18290 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
182a0 20 30 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a   0);.  pParse->z
182b0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
182c0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
182d0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75  ..  /* If the su
182e0 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
182f0 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
18300 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79  tement, then (by
18310 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20   restrictions.  
18320 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f  ** 17 and 18 abo
18330 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  ve) it must be a
18340 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74   UNION ALL and t
18350 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
18360 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66  must .  ** be of
18370 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a   the form:.  **.
18380 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
18390 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d  <expr-list> FROM
183a0 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c   (<sub-query>) <
183b0 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20  where-clause> . 
183c0 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65   **.  ** followe
183d0 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42  d by any ORDER B
183e0 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20  Y, LIMIT and/or 
183f0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
18400 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20  This block.  ** 
18410 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69  creates N-1 copi
18420 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  es of the parent
18430 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61   query without a
18440 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
18450 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53  IT or .  ** OFFS
18460 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a  ET clauses and j
18470 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65  oins them to the
18480 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20   left-hand-side 
18490 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  of the original.
184a0 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e    ** using UNION
184b0 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20   ALL operators. 
184c0 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69  In this case N i
184d0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
184e0 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65  simple.  ** sele
184f0 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ct statements in
18500 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75   the compound su
18510 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20  b-query..  **.  
18520 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  ** Example:.  **
18530 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
18540 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a   a+1 FROM (.  **
18550 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78          SELECT x
18560 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
18570 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
18580 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
18590 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT y FROM tab.  
185a0 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
185b0 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
185c0 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20  SELECT abs(z*2) 
185d0 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20  FROM tab2.  **  
185e0 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35 20     ) WHERE a!=5 
185f0 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
18600 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64    ** Transformed
18610 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
18620 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20       SELECT x+1 
18630 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78  FROM tab WHERE x
18640 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
18650 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
18660 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f    SELECT y+1 FRO
18670 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31 21  M tab WHERE y+1!
18680 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
18690 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
186a0 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31  ELECT abs(z*2)+1
186b0 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45   FROM tab2 WHERE
186c0 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20   abs(z*2)+1!=5. 
186d0 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59   **     ORDER BY
186e0 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20   1.  **.  ** We 
186f0 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63  call this the "c
18700 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
18710 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20   flattening"..  
18720 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53  */.  for(pSub=pS
18730 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62  ub->pPrior; pSub
18740 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  ; pSub=pSub->pPr
18750 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ior){.    Select
18760 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72   *pNew;.    Expr
18770 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
18780 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
18790 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d    Expr *pLimit =
187a0 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
187b0 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d  Select *pPrior =
187c0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
187d0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
187e0 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30  .    p->pSrc = 0
187f0 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
18800 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  = 0;.    p->pLim
18810 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  it = 0;.    pNew
18820 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
18830 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20  Dup(db, p, 0);. 
18840 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
18850 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f  Limit;.    p->pO
18860 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
18870 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  y;.    p->pSrc =
18880 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70   pSrc;.    p->op
18890 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70   = TK_ALL;.    p
188a0 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30  ->pRightmost = 0
188b0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
188c0 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  0 ){.      pNew 
188d0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65  = pPrior;.    }e
188e0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
188f0 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
18900 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52  ;.      pNew->pR
18910 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20  ightmost = 0;.  
18920 20 20 7d 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f    }.    p->pPrio
18930 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 69 66  r = pNew;.    if
18940 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
18950 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
18960 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66   }..  /* Begin f
18970 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46  lattening the iF
18980 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  rom-th entry of 
18990 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
189a0 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74  .  ** in the out
189b0 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  er query..  */. 
189c0 20 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20   pSub = pSub1 = 
189d0 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
189e0 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  t;..  /* Delete 
189f0 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61  the transient ta
18a00 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ble structure as
18a10 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
18a20 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a  e.  ** subquery.
18a30 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62    */.  sqlite3Db
18a40 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
18a50 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
18a60 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
18a70 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  b, pSubitem->zNa
18a80 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
18a90 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
18aa0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53  m->zAlias);.  pS
18ab0 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
18ac0 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  e = 0;.  pSubite
18ad0 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  m->zName = 0;.  
18ae0 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
18af0 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
18b00 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a  ->pSelect = 0;..
18b10 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74    /* Defer delet
18b20 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62  ing the Table ob
18b30 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
18b40 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75  with the.  ** su
18b50 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64  bquery until cod
18b60 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a  e generation is.
18b70 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73    ** complete, s
18b80 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73  ince there may s
18b90 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e  till exist Expr.
18ba0 70 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61  pTab entries tha
18bb0 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20  t.  ** refer to 
18bc0 74 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65  the subquery eve
18bd0 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69  n after flatteni
18be0 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34  ng.  Ticket #334
18bf0 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75  6..  **.  ** pSu
18c00 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61  bitem->pTab is a
18c10 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62  lways non-NULL b
18c20 79 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69  y test restricti
18c30 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62  ons and tests ab
18c40 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ove..  */.  if( 
18c50 41 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d  ALWAYS(pSubitem-
18c60 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
18c70 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65   Table *pTabToDe
18c80 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54  l = pSubitem->pT
18c90 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
18ca0 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29  ToDel->nRef==1 )
18cb0 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a 70  {.      Parse *p
18cc0 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
18cd0 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
18ce0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70  pParse);.      p
18cf0 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a  TabToDel->pNextZ
18d00 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65  ombie = pTopleve
18d10 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20  l->pZombieTab;. 
18d20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e       pToplevel->
18d30 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61  pZombieTab = pTa
18d40 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73  bToDel;.    }els
18d50 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44  e{.      pTabToD
18d60 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  el->nRef--;.    
18d70 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e  }.    pSubitem->
18d80 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  pTab = 0;.  }.. 
18d90 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
18da0 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65  g loop runs once
18db0 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69   for each term i
18dc0 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
18dd0 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74  query.  ** flatt
18de0 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69  ening (as descri
18df0 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20  bed above).  If 
18e00 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64  we are doing a d
18e10 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20  ifferent kind.  
18e20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** of flattening
18e30 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20   - a flattening 
18e40 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d  other than a com
18e50 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
18e60 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a  lattening -.  **
18e70 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20   then this loop 
18e80 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a  only runs once..
18e90 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
18ea0 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66  oop moves all of
18eb0 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e   the FROM elemen
18ec0 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ts of the subque
18ed0 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ry into the.  **
18ee0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
18ef0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
18f00 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69  ery.  Before doi
18f10 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65  ng this, remembe
18f20 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  r.  ** the curso
18f30 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
18f40 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20   original outer 
18f50 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65  query FROM eleme
18f60 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65  nt in.  ** iPare
18f70 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74  nt.  The iParent
18f80 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76   cursor will nev
18f90 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62  er be used.  Sub
18fa0 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a  sequent code.  *
18fb0 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72  * will scan expr
18fc0 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20  essions looking 
18fd0 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65  for iParent refe
18fe0 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61  rences and repla
18ff0 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65  ce.  ** those re
19000 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78  ferences with ex
19010 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
19020 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75  esolve to the su
19030 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a  bquery FROM.  **
19040 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65   elements we are
19050 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e   now copying in.
19060 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72  .  */.  for(pPar
19070 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20  ent=p; pParent; 
19080 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d  pParent=pParent-
19090 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53  >pPrior, pSub=pS
190a0 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
190b0 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20   int nSubSrc;.  
190c0 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20    u8 jointype = 
190d0 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d  0;.    pSubSrc =
190e0 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20   pSub->pSrc;    
190f0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
19100 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  of subquery */. 
19110 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75     nSubSrc = pSu
19120 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20  bSrc->nSrc;  /* 
19130 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
19140 69 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  in subquery FROM
19150 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70   clause */.    p
19160 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  Src = pParent->p
19170 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
19180 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
19190 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20  uter query */.. 
191a0 20 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20     if( pSrc ){. 
191b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
191c0 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46  rent==p );  /* F
191d0 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67  irst time throug
191e0 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
191f0 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70      jointype = p
19200 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  Subitem->jointyp
19210 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
19220 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
19230 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e  ent!=p );  /* 2n
19240 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
19250 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74   times through t
19260 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  he loop */.     
19270 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
19280 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  >pSrc = sqlite3S
19290 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c  rcListAppend(db,
192a0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
192b0 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a   if( pSrc==0 ){.
192c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
192d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
192e0 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
192f0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
19300 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62  ..    /* The sub
19310 71 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e  query uses a sin
19320 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20  gle slot of the 
19330 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
19340 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  he outer.    ** 
19350 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73  query.  If the s
19360 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65  ubquery has more
19370 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e   than one elemen
19380 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  t in its FROM cl
19390 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ause,.    ** the
193a0 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  n expand the out
193b0 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65  er query to make
193c0 20 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f   space for it to
193d0 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e   hold all elemen
193e0 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ts.    ** of the
193f0 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
19400 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65  *.    ** Example
19410 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
19420 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
19430 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a   tabA, (SELECT *
19440 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32   FROM sub1, sub2
19450 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a  ), tabB;.    **.
19460 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72      ** The outer
19470 20 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f   query has 3 slo
19480 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63  ts in its FROM c
19490 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74  lause.  One slot
194a0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   of the.    ** o
194b0 75 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20  uter query (the 
194c0 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20  middle slot) is 
194d0 75 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71  used by the subq
194e0 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a  uery.  The next.
194f0 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20      ** block of 
19500 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64  code will expand
19510 20 74 68 65 20 6f 75 74 20 71 75 65 72 79 20 74   the out query t
19520 6f 20 34 20 73 6c 6f 74 73 2e 20 20 54 68 65 20  o 4 slots.  The 
19530 6d 69 64 64 6c 65 0a 20 20 20 20 2a 2a 20 73 6c  middle.    ** sl
19540 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74  ot is expanded t
19550 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f  o two slots in o
19560 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61  rder to make spa
19570 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  ce for the.    *
19580 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69  * two elements i
19590 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
195a0 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
195b0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
195c0 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
195d0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53       pParent->pS
195e0 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69  rc = pSrc = sqli
195f0 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
19600 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62  e(db, pSrc, nSub
19610 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a  Src-1,iFrom+1);.
19620 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
19630 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
19640 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19650 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
19660 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
19670 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
19680 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75  s from the subqu
19690 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ery into the.   
196a0 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e   ** outer query.
196b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
196c0 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
196d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
196e0 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
196f0 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46  db, pSrc->a[i+iF
19700 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20  rom].pUsing);.  
19710 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46      pSrc->a[i+iF
19720 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e  rom] = pSubSrc->
19730 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73  a[i];.      mems
19740 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69  et(&pSubSrc->a[i
19750 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75  ], 0, sizeof(pSu
19760 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20  bSrc->a[i]));.  
19770 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b    }.    pSrc->a[
19780 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20  iFrom].jointype 
19790 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20  = jointype;.  . 
197a0 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20     /* Now begin 
197b0 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62  substituting sub
197c0 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74  query result set
197d0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72   expressions for
197e0 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e   .    ** referen
197f0 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65  ces to the iPare
19800 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  nt in the outer 
19810 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20  query..    ** . 
19820 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20     ** Example:. 
19830 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53     **.    **   S
19840 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20  ELECT a+5, b*10 
19850 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33  FROM (SELECT x*3
19860 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62   AS a, y+10 AS b
19870 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20   FROM t1) WHERE 
19880 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20  a>b;.    **   \ 
19890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198a0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
198b0 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f  __ subquery ____
198c0 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20  ______/         
198d0 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f   /.    **    \__
198e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
198f0 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20  ___ outer query 
19900 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
19910 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
19920 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65      **.    ** We
19930 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65   look at every e
19940 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
19950 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
19960 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
19970 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77  see.    ** "a" w
19980 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a  e substitute "x*
19990 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  3" and every pla
199a0 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65  ce we see "b" we
199b0 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31   substitute "y+1
199c0 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  0"..    */.    p
199d0 4c 69 73 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e  List = pParent->
199e0 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28  pEList;.    for(
199f0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
19a00 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
19a10 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   if( pList->a[i]
19a20 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  .zName==0 ){.   
19a30 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
19a40 2a 7a 53 70 61 6e 20 3d 20 70 4c 69 73 74 2d 3e  *zSpan = pList->
19a50 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
19a60 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a      if( ALWAYS(z
19a70 53 70 61 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  Span) ){.       
19a80 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a     pList->a[i].z
19a90 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
19aa0 53 74 72 44 75 70 28 64 62 2c 20 7a 53 70 61 6e  StrDup(db, zSpan
19ab0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
19ac0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
19ad0 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
19ae0 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74   pParent->pEList
19af0 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
19b00 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66  >pEList);.    if
19b10 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 20  ( isAgg ){.     
19b20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
19b30 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f  b, pParent->pGro
19b40 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  upBy, iParent, p
19b50 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
19b60 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
19b70 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72  ving = substExpr
19b80 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48  (db, pParent->pH
19b90 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
19ba0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
19bb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75     }.    if( pSu
19bc0 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
19bd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
19be0 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rent->pOrderBy==
19bf0 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
19c00 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  nt->pOrderBy = p
19c10 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
19c20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65       pSub->pOrde
19c30 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rBy = 0;.    }el
19c40 73 65 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e  se if( pParent->
19c50 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
19c60 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
19c70 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  db, pParent->pOr
19c80 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  derBy, iParent, 
19c90 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
19ca0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75     }.    if( pSu
19cb0 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  b->pWhere ){.   
19cc0 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69     pWhere = sqli
19cd0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
19ce0 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b  Sub->pWhere, 0);
19cf0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19d00 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
19d10 20 20 7d 0a 20 20 20 20 69 66 28 20 73 75 62 71    }.    if( subq
19d20 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
19d30 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
19d40 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29  nt->pHaving==0 )
19d50 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
19d60 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72 65  >pHaving = pPare
19d70 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20  nt->pWhere;.    
19d80 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
19d90 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20  e = pWhere;.    
19da0 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69    pParent->pHavi
19db0 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ng = substExpr(d
19dc0 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  b, pParent->pHav
19dd0 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ing, iParent, pS
19de0 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
19df0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
19e00 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
19e10 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74  rAnd(db, pParent
19e20 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20 20 20  ->pHaving, .    
19e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
19e50 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
19e60 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20   pSub->pHaving, 
19e70 30 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0));.      asser
19e80 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f  t( pParent->pGro
19e90 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  upBy==0 );.     
19ea0 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70   pParent->pGroup
19eb0 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
19ec0 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 75 62  ListDup(db, pSub
19ed0 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a  ->pGroupBy, 0);.
19ee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19ef0 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
19f00 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
19f10 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
19f20 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
19f30 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
19f40 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20  pParent->pWhere 
19f50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
19f60 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57  (db, pParent->pW
19f70 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20  here, pWhere);. 
19f80 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54     }.  .    /* T
19f90 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65  he flattened que
19fa0 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69  ry is distinct i
19fb0 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e  f either the inn
19fc0 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  er or the.    **
19fd0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
19fe0 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a  distinct. .    *
19ff0 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73  /.    pParent->s
1a000 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d  elFlags |= pSub-
1a010 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1a020 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20  istinct;.  .    
1a030 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  /*.    ** SELECT
1a040 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43   ... FROM (SELEC
1a050 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46  T ... LIMIT a OF
1a060 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20  FSET b) LIMIT x 
1a070 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a  OFFSET y;.    **
1a080 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74  .    ** One is t
1a090 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f  empted to try to
1a0a0 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20   add a and b to 
1a0b0 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69  combine the limi
1a0c0 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20  ts.  But this.  
1a0d0 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f    ** does not wo
1a0e0 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d  rk if either lim
1a0f0 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
1a100 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1a110 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
1a120 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c       pParent->pL
1a130 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69  imit = pSub->pLi
1a140 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  mit;.      pSub-
1a150 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
1a160 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
1a170 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68  ially, delete wh
1a180 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68  at is left of th
1a190 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72  e subquery and r
1a1a0 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65  eturn.  ** succe
1a1b0 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
1a1c0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
1a1d0 62 2c 20 70 53 75 62 31 29 3b 0a 0a 20 20 72 65  b, pSub1);..  re
1a1e0 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
1a1f0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
1a200 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1a210 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1a220 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1a230 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79   */../*.** Analy
1a240 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  ze the SELECT st
1a250 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
1a260 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  s an argument to
1a270 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73   see if it.** is
1a280 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28   a min() or max(
1a290 29 20 71 75 65 72 79 2e 20 52 65 74 75 72 6e 20  ) query. Return 
1a2a0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
1a2b0 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52  N or WHERE_ORDER
1a2c0 42 59 5f 4d 41 58 20 69 66 20 0a 2a 2a 20 69 74  BY_MAX if .** it
1a2d0 20 69 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77   is, or 0 otherw
1a2e0 69 73 65 2e 20 41 74 20 70 72 65 73 65 6e 74 2c  ise. At present,
1a2f0 20 61 20 71 75 65 72 79 20 69 73 20 63 6f 6e 73   a query is cons
1a300 69 64 65 72 65 64 20 74 6f 20 62 65 0a 2a 2a 20  idered to be.** 
1a310 61 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20 71 75  a min()/max() qu
1a320 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery if:.**.**   
1a330 31 2e 20 54 68 65 72 65 20 69 73 20 61 20 73 69  1. There is a si
1a340 6e 67 6c 65 20 6f 62 6a 65 63 74 20 69 6e 20 74  ngle object in t
1a350 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
1a360 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65 72 65  **.**   2. There
1a370 20 69 73 20 61 20 73 69 6e 67 6c 65 20 65 78 70   is a single exp
1a380 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72  ression in the r
1a390 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20 69  esult set, and i
1a3a0 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 65 69 74  t is.**      eit
1a3b0 68 65 72 20 6d 69 6e 28 78 29 20 6f 72 20 6d 61  her min(x) or ma
1a3c0 78 28 78 29 2c 20 77 68 65 72 65 20 78 20 69 73  x(x), where x is
1a3d0 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65   a column refere
1a3e0 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  nce..*/.static u
1a3f0 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 53 65  8 minMaxQuery(Se
1a400 6c 65 63 74 20 2a 70 29 7b 0a 20 20 45 78 70 72  lect *p){.  Expr
1a410 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72 4c   *pExpr;.  ExprL
1a420 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d  ist *pEList = p-
1a430 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20  >pEList;..  if( 
1a440 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
1a450 20 29 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f   ) return WHERE_
1a460 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
1a470 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74    pExpr = pEList
1a480 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
1a490 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
1a4a0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
1a4b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1a4c0 20 4e 45 56 45 52 28 45 78 70 72 48 61 73 50 72   NEVER(ExprHasPr
1a4d0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1a4e0 5f 78 49 73 53 65 6c 65 63 74 29 29 20 29 20 72  _xIsSelect)) ) r
1a4f0 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73  eturn 0;.  pELis
1a500 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
1a510 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
1a520 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e  ==0 || pEList->n
1a530 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
1a540 20 30 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74   0;.  if( pEList
1a550 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
1a560 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
1a570 29 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f  ) return WHERE_O
1a580 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20  RDERBY_NORMAL;. 
1a590 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1a5a0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1a5b0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1a5c0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
1a5d0 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  rICmp(pExpr->u.z
1a5e0 54 6f 6b 65 6e 2c 22 6d 69 6e 22 29 3d 3d 30 20  Token,"min")==0 
1a5f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 48  ){.    return WH
1a600 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b  ERE_ORDERBY_MIN;
1a610 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1a620 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70  ite3StrICmp(pExp
1a630 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 78  r->u.zToken,"max
1a640 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ")==0 ){.    ret
1a650 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
1a660 59 5f 4d 41 58 3b 0a 20 20 7d 0a 20 20 72 65 74  Y_MAX;.  }.  ret
1a670 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
1a680 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a  Y_NORMAL;.}../*.
1a690 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74  ** The select st
1a6a0 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
1a6b0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
1a6c0 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65  ment is an aggre
1a6d0 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54  gate query..** T
1a6e0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 6d 65 6e  he second argmen
1a6f0 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61  t is the associa
1a700 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e  ted aggregate-in
1a710 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20  fo object. This 
1a720 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73  .** function tes
1a730 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  ts if the SELECT
1a740 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
1a750 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
1a760 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74  count(*) FROM <t
1a770 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  bl>.**.** where 
1a780 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62  table is a datab
1a790 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  ase table, not a
1a7a0 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
1a7b0 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72  iew. If the quer
1a7c0 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20  y.** does match 
1a7d0 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68  this pattern, th
1a7e0 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  en a pointer to 
1a7f0 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
1a800 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a   representing.**
1a810 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e   <tbl> is return
1a820 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
1a830 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1a840 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69  .static Table *i
1a850 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c  sSimpleCount(Sel
1a860 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20  ect *p, AggInfo 
1a870 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61  *pAggInfo){.  Ta
1a880 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70  ble *pTab;.  Exp
1a890 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73  r *pExpr;..  ass
1a8a0 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42  ert( !p->pGroupB
1a8b0 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  y );..  if( p->p
1a8c0 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69  Where || p->pELi
1a8d0 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20  st->nExpr!=1 .  
1a8e0 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72   || p->pSrc->nSr
1a8f0 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d  c!=1 || p->pSrc-
1a900 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20  >a[0].pSelect.  
1a910 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1a920 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d  .  }.  pTab = p-
1a930 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
1a940 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70  ;.  pExpr = p->p
1a950 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
1a960 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  r;.  assert( pTa
1a970 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c  b && !pTab->pSel
1a980 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a  ect && pExpr );.
1a990 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
1a9a0 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
1a9b0 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
1a9c0 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
1a9d0 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
1a9e0 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d    if( (pAggInfo-
1a9f0 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d  >aFunc[0].pFunc-
1aa00 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55  >flags&SQLITE_FU
1aa10 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72  NC_COUNT)==0 ) r
1aa20 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
1aa30 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44  Expr->flags&EP_D
1aa40 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
1aa50 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54   0;..  return pT
1aa60 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ab;.}../*.** If 
1aa70 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
1aa80 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61  item passed as a
1aa90 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61  n argument was a
1aaa0 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e  ugmented with an
1aab0 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63  .** INDEXED BY c
1aac0 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20  lause, then try 
1aad0 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70  to locate the sp
1aae0 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49  ecified index. I
1aaf0 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73  f there.** was s
1ab00 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64  uch a clause and
1ab10 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
1ab20 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
1ab30 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
1ab40 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65  ITE_ERROR and le
1ab50 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
1ab60 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73  pParse. Otherwis
1ab70 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20  e, populate .** 
1ab80 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e  pFrom->pIndex an
1ab90 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
1aba0 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
1abb0 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75  e3IndexedByLooku
1abc0 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
1abd0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1abe0 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  item *pFrom){.  
1abf0 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
1ac00 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78  && pFrom->zIndex
1ac10 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
1ac20 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
1ac30 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e  b;.    char *zIn
1ac40 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e  dex = pFrom->zIn
1ac50 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  dex;.    Index *
1ac60 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
1ac70 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
1ac80 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26   .        pIdx &
1ac90 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
1aca0 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49  (pIdx->zName, zI
1acb0 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20 20  ndex); .        
1acc0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
1acd0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
1ace0 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73  !pIdx ){.      s
1acf0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1ad00 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
1ad10 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64  index: %s", zInd
1ad20 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  ex, 0);.      pP
1ad30 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
1ad40 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  a = 1;.      ret
1ad50 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
1ad60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f  ;.    }.    pFro
1ad70 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  m->pIndex = pIdx
1ad80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1ad90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1ada0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1adb0 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c  is a Walker call
1adc0 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64  back for "expand
1add0 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74  ing" a SELECT st
1ade0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70  atement..** "Exp
1adf0 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f  anding" means to
1ae00 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   do the followin
1ae10 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  g:.**.**    (1) 
1ae20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20   Make sure VDBE 
1ae30 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
1ae40 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
1ae50 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20  d to every.**   
1ae60 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66        element of
1ae70 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1ae80 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
1ae90 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62  Fill in the pTab
1aea0 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  List->a[].pTab f
1aeb0 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63  ields in the Src
1aec0 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
1aed0 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52        defines FR
1aee0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e  OM clause.  When
1aef0 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e   views appear in
1af00 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1af10 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c  ,.**         fil
1af20 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  l pTabList->a[].
1af30 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63  pSelect with a c
1af40 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
1af50 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  T statement.**  
1af60 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c         that impl
1af70 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e  ements the view.
1af80 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65    A copy is made
1af90 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53   of the view's S
1afa0 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
1afb0 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68   statement so th
1afc0 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79  at we can freely
1afd0 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74   modify or delet
1afe0 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
1aff0 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68  .**         with
1b000 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f  out worrying abo
1b010 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68  ut messing up th
1b020 65 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70  e presistent rep
1b030 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20  resentation.**  
1b040 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69         of the vi
1b050 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  ew..**.**    (3)
1b060 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
1b070 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1b080 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68  to accomodate th
1b090 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
1b0a0 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20  d.**         on 
1b0b0 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e  joins and the ON
1b0c0 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
1b0d0 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a  e of joins..**.*
1b0e0 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74  *    (4)  Scan t
1b0f0 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
1b100 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
1b110 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f   set (pEList) lo
1b120 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oking.**        
1b130 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f   for instances o
1b140 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74  f the "*" operat
1b150 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e  or or the TABLE.
1b160 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20  * operator..**  
1b170 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c         If found,
1b180 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22   expand each "*"
1b190 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
1b1a0 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62  umn in every tab
1b1b0 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e  le.**         an
1b1c0 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20  d TABLE.* to be 
1b1d0 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
1b1e0 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61  TABLE..**.*/.sta
1b1f0 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78  tic int selectEx
1b200 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70  pander(Walker *p
1b210 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
1b220 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
1b230 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
1b240 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20  Parse;.  int i, 
1b250 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20  j, k;.  SrcList 
1b260 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70  *pTabList;.  Exp
1b270 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
1b280 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1b290 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73  item *pFrom;.  s
1b2a0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1b2b0 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
1b2c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1b2d0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1b2e0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20  WRC_Abort;.  }. 
1b2f0 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53   if( NEVER(p->pS
1b300 72 63 3d 3d 30 29 20 7c 7c 20 28 70 2d 3e 73 65  rc==0) || (p->se
1b310 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61  lFlags & SF_Expa
1b320 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  nded)!=0 ){.    
1b330 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
1b340 3b 0a 20 20 7d 0a 20 20 70 2d 3e 73 65 6c 46 6c  ;.  }.  p->selFl
1b350 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64  ags |= SF_Expand
1b360 65 64 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  ed;.  pTabList =
1b370 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
1b380 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
1b390 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
1b3a0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
1b3b0 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
1b3c0 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73  d to all entries
1b3d0 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f   in.  ** the FRO
1b3e0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1b3f0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1b400 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1b410 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
1b420 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61  sors(pParse, pTa
1b430 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  bList);..  /* Lo
1b440 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c  ok up every tabl
1b450 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
1b460 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1b470 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20  e select.  If.  
1b480 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  ** an entry of t
1b490 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
1b4a0 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73  s a subquery ins
1b4b0 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20  tead of a table 
1b4c0 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68  or view,.  ** th
1b4d0 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e  en create a tran
1b4e0 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
1b4f0 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62  cture to describ
1b500 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  e the subquery..
1b510 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
1b520 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
1b530 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
1b540 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
1b550 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
1b560 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46 72  Tab;.    if( pFr
1b570 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20  om->pTab!=0 ){. 
1b580 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61       /* This sta
1b590 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61  tement has alrea
1b5a0 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64  dy been prepared
1b5b0 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  .  There is no n
1b5c0 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  eed.      ** to 
1b5d0 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20  go further. */. 
1b5e0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d       assert( i==
1b5f0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1b600 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
1b610 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d   }.    if( pFrom
1b620 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69  ->zName==0 ){.#i
1b630 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b640 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20  T_SUBQUERY.     
1b650 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20   Select *pSel = 
1b660 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
1b670 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
1b680 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
1b690 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
1b6a0 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ECT */.      ass
1b6b0 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a  ert( pSel!=0 );.
1b6c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
1b6d0 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
1b6e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
1b6f0 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
1b700 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 70 46   pSel);.      pF
1b710 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
1b720 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1b730 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
1b740 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20  f(Table));.     
1b750 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
1b760 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
1b770 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65  .      pTab->nRe
1b780 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 61  f = 1;.      pTa
1b790 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
1b7a0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
1b7b0 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79 5f 25  qlite_subquery_%
1b7c0 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62  p_", (void*)pTab
1b7d0 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
1b7e0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20  pSel->pPrior ){ 
1b7f0 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
1b800 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c  ior; }.      sel
1b810 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  ectColumnsFromEx
1b820 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
1b830 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54  Sel->pEList, &pT
1b840 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
1b850 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54  >aCol);.      pT
1b860 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
1b870 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77        pTab->nRow
1b880 45 73 74 20 3d 20 31 30 30 30 30 30 30 3b 0a 20  Est = 1000000;. 
1b890 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c       pTab->tabFl
1b8a0 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
1b8b0 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ral;.#endif.    
1b8c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
1b8d0 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
1b8e0 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69  e or view name i
1b8f0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1b900 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
1b910 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
1b920 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
1b930 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
1b940 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b950 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
1b960 73 65 2c 30 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d  se,0,pFrom->zNam
1b970 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61  e,pFrom->zDataba
1b980 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  se);.      if( p
1b990 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
1b9a0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
1b9b0 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23   pTab->nRef++;.#
1b9c0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1b9d0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
1b9e0 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54   !defined (SQLIT
1b9f0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1ba00 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 70  BLE).      if( p
1ba10 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20  Tab->pSelect || 
1ba20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
1ba30 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
1ba40 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74   reach here if t
1ba50 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
1ba60 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65  s a really a vie
1ba70 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  w */.        if(
1ba80 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
1ba90 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
1baa0 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72  e, pTab) ) retur
1bab0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
1bac0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
1bad0 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
1bae0 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  ;.        pFrom-
1baf0 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
1bb00 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
1bb10 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pTab->pSelect, 0
1bb20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1bb30 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
1bb40 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65  lker, pFrom->pSe
1bb50 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  lect);.      }.#
1bb60 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
1bb70 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69   /* Locate the i
1bb80 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68  ndex named by th
1bb90 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  e INDEXED BY cla
1bba0 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a  use, if any. */.
1bbb0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1bbc0 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70  ndexedByLookup(p
1bbd0 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b  Parse, pFrom) ){
1bbe0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
1bbf0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  C_Abort;.    }. 
1bc00 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73   }..  /* Process
1bc10 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
1bc20 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53  s, and ON and US
1bc30 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a  ING clauses of j
1bc40 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  oins..  */.  if(
1bc50 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1bc60 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65  d || sqliteProce
1bc70 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70  ssJoin(pParse, p
1bc80 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1bc90 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
1bca0 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22    /* For every "
1bcb0 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  *" that occurs i
1bcc0 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
1bcd0 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  t, insert the na
1bce0 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20  mes of.  ** all 
1bcf0 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
1bd00 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20  ables.  And for 
1bd10 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e  every TABLE.* in
1bd20 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20  sert the names. 
1bd30 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d   ** of all colum
1bd40 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68  ns in TABLE.  Th
1bd50 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65  e parser inserte
1bd60 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72  d a special expr
1bd70 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68  ession.  ** with
1bd80 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72   the TK_ALL oper
1bd90 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a  ator for each "*
1bda0 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20  " that it found 
1bdb0 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
1bdc0 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c  st..  ** The fol
1bdd0 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74  lowing code just
1bde0 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74   has to locate t
1bdf0 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73  he TK_ALL expres
1be00 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64  sions and expand
1be10 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74  .  ** each one t
1be20 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
1be30 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
1be40 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
1be50 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f  ** The first loo
1be60 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f  p just checks to
1be70 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
1be80 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74  e any "*" operat
1be90 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65  ors.  ** that ne
1bea0 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20  ed expanding..  
1beb0 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  */.  for(k=0; k<
1bec0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
1bed0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
1bee0 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d  E = pEList->a[k]
1bef0 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
1bf00 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  pE->op==TK_ALL )
1bf10 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65   break;.    asse
1bf20 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
1bf30 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74  OT || pE->pRight
1bf40 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
1bf50 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
1bf60 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21  T || (pE->pLeft!
1bf70 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d  =0 && pE->pLeft-
1bf80 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20  >op==TK_ID) );. 
1bf90 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
1bfa0 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69  K_DOT && pE->pRi
1bfb0 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  ght->op==TK_ALL 
1bfc0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
1bfd0 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
1bfe0 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
1bff0 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
1c000 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
1c010 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
1c020 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
1c030 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
1c040 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
1c050 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
1c060 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
1c070 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
1c080 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
1c090 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
1c0a0 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
1c0b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
1c0c0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1c0d0 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
1c0e0 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
1c0f0 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e  pNew = 0;.    in
1c100 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65  t flags = pParse
1c110 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ->db->flags;.   
1c120 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d   int longNames =
1c130 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1c140 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
1c150 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
1c160 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67          && (flag
1c170 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
1c180 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20  ColNames)==0;.. 
1c190 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45     for(k=0; k<pE
1c1a0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
1c1b0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
1c1c0 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  E = a[k].pExpr;.
1c1d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1c1e0 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
1c1f0 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b  pE->pRight!=0 );
1c200 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  .      if( pE->o
1c210 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45  p!=TK_ALL && (pE
1c220 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
1c230 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d  pE->pRight->op!=
1c240 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20  TK_ALL) ){.     
1c250 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
1c260 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
1c270 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
1c280 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
1c290 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1c2a0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
1c2b0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
1c2c0 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b  Parse, pNew, a[k
1c2d0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
1c2e0 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
1c2f0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
1c300 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
1c310 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
1c320 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e;.          pNe
1c330 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
1c340 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d  -1].zSpan = a[k]
1c350 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20  .zSpan;.        
1c360 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
1c370 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
1c380 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20  .zSpan = 0;.    
1c390 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b      }.        a[
1c3a0 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  k].pExpr = 0;.  
1c3b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c3c0 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
1c3d0 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
1c3e0 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
1c3f0 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
1c400 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
1c410 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
1c420 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
1c430 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
1c440 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
1c450 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
1c460 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20  char *zTName;   
1c470 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74           /* text
1c480 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c   of name of TABL
1c490 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  E */.        if(
1c4a0 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
1c4b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
1c4c0 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d  ert( pE->pLeft!=
1c4d0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
1c4e0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1c4f0 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66  roperty(pE->pLef
1c500 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  t, EP_IntValue) 
1c510 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  );.          zTN
1c520 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d  ame = pE->pLeft-
1c530 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
1c540 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c550 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a      zTName = 0;.
1c560 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c570 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
1c580 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
1c590 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
1c5a0 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
1c5b0 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a           Table *
1c5c0 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
1c5d0 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  ab;.          ch
1c5e0 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
1c5f0 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  From->zAlias;.  
1c600 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
1c610 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
1c620 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20         zTabName 
1c630 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
1c640 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1c650 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
1c660 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
1c670 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  k;.          if(
1c680 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74   zTName && sqlit
1c690 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65  e3StrICmp(zTName
1c6a0 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29  , zTabName)!=0 )
1c6b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
1c6c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1c6d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61    }.          ta
1c6e0 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20  bleSeen = 1;.   
1c6f0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
1c700 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
1c710 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
1c720 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 52  Expr *pExpr, *pR
1c730 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
1c740 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
1c750 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
1c760 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
1c770 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b   char *zColname;
1c780 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65    /* The compute
1c790 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  d column name */
1c7a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
1c7b0 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a  r *zToFree;   /*
1c7c0 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67   Malloced string
1c7d0 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
1c7e0 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20  e freed */.     
1c7f0 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f         Token sCo
1c800 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75  lname;  /* Compu
1c810 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ted column name 
1c820 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20  as a token */.. 
1c830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1c840 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72   a column is mar
1c850 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 20  ked as 'hidden' 
1c860 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20  (currently only 
1c870 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
1c880 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74       ** for virt
1c890 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20  ual tables), do 
1c8a0 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69  not include it i
1c8b0 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20  n the expanded. 
1c8c0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65             ** re
1c8d0 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20  sult-set list.. 
1c8e0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
1c8f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73            if( Is
1c900 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54  HiddenColumn(&pT
1c910 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a  ab->aCol[j]) ){.
1c920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1c930 73 65 72 74 28 49 73 56 69 72 74 75 61 6c 28 70  sert(IsVirtual(p
1c940 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Tab));.         
1c950 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1c960 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20             }..  
1c970 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
1c980 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29  0 && zTName==0 )
1c990 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1c9a0 69 66 28 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e  if( (pFrom->join
1c9b0 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
1c9c0 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  L)!=0.          
1c9d0 20 20 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e        && tableAn
1c9e0 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61  dColumnIndex(pTa
1c9f0 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c  bList, i, zName,
1ca00 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20   0, 0).         
1ca10 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1ca20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
1ca30 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
1ca40 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
1ca50 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
1ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1ca70 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69   table to the ri
1ca80 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ght of the join 
1ca90 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1caa0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1cab0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1cac0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
1cad0 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
1cae0 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c  x(pFrom->pUsing,
1caf0 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
1cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cb10 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20   In a join with 
1cb20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20  a USING clause, 
1cb30 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  omit columns in 
1cb40 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
1cb50 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61      ** using cla
1cb60 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62  use from the tab
1cb70 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  le on the right.
1cb80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1cb90 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1cba0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1cbb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1cbc0 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
1cbd0 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
1cbe0 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a   TK_ID, zName);.
1cbf0 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
1cc00 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  name = zName;.  
1cc10 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
1cc20 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
1cc30 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73     if( longNames
1cc40 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   || pTabList->nS
1cc50 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rc>1 ){.        
1cc60 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
1cc70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
1cc80 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
1cc90 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
1cca0 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zTabName);.     
1ccb0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
1ccc0 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
1ccd0 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
1cce0 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b  eft, pRight, 0);
1ccf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1cd00 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a  f( longNames ){.
1cd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74  zColname = sqlit
1cd30 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
1cd40 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c  s.%s", zTabName,
1cd50 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
1cd60 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65           zToFree
1cd70 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20   = zColname;.   
1cd80 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1cd90 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1cdb0 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  xpr = pRight;.  
1cdc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1cdd0 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
1cde0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
1cdf0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
1ce00 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  w, pExpr);.     
1ce10 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e         sColname.
1ce20 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20  z = zColname;.  
1ce30 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61            sColna
1ce40 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  me.n = sqlite3St
1ce50 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65 29  rlen30(zColname)
1ce60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
1ce70 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
1ce80 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65  Name(pParse, pNe
1ce90 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29  w, &sColname, 0)
1cea0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
1ceb0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1cec0 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20  zToFree);.      
1ced0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1cee0 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62          if( !tab
1cef0 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20  leSeen ){.      
1cf00 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29      if( zTName )
1cf10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1cf20 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1cf30 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
1cf40 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d  able: %s", zTNam
1cf50 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  e);.          }e
1cf60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1cf70 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1cf80 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62  (pParse, "no tab
1cf90 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b  les specified");
1cfa0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1cfb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1cfc0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1cfd0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
1cfe0 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b, pEList);.    
1cff0 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77  p->pEList = pNew
1d000 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  ;.  }.#if SQLITE
1d010 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66  _MAX_COLUMN.  if
1d020 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
1d030 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ->pEList->nExpr>
1d040 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
1d050 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
1d060 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1d070 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1d080 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
1d090 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29   in result set")
1d0a0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
1d0b0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
1d0c0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d  ue;.}../*.** No-
1d0d0 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74  op routine for t
1d0e0 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61  he parse-tree wa
1d0f0 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  lker..**.** When
1d100 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1d110 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70   the Walker.xExp
1d120 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65  rCallback then e
1d130 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a  xpression trees.
1d140 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69  ** are walked wi
1d150 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e  thout any action
1d160 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74  s being taken at
1d170 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65   each node.  Pre
1d180 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e  sumably,.** when
1d190 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1d1a0 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72   used for Walker
1d1b0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74  .xExprCallback t
1d1c0 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78  hen .** Walker.x
1d1d0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69  SelectCallback i
1d1e0 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65  s set to do some
1d1f0 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72  thing useful for
1d200 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75   every .** subqu
1d210 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65  ery in the parse
1d220 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  r tree..*/.stati
1d230 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f  c int exprWalkNo
1d240 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73  op(Walker *NotUs
1d250 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65  ed, Expr *NotUse
1d260 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
1d270 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
1d280 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
1d290 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
1d2a0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ue;.}../*.** Thi
1d2b0 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e  s routine "expan
1d2c0 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ds" a SELECT sta
1d2d0 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f  tement and all o
1d2e0 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73  f its subqueries
1d2f0 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f  ..** For additio
1d300 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
1d310 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73  on what it means
1d320 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53   to "expand" a S
1d330 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
1d340 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d  nt, see the comm
1d350 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63  ent on the selec
1d360 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63  tExpand worker c
1d370 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a  allback above..*
1d380 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61  *.** Expanding a
1d390 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1d3a0 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  t is the first s
1d3b0 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e  tep in processin
1d3c0 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  g a.** SELECT st
1d3d0 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45  atement.  The SE
1d3e0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d  LECT statement m
1d3f0 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20  ust be expanded 
1d400 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72  before.** name r
1d410 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72  esolution is per
1d420 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  formed..**.** If
1d430 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
1d440 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d  rong, an error m
1d450 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65  essage is writte
1d460 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a  n into pParse..*
1d470 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
1d480 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63  nction can detec
1d490 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79  t the problem by
1d4a0 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72   looking at pPar
1d4b0 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f  se->nErr.** and/
1d4c0 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  or pParse->db->m
1d4d0 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a  allocFailed..*/.
1d4e0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
1d4f0 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
1d500 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1d510 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
1d520 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
1d530 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
1d540 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65   = selectExpande
1d550 72 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  r;.  w.xExprCall
1d560 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e  back = exprWalkN
1d570 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
1d580 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  = pParse;.  sqli
1d590 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
1d5a0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a  , pSelect);.}...
1d5b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d5c0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
1d5d0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c  ** This is a Wal
1d5e0 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
1d5f0 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ack callback for
1d600 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65   the sqlite3Sele
1d610 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20  ctTypeInfo().** 
1d620 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
1d630 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63   For each FROM-c
1d640 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20  lause subquery, 
1d650 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  add Column.zType
1d660 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c   and Column.zCol
1d670 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
1d680 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74   to the Table st
1d690 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
1d6a0 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
1d6b0 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61  lt set.** of tha
1d6c0 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  t subquery..**.*
1d6d0 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
1d6e0 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
1d6f0 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
1d700 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75   set was constru
1d710 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63  cted.** by selec
1d720 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20  tExpander() but 
1d730 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c  the type and col
1d740 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  lation informati
1d750 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a  on was omitted.*
1d760 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  * at that point 
1d770 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69  because identifi
1d780 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ers had not yet 
1d790 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20  been resolved.  
1d7a0 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
1d7b0 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
1d7c0 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c  identifier resol
1d7d0 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
1d7e0 20 69 6e 74 20 73 65 6c 65 63 74 41 64 64 53 75   int selectAddSu
1d7f0 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57  bqueryTypeInfo(W
1d800 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
1d810 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
1d820 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69  rse *pParse;.  i
1d830 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20  nt i;.  SrcList 
1d840 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72  *pTabList;.  str
1d850 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1d860 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65   *pFrom;..  asse
1d870 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
1d880 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b  & SF_Resolved );
1d890 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1d8a0 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
1d8b0 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Info)==0 ){.    
1d8c0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
1d8d0 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20  F_HasTypeInfo;. 
1d8e0 20 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c     pParse = pWal
1d8f0 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  ker->pParse;.   
1d900 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
1d910 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Src;.    for(i=0
1d920 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
1d930 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
1d940 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
1d950 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  m++){.      Tabl
1d960 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
1d970 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  >pTab;.      if(
1d980 20 41 4c 57 41 59 53 28 70 54 61 62 21 3d 30 29   ALWAYS(pTab!=0)
1d990 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c   && (pTab->tabFl
1d9a0 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
1d9b0 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
1d9c0 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
1d9d0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1d9e0 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
1d9f0 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63  */.        Selec
1da00 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d  t *pSel = pFrom-
1da10 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
1da20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 20 29    assert( pSel )
1da30 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
1da40 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20   pSel->pPrior ) 
1da50 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
1da60 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73 65 6c  ior;.        sel
1da70 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
1da80 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
1da90 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c  rse, pTab->nCol,
1daa0 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53 65   pTab->aCol, pSe
1dab0 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
1dac0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
1dad0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 23  RC_Continue;.}.#
1dae0 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
1daf0 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20  is routine adds 
1db00 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c  datatype and col
1db10 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1db20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a  information to.*
1db30 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  * the Table stru
1db40 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52  ctures of all FR
1db50 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
1db60 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c  ries in a.** SEL
1db70 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
1db80 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f  *.** Use this ro
1db90 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65  utine after name
1dba0 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a   resolution..*/.
1dbb0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
1dbc0 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65  te3SelectAddType
1dbd0 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
1dbe0 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
1dbf0 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ect){.#ifndef SQ
1dc00 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1dc10 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  RY.  Walker w;. 
1dc20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
1dc30 63 6b 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75  ck = selectAddSu
1dc40 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a  bqueryTypeInfo;.
1dc50 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
1dc60 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70  k = exprWalkNoop
1dc70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
1dc80 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
1dc90 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
1dca0 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a  Select);.#endif.
1dcb0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
1dcc0 6f 75 74 69 6e 65 20 73 65 74 73 20 6f 66 20 61  outine sets of a
1dcd0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1dce0 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
1dcf0 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  .  The.** follow
1dd00 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73  ing is accomplis
1dd10 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  hed:.**.**     *
1dd20 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75    VDBE Cursor nu
1dd30 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e  mbers are assign
1dd40 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63  ed to all FROM-c
1dd50 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  lause terms..** 
1dd60 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c      *  Ephemeral
1dd70 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61   Table objects a
1dd80 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
1dd90 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
1dda0 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20  ubqueries..**   
1ddb0 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e    *  ON and USIN
1ddc0 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68  G clauses are sh
1ddd0 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45  ifted into WHERE
1dde0 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20   statements.**  
1ddf0 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20     *  Wildcards 
1de00 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a  "*" and "TABLE.*
1de10 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73  " in result sets
1de20 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a   are expanded..*
1de30 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66  *     *  Identif
1de40 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69  iers in expressi
1de50 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74  on are matched t
1de60 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  o tables..**.** 
1de70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  This routine act
1de80 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  s recursively on
1de90 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20   all subqueries 
1dea0 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43  within the SELEC
1deb0 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
1dec0 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20  e3SelectPrep(.  
1ded0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1dee0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1def0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
1df00 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
1df10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1df20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1df30 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
1df40 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
1df50 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d  pOuterNC  /* Nam
1df60 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f  e context for co
1df70 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20  ntainer */.){.  
1df80 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1df90 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
1dfa0 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20   return;.  db = 
1dfb0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
1dfc0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
1dfd0 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29  SF_HasTypeInfo )
1dfe0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
1dff0 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70  e3SelectExpand(p
1e000 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28  Parse, p);.  if(
1e010 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
1e020 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1e030 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  d ) return;.  sq
1e040 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65  lite3ResolveSele
1e050 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  ctNames(pParse, 
1e060 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20  p, pOuterNC);.  
1e070 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1e080 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1e090 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
1e0a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
1e0b0 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65  dTypeInfo(pParse
1e0c0 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , p);.}../*.** R
1e0d0 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
1e0e0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  te accumulator..
1e0f0 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67  **.** The aggreg
1e100 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
1e110 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f  is a set of memo
1e120 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f  ry cells that ho
1e130 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61  ld.** intermedia
1e140 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65  te results while
1e150 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20   calculating an 
1e160 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73  aggregate.  This
1e170 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d 70  .** routine simp
1e180 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20  ly stores NULLs 
1e190 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20  in all of those 
1e1a0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f  memory cells..*/
1e1b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
1e1c0 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  etAccumulator(Pa
1e1d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
1e1e0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
1e1f0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1e200 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1e210 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
1e220 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e  gInfo_func *pFun
1e230 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66  c;.  if( pAggInf
1e240 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66  o->nFunc+pAggInf
1e250 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  o->nColumn==0 ){
1e260 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1e270 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
1e280 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
1e290 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
1e2a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e2b0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67  OP_Null, 0, pAgg
1e2c0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
1e2d0 65 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70  em);.  }.  for(p
1e2e0 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  Func=pAggInfo->a
1e2f0 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67  Func, i=0; i<pAg
1e300 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
1e310 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20  +, pFunc++){.   
1e320 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e330 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1e340 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b 0a  , pFunc->iMem);.
1e350 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69      if( pFunc->i
1e360 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20  Distinct>=0 ){. 
1e370 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
1e380 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20  pFunc->pExpr;.  
1e390 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1e3a0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c  rHasProperty(pE,
1e3b0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
1e3c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
1e3d0 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45  x.pList==0 || pE
1e3e0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
1e3f0 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
1e400 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1e410 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54  Parse, "DISTINCT
1e420 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74   aggregates must
1e430 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e   have exactly on
1e440 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  e ".           "
1e450 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20  argument");.    
1e460 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74      pFunc->iDist
1e470 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
1e480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e490 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1e4a0 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
1e4b0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
1e4c0 70 45 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pE->x.pList);.  
1e4d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e4e0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
1e4f0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75  enEphemeral, pFu
1e500 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30  nc->iDistinct, 0
1e510 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1e520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1e530 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
1e540 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
1e550 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FF);.      }.   
1e560 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1e570 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67  Invoke the OP_Ag
1e580 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65  gFinalize opcode
1e590 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65   for every aggre
1e5a0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  gate function.**
1e5b0 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20   in the AggInfo 
1e5c0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
1e5d0 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69  atic void finali
1e5e0 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50  zeAggFunctions(P
1e5f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
1e600 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
1e610 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1e620 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1e630 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
1e640 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
1e650 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
1e660 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
1e670 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
1e680 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
1e690 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
1e6a0 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
1e6b0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
1e6c0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1e6d0 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
1e6e0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
1e6f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1e700 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67  eAddOp4(v, OP_Ag
1e710 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d  gFinal, pF->iMem
1e720 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  , pList ? pList-
1e730 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20  >nExpr : 0, 0,. 
1e740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e750 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e       (void*)pF->
1e760 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
1e770 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  F);.  }.}../*.**
1e780 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75   Update the accu
1e790 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63  mulator memory c
1e7a0 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72  ells for an aggr
1e7b0 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a  egate based on.*
1e7c0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  * the current cu
1e7d0 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
1e7e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70  /.static void up
1e7f0 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
1e800 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
1e810 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1e820 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1e830 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1e840 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1e850 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
1e860 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
1e870 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70  fo_col *pC;..  p
1e880 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
1e890 6f 64 65 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74  ode = 1;.  sqlit
1e8a0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
1e8b0 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28  (pParse);.  for(
1e8c0 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
1e8d0 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
1e8e0 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
1e8f0 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20   pF++){.    int 
1e900 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64  nArg;.    int ad
1e910 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  drNext = 0;.    
1e920 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20  int regAgg;.    
1e930 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
1e940 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
1e950 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
1e960 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1e970 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
1e980 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
1e990 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a     if( pList ){.
1e9a0 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69        nArg = pLi
1e9b0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
1e9c0 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65   regAgg = sqlite
1e9d0 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
1e9e0 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20  arse, nArg);.   
1e9f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1ea00 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
1ea10 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67  e, pList, regAgg
1ea20 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 1);.    }else{
1ea30 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b  .      nArg = 0;
1ea40 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20  .      regAgg = 
1ea50 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
1ea60 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d   pF->iDistinct>=
1ea70 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e  0 ){.      addrN
1ea80 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ext = sqlite3Vdb
1ea90 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1eaa0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72       assert( nAr
1eab0 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63 6f  g==1 );.      co
1eac0 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73  deDistinct(pPars
1ead0 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  e, pF->iDistinct
1eae0 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72  , addrNext, 1, r
1eaf0 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20  egAgg);.    }.  
1eb00 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d    if( pF->pFunc-
1eb10 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1eb20 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b  FUNC_NEEDCOLL ){
1eb30 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
1eb40 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  pColl = 0;.     
1eb50 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1eb60 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1eb70 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
1eb80 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
1eb90 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d  0 );  /* pList!=
1eba0 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68  0 if pF->pFunc h
1ebb0 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20  as NEEDCOLL */. 
1ebc0 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
1ebd0 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70  tem=pList->a; !p
1ebe0 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20  Coll && j<nArg; 
1ebf0 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
1ec00 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
1ec10 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1ec20 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
1ec30 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >pExpr);.      }
1ec40 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
1ec50 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
1ec60 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
1ec70 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
1ec80 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1ec90 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1eca0 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
1ecb0 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
1ecc0 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
1ecd0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1ece0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1ecf0 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65  P_AggStep, 0, re
1ed00 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a  gAgg, pF->iMem,.
1ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d        (void*)pF-
1ed30 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
1ed40 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EF);.    sqlite3
1ed50 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
1ed60 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73  (u8)nArg);.    s
1ed70 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
1ed80 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
1ed90 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
1eda0 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
1edb0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
1edc0 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
1edd0 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20   nArg);.    if( 
1ede0 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20  addrNext ){.    
1edf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1ee00 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
1ee10 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71  rNext);.      sq
1ee20 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
1ee30 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
1ee40 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66   }.  }..  /* Bef
1ee50 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74  ore populating t
1ee60 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  he accumulator r
1ee70 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20  egisters, clear 
1ee80 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1ee90 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  ..  ** Otherwise
1eea0 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  , if any of the 
1eeb0 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20  required column 
1eec0 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61  values are alrea
1eed0 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a  dy present .  **
1eee0 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73   in registers, s
1eef0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
1ef00 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70   may use OP_SCop
1ef10 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61  y to copy the va
1ef20 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e  lue.  ** to pC->
1ef30 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65  iMem. But by the
1ef40 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20   time the value 
1ef50 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69  is used, the ori
1ef60 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20  ginal register. 
1ef70 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65   ** may have bee
1ef80 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61  n used, invalida
1ef90 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79  ting the underly
1efa0 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69  ing buffer holdi
1efb0 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74  ng the.  ** text
1efc0 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20   or blob value. 
1efd0 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30  See ticket [8830
1efe0 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20  34dcb5]..  **.  
1eff0 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74  ** Another solut
1f000 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ion would be to 
1f010 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43  change the OP_SC
1f020 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79  opy used to copy
1f030 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c   cached.  ** val
1f040 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70  ues to an OP_Cop
1f050 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
1f060 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
1f070 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69  pParse);.  for(i
1f080 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d  =0, pC=pAggInfo-
1f090 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66  >aCol; i<pAggInf
1f0a0 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b  o->nAccumulator;
1f0b0 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20   i++, pC++){.   
1f0c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f0d0 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78  (pParse, pC->pEx
1f0e0 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20  pr, pC->iMem);. 
1f0f0 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64   }.  pAggInfo->d
1f100 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20  irectMode = 0;. 
1f110 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1f120 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
1f130 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1f140 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53  e code for the S
1f150 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1f160 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61  given in the p a
1f170 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  rgument.  .**.**
1f180 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
1f190 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
1f1a0 76 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70  various ways dep
1f1b0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a  ending on the.**
1f1c0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1f1d0 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75   SelectDest stru
1f1e0 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
1f1f0 20 62 79 20 61 72 67 75 6d 65 6e 74 20 70 44 65   by argument pDe
1f200 73 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73  st.** as follows
1f210 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73  :.**.**     pDes
1f220 74 2d 3e 65 44 65 73 74 20 20 20 20 52 65 73 75  t->eDest    Resu
1f230 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d  lt.**     ------
1f240 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
1f250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f270 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54  -----.**     SRT
1f280 5f 4f 75 74 70 75 74 20 20 20 20 20 20 47 65 6e  _Output      Gen
1f290 65 72 61 74 65 20 61 20 72 6f 77 20 6f 66 20 6f  erate a row of o
1f2a0 75 74 70 75 74 20 28 75 73 69 6e 67 20 74 68 65  utput (using the
1f2b0 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 0a 2a 2a   OP_ResultRow.**
1f2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2d0 20 20 20 20 20 6f 70 63 6f 64 65 29 20 66 6f 72       opcode) for
1f2e0 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65   each row in the
1f2f0 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a   result set..**.
1f300 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20  **     SRT_Mem  
1f310 20 20 20 20 20 20 20 4f 6e 6c 79 20 76 61 6c 69         Only vali
1f320 64 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20  d if the result 
1f330 69 73 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  is a single colu
1f340 6d 6e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  mn..**          
1f350 20 20 20 20 20 20 20 20 20 20 20 53 74 6f 72 65             Store
1f360 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d   the first colum
1f370 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  n of the first r
1f380 65 73 75 6c 74 20 72 6f 77 0a 2a 2a 20 20 20 20  esult row.**    
1f390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3a0 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 44 65   in register pDe
1f3b0 73 74 2d 3e 69 50 61 72 6d 20 74 68 65 6e 20 61  st->iParm then a
1f3c0 62 61 6e 64 6f 6e 20 74 68 65 20 72 65 73 74 0a  bandon the rest.
1f3d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1f3e0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 71 75         of the qu
1f3f0 65 72 79 2e 20 20 54 68 69 73 20 64 65 73 74 69  ery.  This desti
1f400 6e 61 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 22  nation implies "
1f410 4c 49 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20  LIMIT 1"..**.** 
1f420 20 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20      SRT_Set     
1f430 20 20 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d      The result m
1f440 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ust be a single 
1f450 63 6f 6c 75 6d 6e 2e 20 20 53 74 6f 72 65 20 65  column.  Store e
1f460 61 63 68 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ach.**          
1f470 20 20 20 20 20 20 20 20 20 20 20 72 6f 77 20 6f             row o
1f480 66 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20  f result as the 
1f490 6b 65 79 20 69 6e 20 74 61 62 6c 65 20 70 44 65  key in table pDe
1f4a0 73 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20 20  st->iParm. .**  
1f4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4c0 20 20 20 41 70 70 6c 79 20 74 68 65 20 61 66 66     Apply the aff
1f4d0 69 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66 66  inity pDest->aff
1f4e0 69 6e 69 74 79 20 62 65 66 6f 72 65 20 73 74 6f  inity before sto
1f4f0 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  ring.**         
1f500 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75              resu
1f510 6c 74 73 2e 20 20 55 73 65 64 20 74 6f 20 69 6d  lts.  Used to im
1f520 70 6c 65 6d 65 6e 74 20 22 49 4e 20 28 53 45 4c  plement "IN (SEL
1f530 45 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a  ECT ...)"..**.**
1f540 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20       SRT_Union  
1f550 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
1f560 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61  ts as a key in a
1f570 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1f580 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a   pDest->iParm..*
1f590 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63  *.**     SRT_Exc
1f5a0 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20  ept      Remove 
1f5b0 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65  results from the
1f5c0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1f5d0 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a   pDest->iParm..*
1f5e0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62  *.**     SRT_Tab
1f5f0 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72  le       Store r
1f600 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72  esults in tempor
1f610 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d  ary table pDest-
1f620 3e 69 50 61 72 6d 2e 0a 2a 2a 20 20 20 20 20 20  >iParm..**      
1f630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
1f640 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54 5f  his is like SRT_
1f650 45 70 68 65 6d 54 61 62 20 65 78 63 65 70 74 20  EphemTab except 
1f660 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 0a 2a  that the table.*
1f670 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1f680 20 20 20 20 20 20 69 73 20 61 73 73 75 6d 65 64        is assumed
1f690 20 74 6f 20 61 6c 72 65 61 64 79 20 62 65 20 6f   to already be o
1f6a0 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  pen..**.**     S
1f6b0 52 54 5f 45 70 68 65 6d 54 61 62 20 20 20 20 43  RT_EphemTab    C
1f6c0 72 65 61 74 65 20 61 6e 20 74 65 6d 70 6f 72 61  reate an tempora
1f6d0 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  ry table pDest->
1f6e0 69 50 61 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a  iParm and store.
1f6f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1f700 20 20 20 20 20 20 20 74 68 65 20 72 65 73 75 6c         the resul
1f710 74 20 74 68 65 72 65 2e 20 54 68 65 20 63 75 72  t there. The cur
1f720 73 6f 72 20 69 73 20 6c 65 66 74 20 6f 70 65 6e  sor is left open
1f730 20 61 66 74 65 72 0a 2a 2a 20 20 20 20 20 20 20   after.**       
1f740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1f750 74 75 72 6e 69 6e 67 2e 20 20 54 68 69 73 20 69  turning.  This i
1f760 73 20 6c 69 6b 65 20 53 52 54 5f 54 61 62 6c 65  s like SRT_Table
1f770 20 65 78 63 65 70 74 20 74 68 61 74 0a 2a 2a 20   except that.** 
1f780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f790 20 20 20 20 74 68 69 73 20 64 65 73 74 69 6e 61      this destina
1f7a0 74 69 6f 6e 20 75 73 65 73 20 4f 50 5f 4f 70 65  tion uses OP_Ope
1f7b0 6e 45 70 68 65 6d 65 72 61 6c 20 74 6f 20 63 72  nEphemeral to cr
1f7c0 65 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  eate.**         
1f7d0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
1f7e0 74 61 62 6c 65 20 66 69 72 73 74 2e 0a 2a 2a 0a  table first..**.
1f7f0 2a 2a 20 20 20 20 20 53 52 54 5f 43 6f 72 6f 75  **     SRT_Corou
1f800 74 69 6e 65 20 20 20 47 65 6e 65 72 61 74 65 20  tine   Generate 
1f810 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61  a co-routine tha
1f820 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20  t returns a new 
1f830 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  row of.**       
1f840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1f850 73 75 6c 74 73 20 65 61 63 68 20 74 69 6d 65 20  sults each time 
1f860 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20  it is invoked.  
1f870 54 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74 0a  The entry point.
1f880 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1f890 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
1f8a0 2d 72 6f 75 74 69 6e 65 20 69 73 20 73 74 6f 72  -routine is stor
1f8b0 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 70  ed in register p
1f8c0 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a  Dest->iParm..**.
1f8d0 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 69 73 74  **     SRT_Exist
1f8e0 73 20 20 20 20 20 20 53 74 6f 72 65 20 61 20 31  s      Store a 1
1f8f0 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
1f900 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 69 66 20  pDest->iParm if 
1f910 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20  the result.**   
1f920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f930 20 20 73 65 74 20 69 73 20 6e 6f 74 20 65 6d 70    set is not emp
1f940 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  ty..**.**     SR
1f950 54 5f 44 69 73 63 61 72 64 20 20 20 20 20 54 68  T_Discard     Th
1f960 72 6f 77 20 74 68 65 20 72 65 73 75 6c 74 73 20  row the results 
1f970 61 77 61 79 2e 20 20 54 68 69 73 20 69 73 20 75  away.  This is u
1f980 73 65 64 20 62 79 20 53 45 4c 45 43 54 0a 2a 2a  sed by SELECT.**
1f990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9a0 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 73 20       statements 
1f9b0 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73 20  within triggers 
1f9c0 77 68 6f 73 65 20 6f 6e 6c 79 20 70 75 72 70 6f  whose only purpo
1f9d0 73 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20  se is.**        
1f9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
1f9f0 20 73 69 64 65 2d 65 66 66 65 63 74 73 20 6f 66   side-effects of
1fa00 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a   functions..**.*
1fa10 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
1fa20 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
1fa30 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
1fa40 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a   any errors are.
1fa50 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
1fa60 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  then an appropri
1fa70 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ate error messag
1fa80 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20  e is left in.** 
1fa90 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
1faa0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1fab0 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65  ine does NOT fre
1fac0 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  e the Select str
1fad0 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e  ucture passed in
1fae0 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
1faf0 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73  g function needs
1fb00 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
1fb10 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
1fb20 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
1fb30 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
1fb40 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
1fb50 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
1fb60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1fb70 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
1fb80 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
1fb90 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  d. */.  SelectDe
1fba0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f  st *pDest      /
1fbb0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
1fbc0 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  h the query resu
1fbd0 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
1fbe0 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
1fbf0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1fc00 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ers */.  WhereIn
1fc10 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
1fc20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73  /* Return from s
1fc30 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1fc40 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  () */.  Vdbe *v;
1fc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fc60 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
1fc70 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73  chine under cons
1fc80 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
1fc90 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20  t isAgg;        
1fca0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1fcb0 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69   select lists li
1fcc0 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f  ke "count(*)" */
1fcd0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1fce0 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ist;      /* Lis
1fcf0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
1fd00 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72  extract. */.  Sr
1fd10 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
1fd20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1fd30 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74  tables to select
1fd40 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20   from */.  Expr 
1fd50 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
1fd60 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
1fd70 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
1fd80 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
1fd90 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
1fda0 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
1fdb0 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
1fdc0 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
1fdd0 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20  st *pGroupBy;   
1fde0 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59   /* The GROUP BY
1fdf0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
1fe00 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
1fe10 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20  *pHaving;       
1fe20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20    /* The HAVING 
1fe30 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
1fe40 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73  NULL */.  int is
1fe50 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
1fe60 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
1fe70 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
1fe80 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
1fe90 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20   int distinct;  
1fea0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1feb0 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
1fec0 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a  distinct set */.
1fed0 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20    int rc = 1;   
1fee0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1fef0 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d  e to return from
1ff00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
1ff10 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74  /.  int addrSort
1ff20 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41 64  Index;     /* Ad
1ff30 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f  dress of an OP_O
1ff40 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
1ff50 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 41 67  truction */.  Ag
1ff60 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20  gInfo sAggInfo; 
1ff70 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
1ff80 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72  ion used by aggr
1ff90 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f  egate queries */
1ffa0 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20  .  int iEnd;    
1ffb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1ffc0 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20  ress of the end 
1ffd0 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  of the query */.
1ffe0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
1fff0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20000 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
20010 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ion */..#ifndef 
20020 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
20030 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73 74 6f  AIN.  int iResto
20040 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61  reSelectId = pPa
20050 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a  rse->iSelectId;.
20060 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63    pParse->iSelec
20070 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e  tId = pParse->iN
20080 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23  extSelectId++;.#
20090 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20 70 50  endif..  db = pP
200a0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
200b0 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
200c0 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
200d0 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
200e0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
200f0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
20100 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
20110 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
20120 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , 0) ) return 1;
20130 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49  .  memset(&sAggI
20140 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  nfo, 0, sizeof(s
20150 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 69 66  AggInfo));..  if
20160 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72  ( IgnorableOrder
20170 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
20180 20 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65   assert(pDest->e
20190 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73  Dest==SRT_Exists
201a0 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
201b0 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a  ==SRT_Union || .
201c0 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
201d0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63  ->eDest==SRT_Exc
201e0 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ept || pDest->eD
201f0 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64  est==SRT_Discard
20200 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44  );.    /* If ORD
20210 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64  ER BY makes no d
20220 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65  ifference in the
20230 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69   output then nei
20240 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a  ther does.    **
20250 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20   DISTINCT so it 
20260 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74  can be removed t
20270 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  oo. */.    sqlit
20280 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
20290 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
202a0 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  );.    p->pOrder
202b0 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73  By = 0;.    p->s
202c0 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
202d0 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73  istinct;.  }.  s
202e0 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
202f0 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a  (pParse, p, 0);.
20300 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
20310 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54 61 62  pOrderBy;.  pTab
20320 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
20330 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
20340 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 50 61 72  List;.  if( pPar
20350 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
20360 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
20370 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
20380 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 73 41 67 67  end;.  }.  isAgg
20390 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20   = (p->selFlags 
203a0 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21  & SF_Aggregate)!
203b0 3d 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  =0;.  assert( pE
203c0 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  List!=0 );..  /*
203d0 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e   Begin generatin
203e0 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76  g code..  */.  v
203f0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
20400 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
20410 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c   v==0 ) goto sel
20420 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49  ect_end;..  /* I
20430 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d  f writing to mem
20440 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e  ory or generatin
20450 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c  g a set.  ** onl
20460 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  y a single colum
20470 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e  n may be output.
20480 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
20490 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
204a0 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f  RY.  if( checkFo
204b0 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65  rMultiColumnSele
204c0 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
204d0 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e  pDest, pEList->n
204e0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f 74  Expr) ){.    got
204f0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
20500 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
20510 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
20520 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73   all sub-queries
20530 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
20540 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65  use.  */.#if !de
20550 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
20560 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
20570 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
20580 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28  MIT_VIEW).  for(
20590 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20  i=0; !p->pPrior 
205a0 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  && i<pTabList->n
205b0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Src; i++){.    s
205c0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
205d0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61  em *pItem = &pTa
205e0 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20  bList->a[i];.   
205f0 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
20600 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  ;.    Select *pS
20610 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c  ub = pItem->pSel
20620 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 41  ect;.    int isA
20630 67 67 53 75 62 3b 0a 0a 20 20 20 20 69 66 28 20  ggSub;..    if( 
20640 70 53 75 62 3d 3d 30 20 7c 7c 20 70 49 74 65 6d  pSub==0 || pItem
20650 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 29 20  ->isPopulated ) 
20660 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
20670 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73  * Increment Pars
20680 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65  e.nHeight by the
20690 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c   height of the l
206a0 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f  argest expressio
206b0 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65  n.    ** tree re
206c0 66 65 72 65 64 20 74 6f 20 62 79 20 74 68 69 73  fered to by this
206d0 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c  , the parent sel
206e0 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73  ect. The child s
206f0 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79  elect.    ** may
20700 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73   contain express
20710 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20  ion trees of at 
20720 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c  most.    ** (SQL
20730 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
20740 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74  TH-Parse.nHeight
20750 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20 69  ) height. This i
20760 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d  s a bit.    ** m
20770 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65  ore conservative
20780 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c   than necessary,
20790 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65 72   but much easier
207a0 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a   than enforcing.
207b0 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20      ** an exact 
207c0 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  limit..    */.  
207d0 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
207e0 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t += sqlite3Sele
207f0 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
20800 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
20810 6f 20 73 65 65 20 69 66 20 74 68 65 20 73 75 62  o see if the sub
20820 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62 73  query can be abs
20830 6f 72 62 65 64 20 69 6e 74 6f 20 74 68 65 20 70  orbed into the p
20840 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 73  arent. */.    is
20850 41 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e  AggSub = (pSub->
20860 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
20870 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20  gregate)!=0;.   
20880 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71   if( flattenSubq
20890 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
208a0 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67 53  i, isAgg, isAggS
208b0 75 62 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ub) ){.      if(
208c0 20 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20 20   isAggSub ){.   
208d0 20 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a       isAgg = 1;.
208e0 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c          p->selFl
208f0 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67  ags |= SF_Aggreg
20900 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ate;.      }.   
20910 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d     i = -1;.    }
20920 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
20930 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
20940 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68  t(&dest, SRT_Eph
20950 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43  emTab, pItem->iC
20960 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73  ursor);.      as
20970 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69 73 50  sert( pItem->isP
20980 6f 70 75 6c 61 74 65 64 3d 3d 30 20 29 3b 0a 20  opulated==0 );. 
20990 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
209a0 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53  nteger(pItem->iS
209b0 65 6c 65 63 74 49 64 2c 20 70 50 61 72 73 65 2d  electId, pParse-
209c0 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
209d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
209e0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75  lect(pParse, pSu
209f0 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  b, &dest);.     
20a00 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61   pItem->isPopula
20a10 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ted = 1;.    }. 
20a20 20 20 20 69 66 28 20 2f 2a 70 50 61 72 73 65 2d     if( /*pParse-
20a30 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d  >nErr ||*/ db->m
20a40 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
20a50 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
20a60 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
20a70 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
20a80 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  -= sqlite3Select
20a90 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20  ExprHeight(p);. 
20aa0 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
20ab0 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21  >pSrc;.    if( !
20ac0 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
20ad0 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20  (pDest) ){.     
20ae0 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
20af0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20  OrderBy;.    }. 
20b00 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d   }.  pEList = p-
20b10 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66 0a  >pEList;.#endif.
20b20 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
20b30 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79  here;.  pGroupBy
20b40 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
20b50 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
20b60 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73 74  Having;.  isDist
20b70 69 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c  inct = (p->selFl
20b80 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
20b90 74 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66 20  t)!=0;..#ifndef 
20ba0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
20bb0 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a  OUND_SELECT.  /*
20bc0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65   If there is are
20bd0 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71   a sequence of q
20be0 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65  ueries, do the e
20bf0 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73  arlier ones firs
20c00 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
20c10 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
20c20 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  f( p->pRightmost
20c30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ==0 ){.      Sel
20c40 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69  ect *pLoop, *pRi
20c50 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ght = 0;.      i
20c60 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
20c70 20 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b 0a    int mxSelect;.
20c80 20 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d        for(pLoop=
20c90 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
20ca0 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63  pLoop->pPrior, c
20cb0 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  nt++){.        p
20cc0 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  Loop->pRightmost
20cd0 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70 4c   = p;.        pL
20ce0 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69  oop->pNext = pRi
20cf0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52 69  ght;.        pRi
20d00 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20  ght = pLoop;.   
20d10 20 20 20 7d 0a 20 20 20 20 20 20 6d 78 53 65 6c     }.      mxSel
20d20 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74  ect = db->aLimit
20d30 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
20d40 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b 0a  MPOUND_SELECT];.
20d50 20 20 20 20 20 20 69 66 28 20 6d 78 53 65 6c 65        if( mxSele
20d60 63 74 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c 65  ct && cnt>mxSele
20d70 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
20d80 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
20d90 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
20da0 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e  terms in compoun
20db0 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20  d SELECT");.    
20dc0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
20dd0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
20de0 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74   }.    rc = mult
20df0 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
20e00 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65  p, pDest);.    e
20e10 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
20e20 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
20e30 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
20e40 63 74 49 64 29 3b 0a 20 20 20 20 72 65 74 75 72  ctId);.    retur
20e50 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
20e60 0a 0a 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62  ..  /* If possib
20e70 6c 65 2c 20 72 65 77 72 69 74 65 20 74 68 65 20  le, rewrite the 
20e80 71 75 65 72 79 20 74 6f 20 75 73 65 20 47 52 4f  query to use GRO
20e90 55 50 20 42 59 20 69 6e 73 74 65 61 64 20 6f 66  UP BY instead of
20ea0 20 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2a 20   DISTINCT..  ** 
20eb0 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75  GROUP BY might u
20ec0 73 65 20 61 6e 20 69 6e 64 65 78 2c 20 44 49 53  se an index, DIS
20ed0 54 49 4e 43 54 20 6e 65 76 65 72 20 64 6f 65 73  TINCT never does
20ee0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
20ef0 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
20f00 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  || (p->selFlags 
20f10 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21  & SF_Aggregate)!
20f20 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  =0 );.  if( (p->
20f30 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
20f40 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
20f50 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
20f60 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 47  nct ){.    p->pG
20f70 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
20f80 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
20f90 70 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20  p->pEList, 0);. 
20fa0 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
20fb0 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70  >pGroupBy;.    p
20fc0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
20fd0 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  F_Distinct;.  }.
20fe0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
20ff0 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42  s both a GROUP B
21000 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42  Y and an ORDER B
21010 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  Y clause and the
21020 79 20 61 72 65 0a 20 20 2a 2a 20 69 64 65 6e 74  y are.  ** ident
21030 69 63 61 6c 2c 20 74 68 65 6e 20 64 69 73 61 62  ical, then disab
21040 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  le the ORDER BY 
21050 63 6c 61 75 73 65 20 73 69 6e 63 65 20 74 68 65  clause since the
21060 20 47 52 4f 55 50 20 42 59 0a 20 20 2a 2a 20 77   GROUP BY.  ** w
21070 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e  ill cause elemen
21080 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 69  ts to come out i
21090 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72  n the correct or
210a0 64 65 72 2e 20 20 54 68 69 73 20 69 73 0a 20 20  der.  This is.  
210b0 2a 2a 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  ** an optimizati
210c0 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74  on - the correct
210d0 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72   answer should r
210e0 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73  esult regardless
210f0 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53  ..  ** Use the S
21100 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64  QLITE_GroupByOrd
21110 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c  er flag with SQL
21120 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
21130 49 4d 49 5a 45 52 0a 20 20 2a 2a 20 74 6f 20 64  IMIZER.  ** to d
21140 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69  isable this opti
21150 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73  mization for tes
21160 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 20  ting purposes.. 
21170 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
21180 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
21190 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 4f  (p->pGroupBy, pO
211a0 72 64 65 72 42 79 29 3d 3d 30 0a 20 20 20 20 20  rderBy)==0.     
211b0 20 20 20 20 26 26 20 28 64 62 2d 3e 66 6c 61 67      && (db->flag
211c0 73 20 26 20 53 51 4c 49 54 45 5f 47 72 6f 75 70  s & SQLITE_Group
211d0 42 79 4f 72 64 65 72 29 3d 3d 30 20 29 7b 0a 20  ByOrder)==0 ){. 
211e0 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
211f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
21200 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
21210 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
21220 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a  this sorting.  *
21230 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e  * index might en
21240 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65  d up being unuse
21250 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61  d if the data ca
21260 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61  n be .  ** extra
21270 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74  cted in pre-sort
21280 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68  ed order.  If th
21290 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  at is the case, 
212a0 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50  then the.  ** OP
212b0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
212c0 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20  nstruction will 
212d0 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e  be changed to an
212e0 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20   OP_Noop once.  
212f0 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75 74  ** we figure out
21300 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e   that the sortin
21310 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e  g index is not n
21320 65 65 64 65 64 2e 20 20 54 68 65 20 61 64 64 72  eeded.  The addr
21330 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76  SortIndex.  ** v
21340 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
21350 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68  to facilitate th
21360 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a  at change..  */.
21370 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
21380 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
21390 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65  KeyInfo;.    pKe
213a0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
213b0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
213c0 73 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20  se, pOrderBy);. 
213d0 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43     pOrderBy->iEC
213e0 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
213f0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61  nTab++;.    p->a
21400 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
21410 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d   addrSortIndex =
21420 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21430 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
21440 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
21450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21460 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42           pOrderB
21470 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72  y->iECursor, pOr
21480 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20  derBy->nExpr+2, 
21490 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
214a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
214b0 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
214c0 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
214d0 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  F);.  }else{.   
214e0 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d   addrSortIndex =
214f0 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
21500 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
21510 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
21520 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
21530 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
21540 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
21550 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
21560 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71  hemTab ){.    sq
21570 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21580 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
21590 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 50 61 72  ral, pDest->iPar
215a0 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  m, pEList->nExpr
215b0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
215c0 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20   the limiter..  
215d0 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69  */.  iEnd = sqli
215e0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
215f0 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69  (v);.  computeLi
21600 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
21610 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 0a  rse, p, iEnd);..
21620 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72 74    /* Open a virt
21630 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65  ual index to use
21640 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
21650 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
21660 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
21670 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  SF_Distinct ){. 
21680 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
21690 49 6e 66 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  Info;.    assert
216a0 28 20 69 73 41 67 67 20 7c 7c 20 70 47 72 6f 75  ( isAgg || pGrou
216b0 70 42 79 20 29 3b 0a 20 20 20 20 64 69 73 74 69  pBy );.    disti
216c0 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
216d0 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e  ab++;.    pKeyIn
216e0 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
216f0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
21700 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
21710 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21720 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
21730 65 6d 65 72 61 6c 2c 20 64 69 73 74 69 6e 63 74  emeral, distinct
21740 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
21750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21760 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
21770 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
21780 4f 46 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  OFF);.    sqlite
21790 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
217a0 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
217b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
217c0 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  distinct = -1;. 
217d0 20 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67 61   }..  /* Aggrega
217e0 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65  te and non-aggre
217f0 67 61 74 65 20 71 75 65 72 69 65 73 20 61 72 65  gate queries are
21800 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
21810 6e 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21 69  ntly */.  if( !i
21820 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79  sAgg && pGroupBy
21830 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
21840 69 73 20 63 61 73 65 20 69 73 20 66 6f 72 20 6e  is case is for n
21850 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65  on-aggregate que
21860 72 69 65 73 0a 20 20 20 20 2a 2a 20 42 65 67 69  ries.    ** Begi
21870 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  n the database s
21880 63 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  can.    */.    p
21890 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
218a0 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
218b0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
218c0 72 65 2c 20 26 70 4f 72 64 65 72 42 79 2c 20 30  re, &pOrderBy, 0
218d0 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
218e0 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
218f0 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20  ct_end;..    /* 
21900 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  If sorting index
21910 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65   that was create
21920 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f  d by a prior OP_
21930 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20  OpenEphemeral . 
21940 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
21950 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62  n ended up not b
21960 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65  eing needed, the
21970 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  n change the OP_
21980 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20  OpenEphemeral.  
21990 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f    ** into an OP_
219a0 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Noop..    */.   
219b0 20 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e 64   if( addrSortInd
219c0 65 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42  ex>=0 && pOrderB
219d0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  y==0 ){.      sq
219e0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
219f0 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72  oNoop(v, addrSor
21a00 74 49 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20 20  tIndex, 1);.    
21a10 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
21a20 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  m[2] = -1;.    }
21a30 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
21a40 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
21a50 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20 20  loop.    */.    
21a60 61 73 73 65 72 74 28 21 69 73 44 69 73 74 69 6e  assert(!isDistin
21a70 63 74 29 3b 0a 20 20 20 20 73 65 6c 65 63 74 49  ct);.    selectI
21a80 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
21a90 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30   p, pEList, 0, 0
21aa0 2c 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20  , pOrderBy, -1, 
21ab0 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pDest,.         
21ac0 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
21ad0 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57  o->iContinue, pW
21ae0 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a  Info->iBreak);..
21af0 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64      /* End the d
21b00 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f  atabase scan loo
21b10 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  p..    */.    sq
21b20 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
21b30 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Info);.  }else{.
21b40 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
21b50 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  he processing fo
21b60 72 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  r aggregate quer
21b70 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43  ies */.    NameC
21b80 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f  ontext sNC;    /
21b90 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
21ba0 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67  or processing ag
21bb0 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74  gregate informat
21bc0 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ion */.    int i
21bd0 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  AMem;          /
21be0 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
21bf0 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ess for storing 
21c00 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
21c10 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65   */.    int iBMe
21c20 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
21c30 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
21c40 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52   for previous GR
21c50 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
21c60 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20  t iUseFlag;     
21c70 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
21c80 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e   holding flag in
21c90 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74  dicating that at
21ca0 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20   least.         
21cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
21cc0 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65  * one row of the
21cd0 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67   input to the ag
21ce0 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65  gregator has bee
21cf0 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
21d00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
21d10 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e  cessed */.    in
21d20 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20  t iAbortFlag;   
21d30 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
21d40 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75   which causes qu
21d50 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73  ery abort if pos
21d60 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74  itive */.    int
21d70 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20   groupBySort;   
21d80 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72   /* Rows come fr
21d90 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f  om source in GRO
21da0 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20  UP BY order */. 
21db0 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20     int addrEnd; 
21dc0 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
21dd0 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
21de0 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 0a  this SELECT */..
21df0 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e      /* Remove an
21e00 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65  y and all aliase
21e10 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65  s between the re
21e20 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65  sult set and the
21e30 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59  .    ** GROUP BY
21e40 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a   clause..    */.
21e50 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
21e60 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b   ){.      int k;
21e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e80 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
21e90 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
21ea0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
21eb0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f  _item *pItem;  /
21ec0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
21ed0 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  er expression in
21ee0 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20   a list */..    
21ef0 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73    for(k=p->pELis
21f00 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
21f10 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e  p->pEList->a; k>
21f20 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; k--, pItem++)
21f30 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  {.        pItem-
21f40 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  >iAlias = 0;.   
21f50 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b     }.      for(k
21f60 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  =pGroupBy->nExpr
21f70 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79  , pItem=pGroupBy
21f80 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70  ->a; k>0; k--, p
21f90 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
21fa0 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d   pItem->iAlias =
21fb0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
21fc0 7d 0a 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61  }.. .    /* Crea
21fd0 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75  te a label to ju
21fe0 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61  mp to when we wa
21ff0 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20  nt to abort the 
22000 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64  query */.    add
22010 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  rEnd = sqlite3Vd
22020 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
22030 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
22040 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
22050 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
22060 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72  MN and make entr
22070 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41  ies in.    ** sA
22080 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54  ggInfo for all T
22090 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
220a0 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  odes in expressi
220b0 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ons of the.    *
220c0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
220d0 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  nt..    */.    m
220e0 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
220f0 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
22100 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
22110 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
22120 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
22130 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49  t;.    sNC.pAggI
22140 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b  nfo = &sAggInfo;
22150 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53  .    sAggInfo.nS
22160 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70  ortingColumn = p
22170 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70  GroupBy ? pGroup
22180 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b  By->nExpr+1 : 0;
22190 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47  .    sAggInfo.pG
221a0 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
221b0 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  y;.    sqlite3Ex
221c0 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
221d0 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a  (&sNC, pEList);.
221e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
221f0 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
22200 4e 43 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20  NC, pOrderBy);. 
22210 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
22220 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
22230 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
22240 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69  ates(&sNC, pHavi
22250 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ng);.    }.    s
22260 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c  AggInfo.nAccumul
22270 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e  ator = sAggInfo.
22280 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72  nColumn;.    for
22290 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
222a0 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20  .nFunc; i++){.  
222b0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
222c0 72 48 61 73 50 72 6f 70 65 72 74 79 28 73 41 67  rHasProperty(sAg
222d0 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70  gInfo.aFunc[i].p
222e0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
222f0 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ct) );.      sql
22300 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
22310 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67  ggList(&sNC, sAg
22320 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70  gInfo.aFunc[i].p
22330 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
22340 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
22350 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
22360 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
22370 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73  ;..    /* Proces
22380 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  sing for aggrega
22390 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42  tes with GROUP B
223a0 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72  Y is very differ
223b0 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d  ent and.    ** m
223c0 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  uch more complex
223d0 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73   than aggregates
223e0 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50   without a GROUP
223f0 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   BY..    */.    
22400 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
22410 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
22420 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79  KeyInfo;  /* Key
22430 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
22440 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79  for the group by
22450 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
22460 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20   int j1;        
22470 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63       /* A-vs-B c
22480 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20  omparision jump 
22490 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
224a0 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20  rOutputRow;  /* 
224b0 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74  Start of subrout
224c0 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
224d0 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f   a result row */
224e0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75  .      int regOu
224f0 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65  tputRow;   /* Re
22500 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
22510 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74  ister for output
22520 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
22530 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74       int addrSet
22540 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20  Abort;   /* Set 
22550 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61  the abort flag a
22560 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20  nd return */.   
22570 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66     int addrTopOf
22580 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66  Loop;  /* Top of
22590 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20   the input loop 
225a0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
225b0 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20  rSortingIdx; /* 
225c0 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
225d0 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72  eral for the sor
225e0 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ting index */.  
225f0 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65      int addrRese
22600 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f  t;      /* Subro
22610 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74  utine for resett
22620 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
22630 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tor */.      int
22640 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20   regReset;      
22650 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
22660 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
22670 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65  reset subroutine
22680 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   */..      /* If
22690 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55   there is a GROU
226a0 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d  P BY clause we m
226b0 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74  ight need a sort
226c0 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20  ing index to.   
226d0 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20     ** implement 
226e0 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68  it.  Allocate th
226f0 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  at sorting index
22700 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72   now.  If it tur
22710 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20  ns out.      ** 
22720 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e  that we do not n
22730 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c  eed it after all
22740 2c 20 74 68 65 20 4f 70 65 6e 45 70 68 65 6d 65  , the OpenEpheme
22750 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  ral instruction.
22760 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
22770 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
22780 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20  a Noop.  .      
22790 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66  */.      sAggInf
227a0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70  o.sortingIdx = p
227b0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
227c0 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
227d0 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
227e0 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ist(pParse, pGro
227f0 75 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64 64  upBy);.      add
22800 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71  rSortingIdx = sq
22810 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
22820 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
22830 72 61 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ral, .          
22840 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
22850 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53  Idx, sAggInfo.nS
22860 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20  ortingColumn, . 
22870 20 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61           0, (cha
22880 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
22890 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
228a0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74  ;..      /* Init
228b0 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f  ialize memory lo
228c0 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20  cations used by 
228d0 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61  GROUP BY aggrega
228e0 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20  te processing.  
228f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73      */.      iUs
22900 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  eFlag = ++pParse
22910 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41  ->nMem;.      iA
22920 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61  bortFlag = ++pPa
22930 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
22940 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20   regOutputRow = 
22950 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
22960 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
22970 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
22980 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
22990 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20       regReset = 
229a0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
229b0 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20        addrReset 
229c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
229d0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
229e0 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iAMem = pParse-
229f0 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
22a00 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
22a10 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
22a20 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20  ;.      iBMem = 
22a30 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
22a40 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
22a50 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
22a60 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->nExpr;.      s
22a70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22a80 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
22a90 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  0, iAbortFlag);.
22aa0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
22ab0 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f  t((v, "clear abo
22ac0 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
22ad0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22ae0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
22af0 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 0, iUseFlag);
22b00 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
22b10 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
22b20 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70   accumulator emp
22b30 74 79 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ty"));..      /*
22b40 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68   Begin a loop th
22b50 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
22b60 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20  all source rows 
22b70 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
22b80 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  r..      ** This
22b90 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74   might involve t
22ba0 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70  wo separate loop
22bb0 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72  s with an OP_Sor
22bc0 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72  t in between, or
22bd0 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67  .      ** it mig
22be0 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c  ht be a single l
22bf0 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61 6e  oop that uses an
22c00 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63   index to extrac
22c10 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20  t information.  
22c20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69      ** in the ri
22c30 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67  ght order to beg
22c40 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a  in with..      *
22c50 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
22c60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
22c70 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c  Gosub, regReset,
22c80 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20   addrReset);.   
22c90 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
22ca0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
22cb0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
22cc0 70 57 68 65 72 65 2c 20 26 70 47 72 6f 75 70 42  pWhere, &pGroupB
22cd0 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  y, 0);.      if(
22ce0 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
22cf0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
22d00 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
22d10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
22d20 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  * The optimizer 
22d30 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76  is able to deliv
22d40 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70  er rows in group
22d50 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20   by order so.   
22d60 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f       ** we do no
22d70 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20  t have to sort. 
22d80 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
22d90 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c  meral table will
22da0 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63   be.        ** c
22db0 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62  ancelled later b
22dc0 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20  ecause we still 
22dd0 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  need to use the 
22de0 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20  pKeyInfo.       
22df0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 47 72 6f   */.        pGro
22e00 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
22e10 42 79 3b 0a 20 20 20 20 20 20 20 20 67 72 6f 75  By;.        grou
22e20 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20  pBySort = 0;.   
22e30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22e40 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f    /* Rows are co
22e50 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65  ming out in unde
22e60 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20  termined order. 
22e70 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68   We have to push
22e80 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68  .        ** each
22e90 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74   row into a sort
22ea0 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69  ing index, termi
22eb0 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c  nate the first l
22ec0 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  oop,.        ** 
22ed0 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74  then loop over t
22ee0 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
22ef0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
22f00 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20   the output.    
22f10 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64      ** in sorted
22f20 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a   order.        *
22f30 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  /.        int re
22f40 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69  gBase;.        i
22f50 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20  nt regRecord;.  
22f60 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a        int nCol;.
22f70 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f          int nGro
22f80 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65  upBy;..        e
22f90 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
22fa0 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
22fb0 20 20 20 20 20 69 73 44 69 73 74 69 6e 63 74 20       isDistinct 
22fc0 26 26 20 21 28 70 2d 3e 73 65 6c 46 6c 61 67 73  && !(p->selFlags
22fd0 26 53 46 5f 44 69 73 74 69 6e 63 74 29 3f 22 44  &SF_Distinct)?"D
22fe0 49 53 54 49 4e 43 54 22 3a 22 47 52 4f 55 50 20  ISTINCT":"GROUP 
22ff0 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67  BY");..        g
23000 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a  roupBySort = 1;.
23010 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79          nGroupBy
23020 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   = pGroupBy->nEx
23030 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  pr;.        nCol
23040 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b 20 31 3b   = nGroupBy + 1;
23050 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
23060 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20  oupBy+1;.       
23070 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
23080 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
23090 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
230a0 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b  ( sAggInfo.aCol[
230b0 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  i].iSorterColumn
230c0 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=j ){.         
230d0 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20     nCol++;.     
230e0 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
230f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23100 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73  }.        regBas
23110 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  e = sqlite3GetTe
23120 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
23130 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
23140 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
23150 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
23160 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23170 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
23180 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  arse, pGroupBy, 
23190 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 20  regBase, 0);.   
231a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
231b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
231c0 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e  uence, sAggInfo.
231d0 73 6f 72 74 69 6e 67 49 64 78 2c 72 65 67 42 61  sortingIdx,regBa
231e0 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b 0a 20 20  se+nGroupBy);.  
231f0 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
23200 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f  By+1;.        fo
23210 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
23220 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
23230 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
23240 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
23250 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e  Col = &sAggInfo.
23260 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  aCol[i];.       
23270 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
23280 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
23290 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
232a0 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73   r1 = j + regBas
232b0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
232c0 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20 20 20 20  nt r2;..        
232d0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
232e0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
232f0 6e 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  n(pParse, .     
23300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23310 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
23320 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c  pTab, pCol->iCol
23330 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c  umn, pCol->iTabl
23340 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
23350 20 20 20 20 69 66 28 20 72 31 21 3d 72 32 20 29      if( r1!=r2 )
23360 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23370 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23380 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
23390 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  2, r1);.        
233a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
233b0 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
233c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
233d0 20 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d       regRecord =
233e0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
233f0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
23400 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23410 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
23420 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c  Record, regBase,
23430 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64   nCol, regRecord
23440 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
23450 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
23460 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 73 41  OP_IdxInsert, sA
23470 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
23480 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  x, regRecord);. 
23490 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
234a0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
234b0 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
234c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
234d0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
234e0 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
234f0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
23500 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
23510 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
23520 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23530 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  Op2(v, OP_Sort, 
23540 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
23550 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  Idx, addrEnd);. 
23560 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
23570 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59  nt((v, "GROUP BY
23580 20 73 6f 72 74 22 29 29 3b 0a 20 20 20 20 20 20   sort"));.      
23590 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f    sAggInfo.useSo
235a0 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20  rtingIdx = 1;.  
235b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
235c0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
235d0 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  se);.      }..  
235e0 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
235f0 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
23600 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73  P BY terms and s
23610 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20  tore in b0, b1, 
23620 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28  b2....      ** (
23630 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63  b0 is memory loc
23640 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62  ation iBMem+0, b
23650 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e  1 is iBMem+1, an
23660 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20  d so forth).    
23670 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72    ** Then compar
23680 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
23690 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61  OUP BY terms aga
236a0 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42  inst the GROUP B
236b0 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a  Y terms.      **
236c0 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
236d0 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79  us row currently
236e0 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61   stored in a0, a
236f0 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, a2....      *
23700 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f  /.      addrTopO
23710 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  fLoop = sqlite3V
23720 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
23730 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23740 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
23750 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 66 6f  Parse);.      fo
23760 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42  r(j=0; j<pGroupB
23770 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  y->nExpr; j++){.
23780 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75          if( grou
23790 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
237a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
237b0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
237c0 75 6d 6e 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  umn, sAggInfo.so
237d0 72 74 69 6e 67 49 64 78 2c 20 6a 2c 20 69 42 4d  rtingIdx, j, iBM
237e0 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d  em+j);.        }
237f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23800 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d  sAggInfo.directM
23810 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ode = 1;.       
23820 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
23830 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  de(pParse, pGrou
23840 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c  pBy->a[j].pExpr,
23850 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
23860 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
23870 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23880 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
23890 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d  re, iAMem, iBMem
238a0 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  , pGroupBy->nExp
238b0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
238c0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
238d0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
238e0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
238f0 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
23900 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
23910 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
23920 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
23930 75 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a 31  ump, j1+1, 0, j1
23940 2b 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  +1);..      /* G
23950 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
23960 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20  t runs whenever 
23970 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 68 61  the GROUP BY cha
23980 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43  nges..      ** C
23990 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52  hanges in the GR
239a0 4f 55 50 20 42 59 20 61 72 65 20 64 65 74 65 63  OUP BY are detec
239b0 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69  ted by the previ
239c0 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a  ous code.      *
239d0 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65  * block.  If the
239e0 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67  re were no chang
239f0 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69  es, this block i
23a00 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20  s skipped..     
23a10 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69   **.      ** Thi
23a20 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75  s code copies cu
23a30 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74  rrent group by t
23a40 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32  erms in b0,b1,b2
23a50 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76  ,....      ** ov
23a60 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20  er to a0,a1,a2. 
23a70 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74   It then calls t
23a80 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  he output subrou
23a90 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e  tine.      ** an
23aa0 64 20 72 65 73 65 74 73 20 74 68 65 20 61 67 67  d resets the agg
23ab0 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
23ac0 6f 72 20 72 65 67 69 73 74 65 72 73 20 69 6e 20  or registers in 
23ad0 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20  preparation.    
23ae0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78    ** for the nex
23af0 74 20 47 52 4f 55 50 20 42 59 20 62 61 74 63 68  t GROUP BY batch
23b00 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
23b10 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23b20 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d  Move(pParse, iBM
23b30 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75  em, iAMem, pGrou
23b40 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  pBy->nExpr);.   
23b50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23b60 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
23b70 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20  , regOutputRow, 
23b80 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
23b90 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
23ba0 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e  t((v, "output on
23bb0 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20  e row"));.      
23bc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23bd0 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
23be0 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45  AbortFlag, addrE
23bf0 6e 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  nd);.      VdbeC
23c00 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63  omment((v, "chec
23c10 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  k abort flag"));
23c20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
23c30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
23c40 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
23c50 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
23c60 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
23c70 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c  , "reset accumul
23c80 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
23c90 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67  /* Update the ag
23ca0 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
23cb0 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68  tors based on th
23cc0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20  e content of.   
23cd0 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
23ce0 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20  t row.      */. 
23cf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23d00 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
23d10 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63  .      updateAcc
23d20 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
23d30 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
23d40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23d50 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
23d60 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29  er, 1, iUseFlag)
23d70 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
23d80 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
23d90 65 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75  e data in accumu
23da0 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  lator"));..     
23db0 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c   /* End of the l
23dc0 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  oop.      */.   
23dd0 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
23de0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
23df0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
23e00 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67  v, OP_Next, sAgg
23e10 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
23e20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b   addrTopOfLoop);
23e30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
23e40 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
23e50 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
23e60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
23e70 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
23e80 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  , addrSortingIdx
23e90 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 1);.      }.. 
23ea0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74       /* Output t
23eb0 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20  he final row of 
23ec0 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a  result.      */.
23ed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23ee0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
23ef0 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
23f00 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
23f10 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
23f20 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
23f30 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a   final row"));..
23f40 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76        /* Jump ov
23f50 65 72 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  er the subroutin
23f60 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  es.      */.    
23f70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23f80 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
23f90 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20  0, addrEnd);..  
23fa0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
23fb0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
23fc0 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67  t outputs a sing
23fd0 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
23fe0 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
23ff0 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74  t.  This subrout
24000 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20  ine first looks 
24010 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e  at the iUseFlag.
24020 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20    If iUseFlag.  
24030 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74      ** is less t
24040 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
24050 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75  zero, the subrou
24060 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
24070 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68    If.      ** th
24080 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c  e processing cal
24090 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79  ls for the query
240a0 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20   to abort, this 
240b0 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
240c0 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74   ** increments t
240d0 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65  he iAbortFlag me
240e0 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65  mory location be
240f0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
24100 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72  n.      ** order
24110 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63   to signal the c
24120 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a  aller to abort..
24130 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
24140 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71  ddrSetAbort = sq
24150 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
24160 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
24170 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24180 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
24190 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  1, iAbortFlag);.
241a0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
241b0 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74  t((v, "set abort
241c0 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
241d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
241e0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
241f0 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
24200 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24210 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
24220 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
24230 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
24240 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
24250 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
24260 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
24270 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
24280 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20  fPos, iUseFlag, 
24290 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29  addrOutputRow+2)
242a0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
242b0 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79  ent((v, "Groupby
242c0 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
242d0 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29  r entry point"))
242e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
242f0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
24300 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
24310 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e  tRow);.      fin
24320 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
24330 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
24340 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
24350 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
24360 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
24370 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
24380 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
24390 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63  LL);.      selec
243a0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
243b0 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
243c0 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
243d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
243e0 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 2c         distinct,
243f0 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
24400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
24410 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61  drOutputRow+1, a
24420 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20  ddrSetAbort);.  
24430 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
24440 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
24450 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
24460 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
24470 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72  ment((v, "end gr
24480 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
24490 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  erator"));..    
244a0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
244b0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
244c0 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67  will reset the g
244d0 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61  roup-by accumula
244e0 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  tor.      */.   
244f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
24500 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
24510 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
24520 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
24530 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
24540 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
24550 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
24560 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
24570 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20  set);.     .    
24580 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75  } /* endif pGrou
24590 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72  pBy.  Begin aggr
245a0 65 67 61 74 65 20 71 75 65 72 69 65 73 20 77 69  egate queries wi
245b0 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20  thout GROUP BY: 
245c0 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20  */.    else {.  
245d0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44      ExprList *pD
245e0 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  el = 0;.#ifndef 
245f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
24600 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62  ECOUNT.      Tab
24610 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
24620 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69  if( (pTab = isSi
24630 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41  mpleCount(p, &sA
24640 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20  ggInfo))!=0 ){. 
24650 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53         /* If isS
24660 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74  impleCount() ret
24670 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
24680 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  o a Table struct
24690 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ure, then.      
246a0 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61    ** the SQL sta
246b0 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65  tement is of the
246c0 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a   form:.        *
246d0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  *.        **   S
246e0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
246f0 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20  ROM <tbl>.      
24700 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
24710 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20  where the Table 
24720 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
24730 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61  ed represents ta
24740 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20  ble <tbl>..     
24750 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
24760 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
24770 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61  is so common tha
24780 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65  t it is optimize
24790 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65  d specially. The
247a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43  .        ** OP_C
247b0 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  ount instruction
247c0 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74   is executed eit
247d0 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65  her on the intke
247e0 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20  y table that.   
247f0 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
24800 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61   the data for ta
24810 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20  ble <tbl> or on 
24820 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78  one of its index
24830 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a  es. It.        *
24840 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65  * is better to e
24850 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e  xecute the op on
24860 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e   an index, as in
24870 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74  dexes are almost
24880 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
24890 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73  ys spread across
248a0 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e   less pages than
248b0 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e   their correspon
248c0 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20  ding tables..   
248d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
248e0 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20  const int iDb = 
248f0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
24900 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
24910 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
24920 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
24930 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65  nt iCsr = pParse
24940 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
24950 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20   Cursor to scan 
24960 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20  b-tree */.      
24970 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
24980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24990 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
249a0 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
249b0 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
249c0 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
249d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
249e0 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e  eyinfo for scann
249f0 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ed index */.    
24a00 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74      Index *pBest
24a10 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
24a20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74           /* Best
24a30 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20   index found so 
24a40 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  far */.        i
24a50 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d  nt iRoot = pTab-
24a60 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  >tnum;          
24a70 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
24a80 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72   of scanned b-tr
24a90 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73  ee */..        s
24aa0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
24ab0 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
24ac0 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
24ad0 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
24ae0 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
24af0 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
24b00 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20  zName);..       
24b10 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74   /* Search for t
24b20 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61  he index that ha
24b30 73 20 74 68 65 20 6c 65 61 73 74 20 61 6d 6f 75  s the least amou
24b40 6e 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 2e 20 49  nt of columns. I
24b50 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
24b60 72 65 20 69 73 20 73 75 63 68 20 61 6e 20 69 6e  re is such an in
24b70 64 65 78 2c 20 61 6e 64 20 69 74 20 68 61 73 20  dex, and it has 
24b80 6c 65 73 73 20 63 6f 6c 75 6d 6e 73 20 74 68 61  less columns tha
24b90 6e 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  n the table.    
24ba0 20 20 20 20 2a 2a 20 64 6f 65 73 2c 20 74 68 65      ** does, the
24bb0 6e 20 77 65 20 63 61 6e 20 61 73 73 75 6d 65 20  n we can assume 
24bc0 74 68 61 74 20 69 74 20 63 6f 6e 73 75 6d 65 73  that it consumes
24bd0 20 6c 65 73 73 20 73 70 61 63 65 20 6f 6e 20 64   less space on d
24be0 69 73 6b 20 61 6e 64 0a 20 20 20 20 20 20 20 20  isk and.        
24bf0 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 66 6f 72  ** will therefor
24c00 65 20 62 65 20 63 68 65 61 70 65 72 20 74 6f 20  e be cheaper to 
24c10 73 63 61 6e 20 74 6f 20 64 65 74 65 72 6d 69 6e  scan to determin
24c20 65 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  e the query resu
24c30 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  lt..        ** I
24c40 6e 20 74 68 69 73 20 63 61 73 65 20 73 65 74 20  n this case set 
24c50 69 52 6f 6f 74 20 74 6f 20 74 68 65 20 72 6f 6f  iRoot to the roo
24c60 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
24c70 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65   the index b-tre
24c80 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  e.        ** and
24c90 20 70 4b 65 79 49 6e 66 6f 20 74 6f 20 74 68 65   pKeyInfo to the
24ca0 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
24cb0 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 6e  re required to n
24cc0 61 76 69 67 61 74 65 20 74 68 65 0a 20 20 20 20  avigate the.    
24cd0 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 0a 20 20      ** index..  
24ce0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
24cf0 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20   ** In practice 
24d00 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
24d10 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62  cture will not b
24d20 65 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e  e used. It is on
24d30 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ly .        ** p
24d40 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50  assed to keep OP
24d50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e  _OpenRead happy.
24d60 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
24d70 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
24d80 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
24d90 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
24da0 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t){.          if
24db0 28 20 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78  ( !pBest || pIdx
24dc0 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 42 65 73 74 2d  ->nColumn<pBest-
24dd0 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
24de0 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20          pBest = 
24df0 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  pIdx;.          
24e00 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
24e10 20 20 20 20 69 66 28 20 70 42 65 73 74 20 26 26      if( pBest &&
24e20 20 70 42 65 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 3c   pBest->nColumn<
24e30 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
24e40 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20          iRoot = 
24e50 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20  pBest->tnum;.   
24e60 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20         pKeyInfo 
24e70 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
24e80 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 42  yinfo(pParse, pB
24e90 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  est);.        }.
24ea0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  .        /* Open
24eb0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
24ec0 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74 68 65  sor, execute the
24ed0 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65   OP_Count, close
24ee0 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a   the cursor. */.
24ef0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
24f00 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
24f10 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20  OpenRead, iCsr, 
24f20 69 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20  iRoot, iDb);.   
24f30 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
24f40 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  o ){.          s
24f50 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
24f60 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20  P4(v, -1, (char 
24f70 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
24f80 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
24f90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24fa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
24fb0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74  dOp2(v, OP_Count
24fc0 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f  , iCsr, sAggInfo
24fd0 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b  .aFunc[0].iMem);
24fe0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24ff0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
25000 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20  _Close, iCsr);. 
25010 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
25020 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
25030 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20  _BTREECOUNT */. 
25040 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f       {.        /
25050 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 71  * Check if the q
25060 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f  uery is of one o
25070 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
25080 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a  forms:.        *
25090 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  *.        **   S
250a0 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f  ELECT min(x) FRO
250b0 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  M ....        **
250c0 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29     SELECT max(x)
250d0 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20   FROM ....      
250e0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
250f0 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61  If it is, then a
25100 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77  sk the code in w
25110 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70  here.c to attemp
25120 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74  t to sort result
25130 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20  s.        ** as 
25140 69 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20  if there was an 
25150 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72 20  "ORDER ON x" or 
25160 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53 43  "ORDER ON x DESC
25170 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20 20  " clause. .     
25180 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e 63     ** If where.c
25190 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f 64   is able to prod
251a0 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72 74  uce results sort
251b0 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72  ed in this order
251c0 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  , then.        *
251d0 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64 65 20  * add vdbe code 
251e0 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
251f0 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  the processing l
25200 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a 20  oop after the . 
25210 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20         ** first 
25220 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63 65  iteration (since
25230 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
25240 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
25250 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   is .        ** 
25260 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 70  guaranteed to op
25270 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f 77  erate on the row
25280 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d 75   with the minimu
25290 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20  m or maximum .  
252a0 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f        ** value o
252b0 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f  f x, the only ro
252c0 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20  w required)..   
252d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
252e0 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61  ** A special fla
252f0 67 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64  g must be passed
25300 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
25310 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68  Begin() to sligh
25320 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  tly.        ** m
25330 6f 64 69 66 79 20 62 65 68 61 76 69 6f 75 72 20  odify behaviour 
25340 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
25350 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
25360 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71 75 65  *   + If the que
25370 72 79 20 69 73 20 61 20 22 53 45 4c 45 43 54 20  ry is a "SELECT 
25380 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74 68  min(x)", then th
25390 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a  e loop coded by.
253a0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77          **     w
253b0 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f  here.c should no
253c0 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  t iterate over a
253d0 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20 61  ny values with a
253e0 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20   NULL value.    
253f0 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78      **     for x
25400 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
25410 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20       **   + The 
25420 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69  optimizer code i
25430 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20 74  n where.c (the t
25440 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64 65  hing that decide
25450 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  s which.        
25460 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20  **     index or 
25470 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29 20  indices to use) 
25480 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64  should place a d
25490 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74  ifferent priorit
254a0 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  y on .        **
254b0 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67 20       satisfying 
254c0 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20 63  the 'ORDER BY' c
254d0 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f  lause than it do
254e0 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65  es in other case
254f0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  s..        **   
25500 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20    Refer to code 
25510 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  and comments in 
25520 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61  where.c for deta
25530 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ils..        */.
25540 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
25550 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20   *pMinMax = 0;. 
25560 20 20 20 20 20 20 20 75 38 20 66 6c 61 67 20 3d         u8 flag =
25570 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 70 29 3b   minMaxQuery(p);
25580 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61  .        if( fla
25590 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  g ){.          a
255a0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
255b0 72 6f 70 65 72 74 79 28 70 2d 3e 70 45 4c 69 73  roperty(p->pELis
255c0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 45  t->a[0].pExpr, E
255d0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
255e0 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
255f0 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  x = sqlite3ExprL
25600 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
25610 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
25620 2d 3e 78 2e 70 4c 69 73 74 2c 30 29 3b 0a 20 20  ->x.pList,0);.  
25630 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70          pDel = p
25640 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20  MinMax;.        
25650 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26    if( pMinMax &&
25660 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
25670 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
25680 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e    pMinMax->a[0].
25690 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67  sortOrder = flag
256a0 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  !=WHERE_ORDERBY_
256b0 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20  MIN ?1:0;.      
256c0 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
256d0 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20  [0].pExpr->op = 
256e0 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
256f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
25700 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  .  .        /* T
25710 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66  his case runs if
25720 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68   the aggregate h
25730 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
25740 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20  lause.  The.    
25750 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
25760 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65  g is much simple
25770 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  r since there is
25780 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72   only a single r
25790 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ow.        ** of
257a0 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20   output..       
257b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65   */.        rese
257c0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
257d0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
257e0 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20  .        pWInfo 
257f0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
25800 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
25810 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70  List, pWhere, &p
25820 4d 69 6e 4d 61 78 2c 20 66 6c 61 67 29 3b 0a 20  MinMax, flag);. 
25830 20 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66         if( pWInf
25840 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
25850 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
25860 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c  tDelete(db, pDel
25870 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
25880 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
25890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
258a0 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
258b0 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
258c0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
258d0 28 20 21 70 4d 69 6e 4d 61 78 20 26 26 20 66 6c  ( !pMinMax && fl
258e0 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
258f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25900 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
25910 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29   pWInfo->iBreak)
25920 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
25930 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28  Comment((v, "%s(
25940 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20  ) by index",.   
25950 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c               (fl
25960 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42  ag==WHERE_ORDERB
25970 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78  Y_MIN?"min":"max
25980 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ")));.        }.
25990 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
259a0 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
259b0 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  .        finaliz
259c0 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
259d0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
259e0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
259f0 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
25a00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
25a10 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
25a20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64  pHaving, addrEnd
25a30 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
25a40 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65  ULL);.      sele
25a50 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
25a60 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
25a70 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a  , 0, 0, 0, -1, .
25a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a90 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64        pDest, add
25aa0 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a  rEnd, addrEnd);.
25ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25ac0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
25ad0 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pDel);.    }.   
25ae0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
25af0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
25b00 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f  End);.    .  } /
25b10 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74  * endif aggregat
25b20 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66  e query */..  if
25b30 28 20 64 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  ( distinct>=0 ){
25b40 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70  .    explainTemp
25b50 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44  Table(pParse, "D
25b60 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a  ISTINCT");.  }..
25b70 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
25b80 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
25b90 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65  use, then we nee
25ba0 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65  d to sort the re
25bb0 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73  sults.  ** and s
25bc0 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20  end them to the 
25bd0 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20  callback one by 
25be0 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
25bf0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
25c00 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
25c10 28 70 50 61 72 73 65 2c 20 22 4f 52 44 45 52 20  (pParse, "ORDER 
25c20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65 72 61  BY");.    genera
25c30 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73  teSortTail(pPars
25c40 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d  e, p, v, pEList-
25c50 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a  >nExpr, pDest);.
25c60 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68    }..  /* Jump h
25c70 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73  ere to skip this
25c80 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71   query.  */.  sq
25c90 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
25ca0 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a  Label(v, iEnd);.
25cb0 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54  .  /* The SELECT
25cc0 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
25cd0 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74  y coded.   Set t
25ce0 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
25cf0 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  o 0.  ** to indi
25d00 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a  cate no errors..
25d10 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a    */.  rc = 0;..
25d20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d    /* Control jum
25d30 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e  ps to here if an
25d40 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
25d50 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20  tered above, or 
25d60 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  upon.  ** succes
25d70 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74  sful coding of t
25d80 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a  he SELECT..  */.
25d90 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78  select_end:.  ex
25da0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
25db0 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
25dc0 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  d, iRestoreSelec
25dd0 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e  tId);..  /* Iden
25de0 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  tify column name
25df0 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20  s if results of 
25e00 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 74  the SELECT are t
25e10 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  o be output..  *
25e20 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
25e30 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e  TE_OK && pDest->
25e40 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
25e50 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  t ){.    generat
25e60 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
25e70 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
25e80 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73  EList);.  }..  s
25e90 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
25ea0 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b   sAggInfo.aCol);
25eb0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
25ec0 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  (db, sAggInfo.aF
25ed0 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unc);.  return r
25ee0 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  c;.}..#if define
25ef0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
25f00 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /*.*************
25f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25f50 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
25f60 69 6e 67 20 63 6f 64 65 20 69 73 20 75 73 65 64  ing code is used
25f70 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
25f80 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
25f90 20 20 54 68 65 20 63 6f 64 65 0a 2a 2a 20 74 68    The code.** th
25fa0 61 74 20 66 6f 6c 6c 6f 77 73 20 64 6f 65 73 20  at follows does 
25fb0 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f  not appear in no
25fc0 72 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a  rmal builds..**.
25fd0 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
25fe0 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 70 72  s are used to pr
25ff0 69 6e 74 20 6f 75 74 20 74 68 65 20 63 6f 6e 74  int out the cont
26000 65 6e 74 20 6f 66 20 61 6c 6c 20 6f 72 20 70 61  ent of all or pa
26010 72 74 20 6f 66 20 61 20 0a 2a 2a 20 70 61 72 73  rt of a .** pars
26020 65 20 73 74 72 75 63 74 75 72 65 73 20 73 75 63  e structures suc
26030 68 20 61 73 20 53 65 6c 65 63 74 20 6f 72 20 45  h as Select or E
26040 78 70 72 2e 20 20 53 75 63 68 20 70 72 69 6e 74  xpr.  Such print
26050 6f 75 74 73 20 61 72 65 20 75 73 65 66 75 6c 0a  outs are useful.
26060 2a 2a 20 66 6f 72 20 68 65 6c 70 69 6e 67 20 74  ** for helping t
26070 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 77 68 61  o understand wha
26080 74 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 69  t is happening i
26090 6e 73 69 64 65 20 74 68 65 20 63 6f 64 65 20 67  nside the code g
260a0 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 64 75 72 69  enerator.** duri
260b0 6e 67 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e  ng the execution
260c0 20 6f 66 20 63 6f 6d 70 6c 65 78 20 53 45 4c 45   of complex SELE
260d0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
260e0 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
260f0 6e 65 20 61 72 65 20 6e 6f 74 20 63 61 6c 6c 65  ne are not calle
26100 64 20 61 6e 79 77 68 65 72 65 20 66 72 6f 6d 20  d anywhere from 
26110 77 69 74 68 69 6e 20 74 68 65 20 6e 6f 72 6d 61  within the norma
26120 6c 0a 2a 2a 20 63 6f 64 65 20 62 61 73 65 2e 20  l.** code base. 
26130 20 54 68 65 6e 20 61 72 65 20 69 6e 74 65 6e 64   Then are intend
26140 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
26150 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20  from within the 
26160 64 65 62 75 67 67 65 72 0a 2a 2a 20 6f 72 20 66  debugger.** or f
26170 72 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20 22 70  rom temporary "p
26180 72 69 6e 74 66 22 20 73 74 61 74 65 6d 65 6e 74  rintf" statement
26190 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20 64  s inserted for d
261a0 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  ebugging..*/.voi
261b0 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78  d sqlite3PrintEx
261c0 70 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  pr(Expr *p){.  i
261d0 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
261e0 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
261f0 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
26200 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
26210 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 25  3DebugPrintf("(%
26220 73 22 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  s", p->u.zToken)
26230 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
26240 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
26250 66 28 22 28 25 64 22 2c 20 70 2d 3e 6f 70 29 3b  f("(%d", p->op);
26260 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c  .  }.  if( p->pL
26270 65 66 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  eft ){.    sqlit
26280 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
26290 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ");.    sqlite3P
262a0 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 4c 65 66  rintExpr(p->pLef
262b0 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  t);.  }.  if( p-
262c0 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73  >pRight ){.    s
262d0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
262e0 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  f(" ");.    sqli
262f0 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e  te3PrintExpr(p->
26300 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 73  pRight);.  }.  s
26310 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
26320 66 28 22 29 22 29 3b 0a 7d 0a 76 6f 69 64 20 73  f(")");.}.void s
26330 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c  qlite3PrintExprL
26340 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c  ist(ExprList *pL
26350 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
26360 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
26370 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
26380 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
26390 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Expr(pList->a[i]
263a0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
263b0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d   i<pList->nExpr-
263c0 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
263d0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c  e3DebugPrintf(",
263e0 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   ");.    }.  }.}
263f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69  .void sqlite3Pri
26400 6e 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20  ntSelect(Select 
26410 2a 70 2c 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b  *p, int indent){
26420 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
26430 72 69 6e 74 66 28 22 25 2a 73 53 45 4c 45 43 54  rintf("%*sSELECT
26440 28 25 70 29 20 22 2c 20 69 6e 64 65 6e 74 2c 20  (%p) ", indent, 
26450 22 22 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65  "", p);.  sqlite
26460 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70  3PrintExprList(p
26470 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c  ->pEList);.  sql
26480 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
26490 22 5c 6e 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e  "\n");.  if( p->
264a0 70 53 72 63 20 29 7b 0a 20 20 20 20 63 68 61 72  pSrc ){.    char
264b0 20 2a 7a 50 72 65 66 69 78 3b 0a 20 20 20 20 69   *zPrefix;.    i
264c0 6e 74 20 69 3b 0a 20 20 20 20 7a 50 72 65 66 69  nt i;.    zPrefi
264d0 78 20 3d 20 22 46 52 4f 4d 22 3b 0a 20 20 20 20  x = "FROM";.    
264e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53  for(i=0; i<p->pS
264f0 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  rc->nSrc; i++){.
26500 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
26510 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
26520 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69   = &p->pSrc->a[i
26530 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
26540 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73  DebugPrintf("%*s
26550 20 22 2c 20 69 6e 64 65 6e 74 2b 36 2c 20 7a 50   ", indent+6, zP
26560 72 65 66 69 78 29 3b 0a 20 20 20 20 20 20 7a 50  refix);.      zP
26570 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20  refix = "";.    
26580 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
26590 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
265a0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
265b0 74 66 28 22 28 5c 6e 22 29 3b 0a 20 20 20 20 20  tf("(\n");.     
265c0 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53     sqlite3PrintS
265d0 65 6c 65 63 74 28 70 49 74 65 6d 2d 3e 70 53 65  elect(pItem->pSe
265e0 6c 65 63 74 2c 20 69 6e 64 65 6e 74 2b 31 30 29  lect, indent+10)
265f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
26600 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
26610 73 29 22 2c 20 69 6e 64 65 6e 74 2b 38 2c 20 22  s)", indent+8, "
26620 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ");.      }else 
26630 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  if( pItem->zName
26640 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
26650 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
26660 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  %s", pItem->zNam
26670 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
26680 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61    if( pItem->pTa
26690 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  b ){.        sql
266a0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
266b0 22 28 74 61 62 6c 65 3a 20 25 73 29 22 2c 20 70  "(table: %s)", p
266c0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
266d0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
266e0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c    if( pItem->zAl
266f0 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ias ){.        s
26700 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
26710 66 28 22 20 41 53 20 25 73 22 2c 20 70 49 74 65  f(" AS %s", pIte
26720 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
26730 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c    }.      if( i<
26740 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 2d 31 20  p->pSrc->nSrc-1 
26750 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
26760 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c  e3DebugPrintf(",
26770 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
26780 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
26790 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
267a0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  }.  }.  if( p->p
267b0 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c  Where ){.    sql
267c0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
267d0 22 25 2a 73 20 57 48 45 52 45 20 22 2c 20 69 6e  "%*s WHERE ", in
267e0 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
267f0 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
26800 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
26810 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26820 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  tf("\n");.  }.  
26830 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  if( p->pGroupBy 
26840 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
26850 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 47  bugPrintf("%*s G
26860 52 4f 55 50 20 42 59 20 22 2c 20 69 6e 64 65 6e  ROUP BY ", inden
26870 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69  t, "");.    sqli
26880 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74  te3PrintExprList
26890 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20  (p->pGroupBy);. 
268a0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
268b0 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
268c0 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e  .  if( p->pHavin
268d0 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
268e0 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73  DebugPrintf("%*s
268f0 20 48 41 56 49 4e 47 20 22 2c 20 69 6e 64 65 6e   HAVING ", inden
26900 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69  t, "");.    sqli
26910 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e  te3PrintExpr(p->
26920 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71  pHaving);.    sq
26930 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
26940 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66  ("\n");.  }.  if
26950 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
26960 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
26970 67 50 72 69 6e 74 66 28 22 25 2a 73 20 4f 52 44  gPrintf("%*s ORD
26980 45 52 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c  ER BY ", indent,
26990 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   "");.    sqlite
269a0 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70  3PrintExprList(p
269b0 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
269c0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
269d0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d  ntf("\n");.  }.}
269e0 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73  ./* End of the s
269f0 74 72 75 63 74 75 72 65 20 64 65 62 75 67 20 70  tructure debug p
26a00 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a  rinting code.***
26a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64  **********/.#end
26a60 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
26a70 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
26a80 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
26a90 55 47 29 20 2a 2f 0a                             UG) */.