/ Hex Artifact Content
Login

Artifact f6c4833c4d8e94714761d99013d74f381e084f1d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
0210: 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  l the content of
0220: 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74   a Select struct
0230: 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ure but do not d
0240: 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65  eallocate.** the
0250: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
0260: 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61  e itself..*/.sta
0270: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0280: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0290: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
02a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c  elete(db, p->pEL
02c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
02d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
02e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c   p->pSrc);.  sql
02f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0300: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
0310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0330: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
0340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0350: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0380: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
0390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
03a0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
03b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
03c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
03d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
03e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
03f0: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
0400: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c  Initialize a Sel
0410: 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
0420: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
0430: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
0440: 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65  (SelectDest *pDe
0450: 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  st, int eDest, i
0460: 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65  nt iParm){.  pDe
0470: 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29  st->eDest = (u8)
0480: 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e  eDest;.  pDest->
0490: 69 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20  iParm = iParm;. 
04a0: 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79   pDest->affinity
04b0: 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69   = 0;.  pDest->i
04c0: 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  Mem = 0;.  pDest
04d0: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 7d 0a 0a 0a  ->nMem = 0;.}...
04e0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
04f0: 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75   new Select stru
0500: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
0510: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0520: 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  at.** structure.
0530: 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  .*/.Select *sqli
0540: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
0550: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0560: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0570: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
0580: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
0590: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
05a0: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
05b0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
05c0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
05d0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
05e0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
05f0: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0600: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0610: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0620: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0630: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0640: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0650: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0660: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0670: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
0680: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
0690: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
06a0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
06b0: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
06c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
06d0: 69 73 44 69 73 74 69 6e 63 74 2c 20 20 20 20 20  isDistinct,     
06e0: 20 20 2f 2a 20 74 72 75 65 20 69 66 20 74 68 65    /* true if the
06f0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
0700: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
0710: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
0720: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54          /* LIMIT
0730: 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65   value.  NULL me
0740: 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a  ans not used */.
0750: 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20    Expr *pOffset 
0760: 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45          /* OFFSE
0770: 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d  T value.  NULL m
0780: 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a  eans no offset *
0790: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
07a0: 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74  New;.  Select st
07b0: 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  andin;.  sqlite3
07c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
07d0: 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
07e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
07f0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
0800: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ) );.  assert( d
0810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0820: 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70  || !pOffset || p
0830: 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f 46 46 53  Limit ); /* OFFS
0840: 45 54 20 69 6d 70 6c 69 65 73 20 4c 49 4d 49 54  ET implies LIMIT
0850: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   */.  if( pNew==
0860: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
0870: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0880: 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  d );.    pNew = 
0890: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65  &standin;.    me
08a0: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
08b0: 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
08c0: 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  }.  if( pEList==
08d0: 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20  0 ){.    pEList 
08e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
08f0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
0900: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
0910: 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20  b,TK_ALL,0));.  
0920: 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  }.  pNew->pEList
0930: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 69 66 28   = pEList;.  if(
0940: 20 70 53 72 63 3d 3d 30 20 29 20 70 53 72 63 20   pSrc==0 ) pSrc 
0950: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
0960: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
0970: 28 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77  (*pSrc));.  pNew
0980: 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
0990: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
09a0: 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e  pWhere;.  pNew->
09b0: 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
09c0: 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  pBy;.  pNew->pHa
09d0: 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a  ving = pHaving;.
09e0: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
09f0: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
0a00: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
0a10: 69 73 44 69 73 74 69 6e 63 74 20 3f 20 53 46 5f  isDistinct ? SF_
0a20: 44 69 73 74 69 6e 63 74 20 3a 20 30 3b 0a 20 20  Distinct : 0;.  
0a30: 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45  pNew->op = TK_SE
0a40: 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  LECT;.  pNew->pL
0a50: 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
0a60: 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d   pNew->pOffset =
0a70: 20 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65   pOffset;.  asse
0a80: 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c  rt( pOffset==0 |
0a90: 7c 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20  | pLimit!=0 );. 
0aa0: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
0ab0: 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[0] = -1;.  p
0ac0: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
0ad0: 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[1] = -1;.  pNe
0ae0: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
0af0: 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64  2] = -1;.  if( d
0b00: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0b10: 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c  ) {.    clearSel
0b20: 65 63 74 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  ect(db, pNew);. 
0b30: 20 20 20 69 66 28 20 70 4e 65 77 21 3d 26 73 74     if( pNew!=&st
0b40: 61 6e 64 69 6e 20 29 20 73 71 6c 69 74 65 33 44  andin ) sqlite3D
0b50: 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b  bFree(db, pNew);
0b60: 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20  .    pNew = 0;. 
0b70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
0b80: 72 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21 3d  rt( pNew->pSrc!=
0b90: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
0ba0: 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73  r>0 );.  }.  ass
0bb0: 65 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61 6e  ert( pNew!=&stan
0bc0: 64 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  din );.  return 
0bd0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  pNew;.}../*.** D
0be0: 65 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20  elete the given 
0bf0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0c00: 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
0c10: 73 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  substructures..*
0c20: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
0c30: 6c 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74  lectDelete(sqlit
0c40: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
0c50: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
0c60: 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64     clearSelect(d
0c70: 62 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, p);.    sqlit
0c80: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
0c90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  .  }.}../*.** Gi
0ca0: 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74  ven 1 to 3 ident
0cb0: 69 66 69 65 72 73 20 70 72 65 63 65 65 64 69 6e  ifiers preceedin
0cc0: 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f  g the JOIN keywo
0cd0: 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68  rd, determine th
0ce0: 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69  e.** type of joi
0cf0: 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
0d00: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74  teger constant t
0d10: 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68  hat expresses th
0d20: 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65  at type.** in te
0d30: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  rms of the follo
0d40: 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a  wing bit values:
0d50: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e  .**.**     JT_IN
0d60: 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52  NER.**     JT_CR
0d70: 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55  OSS.**     JT_OU
0d80: 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41  TER.**     JT_NA
0d90: 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f  TURAL.**     JT_
0da0: 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52  LEFT.**     JT_R
0db0: 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c  IGHT.**.** A ful
0dc0: 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20  l outer join is 
0dd0: 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  the combination 
0de0: 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a  of JT_LEFT and J
0df0: 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49  T_RIGHT..**.** I
0e00: 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20  f an illegal or 
0e10: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
0e20: 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74   type is seen, t
0e30: 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
0e40: 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c  .** a join type,
0e50: 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f   but put an erro
0e60: 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  r in the pParse 
0e70: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
0e80: 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70  t sqlite3JoinTyp
0e90: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
0ea0: 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65   Token *pA, Toke
0eb0: 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43  n *pB, Token *pC
0ec0: 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70  ){.  int jointyp
0ed0: 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a  e = 0;.  Token *
0ee0: 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65  apAll[3];.  Toke
0ef0: 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20  n *p;.          
0f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f10: 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37     /*   01234567
0f20: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
0f30: 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20  456789 123 */.  
0f40: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0f50: 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22  r zKeyText[] = "
0f60: 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69  naturaleftouteri
0f70: 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73  ghtfullinnercros
0f80: 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  s";.  static con
0f90: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
0fa0: 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20  u8 i;        /* 
0fb0: 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79  Beginning of key
0fc0: 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65  word text in zKe
0fd0: 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75  yText[] */.    u
0fe0: 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c  8 nChar;    /* L
0ff0: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79  ength of the key
1000: 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74 65  word in characte
1010: 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64  rs */.    u8 cod
1020: 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74  e;     /* Join t
1030: 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20  ype mask */.  } 
1040: 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20  aKeyword[] = {. 
1050: 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f     /* natural */
1060: 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54   { 0,  7, JT_NAT
1070: 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20 20  URAL            
1080: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65      },.    /* le
1090: 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34  ft    */ { 6,  4
10a0: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
10b0: 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ER          },. 
10c0: 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f     /* outer   */
10d0: 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54   { 10, 5, JT_OUT
10e0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
10f0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69      },.    /* ri
1100: 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35  ght   */ { 14, 5
1110: 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  , JT_RIGHT|JT_OU
1120: 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  TER         },. 
1130: 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f     /* full    */
1140: 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46   { 19, 4, JT_LEF
1150: 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  T|JT_RIGHT|JT_OU
1160: 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e  TER },.    /* in
1170: 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35  ner   */ { 23, 5
1180: 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20  , JT_INNER      
1190: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
11a0: 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f     /* cross   */
11b0: 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 28, 5, JT_INN
11c0: 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20  ER|JT_CROSS     
11d0: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e      },.  };.  in
11e0: 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b  t i, j;.  apAll[
11f0: 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c  0] = pA;.  apAll
1200: 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c  [1] = pB;.  apAl
1210: 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72  l[2] = pC;.  for
1220: 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41  (i=0; i<3 && apA
1230: 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll[i]; i++){.   
1240: 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20   p = apAll[i];. 
1250: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72     for(j=0; j<Ar
1260: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
1270: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); j++){.      i
1280: 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72  f( p->n==aKeywor
1290: 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20  d[j].nChar .    
12a0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
12b0: 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
12c0: 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b  p->z, &zKeyText[
12d0: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20  aKeyword[j].i], 
12e0: 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p->n)==0 ){.    
12f0: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
1300: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65  aKeyword[j].code
1310: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1320: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1330: 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
1340: 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d  0 || j==1 || j==
1350: 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d  2 || j==3 || j==
1360: 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d  4 || j==5 || j==
1370: 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d  6 );.    if( j>=
1380: 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f  ArraySize(aKeywo
1390: 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69  rd) ){.      joi
13a0: 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f  ntype |= JT_ERRO
13b0: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
13c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a      }.  }.  if(.
13d0: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
13e0: 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55   (JT_INNER|JT_OU
13f0: 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52  TER))==(JT_INNER
1400: 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20  |JT_OUTER) ||.  
1410: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a     (jointype & J
1420: 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b  T_ERROR)!=0.  ){
1430: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1440: 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20  *zSp = " ";.    
1450: 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b  assert( pB!=0 );
1460: 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29  .    if( pC==0 )
1470: 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73  { zSp++; }.    s
1480: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1490: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
14a0: 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a  or unsupported j
14b0: 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20  oin type: ".    
14c0: 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c 20     "%T %T%s%T", 
14d0: 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29  pA, pB, zSp, pC)
14e0: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
14f0: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
1500: 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65  se if( (jointype
1510: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
1520: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f  .         && (jo
1530: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
1540: 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54  T|JT_RIGHT))!=JT
1550: 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c  _LEFT ){.    sql
1560: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1570: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47  rse, .      "RIG
1580: 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45  HT and FULL OUTE
1590: 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20  R JOINs are not 
15a0: 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72  currently suppor
15b0: 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74  ted");.    joint
15c0: 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a  ype = JT_INNER;.
15d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69    }.  return joi
15e0: 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ntype;.}../*.** 
15f0: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1600: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   of a column in 
1610: 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  a table.  Return
1620: 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d   -1 if the colum
1630: 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74  n.** is not cont
1640: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62  ained in the tab
1650: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1660: 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61  t columnIndex(Ta
1670: 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74  ble *pTab, const
1680: 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20   char *zCol){.  
1690: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
16a0: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
16b0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
16c0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61  lite3StrICmp(pTa
16d0: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  b->aCol[i].zName
16e0: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74  , zCol)==0 ) ret
16f0: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
1700: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
1710: 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72 73   Search the firs
1720: 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53  t N tables in pS
1730: 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  rc, from left to
1740: 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20   right, looking 
1750: 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74  for a.** table t
1760: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e  hat has a column
1770: 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a   named zCol.  .*
1780: 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c  *.** When found,
1790: 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20   set *piTab and 
17a0: 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61  *piCol to the ta
17b0: 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f  ble index and co
17c0: 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66  lumn index.** of
17d0: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f   the matching co
17e0: 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20  lumn and return 
17f0: 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  TRUE..**.** If n
1800: 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ot found, return
1810: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
1820: 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f  c int tableAndCo
1830: 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63  lumnIndex(.  Src
1840: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
1850: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61    /* Array of ta
1860: 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a  bles to search *
1870: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
1880: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1890: 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
18a0: 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61  pSrc->a[] to sea
18b0: 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  rch */.  const c
18c0: 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a  har *zCol,    /*
18d0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
18e0: 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  umn we are looki
18f0: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ng for */.  int 
1900: 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  *piTab,         
1910: 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20   /* Write index 
1920: 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72  of pSrc->a[] her
1930: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f  e */.  int *piCo
1940: 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l           /* W
1950: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
1960: 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54  rc->a[*piTab].pT
1970: 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20  ab->aCol[] here 
1980: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19a0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
19b0: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20   tables in pSrc 
19c0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
19d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
19e0: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74  ex of column mat
19f0: 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20  ching zCol */.. 
1a00: 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62 3d   assert( (piTab=
1a10: 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20  =0)==(piCol==0) 
1a20: 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e  );  /* Both or n
1a30: 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20  either are NULL 
1a40: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
1a50: 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f  N; i++){.    iCo
1a60: 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  l = columnIndex(
1a70: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c  pSrc->a[i].pTab,
1a80: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20   zCol);.    if( 
1a90: 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
1aa0: 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20   if( piTab ){.  
1ab0: 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69        *piTab = i
1ac0: 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c  ;.        *piCol
1ad0: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d   = iCol;.      }
1ae0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1af0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1b00: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1b10: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1b20: 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65 72   used to add ter
1b30: 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f  ms implied by JO
1b40: 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65  IN syntax to the
1b50: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
1b60: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61   expression of a
1b70: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1b80: 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c  t. The new term,
1b90: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44   which.** is AND
1ba0: 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69 73  ed with the exis
1bb0: 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73  ting WHERE claus
1bc0: 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  e, is of the for
1bd0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62  m:.**.**    (tab
1be0: 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f  1.col1 = tab2.co
1bf0: 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  l2).**.** where 
1c00: 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72 63  tab1 is the iSrc
1c10: 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63  'th table in Src
1c20: 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74 61  List pSrc and ta
1c30: 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69  b2 is the .** (i
1c40: 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d  Src+1)'th. Colum
1c50: 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e  n col1 is column
1c60: 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62   iColLeft of tab
1c70: 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a  1, and col2 is.*
1c80: 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67  * column iColRig
1c90: 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73  ht of tab2..*/.s
1ca0: 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68  tatic void addWh
1cb0: 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ereTerm(.  Parse
1cc0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1cd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1ce0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1cf0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1d00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d10: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
1d20: 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61  bles in FROM cla
1d30: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  use */.  int iLe
1d40: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
1d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1d60: 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65  x of first table
1d70: 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63   to join in pSrc
1d80: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65   */.  int iColLe
1d90: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
1da0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1db0: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73  f column in firs
1dc0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
1dd0: 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20 20   iRight,        
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1df0: 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20  Index of second 
1e00: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f  table in pSrc */
1e10: 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74  .  int iColRight
1e20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e30: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
1e40: 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20  olumn in second 
1e50: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1e60: 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20  sOuterJoin,     
1e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1e80: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
1e90: 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20   OUTER join */. 
1ea0: 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20   Expr **ppWhere 
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20   /* IN/OUT: The 
1ed0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
1ee0: 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  add to */.){.  s
1ef0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1f00: 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
1f10: 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45  *pE1;.  Expr *pE
1f20: 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a  2;.  Expr *pEq;.
1f30: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66 74  .  assert( iLeft
1f40: 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  <iRight );.  ass
1f50: 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e  ert( pSrc->nSrc>
1f60: 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65  iRight );.  asse
1f70: 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66  rt( pSrc->a[iLef
1f80: 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73  t].pTab );.  ass
1f90: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69  ert( pSrc->a[iRi
1fa0: 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20  ght].pTab );..  
1fb0: 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65  pE1 = sqlite3Cre
1fc0: 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62  ateColumnExpr(db
1fd0: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
1fe0: 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20  ColLeft);.  pE2 
1ff0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43  = sqlite3CreateC
2000: 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53  olumnExpr(db, pS
2010: 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c  rc, iRight, iCol
2020: 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d  Right);..  pEq =
2030: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
2040: 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31  arse, TK_EQ, pE1
2050: 2c 20 70 45 32 2c 20 30 29 3b 0a 20 20 69 66 28  , pE2, 0);.  if(
2060: 20 70 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a   pEq && isOuterJ
2070: 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53  oin ){.    ExprS
2080: 65 74 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  etProperty(pEq, 
2090: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
20a0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
20b0: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
20c0: 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  q, EP_TokenOnly|
20d0: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
20e0: 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64 75     ExprSetIrredu
20f0: 63 69 62 6c 65 28 70 45 71 29 3b 0a 20 20 20 20  cible(pEq);.    
2100: 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  pEq->iRightJoinT
2110: 61 62 6c 65 20 3d 20 28 69 31 36 29 70 45 32 2d  able = (i16)pE2-
2120: 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a  >iTable;.  }.  *
2130: 70 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  ppWhere = sqlite
2140: 33 45 78 70 72 41 6e 64 28 64 62 2c 20 2a 70 70  3ExprAnd(db, *pp
2150: 57 68 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a  Where, pEq);.}..
2160: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50  /*.** Set the EP
2170: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
2180: 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20  ty on all terms 
2190: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  of the given exp
21a0: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20  ression..** And 
21b0: 73 65 74 20 74 68 65 20 45 78 70 72 2e 69 52 69  set the Expr.iRi
21c0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20  ghtJoinTable to 
21d0: 69 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79  iTable for every
21e0: 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20   term in the.** 
21f0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
2200: 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  * The EP_FromJoi
2210: 6e 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73  n property is us
2220: 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61  ed on terms of a
2230: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  n expression to 
2240: 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54  tell.** the LEFT
2250: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63   OUTER JOIN proc
2260: 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61  essing logic tha
2270: 74 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70  t this term is p
2280: 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f  art of the.** jo
2290: 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73  in restriction s
22a0: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
22b0: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
22c0: 73 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72  se and not a par
22d0: 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65  t.** of the more
22e0: 20 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63   general WHERE c
22f0: 6c 61 75 73 65 2e 20 20 54 68 65 73 65 20 74 65  lause.  These te
2300: 72 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76  rms are moved ov
2310: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45  er to the.** WHE
2320: 52 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67  RE clause during
2330: 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67   join processing
2340: 20 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20   but we need to 
2350: 72 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68  remember that th
2360: 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64  ey.** originated
2370: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
2380: 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ING clause..**.*
2390: 2a 20 54 68 65 20 45 78 70 72 2e 69 52 69 67 68  * The Expr.iRigh
23a0: 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73  tJoinTable tells
23b0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
23c0: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61  e processing tha
23d0: 74 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  t the.** express
23e0: 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ion depends on t
23f0: 61 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54  able iRightJoinT
2400: 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61  able even if tha
2410: 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a  t table is not.*
2420: 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e  * explicitly men
2430: 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78  tioned in the ex
2440: 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20  pression.  That 
2450: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e  information is n
2460: 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73  eeded.** for cas
2470: 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  es like this:.**
2480: 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
2490: 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
24a0: 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
24b0: 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a  b AND t1.x=5.**.
24c0: 2a 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c 61  ** The where cla
24d0: 75 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66  use needs to def
24e0: 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20  er the handling 
24f0: 6f 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a  of the t1.x=5.**
2500: 20 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65   term until afte
2510: 72 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66  r the t2 loop of
2520: 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74   the join.  In t
2530: 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55  hat way, a.** NU
2540: 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62  LL t2 row will b
2550: 65 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65  e inserted whene
2560: 76 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66  ver t1.x!=5.  If
2570: 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65   we do not.** de
2580: 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67  fer the handling
2590: 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77   of t1.x=5, it w
25a0: 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64  ill be processed
25b0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20   immediately.** 
25c0: 61 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f  after the t1 loo
25d0: 70 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20  p and rows with 
25e0: 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76  t1.x!=5 will nev
25f0: 65 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20  er appear in.** 
2600: 74 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63  the output, whic
2610: 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a  h is incorrect..
2620: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2630: 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20  etJoinExpr(Expr 
2640: 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b  *p, int iTable){
2650: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
2660: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
2670: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
2680: 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  n);.    assert( 
2690: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
26a0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
26b0: 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
26c0: 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 49 72  );.    ExprSetIr
26d0: 72 65 64 75 63 69 62 6c 65 28 70 29 3b 0a 20 20  reducible(p);.  
26e0: 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54    p->iRightJoinT
26f0: 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62  able = (i16)iTab
2700: 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45  le;.    setJoinE
2710: 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54  xpr(p->pLeft, iT
2720: 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70  able);.    p = p
2730: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d  ->pRight;.  } .}
2740: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2750: 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74  tine processes t
2760: 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74  he join informat
2770: 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54  ion for a SELECT
2780: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f   statement..** O
2790: 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
27a0: 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65  ses are converte
27b0: 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72  d into extra ter
27c0: 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
27d0: 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52  clause..** NATUR
27e0: 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72  AL joins also cr
27f0: 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45  eate extra WHERE
2800: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a   clause terms..*
2810: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f  *.** The terms o
2820: 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  f a FROM clause 
2830: 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  are contained in
2840: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63   the Select.pSrc
2850: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54   structure..** T
2860: 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62  he left most tab
2870: 6c 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20  le is the first 
2880: 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e  entry in Select.
2890: 70 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74  pSrc.  The right
28a0: 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69  -most.** table i
28b0: 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  s the last entry
28c0: 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72  .  The join oper
28d0: 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20  ator is held in 
28e0: 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20  the entry to.** 
28f0: 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20  the left.  Thus 
2900: 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73  entry 0 contains
2910: 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   the join operat
2920: 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20  or for the join 
2930: 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69  between.** entri
2940: 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79  es 0 and 1.  Any
2950: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
2960: 75 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  uses associated 
2970: 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72  with the join ar
2980: 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68  e.** also attach
2990: 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65  ed to the left e
29a0: 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ntry..**.** This
29b0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
29c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
29d0: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
29e0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
29f0: 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
2a00: 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  in(Parse *pParse
2a10: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
2a20: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e  /* All tables in
2a50: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2a60: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2a90: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75  unters */.  stru
2aa0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2ab0: 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c  *pLeft;     /* L
2ac0: 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  eft table being 
2ad0: 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  joined */.  stru
2ae0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2af0: 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52  *pRight;    /* R
2b00: 69 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67  ight table being
2b10: 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53   joined */..  pS
2b20: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
2b30: 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61  pLeft = &pSrc->a
2b40: 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20  [0];.  pRight = 
2b50: 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72  &pLeft[1];.  for
2b60: 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
2b70: 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68  rc-1; i++, pRigh
2b80: 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20  t++, pLeft++){. 
2b90: 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54     Table *pLeftT
2ba0: 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62  ab = pLeft->pTab
2bb0: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69  ;.    Table *pRi
2bc0: 67 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d  ghtTab = pRight-
2bd0: 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69  >pTab;.    int i
2be0: 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28  sOuter;..    if(
2bf0: 20 4e 45 56 45 52 28 70 4c 65 66 74 54 61 62 3d   NEVER(pLeftTab=
2c00: 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d  =0 || pRightTab=
2c10: 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  =0) ) continue;.
2c20: 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70      isOuter = (p
2c30: 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20  Right->jointype 
2c40: 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a  & JT_OUTER)!=0;.
2c50: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  .    /* When the
2c60: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
2c70: 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64   is present, add
2c80: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
2c90: 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65  rms for.    ** e
2ca0: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74  very column that
2cb0: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
2cc0: 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a  have in common..
2cd0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2ce0: 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20  Right->jointype 
2cf0: 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a  & JT_NATURAL ){.
2d00: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
2d10: 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d  ->pOn || pRight-
2d20: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
2d30: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2d40: 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41  sg(pParse, "a NA
2d50: 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e  TURAL join may n
2d60: 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20  ot have ".      
2d70: 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55       "an ON or U
2d80: 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29  SING clause", 0)
2d90: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2da0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
2db0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69    for(j=0; j<pRi
2dc0: 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  ghtTab->nCol; j+
2dd0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
2de0: 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61   *zName;   /* Na
2df0: 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20  me of column in 
2e00: 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
2e10: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
2e20: 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74  Left;     /* Mat
2e30: 63 68 69 6e 67 20 6c 65 66 74 20 74 61 62 6c 65  ching left table
2e40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
2e50: 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61  iLeftCol;  /* Ma
2e60: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e  tching column in
2e70: 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20   the left table 
2e80: 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  */..        zNam
2e90: 65 20 3d 20 70 52 69 67 68 74 54 61 62 2d 3e 61  e = pRightTab->a
2ea0: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col[j].zName;.  
2eb0: 20 20 20 20 20 20 69 66 28 20 74 61 62 6c 65 41        if( tableA
2ec0: 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53  ndColumnIndex(pS
2ed0: 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20  rc, i+1, zName, 
2ee0: 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f  &iLeft, &iLeftCo
2ef0: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
2f00: 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61  addWhereTerm(pPa
2f10: 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74  rse, pSrc, iLeft
2f20: 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c  , iLeftCol, i+1,
2f30: 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   j,.            
2f40: 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74             isOut
2f50: 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b  er, &p->pWhere);
2f60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f70: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2f80: 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f   Disallow both O
2f90: 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
2fa0: 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ses in the same 
2fb0: 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  join.    */.    
2fc0: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20  if( pRight->pOn 
2fd0: 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e  && pRight->pUsin
2fe0: 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
2ff0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
3000: 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20  e, "cannot have 
3010: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
3020: 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61  G ".        "cla
3030: 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65  uses in the same
3040: 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72   join");.      r
3050: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a  eturn 1;.    }..
3060: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f      /* Add the O
3070: 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  N clause to the 
3080: 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
3090: 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74   clause, connect
30a0: 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20  ed by.    ** an 
30b0: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20  AND operator..  
30c0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
30d0: 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20  ght->pOn ){.    
30e0: 20 20 69 66 28 20 69 73 4f 75 74 65 72 20 29 20    if( isOuter ) 
30f0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69 67  setJoinExpr(pRig
3100: 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d  ht->pOn, pRight-
3110: 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
3120: 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c   p->pWhere = sql
3130: 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
3140: 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72  se->db, p->pWher
3150: 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b  e, pRight->pOn);
3160: 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70  .      pRight->p
3170: 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  On = 0;.    }.. 
3180: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74     /* Create ext
3190: 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20  ra terms on the 
31a0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72  WHERE clause for
31b0: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d   each column nam
31c0: 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  ed.    ** in the
31d0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20   USING clause.  
31e0: 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20  Example: If the 
31f0: 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65  two tables to be
3200: 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20   joined are .   
3210: 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20   ** A and B and 
3220: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3230: 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64   names X, Y, and
3240: 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69   Z, then add thi
3250: 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  s.    ** to the 
3260: 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20  WHERE clause:   
3270: 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59   A.X=B.X AND A.Y
3280: 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a  =B.Y AND A.Z=B.Z
3290: 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61  .    ** Report a
32a0: 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63  n error if any c
32b0: 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20  olumn mentioned 
32c0: 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  in the USING cla
32d0: 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  use is.    ** no
32e0: 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62  t contained in b
32f0: 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65  oth tables to be
3300: 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a   joined..    */.
3310: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
3320: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
3330: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  IdList *pList = 
3340: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a  pRight->pUsing;.
3350: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
3360: 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b  <pList->nId; j++
3370: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
3380: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e  *zName;     /* N
3390: 61 6d 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20  ame of the term 
33a0: 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  in the USING cla
33b0: 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  use */.        i
33c0: 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 20 20  nt iLeft;       
33d0: 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68 65 20  /* Table on the 
33e0: 6c 65 66 74 20 77 69 74 68 20 6d 61 74 63 68 69  left with matchi
33f0: 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  ng column name *
3400: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c  /.        int iL
3410: 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f  eftCol;    /* Co
3420: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d  lumn number of m
3430: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f  atching column o
3440: 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20  n the left */.  
3450: 20 20 20 20 20 20 69 6e 74 20 69 52 69 67 68 74        int iRight
3460: 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  Col;   /* Column
3470: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   number of match
3480: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68  ing column on th
3490: 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20  e right */..    
34a0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73      zName = pLis
34b0: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[j].zName;. 
34c0: 20 20 20 20 20 20 20 69 52 69 67 68 74 43 6f 6c         iRightCol
34d0: 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70   = columnIndex(p
34e0: 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29  RightTab, zName)
34f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52  ;.        if( iR
3500: 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20  ightCol<0.      
3510: 20 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43     || !tableAndC
3520: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c  olumnIndex(pSrc,
3530: 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c   i+1, zName, &iL
3540: 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a  eft, &iLeftCol).
3550: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
3560: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
3570: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61  rMsg(pParse, "ca
3580: 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20  nnot join using 
3590: 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75  column %s - colu
35a0: 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  mn ".           
35b0: 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e   "not present in
35c0: 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a   both tables", z
35d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
35e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
35f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64     }.        add
3600: 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65  WhereTerm(pParse
3610: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
3620: 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52  LeftCol, i+1, iR
3630: 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20  ightCol,.       
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
3650: 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72  Outer, &p->pWher
3660: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
3670: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
3680: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
3690: 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76 22 20  t code into "v" 
36a0: 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 74  that will push t
36b0: 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74 68 65  he record on the
36c0: 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73   top of the.** s
36d0: 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f  tack into the so
36e0: 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rter..*/.static 
36f0: 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72  void pushOntoSor
3700: 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ter(.  Parse *pP
3710: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
3720: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
3730: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
3740: 4f 72 64 65 72 42 79 2c 20 20 20 20 2f 2a 20 54  OrderBy,    /* T
3750: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
3760: 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  se */.  Select *
3770: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 2f  pSelect,       /
3780: 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45  * The whole SELE
3790: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
37a0: 20 20 69 6e 74 20 72 65 67 44 61 74 61 20 20 20    int regData   
37b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
37c0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74  ster holding dat
37d0: 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  a to be sorted *
37e0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
37f0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
3800: 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4f    int nExpr = pO
3810: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
3820: 20 69 6e 74 20 72 65 67 42 61 73 65 20 3d 20 73   int regBase = s
3830: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
3840: 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70 72  ge(pParse, nExpr
3850: 2b 32 29 3b 0a 20 20 69 6e 74 20 72 65 67 52 65  +2);.  int regRe
3860: 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
3870: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
3880: 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 73 71  ;.  int op;.  sq
3890: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
38a0: 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 73  ear(pParse);.  s
38b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
38c0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
38d0: 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61 73 65  OrderBy, regBase
38e0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
38f0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3900: 53 65 71 75 65 6e 63 65 2c 20 70 4f 72 64 65 72  Sequence, pOrder
3910: 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65  By->iECursor, re
3920: 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20  gBase+nExpr);.  
3930: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
3940: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 44  ove(pParse, regD
3950: 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78  ata, regBase+nEx
3960: 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71 6c 69  pr+1, 1);.  sqli
3970: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
3980: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
3990: 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72 20 2b  regBase, nExpr +
39a0: 20 32 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a   2, regRecord);.
39b0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 73    if( pSelect->s
39c0: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65  elFlags & SF_Use
39d0: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f 70  Sorter ){.    op
39e0: 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65   = OP_SorterInse
39f0: 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rt;.  }else{.   
3a00: 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65   op = OP_IdxInse
3a10: 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rt;.  }.  sqlite
3a20: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
3a30: 70 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  p, pOrderBy->iEC
3a40: 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64  ursor, regRecord
3a50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
3a60: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
3a70: 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
3a80: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
3a90: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
3aa0: 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72 2b   regBase, nExpr+
3ab0: 32 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63  2);.  if( pSelec
3ac0: 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  t->iLimit ){.   
3ad0: 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72   int addr1, addr
3ae0: 32 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69  2;.    int iLimi
3af0: 74 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  t;.    if( pSele
3b00: 63 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20  ct->iOffset ){. 
3b10: 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53       iLimit = pS
3b20: 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31  elect->iOffset+1
3b30: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3b40: 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c     iLimit = pSel
3b50: 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ect->iLimit;.   
3b60: 20 7d 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73   }.    addr1 = s
3b70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
3b80: 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69  (v, OP_IfZero, i
3b90: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69  Limit);.    sqli
3ba0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3bb0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c 69 6d   OP_AddImm, iLim
3bc0: 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64  it, -1);.    add
3bd0: 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
3be0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
3bf0: 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  o);.    sqlite3V
3c00: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
3c10: 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddr1);.    sqlit
3c20: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
3c30: 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72 42  OP_Last, pOrderB
3c40: 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20  y->iECursor);.  
3c50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3c60: 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65  Op1(v, OP_Delete
3c70: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
3c80: 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
3c90: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
3ca0: 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a  , addr2);.  }.}.
3cb0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
3cc0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
3cd0: 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69   OFFSET.*/.stati
3ce0: 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65  c void codeOffse
3cf0: 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  t(.  Vdbe *v,   
3d00: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
3d10: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
3d20: 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74  s VM */.  Select
3d30: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *p,        /* T
3d40: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
3d50: 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ent being coded 
3d60: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
3d70: 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  ue     /* Jump h
3d80: 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20  ere to skip the 
3d90: 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a  current record *
3da0: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f  /.){.  if( p->iO
3db0: 66 66 73 65 74 20 26 26 20 69 43 6f 6e 74 69 6e  ffset && iContin
3dc0: 75 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ue!=0 ){.    int
3dd0: 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c 69 74   addr;.    sqlit
3de0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3df0: 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f  OP_AddImm, p->iO
3e00: 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20  ffset, -1);.    
3e10: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
3e20: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
3e30: 66 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73 65 74  fNeg, p->iOffset
3e40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3e50: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
3e60: 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75  oto, 0, iContinu
3e70: 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  e);.    VdbeComm
3e80: 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20 4f 46  ent((v, "skip OF
3e90: 46 53 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b  FSET records"));
3ea0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3eb0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
3ec0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3ed0: 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69  Add code that wi
3ee0: 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ll check to make
3ef0: 20 73 75 72 65 20 74 68 65 20 4e 20 72 65 67 69   sure the N regi
3f00: 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
3f10: 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61  t iMem.** form a
3f20: 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e   distinct entry.
3f30: 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72 74    iTab is a sort
3f40: 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 68  ing index that h
3f50: 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a  olds previously.
3f60: 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74  ** seen combinat
3f70: 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61  ions of the N va
3f80: 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74  lues.  A new ent
3f90: 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54  ry is made in iT
3fa0: 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72  ab.** if the cur
3fb0: 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72  rent N values ar
3fc0: 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  e new..**.** A j
3fd0: 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65 61  ump to addrRepea
3fe0: 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68  t is made and th
3ff0: 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65  e N+1 values are
4000: 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
4010: 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65  .** stack if the
4020: 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20   top N elements 
4030: 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74  are not distinct
4040: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4050: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20   codeDistinct(. 
4060: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4070: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
4080: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
4090: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
40a0: 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20  int iTab,       
40b0: 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20     /* A sorting 
40c0: 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65  index used to te
40d0: 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e  st for distinctn
40e0: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ess */.  int add
40f0: 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a  rRepeat,    /* J
4100: 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e  ump to here if n
4110: 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  ot distinct */. 
4120: 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
4130: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4140: 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69   elements */.  i
4150: 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20  nt iMem         
4160: 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65    /* First eleme
4170: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  nt */.){.  Vdbe 
4180: 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20  *v;.  int r1;.. 
4190: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
41a0: 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74  be;.  r1 = sqlit
41b0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
41c0: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
41d0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
41e0: 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20  OP_Found, iTab, 
41f0: 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d  addrRepeat, iMem
4200: 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , N);.  sqlite3V
4210: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4220: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d  MakeRecord, iMem
4230: 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69  , N, r1);.  sqli
4240: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4250: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
4260: 54 61 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69  Tab, r1);.  sqli
4270: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
4280: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
4290: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
42a0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
42b0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
42c0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
42d0: 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69 73 20  hen a SELECT is 
42e0: 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 73 75  used within a su
42f0: 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28  bexpression.** (
4300: 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20  example:  "a IN 
4310: 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
4320: 61 62 6c 65 29 22 29 20 62 75 74 20 69 74 20 68  able)") but it h
4330: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 72  as more than 1 r
4340: 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e  esult.** column.
4350: 20 20 57 65 20 64 6f 20 74 68 69 73 20 69 6e 20    We do this in 
4360: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63  a subroutine bec
4370: 61 75 73 65 20 74 68 65 20 65 72 72 6f 72 20 75  ause the error u
4380: 73 65 64 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  sed to occur.** 
4390: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63  in multiple plac
43a0: 65 73 2e 20 20 28 54 68 65 20 65 72 72 6f 72 20  es.  (The error 
43b0: 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 6e 20 6f  only occurs in o
43c0: 6e 65 20 70 6c 61 63 65 20 6e 6f 77 2c 20 62 75  ne place now, bu
43d0: 74 20 77 65 0a 2a 2a 20 72 65 74 61 69 6e 20 74  t we.** retain t
43e0: 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f  he subroutine to
43f0: 20 6d 69 6e 69 6d 69 7a 65 20 63 6f 64 65 20 64   minimize code d
4400: 69 73 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73  isruption.).*/.s
4410: 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46  tatic int checkF
4420: 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c  orMultiColumnSel
4430: 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73  ectError(.  Pars
4440: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
4450: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
4460: 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  t. */.  SelectDe
4470: 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20  st *pDest,   /* 
4480: 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53  Destination of S
4490: 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f  ELECT results */
44a0: 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20  .  int nExpr    
44b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
44c0: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
44d0: 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  mns returned by 
44e0: 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69  SELECT */.){.  i
44f0: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
4500: 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e  ->eDest;.  if( n
4510: 45 78 70 72 3e 31 20 26 26 20 28 65 44 65 73 74  Expr>1 && (eDest
4520: 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
4530: 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a  st==SRT_Set) ){.
4540: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4550: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c  Msg(pParse, "onl
4560: 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c  y a single resul
4570: 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a  t allowed for ".
4580: 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54         "a SELECT
4590: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
45a0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29   an expression")
45b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
45c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
45d0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  urn 0;.  }.}.#en
45e0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
45f0: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
4600: 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74  s the code for t
4610: 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65  he inside of the
4620: 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f   inner loop.** o
4630: 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a  f a SELECT..**.*
4640: 2a 20 49 66 20 73 72 63 54 61 62 20 61 6e 64 20  * If srcTab and 
4650: 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68  nColumn are both
4660: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
4670: 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f  pEList expressio
4680: 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61  ns.** are evalua
4690: 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
46a0: 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72  get the data for
46b0: 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 6e   this row.  If n
46c0: 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e  Column>0.** then
46d0: 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20   data is pulled 
46e0: 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20  from srcTab and 
46f0: 70 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f  pEList is used o
4700: 6e 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a 2a  nly to get the.*
4710: 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f 72 20  * datatypes for 
4720: 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  each column..*/.
4730: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
4740: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50  ctInnerLoop(.  P
4750: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4760: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
4770: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
4780: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
4790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
47a0: 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74   complete select
47b0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
47c0: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72   coded */.  Expr
47d0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
47e0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76      /* List of v
47f0: 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74 72  alues being extr
4800: 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  acted */.  int s
4810: 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  rcTab,          
4820: 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20     /* Pull data 
4830: 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20  from this table 
4840: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
4850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
4860: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
4870: 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20  s in the source 
4880: 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
4890: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
48a0: 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c     /* If not NUL
48b0: 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73 20  L, sort results 
48c0: 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20 2a  using this key *
48d0: 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74  /.  int distinct
48e0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
48f0: 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65  f >=0, make sure
4900: 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73   results are dis
4910: 74 69 6e 63 74 20 2a 2f 0a 20 20 53 65 6c 65 63  tinct */.  Selec
4920: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
4930: 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73     /* How to dis
4940: 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75  pose of the resu
4950: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  lts */.  int iCo
4960: 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20  ntinue,         
4970: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
4980: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
4990: 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74  ext row */.  int
49a0: 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20   iBreak         
49b0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
49c0: 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
49d0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
49e0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
49f0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
4a00: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
4a10: 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20   hasDistinct;   
4a20: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
4a30: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
4a40: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
4a50: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75  */.  int regResu
4a60: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lt;             
4a70: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d   /* Start of mem
4a80: 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ory holding resu
4a90: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  lt set */.  int 
4aa0: 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65  eDest = pDest->e
4ab0: 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74  Dest;   /* How t
4ac0: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73  o dispose of res
4ad0: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ults */.  int iP
4ae0: 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 50 61  arm = pDest->iPa
4af0: 72 6d 3b 20 20 20 2f 2a 20 46 69 72 73 74 20 61  rm;   /* First a
4b00: 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f  rgument to dispo
4b10: 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  sal method */.  
4b20: 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  int nResultCol; 
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4b40: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
4b50: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73  columns */..  as
4b60: 73 65 72 74 28 20 76 20 29 3b 0a 20 20 69 66 28  sert( v );.  if(
4b70: 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
4b80: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
4b90: 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20   pEList!=0 );.  
4ba0: 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 64 69  hasDistinct = di
4bb0: 73 74 69 6e 63 74 3e 3d 30 3b 0a 20 20 69 66 28  stinct>=0;.  if(
4bc0: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20   pOrderBy==0 && 
4bd0: 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  !hasDistinct ){.
4be0: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
4bf0: 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , p, iContinue);
4c00: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20  .  }..  /* Pull 
4c10: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
4c20: 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  lumns..  */.  if
4c30: 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20  ( nColumn>0 ){. 
4c40: 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20     nResultCol = 
4c50: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65  nColumn;.  }else
4c60: 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c  {.    nResultCol
4c70: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
4c80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65 73  ;.  }.  if( pDes
4c90: 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20  t->iMem==0 ){.  
4ca0: 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20    pDest->iMem = 
4cb0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
4cc0: 20 20 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20      pDest->nMem 
4cd0: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
4ce0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
4cf0: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
4d00: 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61 73 73 65  }else{ .    asse
4d10: 72 74 28 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 3d  rt( pDest->nMem=
4d20: 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a 20  =nResultCol );. 
4d30: 20 7d 0a 20 20 72 65 67 52 65 73 75 6c 74 20 3d   }.  regResult =
4d40: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3b 0a 20 20   pDest->iMem;.  
4d50: 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b  if( nColumn>0 ){
4d60: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4d70: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
4d80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4d90: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
4da0: 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20  umn, srcTab, i, 
4db0: 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20  regResult+i);.  
4dc0: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
4dd0: 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74  eDest!=SRT_Exist
4de0: 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  s ){.    /* If t
4df0: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
4e00: 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29  s an EXISTS(...)
4e10: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
4e20: 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76   actual.    ** v
4e30: 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 62  alues returned b
4e40: 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  y the SELECT are
4e50: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
4e60: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
4e70: 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
4e80: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71 6c  pParse);.    sql
4e90: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
4ea0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c  List(pParse, pEL
4eb0: 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ist, regResult, 
4ec0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
4ed0: 74 29 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c 75 6d  t);.  }.  nColum
4ee0: 6e 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  n = nResultCol;.
4ef0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53  .  /* If the DIS
4f00: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61  TINCT keyword wa
4f10: 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65  s present on the
4f20: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4f30: 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20  t.  ** and this 
4f40: 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65  row has been see
4f50: 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64  n before, then d
4f60: 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20  o not make this 
4f70: 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66  row.  ** part of
4f80: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
4f90: 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69  /.  if( hasDisti
4fa0: 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nct ){.    asser
4fb0: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
4fc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
4fd0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c 75  st->nExpr==nColu
4fe0: 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65 44 69  mn );.    codeDi
4ff0: 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 64  stinct(pParse, d
5000: 69 73 74 69 6e 63 74 2c 20 69 43 6f 6e 74 69 6e  istinct, iContin
5010: 75 65 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67  ue, nColumn, reg
5020: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 69 66 28  Result);.    if(
5030: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
5040: 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74        codeOffset
5050: 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
5060: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
5070: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
5080: 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
5090: 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68  mode, write each
50a0: 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f   query result to
50b0: 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
50c0: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a  temporary.    **
50d0: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
50e0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
50f0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
5100: 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73  D_SELECT.    cas
5110: 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20  e SRT_Union: {. 
5120: 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20       int r1;.   
5130: 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
5140: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
5150: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5160: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5170: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
5180: 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c  Result, nColumn,
5190: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
51a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
51b0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
51c0: 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
51d0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
51e0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
51f0: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
5200: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
5210: 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72  onstruct a recor
5220: 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79  d from the query
5230: 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73   result, but ins
5240: 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73  tead of.    ** s
5250: 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72  aving that recor
5260: 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b  d, use it as a k
5270: 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65  ey to delete ele
5280: 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a  ments from.    *
5290: 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
52a0: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
52b0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
52c0: 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20  _Except: {.     
52d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
52e0: 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65  p3(v, OP_IdxDele
52f0: 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65  te, iParm, regRe
5300: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  sult, nColumn);.
5310: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5320: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
5330: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
5340: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
5350: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
5360: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
5370: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
5380: 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
5390: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20   {.      int r1 
53a0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
53b0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
53c0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
53d0: 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st==SRT_Table );
53e0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
53f0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65   eDest==SRT_Ephe
5400: 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71  mTab );.      sq
5410: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5420: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
5430: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
5440: 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20  lumn, r1);.     
5450: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
5460: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
5470: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
5480: 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29  pOrderBy, p, r1)
5490: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
54a0: 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20         int r2 = 
54b0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
54c0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
54d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
54e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
54f0: 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b  wid, iParm, r2);
5500: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5510: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5520: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
5530: 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20  r1, r2);.       
5540: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5550: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
5560: 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20  PPEND);.        
5570: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
5580: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
5590: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
55a0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
55b0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
55c0: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
55d0: 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
55e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
55f0: 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77  UERY.    /* If w
5600: 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61  e are creating a
5610: 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70   set for an "exp
5620: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
5630: 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20  )" construct,.  
5640: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
5650: 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67  should be a sing
5660: 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73  le item on the s
5670: 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69  tack.  Write thi
5680: 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e  s.    ** item in
5690: 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65  to the set table
56a0: 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61   with bogus data
56b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
56c0: 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
56d0: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
56e0: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70  mn==1 );.      p
56f0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
5700: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
5710: 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  ity(pEList->a[0]
5720: 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61  .pExpr, pDest->a
5730: 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20  ffinity);.      
5740: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
5750: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69          /* At fi
5760: 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77  rst glance you w
5770: 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f  ould think we co
5780: 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74  uld optimize out
5790: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
57a0: 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68 69 73  ORDER BY in this
57b0: 20 63 61 73 65 20 73 69 6e 63 65 20 74 68 65 20   case since the 
57c0: 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73  order of entries
57d0: 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20   in the set.    
57e0: 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
57f0: 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74 68 65  matter.  But the
5800: 72 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49  re might be a LI
5810: 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77  MIT clause, in w
5820: 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  hich.        ** 
5830: 63 61 73 65 20 74 68 65 20 6f 72 64 65 72 20 64  case the order d
5840: 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20  oes matter */.  
5850: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
5860: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
5870: 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73  derBy, p, regRes
5880: 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ult);.      }els
5890: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
58a0: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
58b0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
58c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
58d0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
58e0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
58f0: 73 75 6c 74 2c 20 31 2c 20 72 31 2c 20 26 70 2d  sult, 1, r1, &p-
5900: 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  >affinity, 1);. 
5910: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
5920: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
5930: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
5940: 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20  gResult, 1);.   
5950: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5960: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
5970: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
5980: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
5990: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
59a0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
59b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
59c0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
59d0: 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69  * If any row exi
59e0: 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  st in the result
59f0: 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61   set, record tha
5a00: 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74  t fact and abort
5a10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
5a20: 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a  e SRT_Exists: {.
5a30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5a40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
5a50: 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29  teger, 1, iParm)
5a60: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
5a70: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
5a80: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
5a90: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
5aa0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5ab0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
5ac0: 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
5ad0: 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
5ae0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
5af0: 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
5b00: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
5b10: 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
5b20: 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
5b30: 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
5b40: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
5b50: 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
5b60: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
5b70: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5b80: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
5b90: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
5ba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
5bb0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
5bc0: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20  e, pOrderBy, p, 
5bd0: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
5be0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5bf0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
5c00: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  Move(pParse, reg
5c10: 52 65 73 75 6c 74 2c 20 69 50 61 72 6d 2c 20 31  Result, iParm, 1
5c20: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  );.        /* Th
5c30: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
5c40: 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20  ill jump out of 
5c50: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
5c60: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
5c70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
5c80: 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
5c90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
5ca0: 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
5cb0: 53 65 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f  Send the data to
5cc0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75   the callback fu
5cd0: 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73  nction or to a s
5ce0: 75 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74  ubroutine.  In t
5cf0: 68 65 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 6f  he.    ** case o
5d00: 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2c 20  f a subroutine, 
5d10: 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69  the subroutine i
5d20: 74 73 65 6c 66 20 69 73 20 72 65 73 70 6f 6e 73  tself is respons
5d30: 69 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20  ible for.    ** 
5d40: 70 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  popping the data
5d50: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e   from the stack.
5d60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5d70: 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 0a   SRT_Coroutine:.
5d80: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74      case SRT_Out
5d90: 70 75 74 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  put: {.      tes
5da0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
5db0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20  T_Coroutine );. 
5dc0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
5dd0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
5de0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   );.      if( pO
5df0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
5e00: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
5e10: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
5e20: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
5e30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5e40: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
5e50: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
5e60: 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20  lumn, r1);.     
5e70: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
5e80: 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  r(pParse, pOrder
5e90: 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20  By, p, r1);.    
5ea0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
5eb0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5ec0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , r1);.      }el
5ed0: 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  se if( eDest==SR
5ee0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
5ef0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5f00: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
5f10: 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50 61  ield, pDest->iPa
5f20: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rm);.      }else
5f30: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5f40: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5f50: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67  P_ResultRow, reg
5f60: 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29  Result, nColumn)
5f70: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5f80: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
5f90: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
5fa0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c   regResult, nCol
5fb0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  umn);.      }.  
5fc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5fd0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
5fe0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
5ff0: 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61  ER).    /* Disca
6000: 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  rd the results. 
6010: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
6020: 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
6030: 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a  nts inside.    *
6040: 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20  * the body of a 
6050: 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75  TRIGGER.  The pu
6060: 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65  rpose of such se
6070: 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c  lects is to call
6080: 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66  .    ** user-def
6090: 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74  ined functions t
60a0: 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66  hat have side ef
60b0: 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f  fects.  We do no
60c0: 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62  t care.    ** ab
60d0: 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72  out the actual r
60e0: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
60f0: 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lect..    */.   
6100: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
6110: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
6120: 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a  =SRT_Discard );.
6130: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6140: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
6150: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
6160: 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
6170: 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
6180: 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70 74  reached.  Except
6190: 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20  , if.  ** there 
61a0: 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20  is a sorter, in 
61b0: 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 73  which case the s
61c0: 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61 64  orter has alread
61d0: 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74  y limited.  ** t
61e0: 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73  he output for us
61f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
6200: 64 65 72 42 79 3d 3d 30 20 26 26 20 70 2d 3e 69  derBy==0 && p->i
6210: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
6220: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6230: 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e  , OP_IfZero, p->
6240: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20  iLimit, iBreak, 
6250: 2d 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  -1);.  }.}../*.*
6260: 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65  * Given an expre
6270: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65  ssion list, gene
6280: 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73  rate a KeyInfo s
6290: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
62a0: 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c  cords.** the col
62b0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
62c0: 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  for each express
62d0: 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72  ion in that expr
62e0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
62f0: 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  ** If the ExprLi
6300: 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  st is an ORDER B
6310: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
6320: 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65  ause then the re
6330: 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e  sulting.** KeyIn
6340: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
6350: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
6360: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
6370: 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a  irtual index to.
6380: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61  ** implement tha
6390: 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68  t clause.  If th
63a0: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68  e ExprList is th
63b0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
63c0: 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e  a SELECT.** then
63d0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
63e0: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
63f0: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
6400: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
6410: 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70  .** index to imp
6420: 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43  lement a DISTINC
6430: 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70  T test..**.** Sp
6440: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
6450: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
6460: 65 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d  e is obtain from
6470: 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61   malloc.  The ca
6480: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
6490: 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  n is responsible
64a0: 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74   for seeing that
64b0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
64c0: 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  is eventually.**
64d0: 20 66 72 65 65 64 2e 20 20 41 64 64 20 74 68 65   freed.  Add the
64e0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
64f0: 72 65 20 74 6f 20 74 68 65 20 50 34 20 66 69 65  re to the P4 fie
6500: 6c 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20  ld of an opcode 
6510: 75 73 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49  using.** P4_KEYI
6520: 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74  NFO_HANDOFF is t
6530: 68 65 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20  he usual way of 
6540: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69  dealing with thi
6550: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  s..*/.static Key
6560: 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f  Info *keyInfoFro
6570: 6d 45 78 70 72 4c 69 73 74 28 50 61 72 73 65 20  mExprList(Parse 
6580: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73  *pParse, ExprLis
6590: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c  t *pList){.  sql
65a0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
65b0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78  e->db;.  int nEx
65c0: 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  pr;.  KeyInfo *p
65d0: 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45  Info;.  struct E
65e0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
65f0: 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  tem;.  int i;.. 
6600: 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e   nExpr = pList->
6610: 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d  nExpr;.  pInfo =
6620: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6630: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
6640: 2a 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a  *pInfo) + nExpr*
6650: 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
6660: 29 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49  )+1) );.  if( pI
6670: 6e 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f  nfo ){.    pInfo
6680: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
6690: 75 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c  u8*)&pInfo->aCol
66a0: 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49  l[nExpr];.    pI
66b0: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75  nfo->nField = (u
66c0: 31 36 29 6e 45 78 70 72 3b 0a 20 20 20 20 70 49  16)nExpr;.    pI
66d0: 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64  nfo->enc = ENC(d
66e0: 62 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 64  b);.    pInfo->d
66f0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 66 6f 72 28  b = db;.    for(
6700: 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  i=0, pItem=pList
6710: 2d 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  ->a; i<nExpr; i+
6720: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
6730: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
6740: 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  l;.      pColl =
6750: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
6760: 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
6770: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
6780: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
6790: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64         pColl = d
67a0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
67b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66      }.      pInf
67c0: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43  o->aColl[i] = pC
67d0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f  oll;.      pInfo
67e0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
67f0: 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  = pItem->sortOrd
6800: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  er;.    }.  }.  
6810: 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a  return pInfo;.}.
6820: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6830: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
6840: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20  LECT./*.** Name 
6850: 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
6860: 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64  n operator, used
6870: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
6880: 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ges..*/.static c
6890: 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63  onst char *selec
68a0: 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b  tOpName(int id){
68b0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77  .  char *z;.  sw
68c0: 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20  itch( id ){.    
68d0: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20  case TK_ALL:    
68e0: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c     z = "UNION AL
68f0: 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  L";   break;.   
6900: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45   case TK_INTERSE
6910: 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45  CT: z = "INTERSE
6920: 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  CT";   break;.  
6930: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
6940: 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54  :    z = "EXCEPT
6950: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
6960: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
6970: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
6980: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
6990: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a    }.  return z;.
69a0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
69b0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
69c0: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e  _SELECT */..#ifn
69d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
69e0: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e  EXPLAIN./*.** Un
69f0: 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e  less an "EXPLAIN
6a00: 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d   QUERY PLAN" com
6a10: 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72  mand is being pr
6a20: 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75  ocessed, this fu
6a30: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e  nction.** is a n
6a40: 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
6a50: 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c   it adds a singl
6a60: 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20  e row of output 
6a70: 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c  to the EQP resul
6a80: 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20  t,.** where the 
6a90: 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68  caption is of th
6aa0: 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
6ab0: 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45  "USE TEMP B-TREE
6ac0: 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20   FOR xxx".**.** 
6ad0: 77 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65  where xxx is one
6ae0: 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20   of "DISTINCT", 
6af0: 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22 47  "ORDER BY" or "G
6b00: 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c  ROUP BY". Exactl
6b10: 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65  y which.** is de
6b20: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
6b30: 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e  zUsage argument.
6b40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6b50: 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
6b60: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6b70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61  const char *zUsa
6b80: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  ge){.  if( pPars
6b90: 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
6ba0: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70  .    Vdbe *v = p
6bb0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
6bc0: 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73    char *zMsg = s
6bd0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
6be0: 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20 54  arse->db, "USE T
6bf0: 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25  EMP B-TREE FOR %
6c00: 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20 20  s", zUsage);.   
6c10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6c20: 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
6c30: 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
6c40: 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c  tId, 0, 0, zMsg,
6c50: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
6c60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67  }.}../*.** Assig
6c70: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74  n expression b t
6c80: 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65  o lvalue a. A se
6c90: 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72  cond, no-op, ver
6ca0: 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63  sion of this mac
6cb0: 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65  ro.** is provide
6cc0: 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d  d when SQLITE_OM
6cd0: 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65  IT_EXPLAIN is de
6ce0: 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f  fined. This allo
6cf0: 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69  ws the code.** i
6d00: 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  n sqlite3Select(
6d10: 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75  ) to assign valu
6d20: 65 73 20 74 6f 20 73 74 72 75 63 74 75 72 65 20  es to structure 
6d30: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
6d40: 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78   that.** only ex
6d50: 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d  ist if SQLITE_OM
6d60: 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f  IT_EXPLAIN is no
6d70: 74 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75  t defined withou
6d80: 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a  t polluting the.
6d90: 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69 66  ** code with #if
6da0: 6e 64 65 66 20 64 69 72 65 63 74 69 76 65 73 2e  ndef directives.
6db0: 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70  .*/.# define exp
6dc0: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61  lainSetInteger(a
6dd0: 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73  , b) a = b..#els
6de0: 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69  e./* No-op versi
6df0: 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61  ons of the expla
6e00: 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e  inXXX() function
6e10: 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f  s and macros. */
6e20: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
6e30: 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a  nTempTable(y,z).
6e40: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
6e50: 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a  SetInteger(y,z).
6e60: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
6e70: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6e80: 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64 65  _EXPLAIN) && !de
6e90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6ea0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
6eb0: 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  T)./*.** Unless 
6ec0: 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52  an "EXPLAIN QUER
6ed0: 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20  Y PLAN" command 
6ee0: 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  is being process
6ef0: 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
6f00: 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  n.** is a no-op.
6f10: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61   Otherwise, it a
6f20: 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  dds a single row
6f30: 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68   of output to th
6f40: 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a  e EQP result,.**
6f50: 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69   where the capti
6f60: 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20  on is of one of 
6f70: 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a  the two forms:.*
6f80: 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54  *.**   "COMPOSIT
6f90: 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75  E SUBQUERIES iSu
6fa0: 62 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f 70  b1 and iSub2 (op
6fb0: 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49  )".**   "COMPOSI
6fc0: 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53  TE SUBQUERIES iS
6fd0: 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 55 53  ub1 and iSub2 US
6fe0: 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20  ING TEMP B-TREE 
6ff0: 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72  (op)".**.** wher
7000: 65 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62  e iSub1 and iSub
7010: 32 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65  2 are the intege
7020: 72 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  rs passed as the
7030: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
7040: 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d  * function param
7050: 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69 73  eters, and op is
7060: 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73   the text repres
7070: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
7080: 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20  parameter.** of 
7090: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54  the same name. T
70a0: 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f 70  he parameter "op
70b0: 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  " must be one of
70c0: 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58   TK_UNION, TK_EX
70d0: 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45  CEPT,.** TK_INTE
70e0: 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e  RSECT or TK_ALL.
70f0: 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20   The first form 
7100: 69 73 20 75 73 65 64 20 69 66 20 61 72 67 75 6d  is used if argum
7110: 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20 0a  ent bUseTmp is .
7120: 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68 65  ** false, or the
7130: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20   second form if 
7140: 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73  it is true..*/.s
7150: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
7160: 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50  inComposite(.  P
7170: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7190: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
71a0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71c0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
71d0: 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
71e0: 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74  PT etc. */.  int
71f0: 20 69 53 75 62 31 2c 20 20 20 20 20 20 20 20 20   iSub1,         
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7210: 53 75 62 71 75 65 72 79 20 69 64 20 31 20 2a 2f  Subquery id 1 */
7220: 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20 20  .  int iSub2,   
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7240: 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69     /* Subquery i
7250: 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73  d 2 */.  int bUs
7260: 65 54 6d 70 20 20 20 20 20 20 20 20 20 20 20 20  eTmp            
7270: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
7280: 20 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c 65   if a temp table
7290: 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a   was used */.){.
72a0: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
72b0: 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  _UNION || op==TK
72c0: 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54  _EXCEPT || op==T
72d0: 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f  K_INTERSECT || o
72e0: 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69  p==TK_ALL );.  i
72f0: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
7300: 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62  in==2 ){.    Vdb
7310: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
7320: 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Vdbe;.    char *
7330: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
7340: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70  rintf(.        p
7350: 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50  Parse->db, "COMP
7360: 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45 53 20  OUND SUBQUERIES 
7370: 25 64 20 41 4e 44 20 25 64 20 25 73 28 25 73 29  %d AND %d %s(%s)
7380: 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c  ", iSub1, iSub2,
7390: 0a 20 20 20 20 20 20 20 20 62 55 73 65 54 6d 70  .        bUseTmp
73a0: 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54  ?"USING TEMP B-T
73b0: 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63 74  REE ":"", select
73c0: 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20 29  OpName(op).    )
73d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
73e0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
73f0: 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
7400: 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
7410: 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
7420: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f  );.  }.}.#else./
7430: 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73  * No-op versions
7440: 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58   of the explainX
7450: 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61  XX() functions a
7460: 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20  nd macros. */.# 
7470: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f  define explainCo
7480: 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c  mposite(v,w,x,y,
7490: 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  z).#endif../*.**
74a0: 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   If the inner lo
74b0: 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  op was generated
74c0: 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c   using a non-nul
74d0: 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d  l pOrderBy argum
74e0: 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ent,.** then the
74f0: 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c   results were pl
7500: 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72  aced in a sorter
7510: 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f  .  After the loo
7520: 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a  p is terminated.
7530: 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75  ** we need to ru
7540: 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64  n the sorter and
7550: 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75   output the resu
7560: 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  lts.  The follow
7570: 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  ing.** routine g
7580: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
7590: 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74  e needed to do t
75a0: 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  hat..*/.static v
75b0: 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74  oid generateSort
75c0: 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70  Tail(.  Parse *p
75d0: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
75e0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
75f0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
7600: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
7610: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
7620: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
7630: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
7640: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44  ode into this VD
7650: 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  BE */.  int nCol
7660: 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d  umn,      /* Num
7670: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f  ber of columns o
7680: 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65  f data */.  Sele
7690: 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a  ctDest *pDest /*
76a0: 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65   Write the sorte
76b0: 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  d results here *
76c0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 42  /.){.  int addrB
76d0: 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
76e0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
76f0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
7700: 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f   to exit loop */
7710: 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69  .  int addrConti
7720: 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
7730: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
7740: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72  /* Jump here for
7750: 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20   next cycle */. 
7760: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74   int addr;.  int
7770: 20 69 54 61 62 3b 0a 20 20 69 6e 74 20 70 73 65   iTab;.  int pse
7780: 75 64 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45 78  udoTab = 0;.  Ex
7790: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
77a0: 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
77b0: 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70  .  int eDest = p
77c0: 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69  Dest->eDest;.  i
77d0: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
77e0: 2d 3e 69 50 61 72 6d 3b 0a 0a 20 20 69 6e 74 20  ->iParm;..  int 
77f0: 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65  regRow;.  int re
7800: 67 52 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62 20  gRowid;..  iTab 
7810: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  = pOrderBy->iECu
7820: 72 73 6f 72 3b 0a 20 20 72 65 67 52 6f 77 20 3d  rsor;.  regRow =
7830: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
7840: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  eg(pParse);.  if
7850: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
7860: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
7870: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
7880: 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20 70     pseudoTab = p
7890: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
78a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
78b0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
78c0: 73 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61 62  seudo, pseudoTab
78d0: 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d  , regRow, nColum
78e0: 6e 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 69 64  n);.    regRowid
78f0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
7900: 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71     regRowid = sq
7910: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
7920: 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 69  pParse);.  }.  i
7930: 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
7940: 20 53 46 5f 55 73 65 53 6f 72 74 65 72 20 29 7b   SF_UseSorter ){
7950: 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f 72 74  .    int regSort
7960: 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Out = ++pParse->
7970: 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 70 74  nMem;.    int pt
7980: 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
7990: 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  ab++;.    sqlite
79a0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
79b0: 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 74  P_OpenPseudo, pt
79c0: 61 62 32 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  ab2, regSortOut,
79d0: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
79e0: 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  +2);.    addr = 
79f0: 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
7a00: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
7a10: 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64  erSort, iTab, ad
7a20: 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 63 6f  drBreak);.    co
7a30: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 61  deOffset(v, p, a
7a40: 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  ddrContinue);.  
7a50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7a60: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
7a70: 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65 67 53  Data, iTab, regS
7a80: 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  ortOut);.    sql
7a90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7aa0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 74 61  , OP_Column, pta
7ab0: 62 32 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  b2, pOrderBy->nE
7ac0: 78 70 72 2b 31 2c 20 72 65 67 52 6f 77 29 3b 0a  xpr+1, regRow);.
7ad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
7ae0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
7af0: 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a 20  G_CLEARCACHE);. 
7b00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
7b10: 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
7b20: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
7b30: 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42  ort, iTab, addrB
7b40: 72 65 61 6b 29 3b 0a 20 20 20 20 63 6f 64 65 4f  reak);.    codeO
7b50: 66 66 73 65 74 28 76 2c 20 70 2c 20 61 64 64 72  ffset(v, p, addr
7b60: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73  Continue);.    s
7b70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7b80: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
7b90: 54 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  Tab, pOrderBy->n
7ba0: 45 78 70 72 2b 31 2c 20 72 65 67 52 6f 77 29 3b  Expr+1, regRow);
7bb0: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65  .  }.  switch( e
7bc0: 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65  Dest ){.    case
7bd0: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
7be0: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
7bf0: 62 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  b: {.      testc
7c00: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
7c10: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74  Table );.      t
7c20: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
7c30: 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a  SRT_EphemTab );.
7c40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7c50: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
7c60: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
7c70: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
7c80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7c90: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
7ca0: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72  iParm, regRow, r
7cb0: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
7cc0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7cd0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
7ce0: 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65  PEND);.      bre
7cf0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
7d00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
7d10: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
7d20: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
7d30: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
7d40: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
7d50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
7d60: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
7d70: 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67 52   regRow, 1, regR
7d80: 6f 77 69 64 2c 20 26 70 2d 3e 61 66 66 69 6e 69  owid, &p->affini
7d90: 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ty, 1);.      sq
7da0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
7db0: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
7dc0: 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31 29 3b  rse, regRow, 1);
7dd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7de0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7df0: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
7e00: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
7e10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7e20: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
7e30: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
7e40: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
7e50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
7e60: 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
7e70: 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c 20   regRow, iParm, 
7e80: 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  1);.      /* The
7e90: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
7ea0: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
7eb0: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
7ec0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7ed0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
7ee0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69  fault: {.      i
7ef0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65  nt i;.      asse
7f00: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  rt( eDest==SRT_O
7f10: 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d  utput || eDest==
7f20: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
7f30: 20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65   .      testcase
7f40: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
7f50: 70 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  put );.      tes
7f60: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
7f70: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20  T_Coroutine );. 
7f80: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
7f90: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
7fa0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
7fb0: 65 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e 69 4d  egRow!=pDest->iM
7fc0: 65 6d 2b 69 20 29 3b 0a 20 20 20 20 20 20 20 20  em+i );.        
7fd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7fe0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
7ff0: 70 73 65 75 64 6f 54 61 62 2c 20 69 2c 20 70 44  pseudoTab, i, pD
8000: 65 73 74 2d 3e 69 4d 65 6d 2b 69 29 3b 0a 20 20  est->iMem+i);.  
8010: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29        if( i==0 )
8020: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
8030: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
8040: 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43  v, OPFLAG_CLEARC
8050: 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20 20 7d  ACHE);.        }
8060: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8070: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
8080: 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tput ){.        
8090: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
80a0: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
80b0: 77 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20  w, pDest->iMem, 
80c0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
80d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
80e0: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
80f0: 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e  (pParse, pDest->
8100: 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  iMem, nColumn);.
8110: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8120: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8130: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
8140: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ld, pDest->iParm
8150: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8160: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8170: 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
8180: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
8190: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73 71 6c  , regRow);.  sql
81a0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
81b0: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
81c0: 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  wid);..  /* The 
81d0: 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
81e0: 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  op.  */.  sqlite
81f0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
8200: 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  l(v, addrContinu
8210: 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  e);.  if( p->sel
8220: 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 53 6f  Flags & SF_UseSo
8230: 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rter ){.    sqli
8240: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8250: 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20   OP_SorterNext, 
8260: 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 7d  iTab, addr);.  }
8270: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
8280: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8290: 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
82a0: 64 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  dr);.  }.  sqlit
82b0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
82c0: 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  el(v, addrBreak)
82d0: 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  ;.  if( eDest==S
82e0: 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65  RT_Output || eDe
82f0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
8300: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
8310: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8320: 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f 54 61  _Close, pseudoTa
8330: 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  b, 0);.  }.}../*
8340: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
8350: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
8360: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
8370: 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70  'declaration typ
8380: 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70  e' of the.** exp
8390: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54  ression pExpr. T
83a0: 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65  he string may be
83b0: 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74   treated as stat
83c0: 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ic by the caller
83d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c  ..**.** The decl
83e0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20  aration type is 
83f0: 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79  the exact dataty
8400: 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78  pe definition ex
8410: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
8420: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45  .** original CRE
8430: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
8440: 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ent if the expre
8450: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
8460: 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72  n. The.** declar
8470: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
8480: 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20   ROWID field is 
8490: 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79  INTEGER. Exactly
84a0: 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73   when an express
84b0: 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  ion.** is consid
84c0: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61  ered a column ca
84d0: 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20  n be complex in 
84e0: 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
84f0: 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a  subqueries. The.
8500: 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  ** result-set ex
8510: 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20  pression in all 
8520: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
8530: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
8540: 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64  ts is .** consid
8550: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79  ered a column by
8560: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
8570: 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
8580: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
8590: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
85a0: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
85b0: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
85c0: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29  CT col FROM tbl)
85d0: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62  ;.**   SELECT ab
85e0: 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63  c FROM (SELECT c
85f0: 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74  ol AS abc FROM t
8600: 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  bl);.** .** The 
8610: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
8620: 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73   for any express
8630: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ion other than a
8640: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e   column is NULL.
8650: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
8660: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
8670: 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  e(.  NameContext
8680: 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a   *pNC, .  Expr *
8690: 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63  pExpr,.  const c
86a0: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 44 62  har **pzOriginDb
86b0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
86c0: 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a 20 20  *pzOriginTab,.  
86d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
86e0: 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68  riginCol.){.  ch
86f0: 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20  ar const *zType 
8700: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
8710: 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d 20 30  t *zOriginDb = 0
8720: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
8730: 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 30 3b 0a  zOriginTab = 0;.
8740: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
8750: 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  riginCol = 0;.  
8760: 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 4e 45 56  int j;.  if( NEV
8770: 45 52 28 70 45 78 70 72 3d 3d 30 29 20 7c 7c 20  ER(pExpr==0) || 
8780: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30  pNC->pSrcList==0
8790: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
87a0: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
87b0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
87c0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
87d0: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
87e0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
87f0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
8800: 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74  column. Locate t
8810: 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c  he table the col
8820: 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20  umn is being.   
8830: 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20     ** extracted 
8840: 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74  from in NameCont
8850: 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68  ext.pSrcList. Th
8860: 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20  is table may be 
8870: 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61  real.      ** da
8880: 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20  tabase table or 
8890: 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  a subquery..    
88a0: 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
88b0: 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
88c0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
88d0: 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e  structure column
88e0: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
88f0: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  om */.      Sele
8900: 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20  ct *pS = 0;     
8910: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
8920: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  t the column is 
8930: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a  extracted from *
8940: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  /.      int iCol
8950: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
8960: 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20  n;  /* Index of 
8970: 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a  column in pTab *
8980: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
8990: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
89a0: 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
89b0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
89c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
89d0: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  MN );.      whil
89e0: 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20  e( pNC && !pTab 
89f0: 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69  ){.        SrcLi
8a00: 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
8a10: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
8a20: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c        for(j=0;j<
8a30: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26  pTabList->nSrc &
8a40: 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  & pTabList->a[j]
8a50: 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d  .iCursor!=pExpr-
8a60: 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20  >iTable;j++);.  
8a70: 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62        if( j<pTab
8a80: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20  List->nSrc ){.  
8a90: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
8aa0: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
8ab0: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ab;.          pS
8ac0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
8ad0: 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ].pSelect;.     
8ae0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8af0: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
8b00: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
8b10: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
8b20: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
8b30: 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20        /* At one 
8b40: 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68 20  time, code such 
8b50: 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78  as "SELECT new.x
8b60: 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67  " within a trigg
8b70: 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20  er would.       
8b80: 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20 63   ** cause this c
8b90: 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e  ondition to run.
8ba0: 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77 65    Since then, we
8bb0: 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75 72   have restructur
8bc0: 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20 2a  ed how.        *
8bd0: 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20 69  * trigger code i
8be0: 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64 20  s generated and 
8bf0: 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f  so this conditio
8c00: 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a  n is no longer .
8c10: 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69          ** possi
8c20: 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 74  ble. However, it
8c30: 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74 72   can still be tr
8c40: 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74  ue for statement
8c50: 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20 2a  s like.        *
8c60: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  * the following:
8c70: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
8c80: 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
8c90: 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54  TABLE t1(col INT
8ca0: 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20 2a  EGER);.        *
8cb0: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
8cc0: 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20  CT t1.col) FROM 
8cd0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20  FROM t1;.       
8ce0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   **.        ** w
8cf0: 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29  hen columnType()
8d00: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
8d10: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74 31  e expression "t1
8d20: 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20 20  .col" in the .  
8d30: 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c        ** sub-sel
8d40: 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ect. In this cas
8d50: 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75 6d  e, set the colum
8d60: 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20  n type to NULL, 
8d70: 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  even.        ** 
8d80: 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64  though it should
8d90: 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54 45   really be "INTE
8da0: 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a  GER"..        **
8db0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
8dc0: 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65   is not a proble
8dd0: 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e  m, as the column
8de0: 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c   type of "t1.col
8df0: 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20 20  " is never.     
8e00: 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e     ** used. When
8e10: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
8e20: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
8e30: 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20 20  xpression .     
8e40: 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20 74     ** "(SELECT t
8e50: 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72  1.col)", the cor
8e60: 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65 74  rect type is ret
8e70: 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20 54  urned (see the T
8e80: 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20 20  K_SELECT.       
8e90: 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f 77   ** branch below
8ea0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  .  */.        br
8eb0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
8ec0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
8ed0: 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62 3d   && pExpr->pTab=
8ee0: 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69  =pTab );.      i
8ef0: 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20  f( pS ){.       
8f00: 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20   /* The "table" 
8f10: 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75  is actually a su
8f20: 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69  b-select or a vi
8f30: 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ew in the FROM c
8f40: 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  lause.        **
8f50: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
8f60: 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e  tatement. Return
8f70: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
8f80: 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e   type and origin
8f90: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
8fa0: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d   for the result-
8fb0: 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  set column of th
8fc0: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20  e sub-select..  
8fd0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
8fe0: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
8ff0: 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53 2d 3e  ALWAYS(iCol<pS->
9000: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
9010: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
9020: 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74  f iCol is less t
9030: 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
9040: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
9050: 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20  quests the.     
9060: 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66       ** rowid of
9070: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20   the sub-select 
9080: 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78  or view. This ex
9090: 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61  pression is lega
90a0: 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20  l (see .        
90b0: 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d    ** test case m
90c0: 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61  isc2.2.2) - it a
90d0: 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20  lways evaluates 
90e0: 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20  to NULL..       
90f0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
9100: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
9110: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
9120: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
9130: 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a  >a[iCol].pExpr;.
9140: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53            sNC.pS
9150: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
9160: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  c;.          sNC
9170: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
9180: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72          sNC.pPar
9190: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
91a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  ;.          zTyp
91b0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
91c0: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e  sNC, p, &zOrigin
91d0: 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c  Db, &zOriginTab,
91e0: 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a   &zOriginCol); .
91f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9200: 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
9210: 28 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 20  (pTab->pSchema) 
9220: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
9230: 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  real table */.  
9240: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
9250: 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  S );.        if(
9260: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
9270: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
9280: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
9290: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
92a0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
92b0: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
92c0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
92d0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
92e0: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
92f0: 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f         zOriginCo
9300: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
9310: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9320: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
9330: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
9340: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
9350: 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 70 54 61  zOriginCol = pTa
9360: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
9370: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ame;.        }. 
9380: 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 54 61         zOriginTa
9390: 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  b = pTab->zName;
93a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43  .        if( pNC
93b0: 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20  ->pParse ){.    
93c0: 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
93d0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
93e0: 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65  ndex(pNC->pParse
93f0: 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
9400: 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
9410: 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70 4e 43 2d  zOriginDb = pNC-
9420: 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62  >pParse->db->aDb
9430: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
9440: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9450: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9460: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
9470: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
9480: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
9490: 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  T: {.      /* Th
94a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
94b0: 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65  a sub-select. Re
94c0: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
94d0: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20  tion type and.  
94e0: 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e      ** origin in
94f0: 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c  fo for the singl
9500: 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
9510: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
9520: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a  e SELECT.      *
9530: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  * statement..   
9540: 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65     */.      Name
9550: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
9560: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
9570: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
9580: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 20  ;.      Expr *p 
9590: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
95a0: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
95b0: 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
95c0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
95d0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
95e0: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
95f0: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
9600: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
9610: 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e   pNC;.      sNC.
9620: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
9630: 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70  arse;.      zTyp
9640: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
9650: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e  sNC, p, &zOrigin
9660: 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c  Db, &zOriginTab,
9670: 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a   &zOriginCol); .
9680: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9690: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
96a0: 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69 6e 44  .  if( pzOriginD
96b0: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
96c0: 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26 26 20   pzOriginTab && 
96d0: 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b 0a 20  pzOriginCol );. 
96e0: 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62 20 3d     *pzOriginDb =
96f0: 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20 20 20   zOriginDb;.    
9700: 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 7a  *pzOriginTab = z
9710: 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20 20 2a  OriginTab;.    *
9720: 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f  pzOriginCol = zO
9730: 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20  riginCol;.  }.  
9740: 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a  return zType;.}.
9750: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
9760: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
9770: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
9780: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
9790: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
97a0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
97b0: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  et..*/.static vo
97c0: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
97d0: 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20  nTypes(.  Parse 
97e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
97f0: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
9800: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
9810: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
9820: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
9830: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
9840: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
9850: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
9860: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
9870: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9880: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20  OMIT_DECLTYPE.  
9890: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
98a0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
98b0: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
98c0: 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  sNC;.  sNC.pSrcL
98d0: 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
98e0: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
98f0: 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30  Parse;.  for(i=0
9900: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
9910: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
9920: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
9930: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
9940: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
9950: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
9960: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
9970: 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74  TADATA.    const
9980: 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d   char *zOrigDb =
9990: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
99a0: 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30  ar *zOrigTab = 0
99b0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
99c0: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
99d0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
99e0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
99f0: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
9a00: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b  Tab, &zOrigCol);
9a10: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62  ..    /* The vdb
9a20: 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20  e must make its 
9a30: 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20  own copy of the 
9a40: 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20  column-type and 
9a50: 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f  other .    ** co
9a60: 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74  lumn specific st
9a70: 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74  rings, in case t
9a80: 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73  he schema is res
9a90: 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20  et before this. 
9aa0: 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61     ** virtual ma
9ab0: 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64  chine is deleted
9ac0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
9ad0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
9ae0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
9af0: 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67  _DATABASE, zOrig
9b00: 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  Db, SQLITE_TRANS
9b10: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
9b20: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
9b30: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54  (v, i, COLNAME_T
9b40: 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20  ABLE, zOrigTab, 
9b50: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
9b60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
9b70: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
9b80: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d  i, COLNAME_COLUM
9b90: 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c  N, zOrigCol, SQL
9ba0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
9bb0: 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20  #else.    zType 
9bc0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
9bd0: 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  C, p, 0, 0, 0);.
9be0: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
9bf0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
9c00: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44  (v, i, COLNAME_D
9c10: 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20  ECLTYPE, zType, 
9c20: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
9c30: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
9c40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
9c50: 4c 54 59 50 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  LTYPE */.}../*.*
9c60: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
9c70: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
9c80: 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65  he VDBE the name
9c90: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
9ca0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
9cb0: 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  t.  This informa
9cc0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
9cd0: 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61  provide the.** a
9ce0: 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e  zCol[] values in
9cf0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a   the callback..*
9d00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
9d10: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
9d20: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
9d30: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
9d40: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
9d50: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
9d60: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  t,  /* List of t
9d70: 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  ables */.  ExprL
9d80: 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
9d90: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
9da0: 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  fining the resul
9db0: 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  t set */.){.  Vd
9dc0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
9dd0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20  pVdbe;.  int i, 
9de0: 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  j;.  sqlite3 *db
9df0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
9e00: 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20   int fullNames, 
9e10: 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66  shortNames;..#if
9e20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9e30: 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66  _EXPLAIN.  /* If
9e40: 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c   this is an EXPL
9e50: 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73  AIN, skip this s
9e60: 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  tep */.  if( pPa
9e70: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
9e80: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
9e90: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50  #endif..  if( pP
9ea0: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
9eb0: 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30 29  t || NEVER(v==0)
9ec0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
9ed0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
9ee0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
9ef0: 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c  sSet = 1;.  full
9f00: 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  Names = (db->fla
9f10: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
9f20: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
9f30: 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62  shortNames = (db
9f40: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
9f50: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21  _ShortColNames)!
9f60: 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  =0;.  sqlite3Vdb
9f70: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70  eSetNumCols(v, p
9f80: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
9f90: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
9fa0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
9fb0: 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  .    Expr *p;.  
9fc0: 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b    p = pEList->a[
9fd0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
9fe0: 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
9ff0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
a000: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
a010: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Name ){.      ch
a020: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  ar *zName = pELi
a030: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
a040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a050: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
a060: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
a070: 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52  zName, SQLITE_TR
a080: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65  ANSIENT);.    }e
a090: 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d 3d  lse if( (p->op==
a0a0: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e  TK_COLUMN || p->
a0b0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
a0c0: 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74 20 29  N) && pTabList )
a0d0: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
a0e0: 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20  Tab;.      char 
a0f0: 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74  *zCol;.      int
a100: 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75   iCol = p->iColu
a110: 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  mn;.      for(j=
a120: 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54 61 62  0; ALWAYS(j<pTab
a130: 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b  List->nSrc); j++
a140: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
a150: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
a160: 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c 65  ursor==p->iTable
a170: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
a180: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
a190: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
a1a0: 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   );.      pTab =
a1b0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
a1c0: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
a1d0: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
a1e0: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
a1f0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
a200: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
a210: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
a220: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ol) );.      if(
a230: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
a240: 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64     zCol = "rowid
a250: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
a260: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70          zCol = p
a270: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
a280: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20  zName;.      }. 
a290: 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e       if( !shortN
a2a0: 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d  ames && !fullNam
a2b0: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  es ){.        sq
a2c0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
a2d0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
a2e0: 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20  E_NAME, .       
a2f0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74       sqlite3DbSt
a300: 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d  rDup(db, pEList-
a310: 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51  >a[i].zSpan), SQ
a320: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
a330: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
a340: 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ullNames ){.    
a350: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
a360: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  = 0;.        zNa
a370: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
a380: 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
a390: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43   pTab->zName, zC
a3a0: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
a3b0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
a3c0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
a3d0: 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51  _NAME, zName, SQ
a3e0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
a3f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a400: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
a410: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
a420: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43  COLNAME_NAME, zC
a430: 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ol, SQLITE_TRANS
a440: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20  IENT);.      }. 
a450: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a460: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
a470: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
a480: 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20  AME_NAME, .     
a490: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74       sqlite3DbSt
a4a0: 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d  rDup(db, pEList-
a4b0: 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51  >a[i].zSpan), SQ
a4c0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
a4d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72     }.  }.  gener
a4e0: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70  ateColumnTypes(p
a4f0: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
a500: 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a   pEList);.}../*.
a510: 2a 2a 20 47 69 76 65 6e 20 61 20 61 6e 20 65 78  ** Given a an ex
a520: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77  pression list (w
a530: 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74  hich is really t
a540: 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65  he list of expre
a550: 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66  ssions.** that f
a560: 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73  orm the result s
a570: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  et of a SELECT s
a580: 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74  tatement) comput
a590: 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  e appropriate.**
a5a0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f   column names fo
a5b0: 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 77  r a table that w
a5c0: 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78  ould hold the ex
a5d0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
a5e0: 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20  *.** All column 
a5f0: 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e  names will be un
a600: 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ique..**.** Only
a610: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
a620: 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20  s are computed. 
a630: 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43   Column.zType, C
a640: 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20  olumn.zColl,.** 
a650: 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73  and other fields
a660: 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a   of Column are z
a670: 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  eroed..**.** Ret
a680: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
a690: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61 20   success.  If a 
a6a0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
a6b0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a  n error occurs,.
a6c0: 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e  ** store NULL in
a6d0: 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e   *paCol and 0 in
a6e0: 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75   *pnCol and retu
a6f0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  rn SQLITE_NOMEM.
a700: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
a710: 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d  electColumnsFrom
a720: 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
a730: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
a740: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
a750: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
a760: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
a770: 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74      /* Expr list
a780: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64   from which to d
a790: 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  erive column nam
a7a0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43  es */.  int *pnC
a7b0: 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
a7c0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
a7d0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68  ber of columns h
a7e0: 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20  ere */.  Column 
a7f0: 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20  **paCol         
a800: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65   /* Write the ne
a810: 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65  w column list he
a820: 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  re */.){.  sqlit
a830: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
a840: 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61  >db;   /* Databa
a850: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
a860: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
a870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a880: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
a890: 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20  */.  int cnt;   
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8b0: 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20   /* Index added 
a8c0: 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65  to make the name
a8d0: 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c   unique */.  Col
a8e0: 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c  umn *aCol, *pCol
a8f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ;        /* For 
a900: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73  looping over res
a910: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
a920: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
a930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a940: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
a950: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
a960: 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  set */.  Expr *p
a970: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a980: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
a990: 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  on for a single 
a9a0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f  result column */
a9b0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a9d0: 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  * Column name */
a9e0: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aa00: 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69  * Size of name i
aa10: 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20  n zName[] */..  
aa20: 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20  if( pEList ){.  
aa30: 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d    nCol = pEList-
aa40: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c  >nExpr;.    aCol
aa50: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
aa60: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
aa70: 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29  f(aCol[0])*nCol)
aa80: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
aa90: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  aCol==0 );.  }el
aaa0: 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30  se{.    nCol = 0
aab0: 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a  ;.    aCol = 0;.
aac0: 20 20 7d 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e    }.  *pnCol = n
aad0: 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20  Col;.  *paCol = 
aae0: 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  aCol;..  for(i=0
aaf0: 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e  , pCol=aCol; i<n
ab00: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
ab10: 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  ){.    /* Get an
ab20: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d   appropriate nam
ab30: 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
ab40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20  .    */.    p = 
ab50: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
ab60: 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
ab70: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20  p->pRight==0 || 
ab80: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
ab90: 70 2d 3e 70 52 69 67 68 74 2c 20 45 50 5f 49 6e  p->pRight, EP_In
aba0: 74 56 61 6c 75 65 29 0a 20 20 20 20 20 20 20 20  tValue).        
abb0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 70 52 69         || p->pRi
abc0: 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d 30  ght->u.zToken==0
abd0: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 75   || p->pRight->u
abe0: 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b  .zToken[0]!=0 );
abf0: 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20  .    if( (zName 
ac00: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
ac10: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
ac20: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
ac30: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22  mn contains an "
ac40: 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73  AS <name>" phras
ac50: 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73  e, use <name> as
ac60: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   the name */.   
ac70: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
ac80: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
ac90: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
aca0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  {.      Expr *pC
acb0: 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20  olExpr = p;  /* 
acc0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
acd0: 68 61 74 20 69 73 20 74 68 65 20 72 65 73 75 6c  hat is the resul
ace0: 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  t column name */
acf0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
ad00: 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ab;         /* T
ad10: 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
ad20: 77 69 74 68 20 74 68 69 73 20 65 78 70 72 65 73  with this expres
ad30: 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68  sion */.      wh
ad40: 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f  ile( pColExpr->o
ad50: 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20  p==TK_DOT ){.   
ad60: 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20       pColExpr = 
ad70: 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74  pColExpr->pRight
ad80: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
ad90: 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b  ( pColExpr!=0 );
ada0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
adb0: 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  f( pColExpr->op=
adc0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c  =TK_COLUMN && AL
add0: 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70  WAYS(pColExpr->p
ade0: 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  Tab!=0) ){.     
adf0: 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e     /* For column
ae00: 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  s use the column
ae10: 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   name name */.  
ae20: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
ae30: 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75   pColExpr->iColu
ae40: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  mn;.        pTab
ae50: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61   = pColExpr->pTa
ae60: 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  b;.        if( i
ae70: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
ae80: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
ae90: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
aea0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
aeb0: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
aec0: 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20        iCol>=0 ? 
aed0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
aee0: 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22  .zName : "rowid"
aef0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
af00: 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  f( pColExpr->op=
af10: 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
af20: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
af30: 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45  asProperty(pColE
af40: 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
af50: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  ) );.        zNa
af60: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
af70: 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70 43  ntf(db, "%s", pC
af80: 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  olExpr->u.zToken
af90: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
afa0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74          /* Use t
afb0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74  he original text
afc0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65   of the column e
afd0: 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73  xpression as its
afe0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
aff0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
b000: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
b010: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  , pEList->a[i].z
b020: 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Span);.      }. 
b030: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
b040: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
b050: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
b060: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
b070: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b080: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
b090: 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e   sure the column
b0a0: 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e   name is unique.
b0b0: 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73    If the name is
b0c0: 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20   not unique,.   
b0d0: 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74   ** append a int
b0e0: 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65  eger to the name
b0f0: 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f   so that it beco
b100: 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20  mes unique..    
b110: 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73  */.    nName = s
b120: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
b130: 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a  Name);.    for(j
b140: 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b  =cnt=0; j<i; j++
b150: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
b160: 69 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c  ite3StrICmp(aCol
b170: 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [j].zName, zName
b180: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
b190: 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a  char *zNewName;.
b1a0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e          zName[nN
b1b0: 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ame] = 0;.      
b1c0: 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c    zNewName = sql
b1d0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
b1e0: 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20  "%s:%d", zName, 
b1f0: 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ++cnt);.        
b200: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
b210: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
b220: 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61    zName = zNewNa
b230: 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  me;.        j = 
b240: 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -1;.        if( 
b250: 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b  zName==0 ) break
b260: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b270: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20      pCol->zName 
b280: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69  = zName;.  }.  i
b290: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
b2a0: 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a  led ){.    for(j
b2b0: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
b2c0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
b2d0: 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a  ee(db, aCol[j].z
b2e0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
b2f0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
b300: 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70  b, aCol);.    *p
b310: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70  aCol = 0;.    *p
b320: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65  nCol = 0;.    re
b330: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
b340: 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
b350: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
b360: 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64  .** Add type and
b370: 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
b380: 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75  mation to a colu
b390: 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e  mn list based on
b3a0: 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61  .** a SELECT sta
b3b0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54  tement..** .** T
b3c0: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70  he column list p
b3d0: 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66  resumably came f
b3e0: 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  rom selectColumn
b3f0: 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73  NamesFromExprLis
b400: 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75  t()..** The colu
b410: 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79  mn list has only
b420: 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65   names, not type
b430: 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e  s or collations.
b440: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
b450: 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61  e goes through a
b460: 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65  nd adds the type
b470: 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
b480: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
b490: 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68  tine requires th
b4a0: 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65  at all identifie
b4b0: 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  rs in the SELECT
b4c0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65  .** statement be
b4d0: 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74   resolved..*/.st
b4e0: 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
b4f0: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
b500: 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72  Collation(.  Par
b510: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
b520: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
b530: 6e 74 65 78 74 73 20 2a 2f 0a 20 20 69 6e 74 20  ntexts */.  int 
b540: 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
b550: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
b560: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 43 6f 6c 75  olumns */.  Colu
b570: 6d 6e 20 2a 61 43 6f 6c 2c 20 20 20 20 20 20 20  mn *aCol,       
b580: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
b590: 75 6d 6e 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  umns */.  Select
b5a0: 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
b5b0: 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74  /* SELECT used t
b5c0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65  o determine type
b5d0: 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
b5e0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
b5f0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b600: 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  b;.  NameContext
b610: 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a   sNC;.  Column *
b620: 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  pCol;.  CollSeq 
b630: 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b  *pColl;.  int i;
b640: 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74  .  Expr *p;.  st
b650: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
b660: 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74  em *a;..  assert
b670: 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ( pSelect!=0 );.
b680: 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65    assert( (pSele
b690: 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
b6a0: 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29  F_Resolved)!=0 )
b6b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c  ;.  assert( nCol
b6c0: 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ==pSelect->pELis
b6d0: 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  t->nExpr || db->
b6e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
b6f0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
b700: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
b710: 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20  .  memset(&sNC, 
b720: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
b730: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
b740: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  = pSelect->pSrc;
b750: 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e  .  a = pSelect->
b760: 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72  pEList->a;.  for
b770: 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b  (i=0, pCol=aCol;
b780: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43   i<nCol; i++, pC
b790: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61  ol++){.    p = a
b7a0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [i].pExpr;.    p
b7b0: 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c  Col->zType = sql
b7c0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b7d0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
b7e0: 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a  , p, 0, 0, 0));.
b7f0: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
b800: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
b810: 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20  Affinity(p);.   
b820: 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e   if( pCol->affin
b830: 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61  ity==0 ) pCol->a
b840: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
b850: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 70  _AFF_NONE;.    p
b860: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
b870: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
b880: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , p);.    if( pC
b890: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
b8a0: 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  l->zColl = sqlit
b8b0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
b8c0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
b8d0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
b8e0: 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20   Given a SELECT 
b8f0: 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72  statement, gener
b900: 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75  ate a Table stru
b910: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
b920: 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  ibes.** the resu
b930: 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53  lt set of that S
b940: 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ELECT..*/.Table 
b950: 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65  *sqlite3ResultSe
b960: 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20  tOfSelect(Parse 
b970: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
b980: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62  *pSelect){.  Tab
b990: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69  le *pTab;.  sqli
b9a0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
b9b0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65  ->db;.  int save
b9c0: 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64  dFlags;..  saved
b9d0: 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67  Flags = db->flag
b9e0: 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  s;.  db->flags &
b9f0: 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f  = ~SQLITE_FullCo
ba00: 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c  lNames;.  db->fl
ba10: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
ba20: 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73  ortColNames;.  s
ba30: 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
ba40: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
ba50: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , 0);.  if( pPar
ba60: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
ba70: 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  n 0;.  while( pS
ba80: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20  elect->pPrior ) 
ba90: 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
baa0: 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d  t->pPrior;.  db-
bab0: 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c  >flags = savedFl
bac0: 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ags;.  pTab = sq
bad0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
bae0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
baf0: 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
bb00: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  b==0 ){.    retu
bb10: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  rn 0;.  }.  /* T
bb20: 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  he sqlite3Result
bb30: 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73  SetOfSelect() is
bb40: 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e   only used n con
bb50: 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b  texts where look
bb60: 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69  aside.  ** is di
bb70: 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65  sabled */.  asse
bb80: 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  rt( db->lookasid
bb90: 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b  e.bEnabled==0 );
bba0: 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20  .  pTab->nRef = 
bbb0: 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  1;.  pTab->zName
bbc0: 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52   = 0;.  pTab->nR
bbd0: 6f 77 45 73 74 20 3d 20 31 30 30 30 30 30 30 3b  owEst = 1000000;
bbe0: 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73  .  selectColumns
bbf0: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
bc00: 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45  rse, pSelect->pE
bc10: 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f  List, &pTab->nCo
bc20: 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b  l, &pTab->aCol);
bc30: 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75  .  selectAddColu
bc40: 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69  mnTypeAndCollati
bc50: 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  on(pParse, pTab-
bc60: 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43 6f  >nCol, pTab->aCo
bc70: 6c 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70  l, pSelect);.  p
bc80: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
bc90: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
bca0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
bcb0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
bcc0: 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
bcd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
bce0: 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
bcf0: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42  ./*.** Get a VDB
bd00: 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  E for the given 
bd10: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20  parser context. 
bd20: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
bd30: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
bd40: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
bd50: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55  ccurs, return NU
bd60: 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d  LL and leave a m
bd70: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
bd80: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
bd90: 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20  e3GetVdbe(Parse 
bda0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
bdb0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
bdc0: 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  dbe;.  if( v==0 
bdd0: 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73  ){.    v = pPars
bde0: 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74  e->pVdbe = sqlit
bdf0: 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61  e3VdbeCreate(pPa
be00: 72 73 65 2d 3e 64 62 29 3b 0a 23 69 66 6e 64 65  rse->db);.#ifnde
be10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
be20: 41 43 45 0a 20 20 20 20 69 66 28 20 76 20 29 7b  ACE.    if( v ){
be30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
be40: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54  beAddOp0(v, OP_T
be50: 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  race);.    }.#en
be60: 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dif.  }.  return
be70: 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   v;.}.../*.** Co
be80: 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74  mpute the iLimit
be90: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65   and iOffset fie
bea0: 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  lds of the SELEC
beb0: 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  T based on the.*
bec0: 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  * pLimit and pOf
bed0: 66 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73  fset expressions
bee0: 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  .  pLimit and pO
bef0: 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65  ffset hold the e
bf00: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68  xpressions.** th
bf10: 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  at appear in the
bf20: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
bf30: 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68  atement after th
bf40: 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
bf50: 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20  ET.** keywords. 
bf60: 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73   Or NULL if thos
bf70: 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f  e keywords are o
bf80: 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61  mitted. iLimit a
bf90: 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61  nd iOffset .** a
bfa0: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d  re the integer m
bfb0: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e  emory register n
bfc0: 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74  umbers for count
bfd0: 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ers used to comp
bfe0: 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69  ute .** the limi
bff0: 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49  t and offset.  I
c000: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69  f there is no li
c010: 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65  mit and/or offse
c020: 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d  t, then .** iLim
c030: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61  it and iOffset a
c040: 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  re negative..**.
c050: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
c060: 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75  changes the valu
c070: 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64  es of iLimit and
c080: 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66   iOffset only if
c090: 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f  .** a limit or o
c0a0: 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  ffset is defined
c0b0: 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70   by pLimit and p
c0c0: 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20  Offset.  iLimit 
c0d0: 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73  and.** iOffset s
c0e0: 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
c0f0: 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70  preset to approp
c100: 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61  riate default va
c110: 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79  lues.** (usually
c120: 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20   but not always 
c130: 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  -1) prior to cal
c140: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
c150: 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c  e..** Only if pL
c160: 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73  imit!=0 or pOffs
c170: 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d  et!=0 do the lim
c180: 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74  it registers get
c190: 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20  .** redefined.  
c1a0: 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
c1b0: 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73  erator uses this
c1c0: 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72   property to for
c1d0: 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20  ce.** the reuse 
c1e0: 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69  of the same limi
c1f0: 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67  t and offset reg
c200: 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75  isters across mu
c210: 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54  ltiple.** SELECT
c220: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
c230: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70  static void comp
c240: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
c250: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
c260: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
c270: 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20  iBreak){.  Vdbe 
c280: 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c  *v = 0;.  int iL
c290: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  imit = 0;.  int 
c2a0: 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61  iOffset;.  int a
c2b0: 64 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20 70  ddr1, n;.  if( p
c2c0: 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->iLimit ) retur
c2d0: 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22  n;..  /* .  ** "
c2e0: 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73  LIMIT -1" always
c2f0: 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e   shows all rows.
c300: 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a    There is some.
c310: 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73 79    ** contraversy
c320: 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20   about what the 
c330: 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
c340: 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a   should be..  **
c350: 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   The current imp
c360: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65  lementation inte
c370: 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22  rprets "LIMIT 0"
c380: 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f   to mean.  ** no
c390: 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71   rows..  */.  sq
c3a0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
c3b0: 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61  ear(pParse);.  a
c3c0: 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
c3d0: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69  t==0 || p->pLimi
c3e0: 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  t!=0 );.  if( p-
c3f0: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70  >pLimit ){.    p
c400: 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69  ->iLimit = iLimi
c410: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
c420: 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  em;.    v = sqli
c430: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
c440: 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  e);.    if( NEVE
c450: 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
c460: 3b 20 20 2f 2a 20 56 44 42 45 20 73 68 6f 75 6c  ;  /* VDBE shoul
c470: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  d have already b
c480: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  een allocated */
c490: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
c4a0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
c4b0: 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a  >pLimit, &n) ){.
c4c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c4d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
c4e0: 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74  teger, n, iLimit
c4f0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
c500: 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20  ment((v, "LIMIT 
c510: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
c520: 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
c530: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c540: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
c550: 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a  to, 0, iBreak);.
c560: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c570: 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c       if( p->nSel
c580: 65 63 74 52 6f 77 20 3e 20 28 64 6f 75 62 6c 65  ectRow > (double
c590: 29 6e 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  )n ) p->nSelectR
c5a0: 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 6e 3b 0a  ow = (double)n;.
c5b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
c5c0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
c5d0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
c5e0: 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d   p->pLimit, iLim
c5f0: 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  it);.      sqlit
c600: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
c610: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c  OP_MustBeInt, iL
c620: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62  imit);.      Vdb
c630: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
c640: 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
c650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c660: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
c670: 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42  Zero, iLimit, iB
c680: 72 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  reak);.    }.   
c690: 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20   if( p->pOffset 
c6a0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  ){.      p->iOff
c6b0: 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20  set = iOffset = 
c6c0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
c6d0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
c6e0: 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63  em++;   /* Alloc
c6f0: 61 74 65 20 61 6e 20 65 78 74 72 61 20 72 65 67  ate an extra reg
c700: 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b  ister for limit+
c710: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  offset */.      
c720: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
c730: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73  pParse, p->pOffs
c740: 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  et, iOffset);.  
c750: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c760: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
c770: 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b  BeInt, iOffset);
c780: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
c790: 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63  nt((v, "OFFSET c
c7a0: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
c7b0: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
c7c0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
c7d0: 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 29  _IfPos, iOffset)
c7e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c7f0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
c800: 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f 66 66  Integer, 0, iOff
c810: 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  set);.      sqli
c820: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
c830: 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20  v, addr1);.     
c840: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c850: 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c  p3(v, OP_Add, iL
c860: 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c 20 69  imit, iOffset, i
c870: 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20  Offset+1);.     
c880: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
c890: 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29   "LIMIT+OFFSET")
c8a0: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d  );.      addr1 =
c8b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c8c0: 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
c8d0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73  iLimit);.      s
c8e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c8f0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
c900: 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a  -1, iOffset+1);.
c910: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c920: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
c930: 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  r1);.    }.  }.}
c940: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c950: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
c960: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ELECT./*.** Retu
c970: 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
c980: 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
c990: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43  uence for the iC
c9a0: 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a  ol-th column of.
c9b0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
c9c0: 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  t for the compou
c9d0: 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d  nd-select statem
c9e0: 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e  ent "p".  Return
c9f0: 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20   NULL if.** the 
ca00: 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65  column has no de
ca10: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
ca20: 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
ca30: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
ca40: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63  quence for the c
ca50: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69  ompound select i
ca60: 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65  s taken from the
ca70: 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  .** left-most te
ca80: 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  rm of the select
ca90: 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c   that has a coll
caa0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
cab0: 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65  */.static CollSe
cac0: 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f  q *multiSelectCo
cad0: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
cae0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
caf0: 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c  int iCol){.  Col
cb00: 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66  lSeq *pRet;.  if
cb10: 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
cb20: 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53     pRet = multiS
cb30: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
cb40: 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  rse, p->pPrior, 
cb50: 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iCol);.  }else{.
cb60: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
cb70: 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  }.  assert( iCol
cb80: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 65  >=0 );.  if( pRe
cb90: 74 3d 3d 30 20 26 26 20 69 43 6f 6c 3c 70 2d 3e  t==0 && iCol<p->
cba0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
cbb0: 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69  .    pRet = sqli
cbc0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
cbd0: 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
cbe0: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29  ->a[iCol].pExpr)
cbf0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
cc00: 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Ret;.}.#endif /*
cc10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
cc20: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
cc30: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
cc40: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
cc50: 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
cc60: 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
cc70: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
cc80: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
cc90: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
cca0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
ccb0: 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
ccc0: 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
ccd0: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
cce0: 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
ccf0: 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
cd00: 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
cd10: 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 23 69 66 6e 64  ts */.);...#ifnd
cd20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
cd30: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
cd40: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
cd50: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70  e is called to p
cd60: 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e  rocess a compoun
cd70: 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f  d query form fro
cd80: 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65  m.** two or more
cd90: 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65   separate querie
cda0: 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55  s using UNION, U
cdb0: 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54  NION ALL, EXCEPT
cdc0: 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43  , or.** INTERSEC
cdd0: 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e  T.**.** "p" poin
cde0: 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ts to the right-
cdf0: 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20  most of the two 
ce00: 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75  queries.  the qu
ce10: 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65  ery on the.** le
ce20: 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e  ft is p->pPrior.
ce30: 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79    The left query
ce40: 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61   could also be a
ce50: 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a   compound query.
ce60: 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  ** in which case
ce70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
ce80: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63  ll be called rec
ce90: 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a  ursively. .**.**
cea0: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
ceb0: 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20  the total query 
cec0: 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65  are to be writte
ced0: 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61  n into a destina
cee0: 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20  tion.** of type 
cef0: 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d  eDest with param
cf00: 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  eter iParm..**.*
cf10: 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f  * Example 1:  Co
cf20: 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77  nsider a three-w
cf30: 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20  ay compound SQL 
cf40: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
cf50: 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
cf60: 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t1 UNION SELE
cf70: 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49  CT b FROM t2 UNI
cf80: 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d  ON SELECT c FROM
cf90: 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73   t3.**.** This s
cfa0: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
cfb0: 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73  ed up as follows
cfc0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
cfd0: 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20  CT c FROM t3.** 
cfe0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60       |.**      `
cff0: 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62  ----->  SELECT b
d000: 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20   FROM t2.**     
d010: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60                 `
d030: 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  ------>  SELECT 
d040: 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20  a FROM t1.**.** 
d050: 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68  The arrows in th
d060: 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20  e diagram above 
d070: 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65  represent the Se
d080: 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e  lect.pPrior poin
d090: 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68  ter..** So if th
d0a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
d0b0: 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61  lled with p equa
d0c0: 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72  l to the t3 quer
d0d0: 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f  y, then.** pPrio
d0e0: 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32  r will be the t2
d0f0: 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77   query.  p->op w
d100: 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20  ill be TK_UNION 
d110: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
d120: 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20  .** Notice that 
d130: 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  because of the w
d140: 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73  ay SQLite parses
d150: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
d160: 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  s, the.** indivi
d170: 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77  dual selects alw
d180: 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c  ays group from l
d190: 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f  eft to right..*/
d1a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
d1b0: 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  iSelect(.  Parse
d1c0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
d1d0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
d1e0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
d1f0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
d200: 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
d210: 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
d220: 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
d230: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
d240: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
d250: 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
d260: 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
d270: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
d280: 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64    /* Success cod
d290: 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74  e from a subrout
d2a0: 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ine */.  Select 
d2b0: 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f  *pPrior;       /
d2c0: 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
d2d0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
d2e0: 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64  our left */.  Vd
d2f0: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
d300: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
d310: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
d320: 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  E */.  SelectDes
d330: 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20  t dest;      /* 
d340: 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61  Alternative data
d350: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a   destination */.
d360: 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74    Select *pDelet
d370: 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e  e = 0;  /* Chain
d380: 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63   of simple selec
d390: 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  ts to delete */.
d3a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
d3b0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
d3c0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
d3d0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
d3e0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
d3f0: 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20 20  int iSub1;      
d400: 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
d410: 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65  of left-hand que
d420: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  ry */.  int iSub
d430: 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  2;            /*
d440: 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74   EQP id of right
d450: 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23  -hand query */.#
d460: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
d470: 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
d480: 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49  o ORDER BY or LI
d490: 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72  MIT clause on pr
d4a0: 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e  ior SELECTs.  On
d4b0: 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74  ly.  ** the last
d4c0: 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45   (right-most) SE
d4d0: 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69  LECT in the seri
d4e0: 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f  es may have an O
d4f0: 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
d500: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
d510: 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20   p && p->pPrior 
d520: 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66  );  /* Calling f
d530: 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65  unction guarante
d540: 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a  es this much */.
d550: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
d560: 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d  b;.  pPrior = p-
d570: 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72  >pPrior;.  asser
d580: 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68  t( pPrior->pRigh
d590: 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20 29 3b  tmost!=pPrior );
d5a0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
d5b0: 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70  r->pRightmost==p
d5c0: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29 3b 0a  ->pRightmost );.
d5d0: 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b    dest = *pDest;
d5e0: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
d5f0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
d600: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d610: 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20  Parse,"ORDER BY 
d620: 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
d630: 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
d640: 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
d650: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
d660: 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
d670: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
d680: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
d690: 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c    if( pPrior->pL
d6a0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
d6b0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
d6c0: 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65  se,"LIMIT clause
d6d0: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
d6e0: 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
d6f0: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
d700: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
d710: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
d720: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
d730: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d  _end;.  }..  v =
d740: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
d750: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
d760: 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54  t( v!=0 );  /* T
d770: 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  he VDBE already 
d780: 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69  created by calli
d790: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  ng function */..
d7a0: 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
d7b0: 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70  destination temp
d7c0: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e  orary table if n
d7d0: 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20  ecessary.  */.  
d7e0: 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
d7f0: 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
d800: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
d810: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c  EList );.    sql
d820: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d830: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
d840: 61 6c 2c 20 64 65 73 74 2e 69 50 61 72 6d 2c 20  al, dest.iParm, 
d850: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
d860: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
d870: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54  beChangeP5(v, BT
d880: 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a  REE_UNORDERED);.
d890: 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
d8a0: 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a   SRT_Table;.  }.
d8b0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
d8c0: 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74  all SELECTs in t
d8d0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76  he statement hav
d8e0: 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
d8f0: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20  r of elements.  
d900: 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75  ** in their resu
d910: 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20  lt sets..  */.  
d920: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
d930: 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c  t && pPrior->pEL
d940: 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ist );.  if( p->
d950: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70  pEList->nExpr!=p
d960: 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Prior->pEList->n
d970: 45 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20  Expr ){.    if( 
d980: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
d990: 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 20  _Values ){.     
d9a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
d9b0: 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41  (pParse, "all VA
d9c0: 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65 20 74  LUES must have t
d9d0: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
d9e0: 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 20 20 7d  f terms");.    }
d9f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
da00: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
da10: 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20  se, "SELECTs to 
da20: 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
da30: 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20  ht of %s".      
da40: 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20    " do not have 
da50: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
da60: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
da70: 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  s", selectOpName
da80: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 7d 0a  (p->op));.    }.
da90: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
daa0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
dab0: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
dac0: 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   Compound SELECT
dad0: 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f  s that have an O
dae0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
daf0: 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72  re handled separ
db00: 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
db10: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
db20: 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
db30: 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70  iSelectOrderBy(p
db40: 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
db50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
db60: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
db70: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
db80: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
db90: 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63  ts..  */.  switc
dba0: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
dbb0: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20  case TK_ALL: {. 
dbc0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
dbd0: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69  0;.      int nLi
dbe0: 6d 69 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  mit;.      asser
dbf0: 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  t( !pPrior->pLim
dc00: 69 74 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69  it );.      pPri
dc10: 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->pLimit = p->
dc20: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50  pLimit;.      pP
dc30: 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20  rior->pOffset = 
dc40: 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
dc50: 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
dc60: 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
dc70: 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
dc80: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
dc90: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
dca0: 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
dcb0: 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
dcc0: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
dcd0: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
dce0: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
dcf0: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
dd00: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
dd10: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
dd20: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
dd30: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72   p->iLimit = pPr
dd40: 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ior->iLimit;.   
dd50: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
dd60: 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b  pPrior->iOffset;
dd70: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c  .      if( p->iL
dd80: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
dd90: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
dda0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
ddb0: 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  fZero, p->iLimit
ddc0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
ddd0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70  omment((v, "Jump
dde0: 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20   ahead if LIMIT 
ddf0: 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20  reached"));.    
de00: 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69    }.      explai
de10: 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
de20: 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
de30: 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
de40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
de50: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
de60: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
de70: 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
de80: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44  E_OK );.      pD
de90: 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
dea0: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
deb0: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
dec0: 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
ded0: 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c   += pPrior->nSel
dee0: 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66  ectRow;.      if
def0: 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  ( pPrior->pLimit
df00: 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
df10: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
df20: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20  pPrior->pLimit, 
df30: 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20  &nLimit).       
df40: 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  && p->nSelectRow
df50: 20 3e 20 28 64 6f 75 62 6c 65 29 6e 4c 69 6d 69   > (double)nLimi
df60: 74 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  t .      ){.    
df70: 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
df80: 77 20 3d 20 28 64 6f 75 62 6c 65 29 6e 4c 69 6d  w = (double)nLim
df90: 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
dfa0: 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20    if( addr ){.  
dfb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dfc0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
dfd0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
dfe0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
dff0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
e000: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  T:.    case TK_U
e010: 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NION: {.      in
e020: 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f  t unionTab;    /
e030: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
e040: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
e050: 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72   table holding r
e060: 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75  esult */.      u
e070: 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20  8 op = 0;       
e080: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52  /* One of the SR
e090: 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  T_ operations to
e0a0: 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a   apply to self *
e0b0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f  /.      int prio
e0c0: 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rOp;     /* The 
e0d0: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74  SRT_ operation t
e0e0: 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72  o apply to prior
e0f0: 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20   selects */.    
e100: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
e110: 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76  *pOffset; /* Sav
e120: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e  ed values of p->
e130: 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f  nLimit and p->nO
e140: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69  ffset */.      i
e150: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
e160: 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64  electDest uniond
e170: 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74  est;..      test
e180: 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
e190: 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20  EXCEPT );.      
e1a0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
e1b0: 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
e1c0: 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54     priorOp = SRT
e1d0: 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66  _Union;.      if
e1e0: 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72  ( dest.eDest==pr
e1f0: 69 6f 72 4f 70 20 26 26 20 41 4c 57 41 59 53 28  iorOp && ALWAYS(
e200: 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 21 70 2d  !p->pLimit &&!p-
e210: 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20 20  >pOffset) ){.   
e220: 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72       /* We can r
e230: 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79  euse a temporary
e240: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
e250: 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20   by a SELECT to 
e260: 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  our.        ** r
e270: 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ight..        */
e280: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e290: 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d   p->pRightmost!=
e2a0: 70 20 29 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c  p );  /* Can onl
e2b0: 79 20 68 61 70 70 65 6e 20 66 6f 72 20 6c 65 66  y happen for lef
e2c0: 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 0a 20  tward elements. 
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2f0: 20 20 20 20 2a 2a 20 6f 66 20 61 20 33 2d 77 61      ** of a 3-wa
e300: 79 20 6f 72 20 6d 6f 72 65 20 63 6f 6d 70 6f 75  y or more compou
e310: 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  nd */.        as
e320: 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d  sert( p->pLimit=
e330: 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f  =0 );      /* No
e340: 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66  t allowed on lef
e350: 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a  tward elements *
e360: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
e370: 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
e380: 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c  );     /* Not al
e390: 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72  lowed on leftwar
e3a0: 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  d elements */.  
e3b0: 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
e3c0: 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20   dest.iParm;.   
e3d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e3e0: 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65    /* We will nee
e3f0: 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  d to create our 
e400: 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  own temporary ta
e410: 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ble to hold the.
e420: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
e430: 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
e440: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
e450: 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70      unionTab = p
e460: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
e470: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e480: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
e490: 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
e4a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e4b0: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
e4c0: 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c  meral, unionTab,
e4d0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   0);.        ass
e4e0: 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
e4f0: 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[0] == -1 );
e500: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72  .        p->addr
e510: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
e520: 64 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  dr;.        p->p
e530: 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c  Rightmost->selFl
e540: 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
e550: 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20  hemeral;.       
e560: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
e570: 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  st );.      }.. 
e580: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
e590: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
e5a0: 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20  ts to our left. 
e5b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
e5c0: 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
e5d0: 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20  OrderBy );.     
e5e0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
e5f0: 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73  stInit(&uniondes
e600: 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f  t, priorOp, unio
e610: 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70  nTab);.      exp
e620: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
e630: 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
e640: 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
e650: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e660: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
e670: 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73  Prior, &uniondes
e680: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
e690: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
e6a0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
e6b0: 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
e6c0: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
e6d0: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  rrent SELECT sta
e6e0: 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a  tement.      */.
e6f0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
e700: 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20  =TK_EXCEPT ){.  
e710: 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45        op = SRT_E
e720: 78 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c  xcept;.      }el
e730: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
e740: 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  rt( p->op==TK_UN
e750: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f  ION );.        o
e760: 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
e770: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
e780: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
e790: 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
e7a0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
e7b0: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
e7c0: 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
e7d0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
e7e0: 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
e7f0: 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65     uniondest.eDe
e800: 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65  st = op;.      e
e810: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
e820: 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
e830: 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
e840: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e850: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
e860: 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b   p, &uniondest);
e870: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e880: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e890: 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79  ;.      /* Query
e8a0: 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73   flattening in s
e8b0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d  qlite3Select() m
e8c0: 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70  ight refill p->p
e8d0: 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a  OrderBy..      *
e8e0: 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c  * Be sure to del
e8f0: 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ete p->pOrderBy,
e900: 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61   therefore, to a
e910: 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65  void a memory le
e920: 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ak. */.      sql
e930: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
e940: 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  te(db, p->pOrder
e950: 42 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  By);.      pDele
e960: 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
e970: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
e980: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
e990: 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
e9a0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  .      if( p->op
e9b0: 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e  ==TK_UNION ) p->
e9c0: 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50  nSelectRow += pP
e9d0: 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
e9e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
e9f0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
ea00: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
ea10: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
ea20: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
ea30: 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
ea40: 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
ea50: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  = 0;.      p->iO
ea60: 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20  ffset = 0;..    
ea70: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
ea80: 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d   data in the tem
ea90: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74  porary table int
eaa0: 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a  o whatever form.
eab0: 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74        ** it is t
eac0: 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79  hat we currently
ead0: 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
eae0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e        assert( un
eaf0: 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 50 61  ionTab==dest.iPa
eb00: 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74  rm || dest.eDest
eb10: 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20  !=priorOp );.   
eb20: 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
eb30: 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20  t!=priorOp ){.  
eb40: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
eb50: 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
eb60: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
eb70: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
eb80: 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
eb90: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
eba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65   ){.          Se
ebb0: 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
ebc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  ;.          whil
ebd0: 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
ebe0: 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
ebf0: 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
ec00: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
ec10: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
ec20: 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45  e, 0, pFirst->pE
ec30: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  List);.        }
ec40: 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20  .        iBreak 
ec50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
ec60: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
ec70: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
ec80: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
ec90: 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  v);.        comp
eca0: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
ecb0: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
ecc0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
ecd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ece0: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e  v, OP_Rewind, un
ecf0: 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b  ionTab, iBreak);
ed00: 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
ed10: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
ed20: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
ed30: 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
ed40: 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
ed50: 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e  p->pEList, union
ed60: 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  Tab, p->pEList->
ed70: 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
ed80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
ed90: 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20 69 43 6f  , -1, &dest, iCo
eda0: 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
edb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
edc0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
edd0: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  iCont);.        
ede0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
edf0: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e  2(v, OP_Next, un
ee00: 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b  ionTab, iStart);
ee10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ee20: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
ee30: 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
ee40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ee50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
ee60: 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  se, unionTab, 0)
ee70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ee80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ee90: 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
eea0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  ( p->op==TK_INTE
eeb0: 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20  RSECT ); {.     
eec0: 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
eed0: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
eee0: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
eef0: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
ef00: 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a  imit, *pOffset;.
ef10: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
ef20: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
ef30: 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a   intersectdest;.
ef40: 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20        int r1;.. 
ef50: 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
ef60: 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
ef70: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
ef80: 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
ef90: 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65  .      ** two te
efa0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
efb0: 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
efc0: 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
efd0: 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  in.      ** by a
efe0: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
eff0: 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
f000: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
f010: 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
f020: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
f030: 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
f040: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  ab++;.      asse
f050: 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
f060: 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64  =0 );..      add
f070: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
f080: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
f090: 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c  Ephemeral, tab1,
f0a0: 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
f0b0: 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
f0c0: 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
f0d0: 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
f0e0: 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
f0f0: 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d        p->pRightm
f100: 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  ost->selFlags |=
f110: 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
f120: 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  l;.      assert(
f130: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20   p->pEList );.. 
f140: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
f150: 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20   SELECTs to our 
f160: 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72  left into tempor
f170: 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22  ary table "tab1"
f180: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
f190: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
f1a0: 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63  stInit(&intersec
f1b0: 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e  tdest, SRT_Union
f1c0: 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 65  , tab1);.      e
f1d0: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
f1e0: 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
f1f0: 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
f200: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f210: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
f220: 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73   pPrior, &inters
f230: 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
f240: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
f250: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
f260: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
f270: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
f280: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
f290: 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  CT into temporar
f2a0: 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20  y table "tab2". 
f2b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
f2c0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
f2d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
f2e0: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32  nEphemeral, tab2
f2f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
f300: 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
f310: 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[1] == -1 );.
f320: 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
f330: 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b  nEphm[1] = addr;
f340: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
f350: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d   = 0;.      pLim
f360: 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
f370: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
f380: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73  = 0;.      pOffs
f390: 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
f3a0: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
f3b0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
f3c0: 65 72 73 65 63 74 64 65 73 74 2e 69 50 61 72 6d  ersectdest.iParm
f3d0: 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65   = tab2;.      e
f3e0: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
f3f0: 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
f400: 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
f410: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f420: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
f430: 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65   p, &intersectde
f440: 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
f450: 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
f460: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  OK );.      pDel
f470: 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
f480: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
f490: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
f4a0: 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
f4b0: 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  ow>pPrior->nSele
f4c0: 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
f4d0: 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
f4e0: 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
f4f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
f500: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
f510: 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
f520: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
f530: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
f540: 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20   pOffset;..     
f550: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
f560: 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
f570: 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
f580: 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
f590: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e        ** tables.
f5a0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
f5b0: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
f5c0: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  t );.      if( d
f5d0: 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  est.eDest==SRT_O
f5e0: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
f5f0: 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
f600: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69  = p;.        whi
f610: 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
f620: 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
f630: 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
f640: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
f650: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
f660: 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  , 0, pFirst->pEL
f670: 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
f680: 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
f690: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
f6a0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e  l(v);.      iCon
f6b0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
f6c0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
f6d0: 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
f6e0: 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
f6f0: 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
f700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f710: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
f720: 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
f730: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
f740: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
f750: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53  Parse);.      iS
f760: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
f770: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
f780: 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29  owKey, tab1, r1)
f790: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f7a0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
f7b0: 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62  OP_NotFound, tab
f7c0: 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29  2, iCont, r1, 0)
f7d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
f7e0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
f7f0: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
f800: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
f810: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
f820: 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e  EList, tab1, p->
f830: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20  pEList->nExpr,. 
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 20 20 20 20 30 2c 20 2d 31 2c 20 26 64 65 73       0, -1, &des
f860: 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
f870: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f880: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
f890: 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
f8a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f8b0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
f8c0: 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20  tab1, iStart);. 
f8d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f8e0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
f8f0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
f900: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f910: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
f920: 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b2, 0);.      sq
f930: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f940: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
f950: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
f960: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
f970: 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
f980: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c  e(pParse, p->op,
f990: 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 70   iSub1, iSub2, p
f9a0: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a  ->op!=TK_ALL);..
f9b0: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
f9c0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
f9d0: 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74   used by .  ** t
f9e0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20  emporary tables 
f9f0: 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d  needed to implem
fa00: 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  ent the compound
fa10: 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74   select..  ** At
fa20: 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f  tach the KeyInfo
fa30: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c   structure to al
fa40: 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  l temporary tabl
fa50: 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
fa60: 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75  is section is ru
fa70: 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d  n by the right-m
fa80: 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
fa90: 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20  ment only..  ** 
faa0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
fab0: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c  s to the left al
fac0: 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70  ways skip this p
fad0: 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d  art.  The right-
fae0: 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54  most.  ** SELECT
faf0: 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70   might also skip
fb00: 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74   this part if it
fb10: 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59   has no ORDER BY
fb20: 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a   clause and.  **
fb30: 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20   no temp tables 
fb40: 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20  are required..  
fb50: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
fb60: 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45 70  lags & SF_UsesEp
fb70: 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69  hemeral ){.    i
fb80: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
fb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fba0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
fbb0: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
fbc0: 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yInfo;          
fbd0: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
fbe0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
fbf0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
fc00: 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b    Select *pLoop;
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
fc30: 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74  hrough SELECT st
fc40: 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  atements */.    
fc50: 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c  CollSeq **apColl
fc60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
fc70: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
fc80: 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ough pKeyInfo->a
fc90: 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e  Coll[] */.    in
fca0: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
fcb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
fcc0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
fcd0: 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a   in result set *
fce0: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
fcf0: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20  ->pRightmost==p 
fd00: 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d  );.    nCol = p-
fd10: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
fd20: 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
fd30: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
fd40: 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20  ro(db,.         
fd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
fd60: 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b  zeof(*pKeyInfo)+
fd70: 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  nCol*(sizeof(Col
fd80: 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20  lSeq*) + 1));.  
fd90: 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20    if( !pKeyInfo 
fda0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
fdb0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
fdc0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
fdd0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a  ect_end;.    }..
fde0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e      pKeyInfo->en
fdf0: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
fe00: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
fe10: 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 0a  d = (u16)nCol;..
fe20: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43      for(i=0, apC
fe30: 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  oll=pKeyInfo->aC
fe40: 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  oll; i<nCol; i++
fe50: 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20  , apColl++){.   
fe60: 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c     *apColl = mul
fe70: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
fe80: 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
fe90: 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43       if( 0==*apC
fea0: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  oll ){.        *
feb0: 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66  apColl = db->pDf
fec0: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
fed0: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
fee0: 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
fef0: 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
ff00: 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
ff10: 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
ff20: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
ff30: 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
ff40: 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
ff50: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
ff60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
ff70: 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
ff80: 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
ff90: 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
ffa0: 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
ffb0: 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
ffc0: 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
ffd0: 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
ffe0: 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
fff0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
10000 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
10010 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
10020 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10030 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10040 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
10050 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
10060 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
10070 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
10080 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
10090 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
100a0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
100b0 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
100c0 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[i] = -1;.   
100d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
100e0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
100f0 20 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a   pKeyInfo);.  }.
10100 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e  .multi_select_en
10110 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d  d:.  pDest->iMem
10120 20 3d 20 64 65 73 74 2e 69 4d 65 6d 3b 0a 20 20   = dest.iMem;.  
10130 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 64 65  pDest->nMem = de
10140 73 74 2e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  st.nMem;.  sqlit
10150 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
10160 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72  b, pDelete);.  r
10170 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
10180 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
10190 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
101a0 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  T */../*.** Code
101b0 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f   an output subro
101c0 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f  utine for a coro
101d0 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61  utine implementa
101e0 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c  tion of a.** SEL
101f0 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a  ECT statment..**
10200 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20  .** The data to 
10210 62 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e  be output is con
10220 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69  tained in pIn->i
10230 4d 65 6d 2e 20 20 54 68 65 72 65 20 61 72 65 0a  Mem.  There are.
10240 2a 2a 20 70 49 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c  ** pIn->nMem col
10250 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75  umns to be outpu
10260 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65  t.  pDest is whe
10270 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68  re the output sh
10280 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e  ould.** be sent.
10290 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e  .**.** regReturn
102a0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
102b0 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68  f the register h
102c0 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f  olding the subro
102d0 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20  utine.** return 
102e0 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  address..**.** I
102f0 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
10300 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74   it is the first
10310 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76   register in a v
10320 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65  ector that.** re
10330 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f  cords the previo
10340 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b  us output.  mem[
10350 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c  regPrev] is a fl
10360 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65  ag that is false
10370 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73  .** if there has
10380 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75   been no previou
10390 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65  s output.  If re
103a0 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64  gPrev>0 then cod
103b0 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65  e is.** generate
103c0 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75  d to suppress du
103d0 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49  plicates.  pKeyI
103e0 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20  nfo is used for 
103f0 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79  comparing.** key
10400 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
10410 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70  LIMIT found in p
10420 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63  ->iLimit is reac
10430 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69  hed, jump immedi
10440 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65  ately to.** iBre
10450 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ak..*/.static in
10460 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  t generateOutput
10470 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61  Subroutine(.  Pa
10480 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
10490 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
104a0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
104b0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
104c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
104d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
104e0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
104f0 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  In,        /* Co
10500 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e  routine supplyin
10510 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65  g data */.  Sele
10520 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
10530 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
10540 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f  send the data */
10550 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e  .  int regReturn
10560 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
10570 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
10580 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
10590 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20  nt regPrev,     
105a0 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
105b0 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  us result regist
105c0 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65  er.  No uniquene
105d0 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79  ss if 0 */.  Key
105e0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
105f0 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70       /* For comp
10600 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69  aring with previ
10610 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  ous entry */.  i
10620 6e 74 20 70 34 74 79 70 65 2c 20 20 20 20 20 20  nt p4type,      
10630 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 34         /* The p4
10640 20 74 79 70 65 20 66 6f 72 20 70 4b 65 79 49 6e   type for pKeyIn
10650 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  fo */.  int iBre
10660 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ak              
10670 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
10680 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54  we hit the LIMIT
10690 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
106a0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
106b0 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  ;.  int iContinu
106c0 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a  e;.  int addr;..
106d0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
106e0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
106f0 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20  v);.  iContinue 
10700 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
10710 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
10720 20 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   Suppress duplic
10730 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20  ates for UNION, 
10740 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
10750 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66  RSECT .  */.  if
10760 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20  ( regPrev ){.   
10770 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20   int j1, j2;.   
10780 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
10790 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
107a0 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  Not, regPrev);. 
107b0 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56     j2 = sqlite3V
107c0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
107d0 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 4d  Compare, pIn->iM
107e0 65 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70  em, regPrev+1, p
107f0 49 6e 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20 20  In->nMem,.      
10800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10810 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
10820 4b 65 79 49 6e 66 6f 2c 20 70 34 74 79 70 65 29  KeyInfo, p4type)
10830 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10840 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
10850 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69  mp, j2+2, iConti
10860 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20  nue, j2+2);.    
10870 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
10880 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
10890 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
108a0 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  opy(pParse, pIn-
108b0 3e 69 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31  >iMem, regPrev+1
108c0 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  , pIn->nMem);.  
108d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
108e0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
108f0 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a  r, 1, regPrev);.
10900 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
10910 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
10920 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  ed ) return 0;..
10930 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68    /* Suppress th
10940 65 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53  e the first OFFS
10950 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68  ET entries if th
10960 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54  ere is an OFFSET
10970 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63   clause.  */.  c
10980 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
10990 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73  iContinue);..  s
109a0 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44  witch( pDest->eD
109b0 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74  est ){.    /* St
109c0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61  ore the result a
109d0 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75  s data using a u
109e0 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a  nique key..    *
109f0 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  /.    case SRT_T
10a00 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
10a10 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
10a20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
10a30 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
10a40 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
10a50 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47  nt r2 = sqlite3G
10a60 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
10a70 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
10a80 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  e( pDest->eDest=
10a90 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20  =SRT_Table );.  
10aa0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44      testcase( pD
10ab0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
10ac0 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20  EphemTab );.    
10ad0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10ae0 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
10af0 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c  cord, pIn->iMem,
10b00 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 20 72 31 29 3b   pIn->nMem, r1);
10b10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10b20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
10b30 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e  ewRowid, pDest->
10b40 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  iParm, r2);.    
10b50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10b60 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
10b70 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20  , pDest->iParm, 
10b80 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  r1, r2);.      s
10b90 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
10ba0 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
10bb0 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  END);.      sqli
10bc0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
10bd0 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
10be0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
10bf0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
10c00 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
10c10 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
10c20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10c30 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
10c40 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
10c50 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
10c60 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
10c70 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
10c80 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
10c90 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
10ca0 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
10cb0 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
10cc0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
10cd0 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
10ce0 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
10cf0 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
10d00 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
10d10 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
10d20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
10d30 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20  ->nMem==1 );.   
10d40 20 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d     p->affinity =
10d50 20 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74   .         sqlit
10d60 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
10d70 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  y(p->pEList->a[0
10d80 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e  ].pExpr, pDest->
10d90 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20  affinity);.     
10da0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
10db0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
10dc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10dd0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
10de0 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
10df0 69 4d 65 6d 2c 20 31 2c 20 72 31 2c 20 26 70 2d  iMem, 1, r1, &p-
10e00 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  >affinity, 1);. 
10e10 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
10e20 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
10e30 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
10e40 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20  >iMem, 1);.     
10e50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10e60 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
10e70 72 74 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  rt, pDest->iParm
10e80 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
10e90 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
10ea0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
10eb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10ec0 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65   }..#if 0  /* Ne
10ed0 76 65 72 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e  ver occurs on an
10ee0 20 4f 52 44 45 52 20 42 59 20 71 75 65 72 79 20   ORDER BY query 
10ef0 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79  */.    /* If any
10f00 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68   row exist in th
10f10 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65  e result set, re
10f20 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61  cord that fact a
10f30 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f  nd abort..    */
10f40 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
10f50 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71  ists: {.      sq
10f60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10f70 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
10f80 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b  , pDest->iParm);
10f90 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
10fa0 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
10fb0 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
10fc0 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
10fd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10fe0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
10ff0 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
11000 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
11010 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
11020 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
11030 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
11040 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
11050 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
11060 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
11070 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
11080 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
11090 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
110a0 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
110b0 73 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d  sert( pIn->nMem=
110c0 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
110d0 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
110e0 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65  pParse, pIn->iMe
110f0 6d 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c  m, pDest->iParm,
11100 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68   1);.      /* Th
11110 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
11120 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20  ill jump out of 
11130 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
11140 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
11150 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
11160 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11170 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
11180 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  .    /* The resu
11190 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  lts are stored i
111a0 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  n a sequence of 
111b0 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a  registers.    **
111c0 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 44 65   starting at pDe
111d0 73 74 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 6e 20  st->iMem.  Then 
111e0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79  the co-routine y
111f0 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ields..    */.  
11200 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
11210 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66  tine: {.      if
11220 28 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30  ( pDest->iMem==0
11230 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73   ){.        pDes
11240 74 2d 3e 69 4d 65 6d 20 3d 20 73 71 6c 69 74 65  t->iMem = sqlite
11250 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
11260 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29  arse, pIn->nMem)
11270 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  ;.        pDest-
11280 3e 6e 4d 65 6d 20 3d 20 70 49 6e 2d 3e 6e 4d 65  >nMem = pIn->nMe
11290 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
112a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
112b0 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
112c0 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69  ->iMem, pDest->i
112d0 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 6e 4d 65 6d  Mem, pDest->nMem
112e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
112f0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
11300 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
11310 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65  Parm);.      bre
11320 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
11330 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
11340 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65   above, then the
11350 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74   result destinat
11360 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20  ion must be.    
11370 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20  ** SRT_Output.  
11380 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
11390 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  never called wit
113a0 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20  h any other.    
113b0 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f  ** destination o
113c0 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ther than the on
113d0 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65  es handled above
113e0 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a   or SRT_Output..
113f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
11400 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65  r SRT_Output, re
11410 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
11420 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f   in a sequence o
11430 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20  f registers.  . 
11440 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f     ** Then the O
11450 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f  P_ResultRow opco
11460 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 61  de is used to ca
11470 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  use sqlite3_step
11480 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74  () to.    ** ret
11490 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77  urn the next row
114a0 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20   of result..    
114b0 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
114c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
114d0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
114e0 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
114f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11500 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
11510 52 6f 77 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  Row, pIn->iMem, 
11520 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  pIn->nMem);.    
11530 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
11540 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
11550 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d  (pParse, pIn->iM
11560 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a  em, pIn->nMem);.
11570 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11580 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d   }.  }..  /* Jum
11590 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
115a0 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20  the loop if the 
115b0 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64  LIMIT is reached
115c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
115d0 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  iLimit ){.    sq
115e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
115f0 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
11600 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c  >iLimit, iBreak,
11610 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   -1);.  }..  /* 
11620 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75 62  Generate the sub
11630 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20  routine return. 
11640 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
11650 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
11660 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73   iContinue);.  s
11670 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
11680 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
11690 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65  egReturn);..  re
116a0 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
116b0 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20  .** Alternative 
116c0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
116d0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66  code generator f
116e0 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74 68  or cases when th
116f0 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44  ere.** is an ORD
11700 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a  ER BY clause..**
11710 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20  .** We assume a 
11720 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c  query of the fol
11730 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a  lowing form:.**.
11740 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41  **      <selectA
11750 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c  >  <operator>  <
11760 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20  selectB>  ORDER 
11770 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e  BY <orderbylist>
11780 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72  .**.** <operator
11790 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f  > is one of UNIO
117a0 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58  N ALL, UNION, EX
117b0 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45  CEPT, or INTERSE
117c0 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a  CT.  The idea.**
117d0 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68   is to code both
117e0 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c   <selectA> and <
117f0 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68  selectB> with th
11800 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
11810 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69  e as.** co-routi
11820 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74  nes.  Then run t
11830 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69  he co-routines i
11840 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d  n parallel and m
11850 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74 73  erge the results
11860 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  .** into the out
11870 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f  put.  In additio
11880 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72  n to the two cor
11890 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20  outines (called 
118a0 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73  selectA and.** s
118b0 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61 72  electB) there ar
118c0 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a  e 7 subroutines:
118d0 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20  .**.**    outA: 
118e0 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70     Move the outp
118f0 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ut of the select
11900 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f  A coroutine into
11910 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20   the output.**  
11920 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
11930 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
11940 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  ..**.**    outB:
11950 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
11960 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
11970 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tB coroutine int
11980 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
11990 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
119a0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
119b0 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61  y.  (Only genera
119c0 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e  ted for UNION an
119d0 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
119e0 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43   UNION ALL.  EXC
119f0 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45  EPT and INSERTSE
11a00 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20  CT never output 
11a10 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20  a row that.**   
11a20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61 72            appear
11a30 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a  s only in B.).**
11a40 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20  .**    AltB:    
11a50 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
11a60 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
11a70 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
11a80 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A<B..**.**   
11a90 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64   AeqB:    Called
11aa0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
11ab0 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
11ac0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d  routines and A==
11ad0 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42  B..**.**    AgtB
11ae0 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
11af0 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
11b00 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
11b10 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a  nes and A>B..**.
11b20 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43  **    EofA:    C
11b30 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20  alled when data 
11b40 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f  is exhausted fro
11b50 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a  m selectA..**.**
11b60 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c      EofB:    Cal
11b70 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
11b80 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
11b90 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54  selectB..**.** T
11ba0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
11bb0 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20  n of the latter 
11bc0 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73  five subroutines
11bd0 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68   depend on which
11be0 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20   .** <operator> 
11bf0 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a  is used:.**.**.*
11c00 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e  *             UN
11c10 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20  ION ALL         
11c20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20  UNION           
11c30 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20 20   EXCEPT         
11c40 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20   INTERSECT.**   
11c50 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
11c60 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
11c70 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
11c80 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
11c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
11ca0 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  AltB:   outA, ne
11cb0 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  xtA      outA, n
11cc0 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c  extA       outA,
11cd0 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e   nextA         n
11ce0 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71  extA.**.**   Aeq
11cf0 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
11d00 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
11d10 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 41             nextA
11d20 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e           outA, n
11d30 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74  extA.**.**   Agt
11d40 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42  B:   outB, nextB
11d50 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74        outB, next
11d60 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42  B          nextB
11d70 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
11d80 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20  B.**.**   EofA: 
11d90 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
11da0 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
11db0 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20 20          halt    
11dc0 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a           halt.**
11dd0 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75  .**   EofB:   ou
11de0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f  tA, nextA      o
11df0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
11e00 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
11e10 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20       halt.**.** 
11e20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71  In the AltB, Aeq
11e30 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62 72  B, and AgtB subr
11e40 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20  outines, an EOF 
11e50 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  on A following n
11e60 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61  extA.** causes a
11e70 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70  n immediate jump
11e80 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20   to EofA and an 
11e90 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69  EOF on B followi
11ea0 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a  ng nextB causes.
11eb0 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  ** an immediate 
11ec0 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57  jump to EofB.  W
11ed0 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45  ithin EofA and E
11ee0 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20  ofB, and EOF on 
11ef0 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c  entry or.** foll
11f00 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73  owing nextX caus
11f10 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65  es a jump to the
11f20 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65   end of the sele
11f30 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  ct processing..*
11f40 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72  *.** Duplicate r
11f50 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e  emoval in the UN
11f60 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64  ION, EXCEPT, and
11f70 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65 73   INTERSECT cases
11f80 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77   is handled.** w
11f90 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ithin the output
11fa0 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68   subroutine.  Th
11fb0 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73 74  e regPrev regist
11fc0 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65  er set holds the
11fd0 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f   previously.** o
11fe0 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20  utput value.  A 
11ff0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61  comparison is ma
12000 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20  de against this 
12010 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75  value and the ou
12020 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70  tput.** is skipp
12030 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20 72  ed if the next r
12040 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20  esults would be 
12050 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
12060 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20  previous..**.** 
12070 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
12080 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d  on plan is to im
12090 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20  plement the two 
120a0 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73  coroutines and s
120b0 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69  even.** subrouti
120c0 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20  nes first, then 
120d0 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20  put the control 
120e0 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f 74  logic at the bot
120f0 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  tom.  Like this:
12100 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
12110 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20  goto Init.**    
12120 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20   coA: coroutine 
12130 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20 28  for left query (
12140 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63  A).**     coB: c
12150 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67  oroutine for rig
12160 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20  ht query (B).** 
12170 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20     outA: output 
12180 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20  one row of A.** 
12190 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20     outB: output 
121a0 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e  one row of B (UN
121b0 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c  ION and UNION AL
121c0 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f  L only).**    Eo
121d0 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f  fA: ....**    Eo
121e0 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c  fB: ....**    Al
121f0 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65  tB: ....**    Ae
12200 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67  qB: ....**    Ag
12210 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e  tB: ....**    In
12220 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63  it: initialize c
12230 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65  oroutine registe
12240 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79  rs.**          y
12250 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20  ield coA.**     
12260 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20 67       if eof(A) g
12270 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20  oto EofA.**     
12280 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a       yield coB.*
12290 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f  *          if eo
122a0 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a  f(B) goto EofB.*
122b0 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61  *    Cmpr: Compa
122c0 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20  re A, B.**      
122d0 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41      Jump AltB, A
122e0 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20  eqB, AgtB.**    
122f0 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20   End: ....**.** 
12300 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65  We call AltB, Ae
12310 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20  qB, AgtB, EofA, 
12320 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75  and EofB "subrou
12330 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79 20  tines" but they 
12340 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61  are not.** actua
12350 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67  lly called using
12360 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20   Gosub and they 
12370 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20  do not Return.  
12380 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f  EofA and EofB lo
12390 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20  op.** until all 
123a0 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
123b0 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74  d then jump to t
123c0 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20  he "end" labe.  
123d0 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61  AltB, AeqB,.** a
123e0 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20  nd AgtB jump to 
123f0 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20  either L2 or to 
12400 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45  one of EofA or E
12410 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ofB..*/.#ifndef 
12420 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
12430 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74  OUND_SELECT.stat
12440 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
12450 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72  ctOrderBy(.  Par
12460 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
12470 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
12480 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
12490 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
124a0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
124b0 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
124c0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
124d0 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
124e0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
124f0 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
12500 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
12510 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
12520 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
12530 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ters */.  Select
12540 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
12550 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
12560 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
12570 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
12580 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
12590 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
125a0 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
125b0 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  BE */.  SelectDe
125c0 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a  st destA;     /*
125d0 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
125e0 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a   coroutine A */.
125f0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
12600 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69  tB;     /* Desti
12610 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75  nation for corou
12620 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20  tine B */.  int 
12630 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20 20  regAddrA;       
12640 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
12650 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
12660 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -A coroutine */.
12670 20 20 69 6e 74 20 72 65 67 45 6f 66 41 3b 20 20    int regEofA;  
12680 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
12690 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e  to indicate when
126a0 20 73 65 6c 65 63 74 2d 41 20 69 73 20 63 6f 6d   select-A is com
126b0 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 72  plete */.  int r
126c0 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20  egAddrB;        
126d0 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
126e0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
126f0 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
12700 20 69 6e 74 20 72 65 67 45 6f 66 42 3b 20 20 20   int regEofB;   
12710 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74         /* Flag t
12720 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20  o indicate when 
12730 73 65 6c 65 63 74 2d 42 20 69 73 20 63 6f 6d 70  select-B is comp
12740 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  lete */.  int ad
12750 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20  drSelectA;      
12760 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
12770 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  e select-A corou
12780 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
12790 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20  drSelectB;      
127a0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
127b0 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  e select-B corou
127c0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
127d0 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20  gOutA;          
127e0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
127f0 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70  ter for the outp
12800 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
12810 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42  */.  int regOutB
12820 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
12830 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
12840 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20  or the output-B 
12850 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
12860 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20  int addrOutA;   
12870 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
12880 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41   of the output-A
12890 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
128a0 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20   int addrOutB = 
128b0 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  0;     /* Addres
128c0 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d  s of the output-
128d0 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
128e0 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20    int addrEofA; 
128f0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
12900 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
12910 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62  -A-exhausted sub
12920 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
12930 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20   addrEofB;      
12940 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
12950 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78   the select-B-ex
12960 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
12970 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
12980 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AltB;         /*
12990 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
129a0 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A<B subroutine *
129b0 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42  /.  int addrAeqB
129c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
129d0 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42  ress of the A==B
129e0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
129f0 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20   int addrAgtB;  
12a00 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
12a10 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62  s of the A>B sub
12a20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
12a30 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20   regLimitA;     
12a40 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
12a50 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
12a60 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  A */.  int regLi
12a70 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitB;        /* 
12a80 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
12a90 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
12aa0 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
12ab0 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67         /* A rang
12ac0 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  e of registers t
12ad0 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20  o hold previous 
12ae0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
12af0 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20  savedLimit;     
12b00 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
12b10 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f   of p->iLimit */
12b20 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73  .  int savedOffs
12b30 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65  et;      /* Save
12b40 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f  d value of p->iO
12b50 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  ffset */.  int l
12b60 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20  abelCmpr;       
12b70 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
12b80 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d  e start of the m
12b90 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a  erge algorithm *
12ba0 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64  /.  int labelEnd
12bb0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  ;         /* Lab
12bc0 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f  el for the end o
12bd0 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45  f the overall SE
12be0 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69  LECT stmt */.  i
12bf0 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20  nt j1;          
12c00 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73       /* Jump ins
12c10 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67  tructions that g
12c20 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a  et retargetted *
12c30 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
12c40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
12c50 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55   of TK_ALL, TK_U
12c60 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c  NION, TK_EXCEPT,
12c70 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f   TK_INTERSECT */
12c80 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
12c90 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70  Dup = 0; /* Comp
12ca0 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  arison informati
12cb0 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  on for duplicate
12cc0 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65   removal */.  Ke
12cd0 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65  yInfo *pKeyMerge
12ce0 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f  ;   /* Compariso
12cf0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
12d00 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a  r merging rows *
12d10 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
12d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
12d30 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
12d40 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
12d50 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54  pOrderBy;   /* T
12d60 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
12d70 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64  se */.  int nOrd
12d80 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  erBy;         /*
12d90 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
12da0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
12db0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
12dc0 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20   *aPermute;     
12dd0 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72     /* Mapping fr
12de0 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  om ORDER BY term
12df0 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20  s to result set 
12e00 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64  columns */.#ifnd
12e10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
12e20 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75  XPLAIN.  int iSu
12e30 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b1;            /
12e40 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74  * EQP id of left
12e50 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20  -hand query */. 
12e60 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20   int iSub2;     
12e70 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
12e80 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71   of right-hand q
12e90 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  uery */.#endif..
12ea0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
12eb0 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73  derBy!=0 );.  as
12ec0 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30  sert( pKeyDup==0
12ed0 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22   ); /* "Managed"
12ee0 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73   code needs this
12ef0 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e  .  Ticket #3382.
12f00 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
12f10 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61  e->db;.  v = pPa
12f20 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
12f30 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20  sert( v!=0 );   
12f40 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74      /* Already t
12f50 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20  hrown the error 
12f60 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61  if VDBE alloc fa
12f70 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45  iled */.  labelE
12f80 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
12f90 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
12fa0 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69  labelCmpr = sqli
12fb0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
12fc0 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63  (v);...  /* Patc
12fd0 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42  h up the ORDER B
12fe0 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  Y clause.  */.  
12ff0 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20  op = p->op;  .  
13000 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
13010 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
13020 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rior->pOrderBy==
13030 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  0 );.  pOrderBy 
13040 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
13050 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
13060 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20  y );.  nOrderBy 
13070 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
13080 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65  r;..  /* For ope
13090 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61  rators other tha
130a0 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68  n UNION ALL we h
130b0 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ave to make sure
130c0 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f   that.  ** the O
130d0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
130e0 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d  overs every term
130f0 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
13100 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65  et.  Add.  ** te
13110 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52  rms to the ORDER
13120 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65   BY clause as ne
13130 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
13140 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29  if( op!=TK_ALL )
13150 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64  {.    for(i=1; d
13160 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
13170 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69  =0 && i<=p->pELi
13180 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
13190 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
131a0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
131b0 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  em;.      for(j=
131c0 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
131d0 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79  y->a; j<nOrderBy
131e0 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
131f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13200 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79   pItem->iOrderBy
13210 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Col>0 );.       
13220 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 4f 72 64   if( pItem->iOrd
13230 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65  erByCol==i ) bre
13240 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
13250 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42    if( j==nOrderB
13260 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  y ){.        Exp
13270 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
13280 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54  3Expr(db, TK_INT
13290 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20  EGER, 0);.      
132a0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
132b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
132c0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  MEM;.        pNe
132d0 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  w->flags |= EP_I
132e0 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  ntValue;.       
132f0 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20   pNew->u.iValue 
13300 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  = i;.        pOr
13310 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
13320 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
13330 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
13340 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69  pNew);.        i
13350 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f  f( pOrderBy ) pO
13360 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72  rderBy->a[nOrder
13370 42 79 2b 2b 5d 2e 69 4f 72 64 65 72 42 79 43 6f  By++].iOrderByCo
13380 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20  l = (u16)i;.    
13390 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
133a0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
133b0 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75  comparison permu
133c0 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e  tation and keyin
133d0 66 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20  fo that is used 
133e0 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65  with.  ** the pe
133f0 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74  rmutation used t
13400 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
13410 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77  he next.  ** row
13420 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65   of results come
13430 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f  s from selectA o
13440 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f  r selectB.  Also
13450 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20   add explicit.  
13460 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f  ** collations to
13470 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
13480 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68  ause terms so th
13490 61 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71  at when the subq
134a0 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74  ueries.  ** to t
134b0 68 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65  he right and the
134c0 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61   left are evalua
134d0 74 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68  ted, they use th
134e0 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63  e correct.  ** c
134f0 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  ollation..  */. 
13500 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69   aPermute = sqli
13510 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
13520 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e  b, sizeof(int)*n
13530 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20  OrderBy);.  if( 
13540 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20  aPermute ){.    
13550 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
13560 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
13570 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
13580 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e  pOrderBy->a; i<n
13590 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49  OrderBy; i++, pI
135a0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  tem++){.      as
135b0 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69 4f 72  sert( pItem->iOr
135c0 64 65 72 42 79 43 6f 6c 3e 30 20 20 26 26 20 70  derByCol>0  && p
135d0 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f  Item->iOrderByCo
135e0 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  l<=p->pEList->nE
135f0 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65  xpr );.      aPe
13600 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d  rmute[i] = pItem
13610 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20  ->iOrderByCol - 
13620 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  1;.    }.    pKe
13630 79 4d 65 72 67 65 20 3d 0a 20 20 20 20 20 20 73  yMerge =.      s
13640 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
13650 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4b  w(db, sizeof(*pK
13660 65 79 4d 65 72 67 65 29 2b 6e 4f 72 64 65 72 42  eyMerge)+nOrderB
13670 79 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  y*(sizeof(CollSe
13680 71 2a 29 2b 31 29 29 3b 0a 20 20 20 20 69 66 28  q*)+1));.    if(
13690 20 70 4b 65 79 4d 65 72 67 65 20 29 7b 0a 20 20   pKeyMerge ){.  
136a0 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61      pKeyMerge->a
136b0 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
136c0 29 26 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f  )&pKeyMerge->aCo
136d0 6c 6c 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20  ll[nOrderBy];.  
136e0 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 6e      pKeyMerge->n
136f0 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 4f 72  Field = (u16)nOr
13700 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 4b 65  derBy;.      pKe
13710 79 4d 65 72 67 65 2d 3e 65 6e 63 20 3d 20 45 4e  yMerge->enc = EN
13720 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72  C(db);.      for
13730 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
13740 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
13750 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
13760 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 54          Expr *pT
13770 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  erm = pOrderBy->
13780 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
13790 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66      if( pTerm->f
137a0 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
137b0 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  late ){.        
137c0 20 20 70 43 6f 6c 6c 20 3d 20 70 54 65 72 6d 2d    pColl = pTerm-
137d0 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  >pColl;.        
137e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
137f0 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65   pColl = multiSe
13800 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
13810 73 65 2c 20 70 2c 20 61 50 65 72 6d 75 74 65 5b  se, p, aPermute[
13820 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  i]);.          p
13830 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Term->flags |= E
13840 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  P_ExpCollate;.  
13850 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70          pTerm->p
13860 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  Coll = pColl;.  
13870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13880 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c  pKeyMerge->aColl
13890 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  [i] = pColl;.   
138a0 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e       pKeyMerge->
138b0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
138c0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
138d0 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20  ortOrder;.      
138e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
138f0 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d  .    pKeyMerge =
13900 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
13910 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45 52  attach the ORDER
13920 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68   BY clause to th
13930 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  e query..  */.  
13940 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
13950 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72  rderBy;.  pPrior
13960 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
13970 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
13980 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64  pParse->db, pOrd
13990 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  erBy, 0);..  /* 
139a0 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65  Allocate a range
139b0 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65   of temporary re
139c0 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20  gisters and the 
139d0 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20  KeyInfo needed. 
139e0 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69   ** for the logi
139f0 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64  c that removes d
13a00 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20  uplicate result 
13a10 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20  rows when the.  
13a20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55  ** operator is U
13a30 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
13a40 20 49 4e 54 45 52 53 45 43 54 20 28 62 75 74 20   INTERSECT (but 
13a50 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a  not UNION ALL)..
13a60 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
13a70 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67  K_ALL ){.    reg
13a80 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Prev = 0;.  }els
13a90 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72  e{.    int nExpr
13aa0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
13ab0 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
13ac0 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72   nOrderBy>=nExpr
13ad0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
13ae0 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50  iled );.    regP
13af0 72 65 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74  rev = sqlite3Get
13b00 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
13b10 2c 20 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20 20  , nExpr+1);.    
13b20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13b30 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
13b40 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   0, regPrev);.  
13b50 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69    pKeyDup = sqli
13b60 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
13b70 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
13b80 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b        sizeof(*pK
13b90 65 79 44 75 70 29 20 2b 20 6e 45 78 70 72 2a 28  eyDup) + nExpr*(
13ba0 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
13bb0 2b 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  +1) );.    if( p
13bc0 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20  KeyDup ){.      
13bd0 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72  pKeyDup->aSortOr
13be0 64 65 72 20 3d 20 28 75 38 2a 29 26 70 4b 65 79  der = (u8*)&pKey
13bf0 44 75 70 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72  Dup->aColl[nExpr
13c00 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70  ];.      pKeyDup
13c10 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  ->nField = (u16)
13c20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4b 65  nExpr;.      pKe
13c30 79 44 75 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  yDup->enc = ENC(
13c40 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  db);.      for(i
13c50 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  =0; i<nExpr; i++
13c60 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  ){.        pKeyD
13c70 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d  up->aColl[i] = m
13c80 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
13c90 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
13ca0 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
13cb0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
13cc0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
13cd0 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65   }.  }. .  /* Se
13ce0 70 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20  parate the left 
13cf0 61 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75  and the right qu
13d00 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f  ery from one ano
13d10 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  ther.  */.  p->p
13d20 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 73 71 6c  Prior = 0;.  sql
13d30 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
13d40 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
13d50 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  p, p->pOrderBy, 
13d60 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20  "ORDER");.  if( 
13d70 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d  pPrior->pPrior==
13d80 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
13d90 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
13da0 70 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69  pBy(pParse, pPri
13db0 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  or, pPrior->pOrd
13dc0 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
13dd0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
13de0 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69  e the limit regi
13df0 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75  sters */.  compu
13e00 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
13e10 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65  (pParse, p, labe
13e20 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  lEnd);.  if( p->
13e30 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b  iLimit && op==TK
13e40 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c  _ALL ){.    regL
13e50 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65  imitA = ++pParse
13e60 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c  ->nMem;.    regL
13e70 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  imitB = ++pParse
13e80 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
13e90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13ea0 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66   OP_Copy, p->iOf
13eb0 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65  fset ? p->iOffse
13ec0 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c  t+1 : p->iLimit,
13ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ef0 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20     regLimitA);. 
13f00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13f10 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
13f20 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c   regLimitA, regL
13f30 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b  imitB);.  }else{
13f40 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d  .    regLimitA =
13f50 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a   regLimitB = 0;.
13f60 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
13f70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
13f80 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69  Limit);.  p->pLi
13f90 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  mit = 0;.  sqlit
13fa0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
13fb0 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20   p->pOffset);.  
13fc0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
13fd0 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b  .  regAddrA = ++
13fe0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
13ff0 72 65 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72  regEofA = ++pPar
14000 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41  se->nMem;.  regA
14010 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrB = ++pParse-
14020 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42  >nMem;.  regEofB
14030 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
14040 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b  m;.  regOutA = +
14050 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
14060 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61   regOutB = ++pPa
14070 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
14080 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
14090 69 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43  it(&destA, SRT_C
140a0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
140b0 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  rA);.  sqlite3Se
140c0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
140d0 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  stB, SRT_Corouti
140e0 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a  ne, regAddrB);..
140f0 20 20 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20 74    /* Jump past t
14100 68 65 20 76 61 72 69 6f 75 73 20 73 75 62 72 6f  he various subro
14110 75 74 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75  utines and corou
14120 74 69 6e 65 73 20 74 6f 20 74 68 65 20 6d 61 69  tines to the mai
14130 6e 0a 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f  n.  ** merge loo
14140 70 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71  p.  */.  j1 = sq
14150 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
14160 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61  v, OP_Goto);.  a
14170 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c  ddrSelectA = sql
14180 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
14190 64 64 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47  ddr(v);...  /* G
141a0 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
141b0 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
141c0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
141d0 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ment to the.  **
141e0 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d   left of the com
141f0 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d  pound operator -
14200 20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e   the "A" select.
14210 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
14220 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67  Comment((v, "Beg
14230 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  in coroutine for
14240 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b   left SELECT"));
14250 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69  .  pPrior->iLimi
14260 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20  t = regLimitA;. 
14270 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
14280 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
14290 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
142a0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
142b0 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
142c0 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c  , &destA);.  sql
142d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
142e0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
142f0 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c   regEofA);.  sql
14300 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
14310 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
14320 64 64 72 41 29 3b 0a 20 20 56 64 62 65 4e 6f 6f  ddrA);.  VdbeNoo
14330 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e  pComment((v, "En
14340 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  d coroutine for 
14350 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  left SELECT"));.
14360 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
14370 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
14380 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
14390 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a  T statement on .
143a0 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d    ** the right -
143b0 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a   the "B" select.
143c0 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63    */.  addrSelec
143d0 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
143e0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
143f0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
14400 74 28 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72  t((v, "Begin cor
14410 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
14420 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61   SELECT"));.  sa
14430 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  vedLimit = p->iL
14440 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66  imit;.  savedOff
14450 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  set = p->iOffset
14460 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
14470 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e  regLimitB;.  p->
14480 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20  iOffset = 0;  . 
14490 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
144a0 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
144b0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
144c0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
144d0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
144e0 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  stB);.  p->iLimi
144f0 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a  t = savedLimit;.
14500 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73    p->iOffset = s
14510 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71  avedOffset;.  sq
14520 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14530 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
14540 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71  , regEofB);.  sq
14550 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
14560 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
14570 41 64 64 72 42 29 3b 0a 20 20 56 64 62 65 4e 6f  AddrB);.  VdbeNo
14580 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  opComment((v, "E
14590 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  nd coroutine for
145a0 20 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29   right SELECT"))
145b0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
145c0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
145d0 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
145e0 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
145f0 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e A.  ** select 
14600 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
14610 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
14620 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
14630 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
14640 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
14650 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22  t routine for A"
14660 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d  ));.  addrOutA =
14670 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
14680 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
14690 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
146a0 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44     p, &destA, pD
146b0 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20  est, regOutA,.  
146c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
146d0 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
146e0 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
146f0 4f 46 46 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  OFF, labelEnd);.
14700 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65    .  /* Generate
14710 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
14720 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
14730 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
14740 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e B.  ** select 
14750 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
14760 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
14770 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
14780 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
14790 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
147a0 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65  NION ){.    Vdbe
147b0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
147c0 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
147d0 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64  for B"));.    ad
147e0 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74  drOutB = generat
147f0 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
14800 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
14810 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
14820 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67  estB, pDest, reg
14830 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20  OutB,.          
14840 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
14850 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49  pKeyDup, P4_KEYI
14860 4e 46 4f 5f 53 54 41 54 49 43 2c 20 6c 61 62 65  NFO_STATIC, labe
14870 6c 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lEnd);.  }..  /*
14880 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
14890 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
148a0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
148b0 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a  rom select A.  *
148c0 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
148d0 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
148e0 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e   select B remain
148f0 73 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  s..  */.  VdbeNo
14900 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  opComment((v, "e
14910 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22  of-A subroutine"
14920 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  ));.  if( op==TK
14930 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54  _EXCEPT || op==T
14940 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
14950 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71     addrEofA = sq
14960 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14970 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
14980 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c 73  abelEnd);.  }els
14990 65 7b 20 20 0a 20 20 20 20 61 64 64 72 45 6f 66  e{  .    addrEof
149a0 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  A = sqlite3VdbeA
149b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
149c0 72 65 67 45 6f 66 42 2c 20 6c 61 62 65 6c 45 6e  regEofB, labelEn
149d0 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
149e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
149f0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
14a00 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 73  addrOutB);.    s
14a10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
14a20 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
14a30 67 41 64 64 72 42 29 3b 0a 20 20 20 20 73 71 6c  gAddrB);.    sql
14a40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14a50 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
14a60 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e  drEofA);.    p->
14a70 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50  nSelectRow += pP
14a80 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
14a90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
14aa0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
14ab0 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68  e to run when th
14ac0 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73  e results from s
14ad0 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65  elect B.  ** are
14ae0 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f   exhausted and o
14af0 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65  nly data in sele
14b00 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20  ct A remains..  
14b10 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
14b20 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
14b30 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72   addrEofB = addr
14b40 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d  EofA;.    if( p-
14b50 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50  >nSelectRow > pP
14b60 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
14b70 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
14b80 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   = pPrior->nSele
14b90 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20  ctRow;.  }else{ 
14ba0 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f   .    VdbeNoopCo
14bb0 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42  mment((v, "eof-B
14bc0 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
14bd0 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73      addrEofB = s
14be0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14bf0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
14c00 66 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  fA, labelEnd);. 
14c10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14c20 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
14c30 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
14c40 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  utA);.    sqlite
14c50 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
14c60 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
14c70 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
14c80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14c90 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66  Goto, 0, addrEof
14ca0 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  B);.  }..  /* Ge
14cb0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
14cc0 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
14cd0 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A<B.  */.  Vdb
14ce0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
14cf0 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74   "A-lt-B subrout
14d00 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c  ine"));.  addrAl
14d10 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
14d20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
14d30 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
14d40 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  rOutA);.  sqlite
14d50 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
14d60 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
14d70 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
14d80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
14d90 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45  , regEofA, addrE
14da0 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofA);.  sqlite3V
14db0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14dc0 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d  Goto, 0, labelCm
14dd0 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  pr);..  /* Gener
14de0 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
14df0 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
14e00 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ==B.  */.  if( o
14e10 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
14e20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
14e30 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66  AltB;.  }else if
14e40 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ( op==TK_INTERSE
14e50 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65  CT ){.    addrAe
14e60 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20  qB = addrAltB;. 
14e70 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20     addrAltB++;. 
14e80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65   }else{.    Vdbe
14e90 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
14ea0 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69  "A-eq-B subrouti
14eb0 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41  ne"));.    addrA
14ec0 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65  eqB =.    sqlite
14ed0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
14ee0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
14ef0 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
14f00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14f10 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64  If, regEofA, add
14f20 72 45 6f 66 41 29 3b 0a 20 20 20 20 73 71 6c 69  rEofA);.    sqli
14f30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14f40 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
14f50 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  elCmpr);.  }..  
14f60 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
14f70 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
14f80 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a  ase of A>B.  */.
14f90 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
14fa0 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75  t((v, "A-gt-B su
14fb0 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
14fc0 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65  ddrAgtB = sqlite
14fd0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
14fe0 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  (v);.  if( op==T
14ff0 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
15000 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c  UNION ){.    sql
15010 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15020 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
15030 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
15040 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
15050 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
15060 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  eld, regAddrB);.
15070 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15080 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
15090 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29  gEofB, addrEofB)
150a0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
150b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
150c0 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  , 0, labelCmpr);
150d0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65  ..  /* This code
150e0 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e   runs once to in
150f0 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68  itialize everyth
15100 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ing..  */.  sqli
15110 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
15120 76 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65  v, j1);.  sqlite
15130 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15140 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
15150 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65  gEofA);.  sqlite
15160 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15170 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
15180 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65  gEofB);.  sqlite
15190 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
151a0 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72  P_Gosub, regAddr
151b0 41 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b  A, addrSelectA);
151c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
151d0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
151e0 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72  , regAddrB, addr
151f0 53 65 6c 65 63 74 42 29 3b 0a 20 20 73 71 6c 69  SelectB);.  sqli
15200 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15210 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c   OP_If, regEofA,
15220 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71   addrEofA);.  sq
15230 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15240 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
15250 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 0a 20  B, addrEofB);.. 
15260 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68   /* Implement th
15270 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f  e main merge loo
15280 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
15290 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
152a0 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
152b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
152c0 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74  Op4(v, OP_Permut
152d0 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20  ation, 0, 0, 0, 
152e0 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c  (char*)aPermute,
152f0 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20   P4_INTARRAY);. 
15300 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15310 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
15320 2c 20 64 65 73 74 41 2e 69 4d 65 6d 2c 20 64 65  , destA.iMem, de
15330 73 74 42 2e 69 4d 65 6d 2c 20 6e 4f 72 64 65 72  stB.iMem, nOrder
15340 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
15350 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
15360 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50  ar*)pKeyMerge, P
15370 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
15380 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  F);.  sqlite3Vdb
15390 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
153a0 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64  mp, addrAltB, ad
153b0 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42  drAeqB, addrAgtB
153c0 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65  );..  /* Release
153d0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
153e0 74 65 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ters.  */.  if( 
153f0 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 73  regPrev ){.    s
15400 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15410 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
15420 65 67 50 72 65 76 2c 20 6e 4f 72 64 65 72 42 79  egPrev, nOrderBy
15430 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  +1);.  }..  /* J
15440 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73 20  ump to the this 
15450 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  point in order t
15460 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
15470 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71  query..  */.  sq
15480 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
15490 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e  Label(v, labelEn
154a0 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  d);..  /* Set th
154b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
154c0 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ut columns.  */.
154d0 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
154e0 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
154f0 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46  {.    Select *pF
15500 69 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20  irst = pPrior;. 
15510 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
15520 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
15530 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
15540 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65  or;.    generate
15550 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
15560 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
15570 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  EList);.  }..  /
15580 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65  * Reassembly the
15590 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
155a0 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
155b0 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74  be freed correct
155c0 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63  ly.  ** by the c
155d0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
155e0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
155f0 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
15600 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
15610 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
15620 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  }.  p->pPrior = 
15630 70 50 72 69 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20  pPrior;..  /*** 
15640 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62  TBD:  Insert sub
15650 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f  routine calls to
15660 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f   close cursors o
15670 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a  n incomplete.  *
15680 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a  *** subqueries *
15690 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f  ***/.  explainCo
156a0 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20  mposite(pParse, 
156b0 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53  p->op, iSub1, iS
156c0 75 62 32 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  ub2, 0);.  retur
156d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
156e0 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
156f0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
15700 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
15710 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
15720 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61  T_VIEW)./* Forwa
15730 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20  rd Declarations 
15740 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
15750 75 62 73 74 45 78 70 72 4c 69 73 74 28 73 71 6c  ubstExprList(sql
15760 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a  ite3*, ExprList*
15770 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a  , int, ExprList*
15780 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  );.static void s
15790 75 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69 74  ubstSelect(sqlit
157a0 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69  e3*, Select *, i
157b0 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b  nt, ExprList *);
157c0 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72  ../*.** Scan thr
157d0 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73  ough the express
157e0 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c  ion pExpr.  Repl
157f0 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65  ace every refere
15800 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75  nce to.** a colu
15810 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62  mn in table numb
15820 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61  er iTable with a
15830 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f   copy of the iCo
15840 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79  lumn-th.** entry
15850 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75   in pEList.  (Bu
15860 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63  t leave referenc
15870 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20  es to the ROWID 
15880 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61  column .** uncha
15890 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69  nged.).**.** Thi
158a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72  s routine is par
158b0 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e  t of the flatten
158c0 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20  ing procedure.  
158d0 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68  A subquery.** wh
158e0 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  ose result set i
158f0 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c  s defined by pEL
15900 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65  ist appears as e
15910 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46  ntry in the.** F
15920 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
15930 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74  SELECT such that
15940 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   the VDBE cursor
15950 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61   assigned to tha
15960 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65  t.** FORM clause
15970 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65   entry is iTable
15980 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
15990 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61  make the necessa
159a0 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ry .** changes t
159b0 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20  o pExpr so that 
159c0 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74  it refers direct
159d0 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65  ly to the source
159e0 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65   table.** of the
159f0 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72   subquery rather
15a00 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
15a10 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
15a20 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
15a30 2a 73 75 62 73 74 45 78 70 72 28 0a 20 20 73 71  *substExpr(.  sq
15a40 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
15a50 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
15a60 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69  oc errors to thi
15a70 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  s connection */.
15a80 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
15a90 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e        /* Expr in
15aa0 20 77 68 69 63 68 20 73 75 62 73 74 69 74 75 74   which substitut
15ab0 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20  ion occurs */.  
15ac0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
15ad0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
15ae0 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a  be substituted *
15af0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
15b00 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74  List    /* Subst
15b10 69 74 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e  itute expression
15b20 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45  s */.){.  if( pE
15b30 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  xpr==0 ) return 
15b40 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
15b50 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
15b60 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
15b70 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66  iTable ){.    if
15b80 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
15b90 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  <0 ){.      pExp
15ba0 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b  r->op = TK_NULL;
15bb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15bc0 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
15bd0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
15be0 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  st!=0 && pExpr->
15bf0 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e  iColumn<pEList->
15c00 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
15c10 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
15c20 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
15c30 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
15c40 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
15c50 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
15c60 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69  List->a[pExpr->i
15c70 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30  Column].pExpr, 0
15c80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
15c90 77 20 26 26 20 70 45 78 70 72 2d 3e 70 43 6f 6c  w && pExpr->pCol
15ca0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  l ){.        pNe
15cb0 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72  w->pColl = pExpr
15cc0 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  ->pColl;.      }
15cd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
15ce0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
15cf0 70 72 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  pr);.      pExpr
15d00 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20   = pNew;.    }. 
15d10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45 78 70   }else{.    pExp
15d20 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74  r->pLeft = subst
15d30 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
15d40 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70  pLeft, iTable, p
15d50 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70  EList);.    pExp
15d60 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73  r->pRight = subs
15d70 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d  tExpr(db, pExpr-
15d80 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c  >pRight, iTable,
15d90 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66   pEList);.    if
15da0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
15db0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
15dc0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
15dd0 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
15de0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
15df0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
15e00 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
15e10 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
15e20 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(db, pExpr->x.p
15e30 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
15e40 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
15e50 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
15e60 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
15e70 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20  ubstExprList(.  
15e80 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
15e90 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
15ea0 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72  alloc errors her
15eb0 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
15ec0 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c  *pList,     /* L
15ed0 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20  ist to scan and 
15ee0 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
15ef0 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a   substitutes */.
15f00 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
15f10 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
15f20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
15f30 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
15f40 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
15f50 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
15f60 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
15f70 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
15f80 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
15f90 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
15fa0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c  pr; i++){.    pL
15fb0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  ist->a[i].pExpr 
15fc0 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
15fd0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
15fe0 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
15ff0 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
16000 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
16010 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
16020 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  ,         /* Rep
16030 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
16040 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65  s here */.  Sele
16050 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
16060 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
16070 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f  ment in which to
16080 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69   make substituti
16090 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ons */.  int iTa
160a0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
160b0 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70   Table to be rep
160c0 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  laced */.  ExprL
160d0 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20  ist *pEList     
160e0 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61  /* Substitute va
160f0 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63  lues */.){.  Src
16100 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74  List *pSrc;.  st
16110 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
16120 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
16130 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  i;.  if( !p ) re
16140 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70  turn;.  substExp
16150 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c  rList(db, p->pEL
16160 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
16170 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
16180 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72  rList(db, p->pGr
16190 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70  oupBy, iTable, p
161a0 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
161b0 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
161c0 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c  OrderBy, iTable,
161d0 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70   pEList);.  p->p
161e0 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78  Having = substEx
161f0 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  pr(db, p->pHavin
16200 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  g, iTable, pELis
16210 74 29 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20  t);.  p->pWhere 
16220 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
16230 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c  p->pWhere, iTabl
16240 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
16250 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d  bstSelect(db, p-
16260 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c  >pPrior, iTable,
16270 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 72 63   pEList);.  pSrc
16280 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
16290 73 65 72 74 28 20 70 53 72 63 20 29 3b 20 20 2f  sert( pSrc );  /
162a0 2a 20 45 76 65 6e 20 66 6f 72 20 28 53 45 4c 45  * Even for (SELE
162b0 43 54 20 31 29 20 77 65 20 68 61 76 65 3a 20 70  CT 1) we have: p
162c0 53 72 63 21 3d 30 20 62 75 74 20 70 53 72 63 2d  Src!=0 but pSrc-
162d0 3e 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66  >nSrc==0 */.  if
162e0 28 20 41 4c 57 41 59 53 28 70 53 72 63 29 20 29  ( ALWAYS(pSrc) )
162f0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63  {.    for(i=pSrc
16300 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53  ->nSrc, pItem=pS
16310 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  rc->a; i>0; i--,
16320 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
16330 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
16340 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c   pItem->pSelect,
16350 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
16360 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
16370 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
16380 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
16390 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
163a0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
163b0 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65  IEW) */..#if !de
163c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
163d0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
163e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
163f0 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
16400 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
16410 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
16420 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61   subqueries as a
16430 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74   performance opt
16440 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68  imization..** Th
16450 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
16460 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73  ns 1 if it makes
16470 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69   changes and 0 i
16480 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20  f no flattening 
16490 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  occurs..**.** To
164a0 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
164b0 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74  concept of flatt
164c0 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20  ening, consider 
164d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
164e0 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
164f0 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
16500 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61  (SELECT x+y AS a
16510 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
16520 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a  <100) WHERE a>5.
16530 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
16540 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65  t way of impleme
16550 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79  nting this query
16560 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74   is to execute t
16570 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66  he.** subquery f
16580 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74  irst and store t
16590 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  he results in a 
165a0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
165b0 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65   then.** run the
165c0 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20   outer query on 
165d0 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74  that temporary t
165e0 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75  able.  This requ
165f0 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73  ires two.** pass
16600 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61  es over the data
16610 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  .  Furthermore, 
16620 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70  because the temp
16630 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68  orary table.** h
16640 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74  as no indices, t
16650 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
16660 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  on the outer que
16670 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ry cannot be.** 
16680 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a  optimized..**.**
16690 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
166a0 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74  tempts to rewrit
166b0 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61  e queries such a
166c0 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f  s the above into
166d0 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  .** a single fla
166e0 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74  t select, like t
166f0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  his:.**.**     S
16700 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
16710 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
16720 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a  00 AND a>5.**.**
16730 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
16740 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d  ted for this sim
16750 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73  pification gives
16760 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
16770 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73  .** but only has
16780 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74   to scan the dat
16790 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63  a once.  And bec
167a0 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67  ause indices mig
167b0 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20  ht .** exist on 
167c0 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20  the table t1, a 
167d0 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66  complete scan of
167e0 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   the data might 
167f0 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a  be.** avoided..*
16800 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20  *.** Flattening 
16810 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  is only attempte
16820 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  d if all of the 
16830 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
16840 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  ue:.**.**   (1) 
16850 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
16860 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
16870 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
16880 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  e aggregates..**
16890 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73  .**   (2)  The s
168a0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
168b0 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74  n aggregate or t
168c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
168d0 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
168e0 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73  .**   (3)  The s
168f0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
16900 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
16910 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
16920 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20   join.**        
16930 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b  (Originally tick
16940 65 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e 67  et #306.  Streng
16950 74 68 65 6e 65 64 20 62 79 20 74 69 63 6b 65 74  thened by ticket
16960 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20   #3300).**.**   
16970 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
16980 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
16990 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  T..**.**  (**)  
169a0 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73  At one point res
169b0 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e  trictions (4) an
169c0 64 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20  d (5) defined a 
169d0 73 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e  subset of DISTIN
169e0 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  CT.**        sub
169f0 2d 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65  -queries that we
16a00 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d  re excluded from
16a10 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
16a20 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20  on. Restriction 
16a30 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68  .**        (4) h
16a40 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78  as since been ex
16a50 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64  panded to exclud
16a60 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73  e all DISTINCT s
16a70 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a  ubqueries..**.**
16a80 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71     (6)  The subq
16a90 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
16aa0 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
16ab0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
16ac0 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
16ad0 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
16ae0 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
16af0 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20  uery has a FROM 
16b00 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20  clause.  TODO:  
16b10 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77  For subqueries w
16b20 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20  ithout.**       
16b30 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20   A FROM clause, 
16b40 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20  consider adding 
16b50 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74  a FROM close wit
16b60 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a  h the special.**
16b70 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73 71          table sq
16b80 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20 63  lite_once that c
16b90 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e  onsists of a sin
16ba0 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69  gle row containi
16bb0 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 73  ng a.**        s
16bc0 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  ingle NULL..**.*
16bd0 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62  *   (8)  The sub
16be0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
16bf0 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
16c00 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
16c10 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
16c20 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71     (9)  The subq
16c30 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
16c40 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
16c50 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
16c60 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
16c70 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
16c80 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73  .**  (10)  The s
16c90 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
16ca0 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
16cb0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
16cc0 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
16cd0 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e        use LIMIT.
16ce0 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68  .**.**  (11)  Th
16cf0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
16d00 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
16d10 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20  o not both have 
16d20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
16d30 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e  ..**.**  (**)  N
16d40 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20  ot implemented. 
16d50 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72   Subsumed into r
16d60 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20  estriction (3). 
16d70 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a   Was previously.
16d80 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65 70 61  **        a sepa
16d90 72 61 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e  rate restriction
16da0 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74   deriving from t
16db0 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a  icket #350..**.*
16dc0 2a 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62  *  (13)  The sub
16dd0 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20  query and outer 
16de0 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
16df0 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a  h use LIMIT..**.
16e00 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75  **  (14)  The su
16e10 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
16e20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a  use OFFSET..**.*
16e30 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f 75 74  *  (15)  The out
16e40 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
16e50 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
16e60 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65  nd select or the
16e70 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75  .**        subqu
16e80 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ery does not hav
16e90 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
16ea0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65  ..**        (See
16eb0 20 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e   ticket #2339 an
16ec0 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38  d ticket [02a8e8
16ed0 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  1d44])..**.**  (
16ee0 31 36 29 20 20 54 68 65 20 6f 75 74 65 72 20 71  16)  The outer q
16ef0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
16f00 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
16f10 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a  subquery does.**
16f20 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74          not cont
16f30 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28  ain ORDER BY.  (
16f40 54 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54  Ticket #2942)  T
16f50 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20  his used to not 
16f60 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  matter.**       
16f70 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64   until we introd
16f80 75 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63  uced the group_c
16f90 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e  oncat() function
16fa0 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20  .  .**.**  (17) 
16fb0 20 54 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   The sub-query i
16fc0 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64  s not a compound
16fd0 20 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69   select, or it i
16fe0 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a  s a UNION ALL .*
16ff0 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e  *        compoun
17000 64 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70  d clause made up
17010 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e   entirely of non
17020 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69  -aggregate queri
17030 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20  es, and .**     
17040 20 20 20 74 68 65 20 70 61 72 65 6e 74 20 71 75     the parent qu
17050 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ery:.**.**      
17060 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73      * is not its
17070 65 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f  elf part of a co
17080 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a  mpound select,.*
17090 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
170a0 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
170b0 20 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65   or DISTINCT que
170c0 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ry, and.**      
170d0 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a      * is not a j
170e0 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  oin.**.**       
170f0 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20   The parent and 
17100 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f  sub-query may co
17110 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75  ntain WHERE clau
17120 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a  ses. Subject to.
17130 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20  **        rules 
17140 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28  (11), (13) and (
17150 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c  14), they may al
17160 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  so contain ORDER
17170 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c   BY,.**        L
17180 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
17190 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73 75  clauses.  The su
171a0 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75 73  bquery cannot us
171b0 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a  e any compound.*
171c0 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f  *        operato
171d0 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49  r other than UNI
171e0 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20 61  ON ALL because a
171f0 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d  ll the other com
17200 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
17210 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65 20 61  operators have a
17220 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49 4e  n implied DISTIN
17230 43 54 20 77 68 69 63 68 20 69 73 20 64 69 73 61  CT which is disa
17240 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20  llowed by.**    
17250 20 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e 20      restriction 
17260 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29  (4)..**.**  (18)
17270 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
17280 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
17290 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c   select, then al
172a0 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  l terms of the.*
172b0 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 62  *        ORDER b
172c0 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  y clause of the 
172d0 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73  parent must be s
172e0 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  imple references
172f0 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63   to .**        c
17300 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75  olumns of the su
17310 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
17320 28 31 39 29 20 20 54 68 65 20 73 75 62 71 75 65  (19)  The subque
17330 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
17340 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
17350 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
17360 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65  t.**        have
17370 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
17380 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66  .**.**  (20)  If
17390 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
173a0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
173b0 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ect, then it mus
173c0 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  t not use.**    
173d0 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20      an ORDER BY 
173e0 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20  clause.  Ticket 
173f0 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64  #3773.  We could
17400 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73   relax this cons
17410 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20  traint.**       
17420 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79   somewhat by say
17430 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72  ing that the ter
17440 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
17450 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a  BY clause must.*
17460 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20  *        appear 
17470 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65  as unmodified re
17480 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  sult columns in 
17490 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
174a0 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20    But we.**     
174b0 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70     have other op
174c0 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d  timizations in m
174d0 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68  ind to deal with
174e0 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a   that case..**.*
174f0 2a 20 20 28 32 31 29 20 20 54 68 65 20 73 75 62  *  (21)  The sub
17500 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
17510 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
17520 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
17530 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
17540 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63  TINCT.  (See tic
17550 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d  ket [752e1646fc]
17560 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  )..**.** In this
17570 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70   routine, the "p
17580 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  " parameter is a
17590 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
175a0 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20  outer query..** 
175b0 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
175c0 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  p->pSrc->a[iFrom
175d0 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75  ].  isAgg is tru
175e0 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71  e if the outer q
175f0 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67  uery.** uses agg
17600 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71  regates and subq
17610 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75  ueryIsAgg is tru
17620 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
17630 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
17640 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74  s..**.** If flat
17650 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74  tening is not at
17660 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f  tempted, this ro
17670 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
17680 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a   and returns 0..
17690 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
176a0 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68   is attempted th
176b0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
176c0 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ns 1..**.** All 
176d0 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
176e0 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20  n analysis must 
176f0 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68  occur on both th
17700 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
17710 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72  d.** the subquer
17720 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  y before this ro
17730 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73  utine runs..*/.s
17740 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65  tatic int flatte
17750 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72  nSubquery(.  Par
17760 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
17770 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
17780 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
17790 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *p,           /
177a0 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20  * The parent or 
177b0 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61  outer SELECT sta
177c0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
177d0 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
177e0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e   /* Index in p->
177f0 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65  pSrc->a[] of the
17800 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20   inner subquery 
17810 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20  */.  int isAgg, 
17820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
17830 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43  e if outer SELEC
17840 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  T uses aggregate
17850 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
17860 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67  int subqueryIsAg
17870 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  g    /* True if 
17880 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
17890 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
178a0 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  tions */.){.  co
178b0 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64  nst char *zSaved
178c0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50  AuthContext = pP
178d0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
178e0 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50  xt;.  Select *pP
178f0 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20  arent;.  Select 
17900 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20  *pSub;       /* 
17910 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
17920 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f  or "subquery" */
17930 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31  .  Select *pSub1
17940 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ;      /* Pointe
17950 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f  r to the rightmo
17960 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62  st select in sub
17970 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c  -query */.  SrcL
17980 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
17990 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
179a0 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
179b0 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
179c0 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f  st *pSubSrc;   /
179d0 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
179e0 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
179f0 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  y */.  ExprList 
17a00 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68  *pList;    /* Th
17a10 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
17a20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
17a30 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74  */.  int iParent
17a40 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45  ;        /* VDBE
17a50 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
17a60 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c  f the pSub resul
17a70 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65  t set temp table
17a80 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
17a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
17aa0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45  p counter */.  E
17ab0 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
17ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ad0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
17ae0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
17af0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
17b00 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65  ubitem;   /* The
17b10 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73   subquery */.  s
17b20 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
17b30 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43  rse->db;..  /* C
17b40 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66  heck to see if f
17b50 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
17b60 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20  mitted.  Return 
17b70 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  0 if not..  */. 
17b80 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
17b90 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
17ba0 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55  rior==0 );  /* U
17bb0 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e  nable to flatten
17bc0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65   compound querie
17bd0 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 66  s */.  if( db->f
17be0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 51 75  lags & SQLITE_Qu
17bf0 65 72 79 46 6c 61 74 74 65 6e 65 72 20 29 20 72  eryFlattener ) r
17c00 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20  eturn 0;.  pSrc 
17c10 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
17c20 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72  ert( pSrc && iFr
17c30 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70  om>=0 && iFrom<p
17c40 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70  Src->nSrc );.  p
17c50 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d  Subitem = &pSrc-
17c60 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61  >a[iFrom];.  iPa
17c70 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  rent = pSubitem-
17c80 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62  >iCursor;.  pSub
17c90 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
17ca0 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20  lect;.  assert( 
17cb0 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSub!=0 );.  if(
17cc0 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75 65   isAgg && subque
17cd0 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e  ryIsAgg ) return
17ce0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
17cf0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
17d00 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28  on (1)  */.  if(
17d10 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26   subqueryIsAgg &
17d20 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29  & pSrc->nSrc>1 )
17d30 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
17d40 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
17d50 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75  on (2)  */.  pSu
17d60 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
17d70 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  c;.  assert( pSu
17d80 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69  bSrc );.  /* Pri
17d90 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e  or to version 3.
17da0 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20  1.2, when LIMIT 
17db0 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74  and OFFSET had t
17dc0 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73  o be simple cons
17dd0 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20  tants,.  ** not 
17de0 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
17df0 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77  ssions, we allow
17e00 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e  ed some combinin
17e10 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f  g of LIMIT and O
17e20 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75  FFSET.  ** becau
17e30 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65  se they could be
17e40 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d   computed at com
17e50 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20  pile-time.  But 
17e60 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
17e70 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d  FFSET.  ** becam
17e80 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  e arbitrary expr
17e90 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65  essions, we were
17ea0 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72   forced to add r
17eb0 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29  estrictions (13)
17ec0 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20  .  ** and (14). 
17ed0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
17ee0 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d  Limit && p->pLim
17ef0 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
17f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
17f10 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20  estriction (13) 
17f20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
17f30 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20  Offset ) return 
17f40 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
17f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
17f60 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20  estriction (14) 
17f70 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67  */.  if( p->pRig
17f80 68 74 6d 6f 73 74 20 26 26 20 70 53 75 62 2d 3e  htmost && pSub->
17f90 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65  pLimit ){.    re
17fa0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
17fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fd0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
17fe0 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (15) */.  }.  
17ff0 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
18000 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
18010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18020 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
18030 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20  ction (7)  */.  
18040 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61  if( pSub->selFla
18050 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
18060 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
18070 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
18080 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20  ction (5)  */.  
18090 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
180a0 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e   && (pSrc->nSrc>
180b0 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20  1 || isAgg) ){. 
180c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
180d0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
180e0 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a  tions (8)(9) */.
180f0 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65    }.  if( (p->se
18100 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
18110 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62 71  inct)!=0 && subq
18120 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
18130 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
18140 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
18150 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20  on (6)  */.  }. 
18160 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
18170 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
18180 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  By ){.     retur
18190 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
181a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
181c0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
181d0 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  1) */.  }.  if( 
181e0 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70  isAgg && pSub->p
181f0 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e  OrderBy ) return
18200 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
18210 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
18220 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20  n (16) */.  if( 
18230 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
18240 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
18250 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
18260 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
18270 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20  n (19) */.  if( 
18280 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
18290 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
182a0 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29  F_Distinct)!=0 )
182b0 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
182c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
182d0 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a  riction (21) */.
182e0 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45    }..  /* OBSOLE
182f0 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20  TE COMMENT 1:.  
18300 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33  ** Restriction 3
18310 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
18320 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61  ry is a join, ma
18330 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
18340 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f  uery is .  ** no
18350 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69  t used as the ri
18360 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
18370 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45  n outer join.  E
18380 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
18390 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  his.  ** is not 
183a0 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
183b0 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
183c0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74  FT OUTER JOIN (t
183d0 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a  2 JOIN t3).  **.
183e0 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74    ** If we flatt
183f0 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65  en the above, we
18400 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a   would get.  **.
18410 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31    **         (t1
18420 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
18430 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a   t2) JOIN t3.  *
18440 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20  *.  ** which is 
18450 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73  not at all the s
18460 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a  ame thing..  **.
18470 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f    ** OBSOLETE CO
18480 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65  MMENT 2:.  ** Re
18490 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49  striction 12:  I
184a0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
184b0 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
184c0 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
184d0 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d  ter.  ** join, m
184e0 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
184f0 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45  query has no WHE
18500 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20  RE clause..  ** 
18510 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77  An examples of w
18520 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  hy this is not a
18530 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
18540 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
18550 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45  T OUTER JOIN (SE
18560 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57  LECT * FROM t2 W
18570 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a  HERE t2.x>0).  *
18580 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
18590 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
185a0 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
185b0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
185c0 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
185d0 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e  IN t2) WHERE t2.
185e0 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75  x>0.  **.  ** Bu
185f0 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73  t the t2.x>0 tes
18600 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61  t will always fa
18610 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77  il on a NULL row
18620 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20   of t2, which.  
18630 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63  ** effectively c
18640 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45  onverts the OUTE
18650 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49  R JOIN into an I
18660 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a  NNER JOIN..  **.
18670 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49    ** THIS OVERRI
18680 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d  DES OBSOLETE COM
18690 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42  MENTS 1 AND 2 AB
186a0 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74  OVE:.  ** Ticket
186b0 20 23 33 33 30 30 20 73 68 6f 77 73 20 74 68 61   #3300 shows tha
186c0 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65  t flattening the
186d0 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
186e0 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20   LEFT JOIN.  ** 
186f0 69 73 20 66 72 61 75 67 68 74 20 77 69 74 68 20  is fraught with 
18700 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f  danger.  Best to
18710 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65   avoid the whole
18720 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a   thing.  If the.
18730 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73    ** subquery is
18740 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
18750 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20  of a LEFT JOIN, 
18760 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74  then do not flat
18770 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ten..  */.  if( 
18780 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74  (pSubitem->joint
18790 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
187a0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
187b0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
187c0 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66  striction 17: If
187d0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
187e0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
187f0 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ECT, then it mus
18800 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20  t.  ** use only 
18810 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  the UNION ALL op
18820 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65  erator. And none
18830 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73   of the simple s
18840 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20  elect queries.  
18850 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ** that make up 
18860 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
18870 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  ECT are allowed 
18880 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20  to be aggregate 
18890 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a  or distinct.  **
188a0 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20   queries..  */. 
188b0 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f   if( pSub->pPrio
188c0 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75  r ){.    if( pSu
188d0 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
188e0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
188f0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32  /* Restriction 2
18900 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  0 */.    }.    i
18910 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e  f( isAgg || (p->
18920 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
18930 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53  stinct)!=0 || pS
18940 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20  rc->nSrc!=1 ){. 
18950 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
18960 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75     }.    for(pSu
18970 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20  b1=pSub; pSub1; 
18980 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72  pSub1=pSub1->pPr
18990 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74  ior){.      test
189a0 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65  case( (pSub1->se
189b0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
189c0 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
189d0 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
189e0 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
189f0 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
18a00 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
18a10 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
18a20 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74  e))==SF_Aggregat
18a30 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
18a40 74 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30  t( pSub->pSrc!=0
18a50 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   );.      if( (p
18a60 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
18a70 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
18a80 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a  _Aggregate))!=0.
18a90 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31         || (pSub1
18aa0 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62  ->pPrior && pSub
18ab0 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a  1->op!=TK_ALL) .
18ac0 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d         || pSub1-
18ad0 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20  >pSrc->nSrc<1.  
18ae0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72      ){.        r
18af0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
18b00 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18b10 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53   pSub1->pSrc->nS
18b20 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20  rc>1 );.    }.. 
18b30 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
18b40 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28  n 18. */.    if(
18b50 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
18b60 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
18b70 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
18b80 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  <p->pOrderBy->nE
18b90 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  xpr; ii++){.    
18ba0 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
18bb0 72 42 79 2d 3e 61 5b 69 69 5d 2e 69 4f 72 64 65  rBy->a[ii].iOrde
18bc0 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75  rByCol==0 ) retu
18bd0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
18be0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a    }.  }..  /****
18bf0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
18c00 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65  is point, flatte
18c10 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
18c20 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20  d. *****/..  /* 
18c30 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75  Authorize the su
18c40 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72  bquery */.  pPar
18c50 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
18c60 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61   = pSubitem->zNa
18c70 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69  me;.  TESTONLY(i
18c80 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68 43   =) sqlite3AuthC
18c90 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
18ca0 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
18cb0 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73 65  , 0);.  testcase
18cc0 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59  ( i==SQLITE_DENY
18cd0 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41   );.  pParse->zA
18ce0 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61  uthContext = zSa
18cf0 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  vedAuthContext;.
18d00 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62  .  /* If the sub
18d10 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
18d20 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
18d30 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20  ement, then (by 
18d40 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a  restrictions.  *
18d50 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76  * 17 and 18 abov
18d60 65 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 20  e) it must be a 
18d70 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68  UNION ALL and th
18d80 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d  e parent query m
18d90 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20  ust .  ** be of 
18da0 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20  the form:.  **. 
18db0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c   **     SELECT <
18dc0 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20  expr-list> FROM 
18dd0 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77  (<sub-query>) <w
18de0 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20  here-clause> .  
18df0 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64  **.  ** followed
18e00 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59   by any ORDER BY
18e10 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f  , LIMIT and/or O
18e20 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54  FFSET clauses. T
18e30 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63  his block.  ** c
18e40 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65  reates N-1 copie
18e50 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  s of the parent 
18e60 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e  query without an
18e70 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49  y ORDER BY, LIMI
18e80 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45  T or .  ** OFFSE
18e90 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f  T clauses and jo
18ea0 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20  ins them to the 
18eb0 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f  left-hand-side o
18ec0 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  f the original. 
18ed0 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20   ** using UNION 
18ee0 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49  ALL operators. I
18ef0 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69 73  n this case N is
18f00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
18f10 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63  imple.  ** selec
18f20 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  t statements in 
18f30 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62  the compound sub
18f40 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a  -query..  **.  *
18f50 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  * Example:.  **.
18f60 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
18f70 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20  a+1 FROM (.  ** 
18f80 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 20         SELECT x 
18f90 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20  FROM tab.  **   
18fa0 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
18fb0 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
18fc0 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a  T y FROM tab.  *
18fd0 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41  *        UNION A
18fe0 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53  LL.  **        S
18ff0 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46  ELECT abs(z*2) F
19000 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20  ROM tab2.  **   
19010 20 20 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f    ) WHERE a!=5 O
19020 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20  RDER BY 1.  **. 
19030 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20   ** Transformed 
19040 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  into:.  **.  ** 
19050 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46      SELECT x+1 F
19060 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b  ROM tab WHERE x+
19070 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e  1!=5.  **     UN
19080 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
19090 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d   SELECT y+1 FROM
190a0 20 74 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d   tab WHERE y+1!=
190b0 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e  5.  **     UNION
190c0 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45   ALL.  **     SE
190d0 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20  LECT abs(z*2)+1 
190e0 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20  FROM tab2 WHERE 
190f0 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20  abs(z*2)+1!=5.  
19100 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20  **     ORDER BY 
19110 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63  1.  **.  ** We c
19120 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f  all this the "co
19130 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20  mpound-subquery 
19140 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a  flattening"..  *
19150 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75  /.  for(pSub=pSu
19160 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b  b->pPrior; pSub;
19170 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
19180 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  or){.    Select 
19190 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c  *pNew;.    ExprL
191a0 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
191b0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
191c0 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20   Expr *pLimit = 
191d0 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 53  p->pLimit;.    S
191e0 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20  elect *pPrior = 
191f0 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70  p->pPrior;.    p
19200 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
19210 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b      p->pSrc = 0;
19220 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
19230 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69   0;.    p->pLimi
19240 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20  t = 0;.    pNew 
19250 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
19260 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20  up(db, p, 0);.  
19270 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
19280 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  imit;.    p->pOr
19290 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
192a0 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
192b0 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20  pSrc;.    p->op 
192c0 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70 2d  = TK_ALL;.    p-
192d0 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b  >pRightmost = 0;
192e0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
192f0 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
19300 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c   pPrior;.    }el
19310 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
19320 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
19330 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69  .      pNew->pRi
19340 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20  ghtmost = 0;.   
19350 20 7d 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72   }.    p->pPrior
19360 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 69 66 28   = pNew;.    if(
19370 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
19380 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  d ) return 1;.  
19390 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c  }..  /* Begin fl
193a0 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72  attening the iFr
193b0 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74  om-th entry of t
193c0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a  he FROM clause .
193d0 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65    ** in the oute
193e0 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  r query..  */.  
193f0 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70  pSub = pSub1 = p
19400 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
19410 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  ;..  /* Delete t
19420 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62  he transient tab
19430 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73  le structure ass
19440 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
19450 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20  .  ** subquery. 
19460 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
19470 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
19480 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
19490 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
194a0 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  , pSubitem->zNam
194b0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
194c0 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
194d0 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75  ->zAlias);.  pSu
194e0 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
194f0 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
19500 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
19510 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  Subitem->zAlias 
19520 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
19530 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20  >pSelect = 0;.. 
19540 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69   /* Defer deleti
19550 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  ng the Table obj
19560 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
19570 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
19580 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65  query until code
19590 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20   generation is. 
195a0 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69   ** complete, si
195b0 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74  nce there may st
195c0 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70  ill exist Expr.p
195d0 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74  Tab entries that
195e0 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  .  ** refer to t
195f0 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e  he subquery even
19600 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e   after flattenin
19610 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36  g.  Ticket #3346
19620 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62  ..  **.  ** pSub
19630 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c  item->pTab is al
19640 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79  ways non-NULL by
19650 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69 6f   test restrictio
19660 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f  ns and tests abo
19670 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41  ve..  */.  if( A
19680 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e  LWAYS(pSubitem->
19690 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
196a0 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c  Table *pTabToDel
196b0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61   = pSubitem->pTa
196c0 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 54  b;.    if( pTabT
196d0 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b  oDel->nRef==1 ){
196e0 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 54  .      Parse *pT
196f0 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
19700 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
19710 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54  Parse);.      pT
19720 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f  abToDel->pNextZo
19730 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c  mbie = pToplevel
19740 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20  ->pZombieTab;.  
19750 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70      pToplevel->p
19760 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62  ZombieTab = pTab
19770 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  ToDel;.    }else
19780 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65  {.      pTabToDe
19790 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d  l->nRef--;.    }
197a0 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70  .    pSubitem->p
197b0 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Tab = 0;.  }..  
197c0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
197d0 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20   loop runs once 
197e0 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e  for each term in
197f0 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
19800 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65  uery.  ** flatte
19810 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69 62  ning (as describ
19820 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20 77  ed above).  If w
19830 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64 69  e are doing a di
19840 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a  fferent kind.  *
19850 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * of flattening 
19860 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f  - a flattening o
19870 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d 70  ther than a comp
19880 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
19890 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20  attening -.  ** 
198a0 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f  then this loop o
198b0 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20  nly runs once.. 
198c0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
198d0 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20  op moves all of 
198e0 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  the FROM element
198f0 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  s of the subquer
19900 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  y into the.  ** 
19910 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
19920 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
19930 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e  ry.  Before doin
19940 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72  g this, remember
19950 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  .  ** the cursor
19960 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
19970 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71  original outer q
19980 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e  uery FROM elemen
19990 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e  t in.  ** iParen
199a0 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74 20  t.  The iParent 
199b0 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65  cursor will neve
199c0 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73  r be used.  Subs
199d0 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a  equent code.  **
199e0 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65   will scan expre
199f0 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66  ssions looking f
19a00 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72  or iParent refer
19a10 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63  ences and replac
19a20 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66  e.  ** those ref
19a30 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78 70  erences with exp
19a40 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65  ressions that re
19a50 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62  solve to the sub
19a60 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20  query FROM.  ** 
19a70 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20  elements we are 
19a80 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a  now copying in..
19a90 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72 65    */.  for(pPare
19aa0 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70  nt=p; pParent; p
19ab0 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e  Parent=pParent->
19ac0 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75  pPrior, pSub=pSu
19ad0 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
19ae0 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20 20  int nSubSrc;.   
19af0 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30   u8 jointype = 0
19b00 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d 20  ;.    pSubSrc = 
19b10 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20  pSub->pSrc;     
19b20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  /* FROM clause o
19b30 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  f subquery */.  
19b40 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62    nSubSrc = pSub
19b50 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e  Src->nSrc;  /* N
19b60 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
19b70 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20  n subquery FROM 
19b80 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53  clause */.    pS
19b90 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53  rc = pParent->pS
19ba0 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  rc;     /* FROM 
19bb0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
19bc0 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20  ter query */..  
19bd0 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20    if( pSrc ){.  
19be0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
19bf0 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69  ent==p );  /* Fi
19c00 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68  rst time through
19c10 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   the loop */.   
19c20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53     jointype = pS
19c30 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
19c40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19c50 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
19c60 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64  nt!=p );  /* 2nd
19c70 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
19c80 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68  times through th
19c90 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
19ca0 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e  pSrc = pParent->
19cb0 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
19cc0 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20  cListAppend(db, 
19cd0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
19ce0 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20  if( pSrc==0 ){. 
19cf0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64         assert( d
19d00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19d10 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
19d20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19d30 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  .    /* The subq
19d40 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e 67  uery uses a sing
19d50 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46  le slot of the F
19d60 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
19d70 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71  e outer.    ** q
19d80 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73 75  uery.  If the su
19d90 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20  bquery has more 
19da0 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74  than one element
19db0 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61   in its FROM cla
19dc0 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  use,.    ** then
19dd0 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65   expand the oute
19de0 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20  r query to make 
19df0 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20  space for it to 
19e00 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74  hold all element
19e10 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  s.    ** of the 
19e20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  subquery..    **
19e30 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
19e40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
19e50 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
19e60 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20  tabA, (SELECT * 
19e70 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29  FROM sub1, sub2)
19e80 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20  , tabB;.    **. 
19e90 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20     ** The outer 
19ea0 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74  query has 3 slot
19eb0 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  s in its FROM cl
19ec0 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20  ause.  One slot 
19ed0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  of the.    ** ou
19ee0 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20 6d  ter query (the m
19ef0 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75  iddle slot) is u
19f00 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71 75  sed by the subqu
19f10 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20  ery.  The next. 
19f20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63     ** block of c
19f30 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  ode will expand 
19f40 74 68 65 20 6f 75 74 20 71 75 65 72 79 20 74 6f  the out query to
19f50 20 34 20 73 6c 6f 74 73 2e 20 20 54 68 65 20 6d   4 slots.  The m
19f60 69 64 64 6c 65 0a 20 20 20 20 2a 2a 20 73 6c 6f  iddle.    ** slo
19f70 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f  t is expanded to
19f80 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72   two slots in or
19f90 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63  der to make spac
19fa0 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  e for the.    **
19fb0 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e   two elements in
19fc0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19fd0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
19fe0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
19ff0 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20   nSubSrc>1 ){.  
1a000 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72      pParent->pSr
1a010 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69 74  c = pSrc = sqlit
1a020 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
1a030 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62 53  (db, pSrc, nSubS
1a040 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20  rc-1,iFrom+1);. 
1a050 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
1a060 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1a070 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a080 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1a090 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 46  * Transfer the F
1a0a0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
1a0b0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65   from the subque
1a0c0 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  ry into the.    
1a0d0 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  ** outer query..
1a0e0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
1a0f0 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =0; i<nSubSrc; i
1a100 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1a110 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
1a120 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72  b, pSrc->a[i+iFr
1a130 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20  om].pUsing);.   
1a140 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72     pSrc->a[i+iFr
1a150 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61  om] = pSubSrc->a
1a160 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  [i];.      memse
1a170 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  t(&pSubSrc->a[i]
1a180 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62  , 0, sizeof(pSub
1a190 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20  Src->a[i]));.   
1a1a0 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69   }.    pSrc->a[i
1a1b0 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  From].jointype =
1a1c0 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20   jointype;.  .  
1a1d0 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73    /* Now begin s
1a1e0 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71  ubstituting subq
1a1f0 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20  uery result set 
1a200 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20  expressions for 
1a210 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
1a220 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e  es to the iParen
1a230 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  t in the outer q
1a240 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  uery..    ** .  
1a250 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
1a260 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
1a270 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46  LECT a+5, b*10 F
1a280 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20  ROM (SELECT x*3 
1a290 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20  AS a, y+10 AS b 
1a2a0 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61  FROM t1) WHERE a
1a2b0 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20  >b;.    **   \  
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2d0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
1a2e0 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
1a2f0 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
1a300 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f  /.    **    \___
1a310 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1a320 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
1a330 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1a340 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20  _____________/. 
1a350 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20     **.    ** We 
1a360 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78  look at every ex
1a370 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
1a380 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20  outer query and 
1a390 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
1a3a0 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65  ee.    ** "a" we
1a3b0 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33   substitute "x*3
1a3c0 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  " and every plac
1a3d0 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20  e we see "b" we 
1a3e0 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30  substitute "y+10
1a3f0 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c  "..    */.    pL
1a400 69 73 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  ist = pParent->p
1a410 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69  EList;.    for(i
1a420 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
1a430 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
1a440 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
1a450 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
1a460 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1a470 7a 53 70 61 6e 20 3d 20 70 4c 69 73 74 2d 3e 61  zSpan = pList->a
1a480 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [i].zSpan;.     
1a490 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a 53     if( ALWAYS(zS
1a4a0 70 61 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pan) ){.        
1a4b0 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e    pList->a[i].zN
1a4c0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
1a4d0 74 72 44 75 70 28 64 62 2c 20 7a 53 70 61 6e 29  trDup(db, zSpan)
1a4e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a4f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 75    }.    }.    su
1a500 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1a510 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c  pParent->pEList,
1a520 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
1a530 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  pEList);.    if(
1a540 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20   isAgg ){.      
1a550 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1a560 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75  , pParent->pGrou
1a570 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  pBy, iParent, pS
1a580 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
1a590 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
1a5a0 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28  ing = substExpr(
1a5b0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  db, pParent->pHa
1a5c0 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70  ving, iParent, p
1a5d0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1a5e0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62    }.    if( pSub
1a5f0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1a600 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1a610 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ent->pOrderBy==0
1a620 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
1a630 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53  t->pOrderBy = pS
1a640 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ub->pOrderBy;.  
1a650 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72      pSub->pOrder
1a660 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  By = 0;.    }els
1a670 65 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70  e if( pParent->p
1a680 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1a690 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1a6a0 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  b, pParent->pOrd
1a6b0 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  erBy, iParent, p
1a6c0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1a6d0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62    }.    if( pSub
1a6e0 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
1a6f0 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74    pWhere = sqlit
1a700 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
1a710 75 62 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a  ub->pWhere, 0);.
1a720 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a730 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20   pWhere = 0;.   
1a740 20 7d 0a 20 20 20 20 69 66 28 20 73 75 62 71 75   }.    if( subqu
1a750 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
1a760 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1a770 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b  t->pHaving==0 );
1a780 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1a790 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72 65 6e  pHaving = pParen
1a7a0 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20  t->pWhere;.     
1a7b0 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
1a7c0 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 20   = pWhere;.     
1a7d0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1a7e0 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  g = substExpr(db
1a7f0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  , pParent->pHavi
1a800 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  ng, iParent, pSu
1a810 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
1a820 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69    pParent->pHavi
1a830 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ng = sqlite3Expr
1a840 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  And(db, pParent-
1a850 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20  >pHaving, .     
1a860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a870 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1a880 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
1a890 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30  pSub->pHaving, 0
1a8a0 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
1a8b0 28 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75  ( pParent->pGrou
1a8c0 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pBy==0 );.      
1a8d0 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42  pParent->pGroupB
1a8e0 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
1a8f0 69 73 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d  istDup(db, pSub-
1a900 3e 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20  >pGroupBy, 0);. 
1a910 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a920 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20  pParent->pWhere 
1a930 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1a940 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c  pParent->pWhere,
1a950 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
1a960 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  pEList);.      p
1a970 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
1a980 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
1a990 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  db, pParent->pWh
1a9a0 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20  ere, pWhere);.  
1a9b0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68    }.  .    /* Th
1a9c0 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72  e flattened quer
1a9d0 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66  y is distinct if
1a9e0 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65   either the inne
1a9f0 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
1aa00 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64  outer query is d
1aa10 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f  istinct. .    */
1aa20 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65  .    pParent->se
1aa30 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e  lFlags |= pSub->
1aa40 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1aa50 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f  stinct;.  .    /
1aa60 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  *.    ** SELECT 
1aa70 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  ... FROM (SELECT
1aa80 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46   ... LIMIT a OFF
1aa90 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f  SET b) LIMIT x O
1aaa0 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a  FFSET y;.    **.
1aab0 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65      ** One is te
1aac0 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20  mpted to try to 
1aad0 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63  add a and b to c
1aae0 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74  ombine the limit
1aaf0 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 20  s.  But this.   
1ab00 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   ** does not wor
1ab10 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69  k if either limi
1ab20 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20  t is negative.. 
1ab30 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
1ab40 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  ub->pLimit ){.  
1ab50 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69      pParent->pLi
1ab60 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d  mit = pSub->pLim
1ab70 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  it;.      pSub->
1ab80 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
1ab90 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69  }.  }..  /* Fini
1aba0 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61  ally, delete wha
1abb0 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65  t is left of the
1abc0 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65   subquery and re
1abd0 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  turn.  ** succes
1abe0 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
1abf0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
1ac00 2c 20 70 53 75 62 31 29 3b 0a 0a 20 20 72 65 74  , pSub1);..  ret
1ac10 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
1ac20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
1ac30 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1ac40 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1ac50 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
1ac60 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  */../*.** Analyz
1ac70 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
1ac80 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
1ac90 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20   an argument to 
1aca0 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  see if it.** is 
1acb0 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  a min() or max()
1acc0 20 71 75 65 72 79 2e 20 52 65 74 75 72 6e 20 57   query. Return W
1acd0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
1ace0 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42   or WHERE_ORDERB
1acf0 59 5f 4d 41 58 20 69 66 20 0a 2a 2a 20 69 74 20  Y_MAX if .** it 
1ad00 69 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  is, or 0 otherwi
1ad10 73 65 2e 20 41 74 20 70 72 65 73 65 6e 74 2c 20  se. At present, 
1ad20 61 20 71 75 65 72 79 20 69 73 20 63 6f 6e 73 69  a query is consi
1ad30 64 65 72 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61  dered to be.** a
1ad40 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20 71 75 65   min()/max() que
1ad50 72 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  ry if:.**.**   1
1ad60 2e 20 54 68 65 72 65 20 69 73 20 61 20 73 69 6e  . There is a sin
1ad70 67 6c 65 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  gle object in th
1ad80 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
1ad90 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65 72 65 20  *.**   2. There 
1ada0 69 73 20 61 20 73 69 6e 67 6c 65 20 65 78 70 72  is a single expr
1adb0 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65  ession in the re
1adc0 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20 69 74  sult set, and it
1add0 20 69 73 0a 2a 2a 20 20 20 20 20 20 65 69 74 68   is.**      eith
1ade0 65 72 20 6d 69 6e 28 78 29 20 6f 72 20 6d 61 78  er min(x) or max
1adf0 28 78 29 2c 20 77 68 65 72 65 20 78 20 69 73 20  (x), where x is 
1ae00 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e  a column referen
1ae10 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ce..*/.static u8
1ae20 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 53 65 6c   minMaxQuery(Sel
1ae30 65 63 74 20 2a 70 29 7b 0a 20 20 45 78 70 72 20  ect *p){.  Expr 
1ae40 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72 4c 69  *pExpr;.  ExprLi
1ae50 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e  st *pEList = p->
1ae60 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70  pEList;..  if( p
1ae70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
1ae80 29 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f  ) return WHERE_O
1ae90 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20  RDERBY_NORMAL;. 
1aea0 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   pExpr = pEList-
1aeb0 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
1aec0 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
1aed0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
1aee0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1aef0 4e 45 56 45 52 28 45 78 70 72 48 61 73 50 72 6f  NEVER(ExprHasPro
1af00 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1af10 78 49 73 53 65 6c 65 63 74 29 29 20 29 20 72 65  xIsSelect)) ) re
1af20 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74  turn 0;.  pEList
1af30 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1af40 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d  t;.  if( pEList=
1af50 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45  =0 || pEList->nE
1af60 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
1af70 30 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d  0;.  if( pEList-
1af80 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21  >a[0].pExpr->op!
1af90 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
1afa0 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52   return WHERE_OR
1afb0 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  DERBY_NORMAL;.  
1afc0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1afd0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1afe0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1aff0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1b000 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
1b010 6f 6b 65 6e 2c 22 6d 69 6e 22 29 3d 3d 30 20 29  oken,"min")==0 )
1b020 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 48 45  {.    return WHE
1b030 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a  RE_ORDERBY_MIN;.
1b040 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
1b050 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72  te3StrICmp(pExpr
1b060 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 78 22  ->u.zToken,"max"
1b070 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
1b080 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  rn WHERE_ORDERBY
1b090 5f 4d 41 58 3b 0a 20 20 7d 0a 20 20 72 65 74 75  _MAX;.  }.  retu
1b0a0 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  rn WHERE_ORDERBY
1b0b0 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a  _NORMAL;.}../*.*
1b0c0 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61  * The select sta
1b0d0 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
1b0e0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1b0f0 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65 67  ent is an aggreg
1b100 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ate query..** Th
1b110 65 20 73 65 63 6f 6e 64 20 61 72 67 6d 65 6e 74  e second argment
1b120 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61 74   is the associat
1b130 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66  ed aggregate-inf
1b140 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a  o object. This .
1b150 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74  ** function test
1b160 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20  s if the SELECT 
1b170 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
1b180 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
1b190 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62  ount(*) FROM <tb
1b1a0 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74  l>.**.** where t
1b1b0 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62 61  able is a databa
1b1c0 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  se table, not a 
1b1d0 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
1b1e0 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72 79  ew. If the query
1b1f0 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74  .** does match t
1b200 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65  his pattern, the
1b210 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1b220 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
1b230 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20  representing.** 
1b240 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65  <tbl> is returne
1b250 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20  d. Otherwise, 0 
1b260 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1b270 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73  static Table *is
1b280 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65  SimpleCount(Sele
1b290 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a  ct *p, AggInfo *
1b2a0 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62  pAggInfo){.  Tab
1b2b0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72  le *pTab;.  Expr
1b2c0 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65   *pExpr;..  asse
1b2d0 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79  rt( !p->pGroupBy
1b2e0 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57   );..  if( p->pW
1b2f0 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73  here || p->pELis
1b300 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20  t->nExpr!=1 .   
1b310 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  || p->pSrc->nSrc
1b320 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  !=1 || p->pSrc->
1b330 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29  a[0].pSelect.  )
1b340 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1b350 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e    }.  pTab = p->
1b360 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
1b370 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45  .  pExpr = p->pE
1b380 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
1b390 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
1b3a0 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65   && !pTab->pSele
1b3b0 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a  ct && pExpr );..
1b3c0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
1b3d0 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
1b3e0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
1b3f0 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
1b400 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ON ) return 0;. 
1b410 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e   if( pAggInfo->n
1b420 46 75 6e 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  Func==0 ) return
1b430 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49   0;.  if( (pAggI
1b440 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46  nfo->aFunc[0].pF
1b450 75 6e 63 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  unc->flags&SQLIT
1b460 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30  E_FUNC_COUNT)==0
1b470 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1b480 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26  f( pExpr->flags&
1b490 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65  EP_Distinct ) re
1b4a0 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72  turn 0;..  retur
1b4b0 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
1b4c0 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c   If the source-l
1b4d0 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64 20  ist item passed 
1b4e0 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77  as an argument w
1b4f0 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74  as augmented wit
1b500 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20  h an.** INDEXED 
1b510 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
1b520 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  try to locate th
1b530 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64 65  e specified inde
1b540 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77  x. If there.** w
1b550 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73 65  as such a clause
1b560 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69   and the named i
1b570 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66  ndex cannot be f
1b580 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  ound, return .**
1b590 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e   SQLITE_ERROR an
1b5a0 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  d leave an error
1b5b0 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65   in pParse. Othe
1b5c0 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20  rwise, populate 
1b5d0 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65  .** pFrom->pInde
1b5e0 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  x and return SQL
1b5f0 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
1b600 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c  qlite3IndexedByL
1b610 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61  ookup(Parse *pPa
1b620 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c  rse, struct SrcL
1b630 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29  ist_item *pFrom)
1b640 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70  {.  if( pFrom->p
1b650 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49  Tab && pFrom->zI
1b660 6e 64 65 78 20 29 7b 0a 20 20 20 20 54 61 62 6c  ndex ){.    Tabl
1b670 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
1b680 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20  >pTab;.    char 
1b690 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72 6f 6d 2d  *zIndex = pFrom-
1b6a0 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20 49 6e 64  >zIndex;.    Ind
1b6b0 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
1b6c0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
1b6d0 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49  dex; .        pI
1b6e0 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  dx && sqlite3Str
1b6f0 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65  ICmp(pIdx->zName
1b700 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20 20 20 20  , zIndex); .    
1b710 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70      pIdx=pIdx->p
1b720 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Next.    );.    
1b730 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20  if( !pIdx ){.   
1b740 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1b750 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
1b760 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20  uch index: %s", 
1b770 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20 20  zIndex, 0);.    
1b780 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
1b790 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20  chema = 1;.     
1b7a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1b7b0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
1b7c0 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20  pFrom->pIndex = 
1b7d0 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pIdx;.  }.  retu
1b7e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b7f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1b800 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20  ine is a Walker 
1b810 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78  callback for "ex
1b820 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43  panding" a SELEC
1b830 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
1b840 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e  "Expanding" mean
1b850 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c  s to do the foll
1b860 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
1b870 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56  (1)  Make sure V
1b880 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
1b890 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
1b8a0 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a  igned to every.*
1b8b0 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e  *         elemen
1b8c0 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
1b8d0 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ause..**.**    (
1b8e0 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  2)  Fill in the 
1b8f0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54  pTabList->a[].pT
1b900 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  ab fields in the
1b910 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a   SrcList that .*
1b920 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  *         define
1b930 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
1b940 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61  When views appea
1b950 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
1b960 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20  ause,.**        
1b970 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e   fill pTabList->
1b980 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68  a[].pSelect with
1b990 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
1b9a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
1b9b0 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20  **         that 
1b9c0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
1b9d0 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20  iew.  A copy is 
1b9e0 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77  made of the view
1b9f0 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  's SELECT.**    
1ba00 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73       statement s
1ba10 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72  o that we can fr
1ba20 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64  eely modify or d
1ba30 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65  elete that state
1ba40 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
1ba50 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67  without worrying
1ba60 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75   about messing u
1ba70 70 20 74 68 65 20 70 72 65 73 69 73 74 65 6e 74  p the presistent
1ba80 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a   representation.
1ba90 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68  **         of th
1baa0 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20  e view..**.**   
1bab0 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20   (3)  Add terms 
1bac0 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
1bad0 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74  use to accomodat
1bae0 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  e the NATURAL ke
1baf0 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20  yword.**        
1bb00 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68   on joins and th
1bb10 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
1bb20 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a  lause of joins..
1bb30 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63  **.**    (4)  Sc
1bb40 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63  an the list of c
1bb50 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
1bb60 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74  sult set (pEList
1bb70 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20  ) looking.**    
1bb80 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63       for instanc
1bb90 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70  es of the "*" op
1bba0 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41  erator or the TA
1bbb0 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  BLE.* operator..
1bbc0 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f  **         If fo
1bbd0 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68  und, expand each
1bbe0 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79   "*" to be every
1bbf0 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79   column in every
1bc00 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20   table.**       
1bc10 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f    and TABLE.* to
1bc20 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
1bc30 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f   in TABLE..**.*/
1bc40 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
1bc50 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65  ctExpander(Walke
1bc60 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
1bc70 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
1bc80 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
1bc90 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  r->pParse;.  int
1bca0 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c   i, j, k;.  SrcL
1bcb0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
1bcc0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1bcd0 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
1bce0 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
1bcf0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1bd00 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
1bd10 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1bd20 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74  iled  ){.    ret
1bd30 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
1bd40 20 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70   }.  if( NEVER(p
1bd50 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 70  ->pSrc==0) || (p
1bd60 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1bd70 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a  Expanded)!=0 ){.
1bd80 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
1bd90 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 2d 3e 73  rune;.  }.  p->s
1bda0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78  elFlags |= SF_Ex
1bdb0 70 61 6e 64 65 64 3b 0a 20 20 70 54 61 62 4c 69  panded;.  pTabLi
1bdc0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
1bdd0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
1bde0 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  st;..  /* Make s
1bdf0 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ure cursor numbe
1be00 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
1be10 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74  igned to all ent
1be20 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65  ries in.  ** the
1be30 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1be40 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
1be50 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ment..  */.  sql
1be60 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
1be70 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
1be80 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f   pTabList);..  /
1be90 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20  * Look up every 
1bea0 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74  table named in t
1beb0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1bec0 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49  f the select.  I
1bed0 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20  f.  ** an entry 
1bee0 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
1bef0 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79  se is a subquery
1bf00 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61   instead of a ta
1bf10 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a  ble or view,.  *
1bf20 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  * then create a 
1bf30 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
1bf40 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73  structure to des
1bf50 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65  cribe the subque
1bf60 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ry..  */.  for(i
1bf70 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
1bf80 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
1bf90 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
1bfa0 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  rom++){.    Tabl
1bfb0 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69 66 28  e *pTab;.    if(
1bfc0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20   pFrom->pTab!=0 
1bfd0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
1bfe0 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61   statement has a
1bff0 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65 70  lready been prep
1c000 61 72 65 64 2e 20 20 54 68 65 72 65 20 69 73 20  ared.  There is 
1c010 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a  no need.      **
1c020 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20   to go further. 
1c030 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1c040 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72   i==0 );.      r
1c050 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
1c060 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1c070 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  From->zName==0 )
1c080 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1c090 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1c0a0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
1c0b0 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
1c0c0 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73  ct;.      /* A s
1c0d0 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
1c0e0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
1c0f0 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
1c100 20 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30   assert( pSel!=0
1c110 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1c120 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
1c130 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1c140 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
1c150 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ker, pSel);.    
1c160 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
1c170 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
1c180 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
1c190 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
1c1a0 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
1c1b0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
1c1c0 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ort;.      pTab-
1c1d0 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
1c1e0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
1c1f0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1c200 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65  , "sqlite_subque
1c210 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29  ry_%p_", (void*)
1c220 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69  pTab);.      whi
1c230 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
1c240 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d   ){ pSel = pSel-
1c250 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20  >pPrior; }.     
1c260 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
1c270 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
1c280 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c  e, pSel->pEList,
1c290 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
1c2a0 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  Tab->aCol);.    
1c2b0 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
1c2c0 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  -1;.      pTab->
1c2d0 6e 52 6f 77 45 73 74 20 3d 20 31 30 30 30 30 30  nRowEst = 100000
1c2e0 30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  0;.      pTab->t
1c2f0 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70  abFlags |= TF_Ep
1c300 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a  hemeral;.#endif.
1c310 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c320 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
1c330 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
1c340 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
1c350 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
1c360 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
1c370 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
1c380 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
1c390 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c  b = .        sql
1c3a0 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
1c3b0 70 50 61 72 73 65 2c 30 2c 70 46 72 6f 6d 2d 3e  pParse,0,pFrom->
1c3c0 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61  zName,pFrom->zDa
1c3d0 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69  tabase);.      i
1c3e0 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
1c3f0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
1c400 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
1c410 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  +;.#if !defined(
1c420 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1c430 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53  ) || !defined (S
1c440 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1c450 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69  ALTABLE).      i
1c460 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
1c470 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54   || IsVirtual(pT
1c480 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ab) ){.        /
1c490 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20  * We reach here 
1c4a0 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  if the named tab
1c4b0 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61  le is a really a
1c4c0 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20   view */.       
1c4d0 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77   if( sqlite3View
1c4e0 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
1c4f0 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 20 72  Parse, pTab) ) r
1c500 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
1c510 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1c520 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d   pFrom->pSelect=
1c530 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46  =0 );.        pF
1c540 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  rom->pSelect = s
1c550 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
1c560 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  db, pTab->pSelec
1c570 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  t, 0);.        s
1c580 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
1c590 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d  (pWalker, pFrom-
1c5a0 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
1c5b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
1c5c0 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  .    /* Locate t
1c5d0 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62  he index named b
1c5e0 79 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59  y the INDEXED BY
1c5f0 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e   clause, if any.
1c600 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
1c610 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
1c620 75 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d  up(pParse, pFrom
1c630 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1c640 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
1c650 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f   }.  }..  /* Pro
1c660 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79  cess NATURAL key
1c670 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e  words, and ON an
1c680 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
1c690 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20  of joins..  */. 
1c6a0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1c6b0 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50  ailed || sqliteP
1c6c0 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73  rocessJoin(pPars
1c6d0 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74  e, p) ){.    ret
1c6e0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
1c6f0 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65   }..  /* For eve
1c700 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75  ry "*" that occu
1c710 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rs in the column
1c720 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68   list, insert th
1c730 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20  e names of.  ** 
1c740 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
1c750 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20  ll tables.  And 
1c760 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e  for every TABLE.
1c770 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  * insert the nam
1c780 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63  es.  ** of all c
1c790 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e  olumns in TABLE.
1c7a0 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73    The parser ins
1c7b0 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20  erted a special 
1c7c0 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
1c7d0 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20  with the TK_ALL 
1c7e0 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63  operator for eac
1c7f0 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f  h "*" that it fo
1c800 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  und in the colum
1c810 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65  n list..  ** The
1c820 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
1c830 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61  just has to loca
1c840 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78  te the TK_ALL ex
1c850 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78  pressions and ex
1c860 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f  pand.  ** each o
1c870 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ne to the list o
1c880 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
1c890 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a   all tables..  *
1c8a0 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
1c8b0 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b   loop just check
1c8c0 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  s to see if ther
1c8d0 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70  e are any "*" op
1c8e0 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61  erators.  ** tha
1c8f0 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67  t need expanding
1c900 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30  ..  */.  for(k=0
1c910 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
1c920 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; k++){.    Exp
1c930 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e  r *pE = pEList->
1c940 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
1c950 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41  if( pE->op==TK_A
1c960 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  LL ) break;.    
1c970 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
1c980 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
1c990 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  ight!=0 );.    a
1c9a0 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
1c9b0 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c  K_DOT || (pE->pL
1c9c0 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c  eft!=0 && pE->pL
1c9d0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20  eft->op==TK_ID) 
1c9e0 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  );.    if( pE->o
1c9f0 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
1ca00 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f  >pRight->op==TK_
1ca10 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ALL ) break;.  }
1ca20 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d  .  if( k<pEList-
1ca30 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a  >nExpr ){.    /*
1ca40 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65  .    ** If we ge
1ca50 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20  t here it means 
1ca60 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63  the result set c
1ca70 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
1ca80 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f  ore "*".    ** o
1ca90 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65  perators that ne
1caa0 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
1cab0 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  d.  Loop through
1cac0 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
1cad0 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  .    ** in the r
1cae0 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78  esult set and ex
1caf0 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79  pand them one by
1cb00 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
1cb10 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1cb20 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73  _item *a = pELis
1cb30 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69  t->a;.    ExprLi
1cb40 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  st *pNew = 0;.  
1cb50 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50    int flags = pP
1cb60 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b  arse->db->flags;
1cb70 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d  .    int longNam
1cb80 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  es = (flags & SQ
1cb90 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
1cba0 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  s)!=0.          
1cbb0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
1cbc0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
1cbd0 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30  hortColNames)==0
1cbe0 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  ;..    for(k=0; 
1cbf0 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
1cc00 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   k++){.      Exp
1cc10 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78  r *pE = a[k].pEx
1cc20 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
1cc30 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
1cc40 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d   || pE->pRight!=
1cc50 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
1cc60 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26  E->op!=TK_ALL &&
1cc70 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54   (pE->op!=TK_DOT
1cc80 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   || pE->pRight->
1cc90 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20  op!=TK_ALL) ){. 
1cca0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70         /* This p
1ccb0 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73  articular expres
1ccc0 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  sion does not ne
1ccd0 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
1cce0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
1ccf0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
1cd00 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
1cd10 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
1cd20 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20   a[k].pExpr);.  
1cd30 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
1cd40 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
1cd50 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
1cd60 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e  1].zName = a[k].
1cd70 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
1cd80 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
1cd90 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20  Expr-1].zSpan = 
1cda0 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[k].zSpan;.    
1cdb0 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65        a[k].zName
1cdc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1cdd0 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a  a[k].zSpan = 0;.
1cde0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cdf0 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30    a[k].pExpr = 0
1ce00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ce10 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65         /* This e
1ce20 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22  xpression is a "
1ce30 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a  *" or a "TABLE.*
1ce40 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  " and needs to b
1ce50 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70  e.        ** exp
1ce60 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  anded. */.      
1ce70 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20    int tableSeen 
1ce80 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74  = 0;      /* Set
1ce90 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45   to 1 when TABLE
1cea0 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20   matches */.    
1ceb0 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65      char *zTName
1cec0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1ced0 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20  text of name of 
1cee0 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20  TABLE */.       
1cef0 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
1cf00 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  DOT ){.         
1cf10 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65   assert( pE->pLe
1cf20 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ft!=0 );.       
1cf30 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1cf40 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e  HasProperty(pE->
1cf50 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c  pLeft, EP_IntVal
1cf60 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ue) );.         
1cf70 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c   zTName = pE->pL
1cf80 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  eft->u.zToken;. 
1cf90 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1cfa0 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d          zTName =
1cfb0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
1cfc0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
1cfd0 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
1cfe0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
1cff0 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
1d000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62  ){.          Tab
1d010 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
1d020 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
1d030 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
1d040 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73   = pFrom->zAlias
1d050 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1d060 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  zTabName==0 ){. 
1d070 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e             zTabN
1d080 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  ame = pTab->zNam
1d090 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
1d0a0 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d           if( db-
1d0b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1d0c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1d0d0 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73   if( zTName && s
1d0e0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
1d0f0 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21  Name, zTabName)!
1d100 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1d110 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1d120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d130 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b    tableSeen = 1;
1d140 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
1d150 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
1d160 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1d170 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c      Expr *pExpr,
1d180 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20   *pRight;.      
1d190 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
1d1a0 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  e = pTab->aCol[j
1d1b0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
1d1c0 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e       char *zColn
1d1d0 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  ame;  /* The com
1d1e0 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  puted column nam
1d1f0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
1d200 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20   char *zToFree; 
1d210 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74    /* Malloced st
1d220 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20  ring that needs 
1d230 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
1d240 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e             Token
1d250 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43   sColname;  /* C
1d260 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e  omputed column n
1d270 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a  ame as a token *
1d280 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  /..            /
1d290 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73  * If a column is
1d2a0 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64 64   marked as 'hidd
1d2b0 65 6e 27 20 28 63 75 72 72 65 6e 74 6c 79 20 6f  en' (currently o
1d2c0 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20 20 20  nly possible.   
1d2d0 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20           ** for 
1d2e0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 29 2c  virtual tables),
1d2f0 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20   do not include 
1d300 69 74 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64  it in the expand
1d310 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ed.            *
1d320 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73  * result-set lis
1d330 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  t..            *
1d340 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
1d350 28 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e  ( IsHiddenColumn
1d360 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29  (&pTab->aCol[j])
1d370 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d380 20 20 61 73 73 65 72 74 28 49 73 56 69 72 74 75    assert(IsVirtu
1d390 61 6c 28 70 54 61 62 29 29 3b 0a 20 20 20 20 20  al(pTab));.     
1d3a0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1d3b0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
1d3c0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1d3d0 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d  ( i>0 && zTName=
1d3e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1d3f0 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e      if( (pFrom->
1d400 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
1d410 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20  TURAL)!=0.      
1d420 20 20 20 20 20 20 20 20 20 20 26 26 20 74 61 62            && tab
1d430 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
1d440 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e  (pTabList, i, zN
1d450 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20  ame, 0, 0).     
1d460 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
1d470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1d480 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e  n a NATURAL join
1d490 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20  , omit the join 
1d4a0 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65  columns from the
1d4b0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1d4c0 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68    ** table to th
1d4d0 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a  e right of the j
1d4e0 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  oin */.         
1d4f0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1d500 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1d510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1d520 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  f( sqlite3IdList
1d530 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73  Index(pFrom->pUs
1d540 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29  ing, zName)>=0 )
1d550 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1d560 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77    /* In a join w
1d570 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75  ith a USING clau
1d580 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73  se, omit columns
1d590 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
1d5a0 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67          ** using
1d5b0 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
1d5c0 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69   table on the ri
1d5d0 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ght. */.        
1d5e0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1d5f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d600 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
1d610 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
1d620 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
1d630 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d  (db, TK_ID, zNam
1d640 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1d650 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65  zColname = zName
1d660 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  ;.            zT
1d670 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  oFree = 0;.     
1d680 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
1d690 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74  ames || pTabList
1d6a0 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  ->nSrc>1 ){.    
1d6b0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
1d6c0 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20  pLeft;.         
1d6d0 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
1d6e0 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
1d6f0 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20  ID, zTabName);. 
1d700 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1d710 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
1d720 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
1d730 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
1d740 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
1d750 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73     if( longNames
1d760 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d770 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73      zColname = s
1d780 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1d790 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e  , "%s.%s", zTabN
1d7a0 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ame, zName);.   
1d7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f               zTo
1d7c0 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b  Free = zColname;
1d7d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1d7e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
1d7f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1d800 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74    pExpr = pRight
1d810 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1d820 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
1d830 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
1d840 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
1d850 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20   pNew, pExpr);. 
1d860 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e             sColn
1d870 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65  ame.z = zColname
1d880 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 43  ;.            sC
1d890 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74  olname.n = sqlit
1d8a0 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e  e3Strlen30(zColn
1d8b0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
1d8c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
1d8d0 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
1d8e0 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65   pNew, &sColname
1d8f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1d900 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1d910 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20  db, zToFree);.  
1d920 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d930 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1d940 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20  !tableSeen ){.  
1d950 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
1d960 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
1d970 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1d980 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
1d990 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a  ch table: %s", z
1d9a0 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  TName);.        
1d9b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d9c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1d9d0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
1d9e0 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65   tables specifie
1d9f0 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  d");.          }
1da00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1da10 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
1da20 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
1da30 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a  te(db, pEList);.
1da40 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20      p->pEList = 
1da50 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51  pNew;.  }.#if SQ
1da60 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a  LITE_MAX_COLUMN.
1da70 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20    if( p->pEList 
1da80 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  && p->pEList->nE
1da90 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  xpr>db->aLimit[S
1daa0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
1dab0 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MN] ){.    sqlit
1dac0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1dad0 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
1dae0 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73  umns in result s
1daf0 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  et");.  }.#endif
1db00 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
1db10 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
1db20 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66   No-op routine f
1db30 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65  or the parse-tre
1db40 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20  e walker..**.** 
1db50 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
1db60 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e  e is the Walker.
1db70 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68  xExprCallback th
1db80 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  en expression tr
1db90 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65  ees.** are walke
1dba0 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63  d without any ac
1dbb0 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65  tions being take
1dbc0 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20  n at each node. 
1dbd0 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20   Presumably,.** 
1dbe0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
1dbf0 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61  e is used for Wa
1dc00 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61  lker.xExprCallba
1dc10 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b  ck then .** Walk
1dc20 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
1dc30 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20  ck is set to do 
1dc40 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c  something useful
1dc50 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73   for every .** s
1dc60 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70  ubquery in the p
1dc70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73  arser tree..*/.s
1dc80 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 57 61  tatic int exprWa
1dc90 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e  lkNoop(Walker *N
1dca0 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f  otUsed, Expr *No
1dcb0 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
1dcc0 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
1dcd0 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
1dce0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
1dcf0 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
1dd00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65   This routine "e
1dd10 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54  xpands" a SELECT
1dd20 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61   statement and a
1dd30 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75 65  ll of its subque
1dd40 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64  ries..** For add
1dd50 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
1dd60 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d  ion on what it m
1dd70 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22  eans to "expand"
1dd80 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61   a SELECT.** sta
1dd90 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20  tement, see the 
1dda0 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73  comment on the s
1ddb0 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b  electExpand work
1ddc0 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76  er callback abov
1ddd0 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69  e..**.** Expandi
1dde0 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ng a SELECT stat
1ddf0 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72  ement is the fir
1de00 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65  st step in proce
1de10 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43  ssing a.** SELEC
1de20 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  T statement.  Th
1de30 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1de40 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e  nt must be expan
1de50 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61  ded before.** na
1de60 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73  me resolution is
1de70 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a   performed..**.*
1de80 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  * If anything go
1de90 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72  es wrong, an err
1dea0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72  or message is wr
1deb0 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73  itten into pPars
1dec0 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  e..** The callin
1ded0 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64  g function can d
1dee0 65 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65  etect the proble
1def0 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  m by looking at 
1df00 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20  pParse->nErr.** 
1df10 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64  and/or pParse->d
1df20 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e  b->mallocFailed.
1df30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1df40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
1df50 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  and(Parse *pPars
1df60 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
1df70 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  ct){.  Walker w;
1df80 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
1df90 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70  back = selectExp
1dfa0 61 6e 64 65 72 3b 0a 20 20 77 2e 78 45 78 70 72  ander;.  w.xExpr
1dfb0 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57  Callback = exprW
1dfc0 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
1dfd0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
1dfe0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
1dff0 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
1e000 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
1e010 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1e020 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
1e030 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43   Walker.xSelectC
1e040 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b  allback callback
1e050 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
1e060 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29  SelectTypeInfo()
1e070 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
1e080 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52  *.** For each FR
1e090 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
1e0a0 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a  ry, add Column.z
1e0b0 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e  Type and Column.
1e0c0 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  zColl.** informa
1e0d0 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c  tion to the Tabl
1e0e0 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
1e0f0 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
1e100 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66  result set.** of
1e110 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a   that subquery..
1e120 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  **.** The Table 
1e130 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
1e140 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
1e150 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e  sult set was con
1e160 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73  structed.** by s
1e170 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20  electExpander() 
1e180 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  but the type and
1e190 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
1e1a0 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74  mation was omitt
1e1b0 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f  ed.** at that po
1e1c0 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e  int because iden
1e1d0 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20  tifiers had not 
1e1e0 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  yet been resolve
1e1f0 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  d.  This.** rout
1e200 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
1e210 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72  ter identifier r
1e220 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  esolution..*/.st
1e230 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 41  atic int selectA
1e240 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
1e250 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  fo(Walker *pWalk
1e260 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
1e270 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
1e280 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c  .  int i;.  SrcL
1e290 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
1e2a0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1e2b0 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20  item *pFrom;..  
1e2c0 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
1e2d0 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
1e2e0 64 20 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73  d );.  if( (p->s
1e2f0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73  elFlags & SF_Has
1e300 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a  TypeInfo)==0 ){.
1e310 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
1e320 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66  |= SF_HasTypeInf
1e330 6f 3b 0a 20 20 20 20 70 50 61 72 73 65 20 3d 20  o;.    pParse = 
1e340 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
1e350 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
1e360 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f 72  p->pSrc;.    for
1e370 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
1e380 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
1e390 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
1e3a0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
1e3b0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
1e3c0 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  rom->pTab;.     
1e3d0 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61 62   if( ALWAYS(pTab
1e3e0 21 3d 30 29 20 26 26 20 28 70 54 61 62 2d 3e 74  !=0) && (pTab->t
1e3f0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
1e400 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20  emeral)!=0 ){.  
1e410 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
1e420 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
1e430 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
1e440 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  ECT */.        S
1e450 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46  elect *pSel = pF
1e460 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
1e470 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
1e480 65 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68  el );.        wh
1e490 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
1e4a0 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d  r ) pSel = pSel-
1e4b0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
1e4c0 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
1e4d0 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
1e4e0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e  (pParse, pTab->n
1e4f0 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c  Col, pTab->aCol,
1e500 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   pSel);.      }.
1e510 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1e520 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
1e530 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
1e540 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1e550 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64  dds datatype and
1e560 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1e570 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nce information 
1e580 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20  to.** the Table 
1e590 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c  structures of al
1e5a0 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
1e5b0 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a  bqueries in a.**
1e5c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1e5d0 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69  t..**.** Use thi
1e5e0 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  s routine after 
1e5f0 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  name resolution.
1e600 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e610 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
1e620 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a  TypeInfo(Parse *
1e630 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
1e640 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65  pSelect){.#ifnde
1e650 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1e660 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20  BQUERY.  Walker 
1e670 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  w;.  w.xSelectCa
1e680 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 41  llback = selectA
1e690 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
1e6a0 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  fo;.  w.xExprCal
1e6b0 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b  lback = exprWalk
1e6c0 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65  Noop;.  w.pParse
1e6d0 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c   = pParse;.  sql
1e6e0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
1e6f0 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e  w, pSelect);.#en
1e700 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  dif.}.../*.** Th
1e710 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
1e720 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
1e730 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73  ement for proces
1e740 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f  sing.  The.** fo
1e750 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d  llowing is accom
1e760 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  plished:.**.**  
1e770 20 20 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f     *  VDBE Curso
1e780 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73  r numbers are as
1e790 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52  signed to all FR
1e7a0 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  OM-clause terms.
1e7b0 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d  .**     *  Ephem
1e7c0 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63  eral Table objec
1e7d0 74 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66  ts are created f
1e7e0 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  or all FROM-clau
1e7f0 73 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  se subqueries..*
1e800 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20  *     *  ON and 
1e810 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72  USING clauses ar
1e820 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57  e shifted into W
1e830 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a  HERE statements.
1e840 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61  **     *  Wildca
1e850 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42  rds "*" and "TAB
1e860 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20  LE.*" in result 
1e870 73 65 74 73 20 61 72 65 20 65 78 70 61 6e 64 65  sets are expande
1e880 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65  d..**     *  Ide
1e890 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78 70 72  ntifiers in expr
1e8a0 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68  ession are match
1e8b0 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a  ed to tables..**
1e8c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1e8d0 20 61 63 74 73 20 72 65 63 75 72 73 69 76 65 6c   acts recursivel
1e8e0 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72  y on all subquer
1e8f0 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 53  ies within the S
1e900 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ELECT..*/.void s
1e910 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
1e920 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1e930 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
1e940 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
1e950 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
1e960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e970 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
1e980 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
1e990 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  . */.  NameConte
1e9a0 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a  xt *pOuterNC  /*
1e9b0 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
1e9c0 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29  r container */.)
1e9d0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1e9e0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d  .  if( NEVER(p==
1e9f0 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
1ea00 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1ea10 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
1ea20 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e  s & SF_HasTypeIn
1ea30 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  fo ) return;.  s
1ea40 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
1ea50 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  nd(pParse, p);. 
1ea60 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1ea70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
1ea80 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
1ea90 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
1eaa0 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72  SelectNames(pPar
1eab0 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29  se, p, pOuterNC)
1eac0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1ead0 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
1eae0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
1eaf0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  n;.  sqlite3Sele
1eb00 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50  ctAddTypeInfo(pP
1eb10 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  arse, p);.}../*.
1eb20 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67  ** Reset the agg
1eb30 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
1eb40 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67  or..**.** The ag
1eb50 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
1eb60 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20  tor is a set of 
1eb70 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61  memory cells tha
1eb80 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d  t hold.** interm
1eb90 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77  ediate results w
1eba0 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67  hile calculating
1ebb0 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
1ebc0 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
1ebd0 73 69 6d 70 6c 79 20 73 74 6f 72 65 73 20 4e 55  simply stores NU
1ebe0 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  LLs in all of th
1ebf0 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  ose memory cells
1ec00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ec10 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
1ec20 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1ec30 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
1ec40 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
1ec50 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1ec60 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
1ec70 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
1ec80 70 46 75 6e 63 3b 0a 20 20 69 66 28 20 70 41 67  pFunc;.  if( pAg
1ec90 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67  gInfo->nFunc+pAg
1eca0 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d  gInfo->nColumn==
1ecb0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
1ecc0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
1ecd0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  i<pAggInfo->nCol
1ece0 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  umn; i++){.    s
1ecf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ed00 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
1ed10 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69  pAggInfo->aCol[i
1ed20 5d 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 66  ].iMem);.  }.  f
1ed30 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66  or(pFunc=pAggInf
1ed40 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69  o->aFunc, i=0; i
1ed50 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
1ed60 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b  ; i++, pFunc++){
1ed70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ed80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
1ed90 6c 2c 20 30 2c 20 70 46 75 6e 63 2d 3e 69 4d 65  l, 0, pFunc->iMe
1eda0 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  m);.    if( pFun
1edb0 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20  c->iDistinct>=0 
1edc0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
1edd0 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72  E = pFunc->pExpr
1ede0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1edf0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1ee00 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pE, EP_xIsSelec
1ee10 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t) );.      if( 
1ee20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c  pE->x.pList==0 |
1ee30 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  | pE->x.pList->n
1ee40 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
1ee50 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1ee60 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54  sg(pParse, "DIST
1ee70 49 4e 43 54 20 61 67 67 72 65 67 61 74 65 73 20  INCT aggregates 
1ee80 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c  must have exactl
1ee90 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20  y one ".        
1eea0 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a     "argument");.
1eeb0 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69          pFunc->i
1eec0 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
1eed0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1eee0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
1eef0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
1ef00 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
1ef10 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 29  se, pE->x.pList)
1ef20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1ef30 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1ef40 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
1ef50 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
1ef60 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  t, 0, 0,.       
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef80 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
1ef90 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
1efa0 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d  ANDOFF);.      }
1efb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1efc0 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f  .** Invoke the O
1efd0 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70  P_AggFinalize op
1efe0 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 61  code for every a
1eff0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1f000 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49  n.** in the AggI
1f010 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nfo structure..*
1f020 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69  /.static void fi
1f030 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
1f040 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ns(Parse *pParse
1f050 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
1f060 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
1f070 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1f080 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1f090 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
1f0a0 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  *pF;.  for(i=0, 
1f0b0 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  pF=pAggInfo->aFu
1f0c0 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  nc; i<pAggInfo->
1f0d0 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b  nFunc; i++, pF++
1f0e0 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
1f0f0 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78  *pList = pF->pEx
1f100 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
1f110 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1f120 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45  sProperty(pF->pE
1f130 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1f140 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t) );.    sqlite
1f150 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1f160 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e  P_AggFinal, pF->
1f170 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c  iMem, pList ? pL
1f180 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20  ist->nExpr : 0, 
1f190 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1f1a0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
1f1b0 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  pF->pFunc, P4_FU
1f1c0 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  NCDEF);.  }.}../
1f1d0 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20  *.** Update the 
1f1e0 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f  accumulator memo
1f1f0 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20  ry cells for an 
1f200 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20  aggregate based 
1f210 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  on.** the curren
1f220 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
1f230 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1f240 64 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61  d updateAccumula
1f250 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
1f260 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
1f270 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
1f280 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1f290 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
1f2a0 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20 69   regHit = 0;.  i
1f2b0 6e 74 20 61 64 64 72 48 69 74 54 65 73 74 20 3d  nt addrHitTest =
1f2c0 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   0;.  struct Agg
1f2d0 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
1f2e0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
1f2f0 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67  col *pC;..  pAgg
1f300 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
1f310 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 1;.  sqlite3E
1f320 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
1f330 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  arse);.  for(i=0
1f340 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
1f350 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
1f360 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
1f370 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72  ++){.    int nAr
1f380 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e  g;.    int addrN
1f390 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ext = 0;.    int
1f3a0 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70   regAgg;.    Exp
1f3b0 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
1f3c0 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  F->pExpr->x.pLis
1f3d0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  t;.    assert( !
1f3e0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1f3f0 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  pF->pExpr, EP_xI
1f400 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
1f410 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
1f420 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d     nArg = pList-
1f430 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65  >nExpr;.      re
1f440 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65  gAgg = sqlite3Ge
1f450 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
1f460 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  e, nArg);.      
1f470 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
1f480 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
1f490 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20 31  pList, regAgg, 1
1f4a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1f4b0 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20      nArg = 0;.  
1f4c0 20 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a      regAgg = 0;.
1f4d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
1f4e0 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
1f4f0 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74  {.      addrNext
1f500 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1f510 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1f520 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
1f530 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44  1 );.      codeD
1f540 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
1f550 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61  pF->iDistinct, a
1f560 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41  ddrNext, 1, regA
1f570 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gg);.    }.    i
1f580 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 6c  f( pF->pFunc->fl
1f590 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
1f5a0 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20  C_NEEDCOLL ){.  
1f5b0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
1f5c0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  ll = 0;.      st
1f5d0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1f5e0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
1f5f0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73   int j;.      as
1f600 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
1f610 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69  ;  /* pList!=0 i
1f620 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20  f pF->pFunc has 
1f630 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20  NEEDCOLL */.    
1f640 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
1f650 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c  =pList->a; !pCol
1f660 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b  l && j<nArg; j++
1f670 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1f680 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1f690 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1f6a0 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
1f6b0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
1f6c0 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
1f6d0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
1f6e0 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
1f6f0 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
1f700 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 48 69  .      if( regHi
1f710 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f  t==0 && pAggInfo
1f720 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29  ->nAccumulator )
1f730 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72   regHit = ++pPar
1f740 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1f750 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f760 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  4(v, OP_CollSeq,
1f770 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28   regHit, 0, 0, (
1f780 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
1f790 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d  _COLLSEQ);.    }
1f7a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1f7b0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67  AddOp4(v, OP_Agg
1f7c0 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c  Step, 0, regAgg,
1f7d0 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20   pF->iMem,.     
1f7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7f0 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
1f800 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
1f810 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1f820 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
1f830 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
1f840 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1f850 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
1f860 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
1f870 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1f880 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
1f890 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
1f8a0 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e  );.    if( addrN
1f8b0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ext ){.      sql
1f8c0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1f8d0 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74  abel(v, addrNext
1f8e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f8f0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
1f900 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
1f910 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 70  }..  /* Before p
1f920 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61 63  opulating the ac
1f930 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
1f940 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ers, clear the c
1f950 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a  olumn cache..  *
1f960 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
1f970 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75 69  any of the requi
1f980 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  red column value
1f990 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 72  s are already pr
1f9a0 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72  esent .  ** in r
1f9b0 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74 65  egisters, sqlite
1f9c0 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79 20  3ExprCode() may 
1f9d0 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20  use OP_SCopy to 
1f9e0 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a 20  copy the value. 
1f9f0 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e   ** to pC->iMem.
1fa00 20 42 75 74 20 62 79 20 74 68 65 20 74 69 6d 65   But by the time
1fa10 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 75 73   the value is us
1fa20 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
1fa30 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d   register.  ** m
1fa40 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 73 65  ay have been use
1fa50 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20  d, invalidating 
1fa60 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62  the underlying b
1fa70 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  uffer holding th
1fa80 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20 62  e.  ** text or b
1fa90 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20 74  lob value. See t
1faa0 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63 62  icket [883034dcb
1fab0 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  5]..  **.  ** An
1fac0 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77  other solution w
1fad0 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e 67  ould be to chang
1fae0 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20 75  e the OP_SCopy u
1faf0 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63 68  sed to copy cach
1fb00 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 74  ed.  ** values t
1fb10 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20  o an OP_Copy..  
1fb20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69 74 20  */.  if( regHit 
1fb30 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54 65  ){.    addrHitTe
1fb40 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
1fb50 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
1fb60 20 72 65 67 48 69 74 29 3b 0a 20 20 7d 0a 20 20   regHit);.  }.  
1fb70 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1fb80 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
1fb90 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67   for(i=0, pC=pAg
1fba0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70  gInfo->aCol; i<p
1fbb0 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75  AggInfo->nAccumu
1fbc0 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b  lator; i++, pC++
1fbd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
1fbe0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1fbf0 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d  C->pExpr, pC->iM
1fc00 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49  em);.  }.  pAggI
1fc10 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
1fc20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  = 0;.  sqlite3Ex
1fc30 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
1fc40 72 73 65 29 3b 0a 20 20 69 66 28 20 61 64 64 72  rse);.  if( addr
1fc50 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20 20 73  HitTest ){.    s
1fc60 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1fc70 72 65 28 76 2c 20 61 64 64 72 48 69 74 54 65 73  re(v, addrHitTes
1fc80 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
1fc90 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f 50   Add a single OP
1fca0 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63  _Explain instruc
1fcb0 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42 45  tion to the VDBE
1fcc0 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73 69   to explain a si
1fcd0 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29  mple.** count(*)
1fce0 20 71 75 65 72 79 20 28 22 53 45 4c 45 43 54 20   query ("SELECT 
1fcf0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54  count(*) FROM pT
1fd00 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ab")..*/.#ifndef
1fd10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
1fd20 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69 64  LAIN.static void
1fd30 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f   explainSimpleCo
1fd40 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  unt(.  Parse *pP
1fd50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
1fd60 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
1fd70 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
1fd80 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
1fd90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fda0 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72  Table being quer
1fdb0 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ied */.  Index *
1fdc0 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20  pIdx            
1fdd0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1fde0 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69  x used to optimi
1fdf0 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c  ze scan, or NULL
1fe00 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61   */.){.  if( pPa
1fe10 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
1fe20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71  ){.    char *zEq
1fe30 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  p = sqlite3MPrin
1fe40 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
1fe50 53 43 41 4e 20 54 41 42 4c 45 20 25 73 20 25 73  SCAN TABLE %s %s
1fe60 25 73 28 7e 25 64 20 72 6f 77 73 29 22 2c 0a 20  %s(~%d rows)",. 
1fe70 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
1fe80 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 49 64  me, .        pId
1fe90 78 20 3f 20 22 55 53 49 4e 47 20 43 4f 56 45 52  x ? "USING COVER
1fea0 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22  ING INDEX " : ""
1feb0 2c 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3f  ,.        pIdx ?
1fec0 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22   pIdx->zName : "
1fed0 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ",.        pTab-
1fee0 3e 6e 52 6f 77 45 73 74 0a 20 20 20 20 29 3b 0a  >nRowEst.    );.
1fef0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ff00 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 70  ddOp4(.        p
1ff10 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
1ff20 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
1ff30 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
1ff40 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41  0, zEqp, P4_DYNA
1ff50 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  MIC.    );.  }.}
1ff60 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1ff70 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
1ff80 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66  nt(a,b,c).#endif
1ff90 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1ffa0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45   code for the SE
1ffb0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67  LECT statement g
1ffc0 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72  iven in the p ar
1ffd0 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  gument.  .**.** 
1ffe0 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
1fff0 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76  distributed in v
20000 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65  arious ways depe
20010 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20  nding on the.** 
20020 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
20030 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
20040 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  ture pointed to 
20050 62 79 20 61 72 67 75 6d 65 6e 74 20 70 44 65 73  by argument pDes
20060 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t.** as follows:
20070 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73 74  .**.**     pDest
20080 2d 3e 65 44 65 73 74 20 20 20 20 52 65 73 75 6c  ->eDest    Resul
20090 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  t.**     -------
200a0 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
200b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
200c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
200d0 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ----.**     SRT_
200e0 4f 75 74 70 75 74 20 20 20 20 20 20 47 65 6e 65  Output      Gene
200f0 72 61 74 65 20 61 20 72 6f 77 20 6f 66 20 6f 75  rate a row of ou
20100 74 70 75 74 20 28 75 73 69 6e 67 20 74 68 65 20  tput (using the 
20110 4f 50 5f 52 65 73 75 6c 74 52 6f 77 0a 2a 2a 20  OP_ResultRow.** 
20120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20130 20 20 20 20 6f 70 63 6f 64 65 29 20 66 6f 72 20      opcode) for 
20140 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20  each row in the 
20150 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a  result set..**.*
20160 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20  *     SRT_Mem   
20170 20 20 20 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64        Only valid
20180 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 69   if the result i
20190 73 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  s a single colum
201a0 6e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  n..**           
201b0 20 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20            Store 
201c0 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  the first column
201d0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65   of the first re
201e0 73 75 6c 74 20 72 6f 77 0a 2a 2a 20 20 20 20 20  sult row.**     
201f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20200 69 6e 20 72 65 67 69 73 74 65 72 20 70 44 65 73  in register pDes
20210 74 2d 3e 69 50 61 72 6d 20 74 68 65 6e 20 61 62  t->iParm then ab
20220 61 6e 64 6f 6e 20 74 68 65 20 72 65 73 74 0a 2a  andon the rest.*
20230 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
20240 20 20 20 20 20 20 6f 66 20 74 68 65 20 71 75 65        of the que
20250 72 79 2e 20 20 54 68 69 73 20 64 65 73 74 69 6e  ry.  This destin
20260 61 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 22 4c  ation implies "L
20270 49 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20 20  IMIT 1"..**.**  
20280 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20     SRT_Set      
20290 20 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 75     The result mu
202a0 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63  st be a single c
202b0 6f 6c 75 6d 6e 2e 20 20 53 74 6f 72 65 20 65 61  olumn.  Store ea
202c0 63 68 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ch.**           
202d0 20 20 20 20 20 20 20 20 20 20 72 6f 77 20 6f 66            row of
202e0 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 6b   result as the k
202f0 65 79 20 69 6e 20 74 61 62 6c 65 20 70 44 65 73  ey in table pDes
20300 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20 20 20  t->iParm. .**   
20310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20320 20 20 41 70 70 6c 79 20 74 68 65 20 61 66 66 69    Apply the affi
20330 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66 66 69  nity pDest->affi
20340 6e 69 74 79 20 62 65 66 6f 72 65 20 73 74 6f 72  nity before stor
20350 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
20360 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
20370 74 73 2e 20 20 55 73 65 64 20 74 6f 20 69 6d 70  ts.  Used to imp
20380 6c 65 6d 65 6e 74 20 22 49 4e 20 28 53 45 4c 45  lement "IN (SELE
20390 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a 20  CT ...)"..**.** 
203a0 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20      SRT_Union   
203b0 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
203c0 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20  s as a key in a 
203d0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
203e0 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a  pDest->iParm..**
203f0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65  .**     SRT_Exce
20400 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72  pt      Remove r
20410 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20  esults from the 
20420 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
20430 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a  pDest->iParm..**
20440 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c  .**     SRT_Tabl
20450 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  e       Store re
20460 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61  sults in tempora
20470 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  ry table pDest->
20480 69 50 61 72 6d 2e 0a 2a 2a 20 20 20 20 20 20 20  iParm..**       
20490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68                Th
204a0 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54 5f 45  is is like SRT_E
204b0 70 68 65 6d 54 61 62 20 65 78 63 65 70 74 20 74  phemTab except t
204c0 68 61 74 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a  hat the table.**
204d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204e0 20 20 20 20 20 69 73 20 61 73 73 75 6d 65 64 20       is assumed 
204f0 74 6f 20 61 6c 72 65 61 64 79 20 62 65 20 6f 70  to already be op
20500 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  en..**.**     SR
20510 54 5f 45 70 68 65 6d 54 61 62 20 20 20 20 43 72  T_EphemTab    Cr
20520 65 61 74 65 20 61 6e 20 74 65 6d 70 6f 72 61 72  eate an temporar
20530 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
20540 50 61 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a  Parm and store.*
20550 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
20560 20 20 20 20 20 20 74 68 65 20 72 65 73 75 6c 74        the result
20570 20 74 68 65 72 65 2e 20 54 68 65 20 63 75 72 73   there. The curs
20580 6f 72 20 69 73 20 6c 65 66 74 20 6f 70 65 6e 20  or is left open 
20590 61 66 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  after.**        
205a0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
205b0 75 72 6e 69 6e 67 2e 20 20 54 68 69 73 20 69 73  urning.  This is
205c0 20 6c 69 6b 65 20 53 52 54 5f 54 61 62 6c 65 20   like SRT_Table 
205d0 65 78 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 20  except that.**  
205e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205f0 20 20 20 74 68 69 73 20 64 65 73 74 69 6e 61 74     this destinat
20600 69 6f 6e 20 75 73 65 73 20 4f 50 5f 4f 70 65 6e  ion uses OP_Open
20610 45 70 68 65 6d 65 72 61 6c 20 74 6f 20 63 72 65  Ephemeral to cre
20620 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ate.**          
20630 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 74             the t
20640 61 62 6c 65 20 66 69 72 73 74 2e 0a 2a 2a 0a 2a  able first..**.*
20650 2a 20 20 20 20 20 53 52 54 5f 43 6f 72 6f 75 74  *     SRT_Corout
20660 69 6e 65 20 20 20 47 65 6e 65 72 61 74 65 20 61  ine   Generate a
20670 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74   co-routine that
20680 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20 72   returns a new r
20690 6f 77 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20  ow of.**        
206a0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
206b0 75 6c 74 73 20 65 61 63 68 20 74 69 6d 65 20 69  ults each time i
206c0 74 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20 54  t is invoked.  T
206d0 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74 0a 2a  he entry point.*
206e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
206f0 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 2d        of the co-
20700 72 6f 75 74 69 6e 65 20 69 73 20 73 74 6f 72 65  routine is store
20710 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 44  d in register pD
20720 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  est->iParm..**.*
20730 2a 20 20 20 20 20 53 52 54 5f 45 78 69 73 74 73  *     SRT_Exists
20740 20 20 20 20 20 20 53 74 6f 72 65 20 61 20 31 20        Store a 1 
20750 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70  in memory cell p
20760 44 65 73 74 2d 3e 69 50 61 72 6d 20 69 66 20 74  Dest->iParm if t
20770 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20  he result.**    
20780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20790 20 73 65 74 20 69 73 20 6e 6f 74 20 65 6d 70 74   set is not empt
207a0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  y..**.**     SRT
207b0 5f 44 69 73 63 61 72 64 20 20 20 20 20 54 68 72  _Discard     Thr
207c0 6f 77 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  ow the results a
207d0 77 61 79 2e 20 20 54 68 69 73 20 69 73 20 75 73  way.  This is us
207e0 65 64 20 62 79 20 53 45 4c 45 43 54 0a 2a 2a 20  ed by SELECT.** 
207f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20800 20 20 20 20 73 74 61 74 65 6d 65 6e 74 73 20 77      statements w
20810 69 74 68 69 6e 20 74 72 69 67 67 65 72 73 20 77  ithin triggers w
20820 68 6f 73 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73  hose only purpos
20830 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  e is.**         
20840 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
20850 73 69 64 65 2d 65 66 66 65 63 74 73 20 6f 66 20  side-effects of 
20860 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  functions..**.**
20870 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
20880 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
20890 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
208a0 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
208b0 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
208c0 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
208d0 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
208e0 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
208f0 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
20900 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
20910 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
20920 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
20930 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
20940 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
20950 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
20960 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69  to do that..*/.i
20970 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
20980 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
20990 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
209a0 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
209b0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
209c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
209d0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
209e0 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
209f0 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
20a00 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a  t *pDest      /*
20a10 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
20a20 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
20a30 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
20a40 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
20a50 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
20a60 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  rs */.  WhereInf
20a70 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f  o *pWInfo;     /
20a80 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71  * Return from sq
20a90 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
20aa0 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ) */.  Vdbe *v; 
20ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20ac0 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
20ad0 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  hine under const
20ae0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
20af0 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20   isAgg;         
20b00 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
20b10 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b  select lists lik
20b20 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a  e "count(*)" */.
20b30 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
20b40 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st;      /* List
20b50 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65   of columns to e
20b60 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63  xtract. */.  Src
20b70 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
20b80 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
20b90 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20  ables to select 
20ba0 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a  from */.  Expr *
20bb0 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
20bc0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
20bd0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
20be0 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
20bf0 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f   *pOrderBy;    /
20c00 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
20c10 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
20c20 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
20c30 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
20c40 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20  /* The GROUP BY 
20c50 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
20c60 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
20c70 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20  pHaving;        
20c80 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63   /* The HAVING c
20c90 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
20ca0 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  ULL */.  int isD
20cb0 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
20cc0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
20cd0 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
20ce0 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
20cf0 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20  int distinct;   
20d00 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
20d10 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
20d20 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20  istinct set */. 
20d30 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20   int rc = 1;    
20d40 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
20d50 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20   to return from 
20d60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
20d70 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49  .  int addrSortI
20d80 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41 64 64  ndex;     /* Add
20d90 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70  ress of an OP_Op
20da0 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
20db0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
20dc0 20 61 64 64 72 44 69 73 74 69 6e 63 74 49 6e 64   addrDistinctInd
20dd0 65 78 3b 20 2f 2a 20 41 64 64 72 65 73 73 20 6f  ex; /* Address o
20de0 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65  f an OP_OpenEphe
20df0 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
20e00 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73  n */.  AggInfo s
20e10 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a  AggInfo;      /*
20e20 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65   Information use
20e30 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71  d by aggregate q
20e40 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ueries */.  int 
20e50 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  iEnd;           
20e60 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
20e70 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
20e80 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
20e90 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
20ea0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
20eb0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
20ec0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20ed0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
20ee0 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  nt iRestoreSelec
20ef0 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  tId = pParse->iS
20f00 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73  electId;.  pPars
20f10 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70  e->iSelectId = p
20f20 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
20f30 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ctId++;.#endif..
20f40 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
20f50 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  b;.  if( p==0 ||
20f60 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
20f70 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
20f80 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
20f90 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
20fa0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
20fb0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
20fc0 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20  ECT, 0, 0, 0) ) 
20fd0 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73  return 1;.  mems
20fe0 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c  et(&sAggInfo, 0,
20ff0 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f   sizeof(sAggInfo
21000 29 29 3b 0a 0a 20 20 69 66 28 20 49 67 6e 6f 72  ));..  if( Ignor
21010 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
21020 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  t) ){.    assert
21030 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53  (pDest->eDest==S
21040 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65  RT_Exists || pDe
21050 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55  st->eDest==SRT_U
21060 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20  nion || .       
21070 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
21080 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20  ==SRT_Except || 
21090 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
210a0 54 5f 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20  T_Discard);.    
210b0 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d  /* If ORDER BY m
210c0 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  akes no differen
210d0 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ce in the output
210e0 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f   then neither do
210f0 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e  es.    ** DISTIN
21100 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20  CT so it can be 
21110 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a  removed too. */.
21120 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
21130 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
21140 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
21150 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
21160 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
21170 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
21180 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
21190 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
211a0 2c 20 70 2c 20 30 29 3b 0a 20 20 70 4f 72 64 65  , p, 0);.  pOrde
211b0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
211c0 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  y;.  pTabList = 
211d0 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
211e0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
211f0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
21200 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
21210 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
21220 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
21230 7d 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e  }.  isAgg = (p->
21240 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
21250 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 61  gregate)!=0;.  a
21260 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
21270 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
21280 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
21290 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
212a0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
212b0 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
212c0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
212d0 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69  ;..  /* If writi
212e0 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20  ng to memory or 
212f0 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74  generating a set
21300 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  .  ** only a sin
21310 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62  gle column may b
21320 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23  e output..  */.#
21330 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21340 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
21350 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  ( checkForMultiC
21360 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
21370 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20  (pParse, pDest, 
21380 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
21390 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
213a0 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69  t_end;.  }.#endi
213b0 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
213c0 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
213d0 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
213e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
213f0 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
21400 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
21410 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
21420 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
21430 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70  W).  for(i=0; !p
21440 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54  ->pPrior && i<pT
21450 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
21460 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
21470 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
21480 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
21490 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
214a0 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53  Dest dest;.    S
214b0 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49  elect *pSub = pI
214c0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
214d0 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a    int isAggSub;.
214e0 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30  .    if( pSub==0
214f0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21500 20 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72   if( pItem->addr
21510 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20  FillSub ){.     
21520 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21530 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
21540 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
21550 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  , pItem->addrFil
21560 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 63 6f 6e  lSub);.      con
21570 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
21580 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50    /* Increment P
21590 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20  arse.nHeight by 
215a0 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68  the height of th
215b0 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73  e largest expres
215c0 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65  sion.    ** tree
215d0 20 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 74   refered to by t
215e0 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20  his, the parent 
215f0 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c  select. The chil
21600 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20  d select.    ** 
21610 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72  may contain expr
21620 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20  ession trees of 
21630 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28  at most.    ** (
21640 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
21650 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69  DEPTH-Parse.nHei
21660 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69  ght) height. Thi
21670 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a  s is a bit.    *
21680 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74  * more conservat
21690 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61  ive than necessa
216a0 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73  ry, but much eas
216b0 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69  ier than enforci
216c0 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61  ng.    ** an exa
216d0 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f  ct limit..    */
216e0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
216f0 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  ight += sqlite3S
21700 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
21710 70 29 3b 0a 0a 20 20 20 20 69 73 41 67 67 53 75  p);..    isAggSu
21720 62 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c  b = (pSub->selFl
21730 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
21740 74 65 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20  te)!=0;.    if( 
21750 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
21760 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73  pParse, p, i, is
21770 41 67 67 2c 20 69 73 41 67 67 53 75 62 29 20 29  Agg, isAggSub) )
21780 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
21790 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65 20  subquery can be 
217a0 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74  absorbed into it
217b0 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20  s parent. */.   
217c0 20 20 20 69 66 28 20 69 73 41 67 67 53 75 62 20     if( isAggSub 
217d0 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67 67  ){.        isAgg
217e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 1;.        p-
217f0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
21800 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20  Aggregate;.     
21810 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b   }.      i = -1;
21820 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21830 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
21840 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
21850 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68  will fill an eph
21860 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74  emeral table wit
21870 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  h.      ** the c
21880 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73  ontent of this s
21890 75 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d  ubquery.  pItem-
218a0 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c  >addrFillSub wil
218b0 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a  l point.      **
218c0 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20   to the address 
218d0 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
218e0 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49   subroutine.  pI
218f0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20  tem->regReturn. 
21900 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67       ** is a reg
21910 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  ister allocated 
21920 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72  to hold the subr
21930 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64  outine return ad
21940 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20  dress.      */. 
21950 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72       int topAddr
21960 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65  ;.      int once
21970 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Addr = 0;.      
21980 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20  int retAddr;.   
21990 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
219a0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30  ->addrFillSub==0
219b0 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   );.      pItem-
219c0 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
219d0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
219e0 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c     topAddr = sql
219f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21a00 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
21a10 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
21a20 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  n);.      pItem-
21a30 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74  >addrFillSub = t
21a40 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20  opAddr+1;.      
21a50 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
21a60 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65  (v, "materialize
21a70 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61   %s", pItem->pTa
21a80 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
21a90 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 73 43    if( pItem->isC
21aa0 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a  orrelated==0 ){.
21ab0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
21ac0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
21ad0 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64 20   correlated and 
21ae0 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  if we are not in
21af0 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20 20  side of.        
21b00 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74 68  ** a trigger, th
21b10 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  en we only need 
21b20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 76  to compute the v
21b30 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62 71  alue of the subq
21b40 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  uery.        ** 
21b50 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  once. */.       
21b60 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c 69   onceAddr = sqli
21b70 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
21b80 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
21b90 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
21ba0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
21bb0 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49  SRT_EphemTab, pI
21bc0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
21bd0 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
21be0 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53  nteger(pItem->iS
21bf0 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61  electId, (u8)pPa
21c00 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
21c10 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Id);.      sqlit
21c20 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
21c30 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
21c40 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
21c50 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 28 75 6e 73  ->nRowEst = (uns
21c60 69 67 6e 65 64 29 70 53 75 62 2d 3e 6e 53 65 6c  igned)pSub->nSel
21c70 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66  ectRow;.      if
21c80 28 20 6f 6e 63 65 41 64 64 72 20 29 20 73 71 6c  ( onceAddr ) sql
21c90 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
21ca0 28 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20  (v, onceAddr);. 
21cb0 20 20 20 20 20 72 65 74 41 64 64 72 20 3d 20 73       retAddr = s
21cc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
21cd0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70  (v, OP_Return, p
21ce0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
21cf0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
21d00 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73 22  ent((v, "end %s"
21d10 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
21d20 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71  Name));.      sq
21d30 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
21d40 31 28 76 2c 20 74 6f 70 41 64 64 72 2c 20 72 65  1(v, topAddr, re
21d50 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71  tAddr);.      sq
21d60 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
21d70 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a  gCache(pParse);.
21d80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2f 2a      }.    if( /*
21d90 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 2a  pParse->nErr ||*
21da0 2f 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  / db->mallocFail
21db0 65 64 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  ed ){.      goto
21dc0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
21dd0 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e   }.    pParse->n
21de0 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65  Height -= sqlite
21df0 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
21e00 74 28 70 29 3b 0a 20 20 20 20 70 54 61 62 4c 69  t(p);.    pTabLi
21e10 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
21e20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65    if( !Ignorable
21e30 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29  Orderby(pDest) )
21e40 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  {.      pOrderBy
21e50 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
21e60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69      }.  }.  pELi
21e70 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
21e80 23 65 6e 64 69 66 0a 20 20 70 57 68 65 72 65 20  #endif.  pWhere 
21e90 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70  = p->pWhere;.  p
21ea0 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
21eb0 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67  oupBy;.  pHaving
21ec0 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
21ed0 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 28 70   isDistinct = (p
21ee0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
21ef0 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23  Distinct)!=0;..#
21f00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21f10 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
21f20 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  CT.  /* If there
21f30 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e   is are a sequen
21f40 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64  ce of queries, d
21f50 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e  o the earlier on
21f60 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20  es first..  */. 
21f70 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
21f80 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69  {.    if( p->pRi
21f90 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20  ghtmost==0 ){.  
21fa0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f      Select *pLoo
21fb0 70 2c 20 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a  p, *pRight = 0;.
21fc0 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20        int cnt = 
21fd0 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 53  0;.      int mxS
21fe0 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 66 6f 72  elect;.      for
21ff0 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b  (pLoop=p; pLoop;
22000 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50   pLoop=pLoop->pP
22010 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20  rior, cnt++){.  
22020 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69        pLoop->pRi
22030 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20  ghtmost = p;.   
22040 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78       pLoop->pNex
22050 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  t = pRight;.    
22060 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 6f      pRight = pLo
22070 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  op;.      }.    
22080 20 20 6d 78 53 65 6c 65 63 74 20 3d 20 64 62 2d    mxSelect = db-
22090 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
220a0 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
220b0 4c 45 43 54 5d 3b 0a 20 20 20 20 20 20 69 66 28  LECT];.      if(
220c0 20 6d 78 53 65 6c 65 63 74 20 26 26 20 63 6e 74   mxSelect && cnt
220d0 3e 6d 78 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  >mxSelect ){.   
220e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
220f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
22100 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20  o many terms in 
22110 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 22  compound SELECT"
22120 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
22130 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
22140 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63    }.    }.    rc
22150 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70   = multiSelect(p
22160 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
22170 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74  ;.    explainSet
22180 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e  Integer(pParse->
22190 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74  iSelectId, iRest
221a0 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  oreSelectId);.  
221b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
221c0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
221d0 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61   there is both a
221e0 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e   GROUP BY and an
221f0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
22200 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20   and they are.  
22210 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68  ** identical, th
22220 65 6e 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f  en disable the O
22230 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73  RDER BY clause s
22240 69 6e 63 65 20 74 68 65 20 47 52 4f 55 50 20 42  ince the GROUP B
22250 59 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 61 75 73  Y.  ** will caus
22260 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f  e elements to co
22270 6d 65 20 6f 75 74 20 69 6e 20 74 68 65 20 63 6f  me out in the co
22280 72 72 65 63 74 20 6f 72 64 65 72 2e 20 20 54 68  rrect order.  Th
22290 69 73 20 69 73 0a 20 20 2a 2a 20 61 6e 20 6f 70  is is.  ** an op
222a0 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65  timization - the
222b0 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
222c0 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65  should result re
222d0 67 61 72 64 6c 65 73 73 2e 0a 20 20 2a 2a 20 55  gardless..  ** U
222e0 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72  se the SQLITE_Gr
222f0 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20  oupByOrder flag 
22300 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54  with SQLITE_TEST
22310 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 0a 20  CTRL_OPTIMIZER. 
22320 20 2a 2a 20 74 6f 20 64 69 73 61 62 6c 65 20 74   ** to disable t
22330 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
22340 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
22350 70 6f 73 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  poses..  */.  if
22360 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
22370 74 43 6f 6d 70 61 72 65 28 70 2d 3e 70 47 72 6f  tCompare(p->pGro
22380 75 70 42 79 2c 20 70 4f 72 64 65 72 42 79 29 3d  upBy, pOrderBy)=
22390 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
223a0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
223b0 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29  TE_GroupByOrder)
223c0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 72 64 65  ==0 ){.    pOrde
223d0 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rBy = 0;.  }..  
223e0 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
223f0 69 73 20 44 49 53 54 49 4e 43 54 20 77 69 74 68  is DISTINCT with
22400 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74   an ORDER BY but
22410 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
22420 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20  gate, and .  ** 
22430 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69  if the select-li
22440 73 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  st is the same a
22450 73 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c  s the ORDER BY l
22460 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71  ist, then this q
22470 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65  uery.  ** can be
22480 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20   rewritten as a 
22490 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68  GROUP BY. In oth
224a0 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a  er words, this:.
224b0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
224c0 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78 79  LECT DISTINCT xy
224d0 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52  z FROM ... ORDER
224e0 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a   BY xyz.  **.  *
224f0 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64  * is transformed
22500 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
22510 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52     SELECT xyz FR
22520 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20  OM ... GROUP BY 
22530 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  xyz.  **.  ** Th
22540 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73  e second form is
22550 20 70 72 65 66 65 72 72 65 64 20 61 73 20 61 20   preferred as a 
22560 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72  single index (or
22570 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79   temp-table) may
22580 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66   be .  ** used f
22590 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45  or both the ORDE
225a0 52 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  R BY and DISTINC
225b0 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73  T processing. As
225c0 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a   originally .  *
225d0 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20 71 75  * written the qu
225e0 65 72 79 20 6d 75 73 74 20 75 73 65 20 61 20 74  ery must use a t
225f0 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74  emp-table for at
22600 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68   least one of th
22610 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59  e ORDER .  ** BY
22620 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61   and DISTINCT, a
22630 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73  nd an index or s
22640 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62  eparate temp-tab
22650 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  le for the other
22660 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  ..  */.  if( (p-
22670 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
22680 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
22690 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
226a0 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69  inct .   && sqli
226b0 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
226c0 72 65 28 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e  re(pOrderBy, p->
226d0 70 45 4c 69 73 74 29 3d 3d 30 0a 20 20 29 7b 0a  pEList)==0.  ){.
226e0 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
226f0 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b  &= ~SF_Distinct;
22700 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79  .    p->pGroupBy
22710 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
22720 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
22730 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 70 47 72  ist, 0);.    pGr
22740 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
22750 70 42 79 3b 0a 20 20 20 20 70 4f 72 64 65 72 42  pBy;.    pOrderB
22760 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  y = 0;.  }..  /*
22770 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
22780 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
22790 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69   then this sorti
227a0 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69  ng.  ** index mi
227b0 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67  ght end up being
227c0 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64   unused if the d
227d0 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a  ata can be .  **
227e0 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72   extracted in pr
227f0 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20  e-sorted order. 
22800 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20   If that is the 
22810 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  case, then the. 
22820 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   ** OP_OpenEphem
22830 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
22840 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
22850 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f   to an OP_Noop o
22860 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75  nce.  ** we figu
22870 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20  re out that the 
22880 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73  sorting index is
22890 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68   not needed.  Th
228a0 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a  e addrSortIndex.
228b0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73    ** variable is
228c0 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74   used to facilit
228d0 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e  ate that change.
228e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
228f0 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49  erBy ){.    KeyI
22900 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
22910 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
22920 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
22930 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  t(pParse, pOrder
22940 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42  By);.    pOrderB
22950 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50  y->iECursor = pP
22960 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
22970 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
22980 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49  m[2] = addrSortI
22990 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c  ndex =.      sql
229a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
229b0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
229c0 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  al,.            
229d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
229e0 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
229f0 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  r, pOrderBy->nEx
22a00 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20  pr+2, 0,.       
22a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
22a30 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
22a40 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73  HANDOFF);.  }els
22a50 65 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49  e{.    addrSortI
22a60 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  ndex = -1;.  }..
22a70 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70    /* If the outp
22a80 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ut is destined f
22a90 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  or a temporary t
22aa0 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20  able, open that 
22ab0 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
22ac0 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
22ad0 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
22ae0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22af0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
22b00 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74  Ephemeral, pDest
22b10 2d 3e 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  ->iParm, pEList-
22b20 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  >nExpr);.  }..  
22b30 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74  /* Set the limit
22b40 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20  er..  */.  iEnd 
22b50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
22b60 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e  eLabel(v);.  p->
22b70 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 28 64 6f  nSelectRow = (do
22b80 75 62 6c 65 29 4c 41 52 47 45 53 54 5f 49 4e 54  uble)LARGEST_INT
22b90 36 34 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d  64;.  computeLim
22ba0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
22bb0 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20  se, p, iEnd);.  
22bc0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30  if( p->iLimit==0
22bd0 20 26 26 20 61 64 64 72 53 6f 72 74 49 6e 64 65   && addrSortInde
22be0 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x>=0 ){.    sqli
22bf0 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
22c00 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e  addrSortIndex)->
22c10 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74  opcode = OP_Sort
22c20 65 72 4f 70 65 6e 3b 0a 20 20 20 20 70 2d 3e 73  erOpen;.    p->s
22c30 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73  elFlags |= SF_Us
22c40 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20  eSorter;.  }..  
22c50 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61  /* Open a virtua
22c60 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  l index to use f
22c70 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
22c80 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
22c90 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
22ca0 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
22cb0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
22cc0 66 6f 3b 0a 20 20 20 20 64 69 73 74 69 6e 63 74  fo;.    distinct
22cd0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
22ce0 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  +;.    pKeyInfo 
22cf0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
22d00 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d  rList(pParse, p-
22d10 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 61 64  >pEList);.    ad
22d20 64 72 44 69 73 74 69 6e 63 74 49 6e 64 65 78 20  drDistinctIndex 
22d30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
22d40 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
22d50 68 65 6d 65 72 61 6c 2c 20 64 69 73 74 69 6e 63  hemeral, distinc
22d60 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  t, 0, 0,.       
22d70 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
22d80 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
22d90 44 4f 46 46 29 3b 0a 20 20 20 20 73 71 6c 69 74  DOFF);.    sqlit
22da0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
22db0 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  , BTREE_UNORDERE
22dc0 44 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  D);.  }else{.   
22dd0 20 64 69 73 74 69 6e 63 74 20 3d 20 61 64 64 72   distinct = addr
22de0 44 69 73 74 69 6e 63 74 49 6e 64 65 78 20 3d 20  DistinctIndex = 
22df0 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67  -1;.  }..  /* Ag
22e00 67 72 65 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d  gregate and non-
22e10 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
22e20 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 64 69  s are handled di
22e30 66 66 65 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69  fferently */.  i
22e40 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72  f( !isAgg && pGr
22e50 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
22e60 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 20  ExprList *pDist 
22e70 3d 20 28 69 73 44 69 73 74 69 6e 63 74 20 3f 20  = (isDistinct ? 
22e80 70 2d 3e 70 45 4c 69 73 74 20 3a 20 30 29 3b 0a  p->pEList : 0);.
22e90 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68  .    /* Begin th
22ea0 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e  e database scan.
22eb0 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d   */.    pWInfo =
22ec0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
22ed0 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
22ee0 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4f  ist, pWhere, &pO
22ef0 72 64 65 72 42 79 2c 20 70 44 69 73 74 2c 20 30  rderBy, pDist, 0
22f00 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
22f10 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
22f20 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  ct_end;.    if( 
22f30 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20  pWInfo->nRowOut 
22f40 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  < p->nSelectRow 
22f50 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
22f60 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  = pWInfo->nRowOu
22f70 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f  t;..    /* If so
22f80 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
22f90 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
22fa0 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
22fb0 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
22fc0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
22fd0 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
22fe0 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
22ff0 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
23000 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
23010 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
23020 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
23030 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
23040 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   && pOrderBy==0 
23050 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
23060 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
23070 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65  (v, addrSortInde
23080 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64  x);.      p->add
23090 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d  rOpenEphm[2] = -
230a0 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  1;.    }..    if
230b0 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  ( pWInfo->eDisti
230c0 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 56 64 62  nct ){.      Vdb
230d0 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20  eOp *pOp;       
230e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c           /* No l
230f0 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 20 4f  onger required O
23100 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
23110 74 72 2e 20 2a 2f 0a 20 20 20 20 20 0a 20 20 20  tr. */.     .   
23120 20 20 20 61 73 73 65 72 74 28 20 61 64 64 72 44     assert( addrD
23130 69 73 74 69 6e 63 74 49 6e 64 65 78 3e 3d 30 20  istinctIndex>=0 
23140 29 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73  );.      pOp = s
23150 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
23160 76 2c 20 61 64 64 72 44 69 73 74 69 6e 63 74 49  v, addrDistinctI
23170 6e 64 65 78 29 3b 0a 0a 20 20 20 20 20 20 61 73  ndex);..      as
23180 73 65 72 74 28 20 69 73 44 69 73 74 69 6e 63 74  sert( isDistinct
23190 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
231a0 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  ( pWInfo->eDisti
231b0 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  nct==WHERE_DISTI
231c0 4e 43 54 5f 4f 52 44 45 52 45 44 20 0a 20 20 20  NCT_ORDERED .   
231d0 20 20 20 20 20 20 20 20 7c 7c 20 70 57 49 6e 66          || pWInf
231e0 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48  o->eDistinct==WH
231f0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
23200 51 55 45 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  QUE .      );.  
23210 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d      distinct = -
23220 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  1;.      if( pWI
23230 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d  nfo->eDistinct==
23240 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
23250 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20 20 20  RDERED ){.      
23260 20 20 69 6e 74 20 69 4a 75 6d 70 3b 0a 20 20 20    int iJump;.   
23270 20 20 20 20 20 69 6e 74 20 69 45 78 70 72 3b 0a       int iExpr;.
23280 20 20 20 20 20 20 20 20 69 6e 74 20 69 46 6c 61          int iFla
23290 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
232a0 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  em;.        int 
232b0 69 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e  iBase = pParse->
232c0 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20  nMem+1;.        
232d0 69 6e 74 20 69 42 61 73 65 32 20 3d 20 69 42 61  int iBase2 = iBa
232e0 73 65 20 2b 20 70 45 4c 69 73 74 2d 3e 6e 45 78  se + pEList->nEx
232f0 70 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  pr;.        pPar
23300 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 28 70 45 4c  se->nMem += (pEL
23310 69 73 74 2d 3e 6e 45 78 70 72 2a 32 29 3b 0a 0a  ist->nExpr*2);..
23320 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
23330 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
23340 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72  emeral coded ear
23350 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 49 6e  lier to an OP_In
23360 74 65 67 65 72 2e 20 54 68 65 0a 20 20 20 20 20  teger. The.     
23370 20 20 20 2a 2a 20 4f 50 5f 49 6e 74 65 67 65 72     ** OP_Integer
23380 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65   initializes the
23390 20 22 66 69 72 73 74 20 72 6f 77 22 20 66 6c 61   "first row" fla
233a0 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  g.  */.        p
233b0 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
233c0 49 6e 74 65 67 65 72 3b 0a 20 20 20 20 20 20 20  Integer;.       
233d0 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20   pOp->p1 = 1;.  
233e0 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
233f0 69 46 6c 61 67 3b 0a 0a 20 20 20 20 20 20 20 20  iFlag;..        
23400 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
23410 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
23420 70 45 4c 69 73 74 2c 20 69 42 61 73 65 2c 20 31  pEList, iBase, 1
23430 29 3b 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70  );.        iJump
23440 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
23450 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31  rrentAddr(v) + 1
23460 20 2b 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   + pEList->nExpr
23470 20 2b 20 31 20 2b 20 31 3b 0a 20 20 20 20 20 20   + 1 + 1;.      
23480 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23490 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 69 46  Op2(v, OP_If, iF
234a0 6c 61 67 2c 20 69 4a 75 6d 70 2d 31 29 3b 0a 20  lag, iJump-1);. 
234b0 20 20 20 20 20 20 20 66 6f 72 28 69 45 78 70 72         for(iExpr
234c0 3d 30 3b 20 69 45 78 70 72 3c 70 45 4c 69 73 74  =0; iExpr<pEList
234d0 2d 3e 6e 45 78 70 72 3b 20 69 45 78 70 72 2b 2b  ->nExpr; iExpr++
234e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c  ){.          Col
234f0 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
23500 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
23510 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d  (pParse, pEList-
23520 3e 61 5b 69 45 78 70 72 5d 2e 70 45 78 70 72 29  >a[iExpr].pExpr)
23530 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
23540 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
23550 20 4f 50 5f 4e 65 2c 20 69 42 61 73 65 2b 69 45   OP_Ne, iBase+iE
23560 78 70 72 2c 20 69 4a 75 6d 70 2c 20 69 42 61 73  xpr, iJump, iBas
23570 65 32 2b 69 45 78 70 72 29 3b 0a 20 20 20 20 20  e2+iExpr);.     
23580 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23590 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
235a0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43  (const char *)pC
235b0 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
235c0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
235d0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
235e0 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  v, SQLITE_NULLEQ
235f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
23600 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23610 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
23620 6f 2c 20 30 2c 20 70 57 49 6e 66 6f 2d 3e 69 43  o, 0, pWInfo->iC
23630 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 20 20 20  ontinue);..     
23640 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23650 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
23660 65 72 2c 20 30 2c 20 69 46 6c 61 67 29 3b 0a 20  er, 0, iFlag);. 
23670 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
23680 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
23690 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20  tAddr(v)==iJump 
236a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
236b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
236c0 4f 50 5f 4d 6f 76 65 2c 20 69 42 61 73 65 2c 20  OP_Move, iBase, 
236d0 69 42 61 73 65 32 2c 20 70 45 4c 69 73 74 2d 3e  iBase2, pEList->
236e0 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65  nExpr);.      }e
236f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 70  lse{.        pOp
23700 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f  ->opcode = OP_No
23710 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  op;.      }.    
23720 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  }..    /* Use th
23730 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72  e standard inner
23740 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 73 65   loop. */.    se
23750 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
23760 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c  arse, p, pEList,
23770 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
23780 20 64 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74   distinct, pDest
23790 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
237a0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43        pWInfo->iC
237b0 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d  ontinue, pWInfo-
237c0 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 20 20 2f  >iBreak);..    /
237d0 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61  * End the databa
237e0 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  se scan loop..  
237f0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
23800 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
23810 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
23820 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 70 72  * This is the pr
23830 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67  ocessing for agg
23840 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a  regate queries *
23850 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  /.    NameContex
23860 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d  t sNC;    /* Nam
23870 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72  e context for pr
23880 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61  ocessing aggrega
23890 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  te information *
238a0 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b  /.    int iAMem;
238b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
238c0 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
238d0 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65  or storing curre
238e0 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  nt GROUP BY */. 
238f0 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20     int iBMem;   
23900 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
23910 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
23920 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42  previous GROUP B
23930 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73  Y */.    int iUs
23940 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  eFlag;       /* 
23950 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64  Mem address hold
23960 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74  ing flag indicat
23970 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73  ing that at leas
23980 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
23990 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65            ** one
239a0 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75   row of the inpu
239b0 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  t to the aggrega
239c0 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20  tor has been.   
239d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239e0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
239f0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62  d */.    int iAb
23a00 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20  ortFlag;     /* 
23a10 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63  Mem address whic
23a20 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61  h causes query a
23a30 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65  bort if positive
23a40 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75   */.    int grou
23a50 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52  pBySort;    /* R
23a60 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f  ows come from so
23a70 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59  urce in GROUP BY
23a80 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e   order */.    in
23a90 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
23aa0 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63    /* End of proc
23ab0 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20  essing for this 
23ac0 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e  SELECT */.    in
23ad0 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20  t sortPTab = 0; 
23ae0 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65    /* Pseudotable
23af0 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20   used to decode 
23b00 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20  sorting results 
23b10 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f  */.    int sortO
23b20 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75  ut = 0;    /* Ou
23b30 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66 72  tput register fr
23b40 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  om the sorter */
23b50 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
23b60 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61  any and all alia
23b70 73 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ses between the 
23b80 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74  result set and t
23b90 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20  he.    ** GROUP 
23ba0 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a  BY clause..    *
23bb0 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
23bc0 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
23bd0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
23be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
23bf0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
23c00 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
23c10 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
23c20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
23c30 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  over expression 
23c40 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20  in a list */..  
23c50 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c      for(k=p->pEL
23c60 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
23c70 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20  m=p->pEList->a; 
23c80 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b  k>0; k--, pItem+
23c90 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
23ca0 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20  m->iAlias = 0;. 
23cb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
23cc0 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  (k=pGroupBy->nEx
23cd0 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70  pr, pItem=pGroup
23ce0 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c  By->a; k>0; k--,
23cf0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
23d00 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73     pItem->iAlias
23d10 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
23d20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
23d30 63 74 52 6f 77 3e 28 64 6f 75 62 6c 65 29 31 30  ctRow>(double)10
23d40 30 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  0 ) p->nSelectRo
23d50 77 20 3d 20 28 64 6f 75 62 6c 65 29 31 30 30 3b  w = (double)100;
23d60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23d70 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
23d80 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20 20  = (double)1;.   
23d90 20 7d 0a 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65   }.. .    /* Cre
23da0 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a  ate a label to j
23db0 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77  ump to when we w
23dc0 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65  ant to abort the
23dd0 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64   query */.    ad
23de0 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  drEnd = sqlite3V
23df0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
23e00 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
23e10 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
23e20 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
23e30 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74  UMN and make ent
23e40 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73  ries in.    ** s
23e50 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20  AggInfo for all 
23e60 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
23e70 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73  nodes in express
23e80 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ions of the.    
23e90 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
23ea0 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
23eb0 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
23ec0 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
23ed0 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
23ee0 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
23ef0 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
23f00 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67  st;.    sNC.pAgg
23f10 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f  Info = &sAggInfo
23f20 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  ;.    sAggInfo.n
23f30 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20  SortingColumn = 
23f40 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75  pGroupBy ? pGrou
23f50 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30  pBy->nExpr+1 : 0
23f60 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70  ;.    sAggInfo.p
23f70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
23f80 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  By;.    sqlite3E
23f90 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
23fa0 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b  t(&sNC, pEList);
23fb0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
23fc0 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
23fd0 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  sNC, pOrderBy);.
23fe0 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
23ff0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24000 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
24010 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76  gates(&sNC, pHav
24020 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ing);.    }.    
24030 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75  sAggInfo.nAccumu
24040 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f  lator = sAggInfo
24050 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f  .nColumn;.    fo
24060 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
24070 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20  o.nFunc; i++){. 
24080 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
24090 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 73 41  prHasProperty(sA
240a0 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
240b0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
240c0 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e  ect) );.      sN
240d0 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f  C.ncFlags |= NC_
240e0 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 20  InAggFunc;.     
240f0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
24100 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
24110 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
24120 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  i].pExpr->x.pLis
24130 74 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63  t);.      sNC.nc
24140 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41  Flags &= ~NC_InA
24150 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20  ggFunc;.    }.  
24160 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
24170 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
24180 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f  lect_end;..    /
24190 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  * Processing for
241a0 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
241b0 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72   GROUP BY is ver
241c0 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a  y different and.
241d0 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65      ** much more
241e0 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67   complex than ag
241f0 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74  gregates without
24200 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20   a GROUP BY..   
24210 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
24220 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65  upBy ){.      Ke
24230 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
24240 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f    /* Keying info
24250 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
24260 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20  group by clause 
24270 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b  */.      int j1;
24280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24290 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69  A-vs-B comparisi
242a0 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20  on jump */.     
242b0 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52   int addrOutputR
242c0 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66  ow;  /* Start of
242d0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
242e0 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c   outputs a resul
242f0 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69  t row */.      i
24300 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b  nt regOutputRow;
24310 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
24320 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
24330 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  r output subrout
24340 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ine */.      int
24350 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20   addrSetAbort;  
24360 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72   /* Set the abor
24370 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72  t flag and retur
24380 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  n */.      int a
24390 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f  ddrTopOfLoop;  /
243a0 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70  * Top of the inp
243b0 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  ut loop */.     
243c0 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67   int addrSorting
243d0 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f  Idx; /* The OP_O
243e0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72  penEphemeral for
243f0 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
24400 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
24410 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20  addrReset;      
24420 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f  /* Subroutine fo
24430 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20  r resetting the 
24440 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20  accumulator */. 
24450 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65       int regRese
24460 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  t;       /* Retu
24470 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
24480 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73 75  ter for reset su
24490 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20  broutine */..   
244a0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
244b0 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  s a GROUP BY cla
244c0 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65  use we might nee
244d0 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  d a sorting inde
244e0 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d  x to.      ** im
244f0 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c  plement it.  All
24500 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69  ocate that sorti
24510 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49  ng index now.  I
24520 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20  f it turns out. 
24530 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
24540 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61  do not need it a
24550 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50  fter all, the OP
24560 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74  _SorterOpen inst
24570 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ruction.      **
24580 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
24590 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20  ed into a Noop. 
245a0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
245b0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
245c0 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gIdx = pParse->n
245d0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65  Tab++;.      pKe
245e0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
245f0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
24600 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20  se, pGroupBy);. 
24610 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67       addrSorting
24620 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Idx = sqlite3Vdb
24630 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f  eAddOp4(v, OP_So
24640 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20  rterOpen, .     
24650 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
24660 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e  rtingIdx, sAggIn
24670 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
24680 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c  n, .          0,
24690 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
246a0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
246b0 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  DOFF);..      /*
246c0 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
246d0 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65  ry locations use
246e0 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67  d by GROUP BY ag
246f0 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69  gregate processi
24700 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ng.      */.    
24710 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70    iUseFlag = ++p
24720 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
24730 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20     iAbortFlag = 
24740 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
24750 20 20 20 20 20 20 72 65 67 4f 75 74 70 75 74 52        regOutputR
24760 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ow = ++pParse->n
24770 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f  Mem;.      addrO
24780 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74  utputRow = sqlit
24790 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
247a0 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73  v);.      regRes
247b0 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
247c0 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52  Mem;.      addrR
247d0 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64  eset = sqlite3Vd
247e0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
247f0 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50        iAMem = pP
24800 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
24810 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
24820 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
24830 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d  nExpr;.      iBM
24840 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
24850 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61  m + 1;.      pPa
24860 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
24870 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
24880 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
24890 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
248a0 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c  ger, 0, iAbortFl
248b0 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
248c0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61  omment((v, "clea
248d0 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  r abort flag"));
248e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
248f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
24900 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46  nteger, 0, iUseF
24910 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
24920 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
24930 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  icate accumulato
24940 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20  r empty"));.    
24950 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24960 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
24970 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b  0, iAMem, iAMem+
24980 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d  pGroupBy->nExpr-
24990 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65  1);..      /* Be
249a0 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20  gin a loop that 
249b0 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c  will extract all
249c0 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20   source rows in 
249d0 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a  GROUP BY order..
249e0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69        ** This mi
249f0 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20  ght involve two 
24a00 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77  separate loops w
24a10 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69  ith an OP_Sort i
24a20 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20  n between, or.  
24a30 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
24a40 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70  be a single loop
24a50 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e   that uses an in
24a60 64 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69  dex to extract i
24a70 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20  nformation.     
24a80 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74   ** in the right
24a90 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20   order to begin 
24aa0 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  with..      */. 
24ab0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24ac0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
24ad0 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64  ub, regReset, ad
24ae0 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
24af0 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
24b00 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
24b10 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
24b20 65 72 65 2c 20 26 70 47 72 6f 75 70 42 79 2c 20  ere, &pGroupBy, 
24b30 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
24b40 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
24b50 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
24b60 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
24b70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
24b80 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  * The optimizer 
24b90 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76  is able to deliv
24ba0 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70  er rows in group
24bb0 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20   by order so.   
24bc0 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f       ** we do no
24bd0 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20  t have to sort. 
24be0 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
24bf0 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c  meral table will
24c00 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63   be.        ** c
24c10 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62  ancelled later b
24c20 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20  ecause we still 
24c30 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  need to use the 
24c40 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20  pKeyInfo.       
24c50 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 47 72 6f   */.        pGro
24c60 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
24c70 42 79 3b 0a 20 20 20 20 20 20 20 20 67 72 6f 75  By;.        grou
24c80 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20  pBySort = 0;.   
24c90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24ca0 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f    /* Rows are co
24cb0 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65  ming out in unde
24cc0 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20  termined order. 
24cd0 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68   We have to push
24ce0 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68  .        ** each
24cf0 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74   row into a sort
24d00 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69  ing index, termi
24d10 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c  nate the first l
24d20 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  oop,.        ** 
24d30 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74  then loop over t
24d40 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
24d50 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
24d60 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20   the output.    
24d70 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64      ** in sorted
24d80 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a   order.        *
24d90 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  /.        int re
24da0 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69  gBase;.        i
24db0 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20  nt regRecord;.  
24dc0 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a        int nCol;.
24dd0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f          int nGro
24de0 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65  upBy;..        e
24df0 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
24e00 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
24e10 20 20 20 20 20 69 73 44 69 73 74 69 6e 63 74 20       isDistinct 
24e20 26 26 20 21 28 70 2d 3e 73 65 6c 46 6c 61 67 73  && !(p->selFlags
24e30 26 53 46 5f 44 69 73 74 69 6e 63 74 29 3f 22 44  &SF_Distinct)?"D
24e40 49 53 54 49 4e 43 54 22 3a 22 47 52 4f 55 50 20  ISTINCT":"GROUP 
24e50 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67  BY");..        g
24e60 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a  roupBySort = 1;.
24e70 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79          nGroupBy
24e80 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   = pGroupBy->nEx
24e90 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  pr;.        nCol
24ea0 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b 20 31 3b   = nGroupBy + 1;
24eb0 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
24ec0 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20  oupBy+1;.       
24ed0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
24ee0 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
24ef0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
24f00 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b  ( sAggInfo.aCol[
24f10 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  i].iSorterColumn
24f20 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=j ){.         
24f30 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20     nCol++;.     
24f40 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
24f50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24f60 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73  }.        regBas
24f70 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  e = sqlite3GetTe
24f80 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
24f90 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
24fa0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
24fb0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
24fc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
24fd0 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
24fe0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  arse, pGroupBy, 
24ff0 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 20  regBase, 0);.   
25000 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25010 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
25020 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e  uence, sAggInfo.
25030 73 6f 72 74 69 6e 67 49 64 78 2c 72 65 67 42 61  sortingIdx,regBa
25040 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b 0a 20 20  se+nGroupBy);.  
25050 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
25060 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f  By+1;.        fo
25070 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
25080 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
25090 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
250a0 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
250b0 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e  Col = &sAggInfo.
250c0 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  aCol[i];.       
250d0 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
250e0 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
250f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
25100 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73   r1 = j + regBas
25110 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
25120 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20 20 20 20  nt r2;..        
25130 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
25140 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
25150 6e 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  n(pParse, .     
25160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25170 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
25180 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c  pTab, pCol->iCol
25190 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c  umn, pCol->iTabl
251a0 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20  e, r1, 0);.     
251b0 20 20 20 20 20 20 20 69 66 28 20 72 31 21 3d 72         if( r1!=r
251c0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
251d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
251e0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
251f0 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20 20 20 20  , r2, r1);.     
25200 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25210 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
25220 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
25230 20 20 20 20 20 20 20 20 72 65 67 52 65 63 6f 72          regRecor
25240 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
25250 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
25260 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
25270 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
25280 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61  akeRecord, regBa
25290 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63  se, nCol, regRec
252a0 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
252b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
252c0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  v, OP_SorterInse
252d0 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
252e0 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f  tingIdx, regReco
252f0 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
25300 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
25310 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
25320 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
25330 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
25340 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
25350 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20  egBase, nCol);. 
25360 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
25370 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
25380 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
25390 2e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 20  .sortingIdxPTab 
253a0 3d 20 73 6f 72 74 50 54 61 62 20 3d 20 70 50 61  = sortPTab = pPa
253b0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
253c0 20 20 20 20 20 73 6f 72 74 4f 75 74 20 3d 20 73       sortOut = s
253d0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
253e0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
253f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25400 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
25410 65 75 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20  eudo, sortPTab, 
25420 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a  sortOut, nCol);.
25430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
25440 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
25450 53 6f 72 74 65 72 53 6f 72 74 2c 20 73 41 67 67  SorterSort, sAgg
25460 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
25470 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
25480 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
25490 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72  v, "GROUP BY sor
254a0 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41  t"));.        sA
254b0 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e  ggInfo.useSortin
254c0 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  gIdx = 1;.      
254d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
254e0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
254f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
25500 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
25510 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
25520 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65   terms and store
25530 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e   in b0, b1, b2..
25540 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69  ..      ** (b0 i
25550 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  s memory locatio
25560 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73  n iBMem+0, b1 is
25570 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f   iBMem+1, and so
25580 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a   forth).      **
25590 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68   Then compare th
255a0 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
255b0 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74  BY terms against
255c0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65   the GROUP BY te
255d0 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  rms.      ** fro
255e0 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  m the previous r
255f0 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ow currently sto
25600 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61  red in a0, a1, a
25610 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  2....      */.  
25620 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f      addrTopOfLoo
25630 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
25640 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
25650 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
25660 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
25670 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72  e);.      if( gr
25680 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
25690 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
256a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
256b0 74 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66  terData, sAggInf
256c0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 6f  o.sortingIdx, so
256d0 72 74 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a  rtOut);.      }.
256e0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
256f0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
25700 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
25710 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
25720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
25730 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
25740 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72  , OP_Column, sor
25750 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b  tPTab, j, iBMem+
25760 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  j);.          if
25770 28 20 6a 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  ( j==0 ) sqlite3
25780 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
25790 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48  OPFLAG_CLEARCACH
257a0 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  E);.        }els
257b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  e{.          sAg
257c0 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65  gInfo.directMode
257d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
257e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
257f0 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
25800 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42  ->a[j].pExpr, iB
25810 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
25820 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
25830 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25840 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
25850 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70   iAMem, iBMem, p
25860 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a  GroupBy->nExpr,.
25870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25880 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
25890 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
258a0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31  YINFO);.      j1
258b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
258c0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
258d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
258e0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
258f0 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29  , j1+1, 0, j1+1)
25900 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
25910 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72  rate code that r
25920 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  uns whenever the
25930 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65   GROUP BY change
25940 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e  s..      ** Chan
25950 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50  ges in the GROUP
25960 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64   BY are detected
25970 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
25980 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62   code.      ** b
25990 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20  lock.  If there 
259a0 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c  were no changes,
259b0 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73   this block is s
259c0 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  kipped..      **
259d0 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63  .      ** This c
259e0 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65  ode copies curre
259f0 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d  nt group by term
25a00 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e  s in b0,b1,b2,..
25a10 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20  ..      ** over 
25a20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74  to a0,a1,a2.  It
25a30 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20   then calls the 
25a40 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
25a50 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72  e.      ** and r
25a60 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67  esets the aggreg
25a70 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
25a80 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65  registers in pre
25a90 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  paration.      *
25aa0 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47  * for the next G
25ab0 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20  ROUP BY batch.. 
25ac0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
25ad0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
25ae0 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c  e(pParse, iBMem,
25af0 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iAMem, pGroupBy
25b00 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
25b10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25b20 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
25b30 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
25b40 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
25b50 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
25b60 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72  v, "output one r
25b70 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ow"));.      sql
25b80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
25b90 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f  , OP_IfPos, iAbo
25ba0 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29  rtFlag, addrEnd)
25bb0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
25bc0 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61  ent((v, "check a
25bd0 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
25be0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25bf0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
25c00 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
25c10 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56  rReset);.      V
25c20 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
25c30 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f  reset accumulato
25c40 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
25c50 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65  Update the aggre
25c60 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
25c70 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  s based on the c
25c80 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20  ontent of.      
25c90 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ** the current r
25ca0 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ow.      */.    
25cb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
25cc0 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
25cd0 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
25ce0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
25cf0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
25d00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25d10 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
25d20 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   1, iUseFlag);. 
25d30 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
25d40 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64  ((v, "indicate d
25d50 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74  ata in accumulat
25d60 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
25d70 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   End of the loop
25d80 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
25d90 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
25da0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
25db0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25dc0 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73  OP_SorterNext, s
25dd0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
25de0 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  dx, addrTopOfLoo
25df0 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  p);.      }else{
25e00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25e10 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
25e20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
25e30 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
25e40 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67  p(v, addrSorting
25e50 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Idx);.      }.. 
25e60 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74       /* Output t
25e70 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20  he final row of 
25e80 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a  result.      */.
25e90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25ea0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
25eb0 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
25ec0 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
25ed0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
25ee0 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
25ef0 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a   final row"));..
25f00 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76        /* Jump ov
25f10 65 72 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  er the subroutin
25f20 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  es.      */.    
25f30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25f40 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
25f50 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20  0, addrEnd);..  
25f60 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
25f70 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
25f80 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67  t outputs a sing
25f90 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
25fa0 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
25fb0 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74  t.  This subrout
25fc0 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20  ine first looks 
25fd0 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e  at the iUseFlag.
25fe0 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20    If iUseFlag.  
25ff0 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74      ** is less t
26000 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
26010 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75  zero, the subrou
26020 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
26030 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68    If.      ** th
26040 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c  e processing cal
26050 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79  ls for the query
26060 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20   to abort, this 
26070 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
26080 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74   ** increments t
26090 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65  he iAbortFlag me
260a0 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65  mory location be
260b0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
260c0 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72  n.      ** order
260d0 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63   to signal the c
260e0 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a  aller to abort..
260f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
26100 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71  ddrSetAbort = sq
26110 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
26120 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
26130 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
26140 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
26150 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  1, iAbortFlag);.
26160 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
26170 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74  t((v, "set abort
26180 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
26190 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
261a0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
261b0 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
261c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
261d0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
261e0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
261f0 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
26200 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
26210 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
26220 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
26230 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
26240 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20  fPos, iUseFlag, 
26250 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29  addrOutputRow+2)
26260 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
26270 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79  ent((v, "Groupby
26280 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
26290 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29  r entry point"))
262a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
262b0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
262c0 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
262d0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e  tRow);.      fin
262e0 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
262f0 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
26300 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
26310 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
26320 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
26330 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
26340 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
26350 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63  LL);.      selec
26360 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
26370 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
26380 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
26390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
263a0 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 2c         distinct,
263b0 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
263c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
263d0 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61  drOutputRow+1, a
263e0 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20  ddrSetAbort);.  
263f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26400 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
26410 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
26420 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
26430 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72  ment((v, "end gr
26440 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
26450 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  erator"));..    
26460 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
26470 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
26480 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67  will reset the g
26490 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61  roup-by accumula
264a0 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  tor.      */.   
264b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
264c0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
264d0 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
264e0 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
264f0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
26500 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
26510 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
26520 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
26530 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20  set);.     .    
26540 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75  } /* endif pGrou
26550 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72  pBy.  Begin aggr
26560 65 67 61 74 65 20 71 75 65 72 69 65 73 20 77 69  egate queries wi
26570 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20  thout GROUP BY: 
26580 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20  */.    else {.  
26590 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44      ExprList *pD
265a0 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  el = 0;.#ifndef 
265b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
265c0 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62  ECOUNT.      Tab
265d0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
265e0 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69  if( (pTab = isSi
265f0 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41  mpleCount(p, &sA
26600 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20  ggInfo))!=0 ){. 
26610 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53         /* If isS
26620 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74  impleCount() ret
26630 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
26640 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  o a Table struct
26650 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ure, then.      
26660 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61    ** the SQL sta
26670 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65  tement is of the
26680 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a   form:.        *
26690 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  *.        **   S
266a0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
266b0 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20  ROM <tbl>.      
266c0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
266d0 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20  where the Table 
266e0 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
266f0 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61  ed represents ta
26700 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20  ble <tbl>..     
26710 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
26720 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
26730 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61  is so common tha
26740 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65  t it is optimize
26750 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65  d specially. The
26760 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43  .        ** OP_C
26770 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  ount instruction
26780 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74   is executed eit
26790 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65  her on the intke
267a0 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20  y table that.   
267b0 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
267c0 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61   the data for ta
267d0 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20  ble <tbl> or on 
267e0 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78  one of its index
267f0 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a  es. It.        *
26800 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65  * is better to e
26810 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e  xecute the op on
26820 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e   an index, as in
26830 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74  dexes are almost
26840 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
26850 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73  ys spread across
26860 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e   less pages than
26870 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e   their correspon
26880 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20  ding tables..   
26890 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
268a0 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20  const int iDb = 
268b0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
268c0 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
268d0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
268e0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
268f0 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65  nt iCsr = pParse
26900 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
26910 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20   Cursor to scan 
26920 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20  b-tree */.      
26930 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
26940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26950 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
26960 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
26970 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
26980 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
26990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
269a0 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e  eyinfo for scann
269b0 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ed index */.    
269c0 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74      Index *pBest
269d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
269e0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74           /* Best
269f0 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20   index found so 
26a00 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  far */.        i
26a10 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d  nt iRoot = pTab-
26a20 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  >tnum;          
26a30 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
26a40 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72   of scanned b-tr
26a50 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73  ee */..        s
26a60 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
26a70 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
26a80 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
26a90 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
26aa0 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
26ab0 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
26ac0 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20  zName);..       
26ad0 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74   /* Search for t
26ae0 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61  he index that ha
26af0 73 20 74 68 65 20 6c 65 61 73 74 20 61 6d 6f 75  s the least amou
26b00 6e 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 2e 20 49  nt of columns. I
26b10 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
26b20 72 65 20 69 73 20 73 75 63 68 20 61 6e 20 69 6e  re is such an in
26b30 64 65 78 2c 20 61 6e 64 20 69 74 20 68 61 73 20  dex, and it has 
26b40 6c 65 73 73 20 63 6f 6c 75 6d 6e 73 20 74 68 61  less columns tha
26b50 6e 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  n the table.    
26b60 20 20 20 20 2a 2a 20 64 6f 65 73 2c 20 74 68 65      ** does, the
26b70 6e 20 77 65 20 63 61 6e 20 61 73 73 75 6d 65 20  n we can assume 
26b80 74 68 61 74 20 69 74 20 63 6f 6e 73 75 6d 65 73  that it consumes
26b90 20 6c 65 73 73 20 73 70 61 63 65 20 6f 6e 20 64   less space on d
26ba0 69 73 6b 20 61 6e 64 0a 20 20 20 20 20 20 20 20  isk and.        
26bb0 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 66 6f 72  ** will therefor
26bc0 65 20 62 65 20 63 68 65 61 70 65 72 20 74 6f 20  e be cheaper to 
26bd0 73 63 61 6e 20 74 6f 20 64 65 74 65 72 6d 69 6e  scan to determin
26be0 65 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  e the query resu
26bf0 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  lt..        ** I
26c00 6e 20 74 68 69 73 20 63 61 73 65 20 73 65 74 20  n this case set 
26c10 69 52 6f 6f 74 20 74 6f 20 74 68 65 20 72 6f 6f  iRoot to the roo
26c20 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
26c30 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65   the index b-tre
26c40 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  e.        ** and
26c50 20 70 4b 65 79 49 6e 66 6f 20 74 6f 20 74 68 65   pKeyInfo to the
26c60 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
26c70 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 6e  re required to n
26c80 61 76 69 67 61 74 65 20 74 68 65 0a 20 20 20 20  avigate the.    
26c90 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 0a 20 20      ** index..  
26ca0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
26cb0 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29   ** (2011-04-15)
26cc0 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c   Do not do a ful
26cd0 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f  l scan of an uno
26ce0 72 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20  rdered index..  
26cf0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
26d00 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20   ** In practice 
26d10 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
26d20 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62  cture will not b
26d30 65 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e  e used. It is on
26d40 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ly .        ** p
26d50 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50  assed to keep OP
26d60 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e  _OpenRead happy.
26d70 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26d80 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
26d90 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
26da0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
26db0 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t){.          if
26dc0 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72  ( pIdx->bUnorder
26dd0 65 64 3d 3d 30 20 26 26 20 28 21 70 42 65 73 74  ed==0 && (!pBest
26de0 20 7c 7c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   || pIdx->nColum
26df0 6e 3c 70 42 65 73 74 2d 3e 6e 43 6f 6c 75 6d 6e  n<pBest->nColumn
26e00 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
26e10 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20   pBest = pIdx;. 
26e20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26e30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
26e40 20 70 42 65 73 74 20 26 26 20 70 42 65 73 74 2d   pBest && pBest-
26e50 3e 6e 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e  >nColumn<pTab->n
26e60 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Col ){.         
26e70 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e   iRoot = pBest->
26e80 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  tnum;.          
26e90 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
26ea0 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
26eb0 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20  Parse, pBest);. 
26ec0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
26ed0 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64    /* Open a read
26ee0 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78  -only cursor, ex
26ef0 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75  ecute the OP_Cou
26f00 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75  nt, close the cu
26f10 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rsor. */.       
26f20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26f30 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p3(v, OP_OpenRea
26f40 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20  d, iCsr, iRoot, 
26f50 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66  iDb);.        if
26f60 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
26f70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
26f80 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
26f90 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49  1, (char *)pKeyI
26fa0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
26fb0 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
26fc0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
26fd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
26fe0 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c   OP_Count, iCsr,
26ff0 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
27000 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  0].iMem);.      
27010 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27020 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
27030 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20   iCsr);.        
27040 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
27050 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  nt(pParse, pTab,
27060 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d   pBest);.      }
27070 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
27080 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
27090 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b  COUNT */.      {
270a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
270b0 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  k if the query i
270c0 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s of one of the 
270d0 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a  following forms:
270e0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
270f0 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
27100 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a  min(x) FROM ....
27110 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
27120 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20  ECT max(x) FROM 
27130 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ....        **. 
27140 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20         ** If it 
27150 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65  is, then ask the
27160 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63   code in where.c
27170 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73   to attempt to s
27180 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20  ort results.    
27190 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65      ** as if the
271a0 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52  re was an "ORDER
271b0 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52   ON x" or "ORDER
271c0 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75   ON x DESC" clau
271d0 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  se. .        ** 
271e0 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61 62  If where.c is ab
271f0 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65  le to produce re
27200 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20  sults sorted in 
27210 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e  this order, then
27220 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20  .        ** add 
27230 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65  vdbe code to bre
27240 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72  ak out of the pr
27250 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66  ocessing loop af
27260 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 20  ter the .       
27270 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61 74   ** first iterat
27280 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66  ion (since the f
27290 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
272a0 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20  f the loop is . 
272b0 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e         ** guaran
272c0 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20  teed to operate 
272d0 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 20  on the row with 
272e0 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d  the minimum or m
272f0 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20  aximum .        
27300 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74  ** value of x, t
27310 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75  he only row requ
27320 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a  ired)..        *
27330 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73  *.        ** A s
27340 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74  pecial flag must
27350 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73 71   be passed to sq
27360 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
27370 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20  ) to slightly.  
27380 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20        ** modify 
27390 62 65 68 61 76 69 6f 75 72 20 61 73 20 66 6f 6c  behaviour as fol
273a0 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a  lows:.        **
273b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  .        **   + 
273c0 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
273d0 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  a "SELECT min(x)
273e0 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70  ", then the loop
273f0 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20   coded by.      
27400 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63    **     where.c
27410 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72   should not iter
27420 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c  ate over any val
27430 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  ues with a NULL 
27440 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a  value.        **
27450 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20       for x..    
27460 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
27470 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69  *   + The optimi
27480 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72  zer code in wher
27490 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20 74  e.c (the thing t
274a0 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69 63  hat decides whic
274b0 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  h.        **    
274c0 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65   index or indice
274d0 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64  s to use) should
274e0 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72 65   place a differe
274f0 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a  nt priority on .
27500 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73          **     s
27510 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f  atisfying the 'O
27520 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65 20  RDER BY' clause 
27530 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20  than it does in 
27540 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20  other cases..   
27550 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65       **     Refe
27560 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f  r to code and co
27570 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e  mments in where.
27580 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20  c for details.. 
27590 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
275a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e    ExprList *pMin
275b0 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Max = 0;.       
275c0 20 75 38 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61   u8 flag = minMa
275d0 78 51 75 65 72 79 28 70 29 3b 0a 20 20 20 20 20  xQuery(p);.     
275e0 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20     if( flag ){. 
275f0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
27600 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
27610 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  y(p->pEList->a[0
27620 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ].pExpr, EP_xIsS
27630 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
27640 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71      pMinMax = sq
27650 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
27660 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  (db, p->pEList->
27670 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c  a[0].pExpr->x.pL
27680 69 73 74 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  ist,0);.        
27690 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78    pDel = pMinMax
276a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
276b0 70 4d 69 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e  pMinMax && !db->
276c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
276d0 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e              pMin
276e0 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72  Max->a[0].sortOr
276f0 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52  der = flag!=WHER
27700 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31  E_ORDERBY_MIN ?1
27710 3a 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  :0;.            
27720 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45  pMinMax->a[0].pE
27730 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c  xpr->op = TK_COL
27740 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  UMN;.          }
27750 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
27760 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
27770 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61  se runs if the a
27780 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20  ggregate has no 
27790 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
277a0 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a    The.        **
277b0 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d   processing is m
277c0 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63  uch simpler sinc
277d0 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  e there is only 
277e0 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20  a single row.   
277f0 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75       ** of outpu
27800 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
27810 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
27820 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
27830 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
27840 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
27850 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
27860 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
27870 70 57 68 65 72 65 2c 20 26 70 4d 69 6e 4d 61 78  pWhere, &pMinMax
27880 2c 20 30 2c 20 66 6c 61 67 29 3b 0a 20 20 20 20  , 0, flag);.    
27890 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
278a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
278b0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
278c0 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a  lete(db, pDel);.
278d0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
278e0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
278f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64     }.        upd
27900 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
27910 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
27920 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
27930 70 4d 69 6e 4d 61 78 20 26 26 20 66 6c 61 67 20  pMinMax && flag 
27940 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
27950 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
27960 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 57  , OP_Goto, 0, pW
27970 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 20  Info->iBreak);. 
27980 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
27990 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62  ment((v, "%s() b
279a0 79 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20  y index",.      
279b0 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d            (flag=
279c0 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
279d0 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29  IN?"min":"max"))
279e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
279f0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
27a00 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
27a10 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
27a20 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
27a30 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
27a40 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 4f       }..      pO
27a50 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
27a60 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
27a70 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
27a80 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53  ving, addrEnd, S
27a90 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
27aa0 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
27ab0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
27ac0 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30   p, p->pEList, 0
27ad0 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20  , 0, 0, -1, .   
27ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27af0 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e     pDest, addrEn
27b00 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  d, addrEnd);.   
27b10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
27b20 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  stDelete(db, pDe
27b30 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
27b40 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
27b50 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64  Label(v, addrEnd
27b60 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65  );.    .  } /* e
27b70 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71  ndif aggregate q
27b80 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20 64  uery */..  if( d
27b90 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
27ba0 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
27bb0 6c 65 28 70 50 61 72 73 65 2c 20 22 44 49 53 54  le(pParse, "DIST
27bc0 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  INCT");.  }..  /
27bd0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
27be0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
27bf0 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74  , then we need t
27c00 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c  o sort the resul
27c10 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64  ts.  ** and send
27c20 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c   them to the cal
27c30 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65  lback one by one
27c40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
27c50 64 65 72 42 79 20 29 7b 0a 20 20 20 20 65 78 70  derBy ){.    exp
27c60 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
27c70 61 72 73 65 2c 20 22 4f 52 44 45 52 20 42 59 22  arse, "ORDER BY"
27c80 29 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53  );.    generateS
27c90 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20  ortTail(pParse, 
27ca0 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  p, v, pEList->nE
27cb0 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  xpr, pDest);.  }
27cc0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
27cd0 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75   to skip this qu
27ce0 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ery.  */.  sqlit
27cf0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
27d00 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20  el(v, iEnd);..  
27d10 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61  /* The SELECT wa
27d20 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
27d30 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20  oded.   Set the 
27d40 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30  return code to 0
27d50 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
27d60 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a  e no errors..  *
27d70 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f  /.  rc = 0;..  /
27d80 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20  * Control jumps 
27d90 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72  to here if an er
27da0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
27db0 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f  ed above, or upo
27dc0 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75  n.  ** successfu
27dd0 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  l coding of the 
27de0 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c  SELECT..  */.sel
27df0 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78 70 6c 61  ect_end:.  expla
27e00 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50 61  inSetInteger(pPa
27e10 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
27e20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64  iRestoreSelectId
27e30 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66  );..  /* Identif
27e40 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  y column names i
27e50 66 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  f results of the
27e60 20 53 45 4c 45 43 54 20 61 72 65 20 74 6f 20 62   SELECT are to b
27e70 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20  e output..  */. 
27e80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27e90 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65 44 65  OK && pDest->eDe
27ea0 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
27eb0 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  {.    generateCo
27ec0 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
27ed0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
27ee0 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  st);.  }..  sqli
27ef0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41  te3DbFree(db, sA
27f00 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20  ggInfo.aCol);.  
27f10 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
27f20 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
27f30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
27f40 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
27f50 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45  QLITE_ENABLE_TRE
27f60 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a  E_EXPLAIN)./*.**
27f70 20 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61   Generate a huma
27f80 6e 2d 72 65 61 64 61 62 6c 65 20 64 65 73 63 72  n-readable descr
27f90 69 70 74 69 6f 6e 20 6f 66 20 61 20 74 68 65 20  iption of a the 
27fa0 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a  Select object..*
27fb0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
27fc0 70 6c 61 69 6e 4f 6e 65 53 65 6c 65 63 74 28 56  plainOneSelect(V
27fd0 64 62 65 20 2a 70 56 64 62 65 2c 20 53 65 6c 65  dbe *pVdbe, Sele
27fe0 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  ct *p){.  sqlite
27ff0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
28000 56 64 62 65 2c 20 22 53 45 4c 45 43 54 20 22 29  Vdbe, "SELECT ")
28010 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  ;.  if( p->selFl
28020 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
28030 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
28040 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   ){.    if( p->s
28050 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
28060 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 73  tinct ){.      s
28070 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
28080 6e 74 66 28 70 56 64 62 65 2c 20 22 44 49 53 54  ntf(pVdbe, "DIST
28090 49 4e 43 54 20 22 29 3b 0a 20 20 20 20 7d 0a 20  INCT ");.    }. 
280a0 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61     if( p->selFla
280b0 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
280c0 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
280d0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
280e0 70 56 64 62 65 2c 20 22 61 67 67 5f 66 6c 61 67  pVdbe, "agg_flag
280f0 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   ");.    }.    s
28100 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
28110 70 56 64 62 65 29 3b 0a 20 20 20 20 73 71 6c 69  pVdbe);.    sqli
28120 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
28130 28 70 56 64 62 65 2c 20 22 20 20 20 22 29 3b 0a  (pVdbe, "   ");.
28140 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
28150 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70 56 64  lainExprList(pVd
28160 62 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  be, p->pEList);.
28170 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
28180 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 69 66 28  NL(pVdbe);.  if(
28190 20 70 2d 3e 70 53 72 63 20 26 26 20 70 2d 3e 70   p->pSrc && p->p
281a0 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20  Src->nSrc ){.   
281b0 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69   int i;.    sqli
281c0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
281d0 28 70 56 64 62 65 2c 20 22 46 52 4f 4d 20 22 29  (pVdbe, "FROM ")
281e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
281f0 6c 61 69 6e 50 75 73 68 28 70 56 64 62 65 29 3b  lainPush(pVdbe);
28200 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
28210 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69  p->pSrc->nSrc; i
28220 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
28230 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
28240 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63  pItem = &p->pSrc
28250 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71  ->a[i];.      sq
28260 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
28270 74 66 28 70 56 64 62 65 2c 20 22 7b 25 64 2c 2a  tf(pVdbe, "{%d,*
28280 7d 20 3d 20 22 2c 20 70 49 74 65 6d 2d 3e 69 43  } = ", pItem->iC
28290 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66  ursor);.      if
282a0 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
282b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
282c0 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74  te3ExplainSelect
282d0 28 70 56 64 62 65 2c 20 70 49 74 65 6d 2d 3e 70  (pVdbe, pItem->p
282e0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
282f0 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62   if( pItem->pTab
28300 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
28310 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
28320 74 66 28 70 56 64 62 65 2c 20 22 20 28 74 61 62  tf(pVdbe, " (tab
28330 6e 61 6d 65 3d 25 73 29 22 2c 20 70 49 74 65 6d  name=%s)", pItem
28340 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  ->pTab->zName);.
28350 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28360 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d  }else if( pItem-
28370 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  >zName ){.      
28380 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
28390 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 25  Printf(pVdbe, "%
283a0 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  s", pItem->zName
283b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
283c0 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69   if( pItem->zAli
283d0 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  as ){.        sq
283e0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
283f0 74 66 28 70 56 64 62 65 2c 20 22 20 28 41 53 20  tf(pVdbe, " (AS 
28400 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  %s)", pItem->zAl
28410 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ias);.      }.  
28420 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 6a      if( pItem->j
28430 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
28440 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  T ){.        sql
28450 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
28460 66 28 70 56 64 62 65 2c 20 22 20 4c 45 46 54 2d  f(pVdbe, " LEFT-
28470 4a 4f 49 4e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  JOIN");.      }.
28480 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28490 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
284a0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
284b0 45 78 70 6c 61 69 6e 50 6f 70 28 70 56 64 62 65  ExplainPop(pVdbe
284c0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
284d0 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71  pWhere ){.    sq
284e0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
284f0 74 66 28 70 56 64 62 65 2c 20 22 57 48 45 52 45  tf(pVdbe, "WHERE
28500 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
28510 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62  ExplainExpr(pVdb
28520 65 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  e, p->pWhere);. 
28530 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
28540 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a  nNL(pVdbe);.  }.
28550 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42    if( p->pGroupB
28560 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
28570 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
28580 64 62 65 2c 20 22 47 52 4f 55 50 42 59 20 22 29  dbe, "GROUPBY ")
28590 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
285a0 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70 56 64  lainExprList(pVd
285b0 62 65 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29  be, p->pGroupBy)
285c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
285d0 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
285e0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76   }.  if( p->pHav
285f0 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ing ){.    sqlit
28600 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
28610 70 56 64 62 65 2c 20 22 48 41 56 49 4e 47 20 22  pVdbe, "HAVING "
28620 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
28630 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c  plainExpr(pVdbe,
28640 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
28650 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
28660 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20  NL(pVdbe);.  }. 
28670 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
28680 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
28690 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
286a0 62 65 2c 20 22 4f 52 44 45 52 42 59 20 22 29 3b  be, "ORDERBY ");
286b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
286c0 61 69 6e 45 78 70 72 4c 69 73 74 28 70 56 64 62  ainExprList(pVdb
286d0 65 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  e, p->pOrderBy);
286e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
286f0 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
28700 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  }.  if( p->pLimi
28710 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
28720 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
28730 64 62 65 2c 20 22 4c 49 4d 49 54 20 22 29 3b 0a  dbe, "LIMIT ");.
28740 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
28750 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d  inExpr(pVdbe, p-
28760 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71  >pLimit);.    sq
28770 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
28780 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Vdbe);.  }.  if(
28790 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20   p->pOffset ){. 
287a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
287b0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
287c0 4f 46 46 53 45 54 20 22 29 3b 0a 20 20 20 20 73  OFFSET ");.    s
287d0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
287e0 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 4f 66 66  r(pVdbe, p->pOff
287f0 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
28800 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
28810 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71  );.  }.}.void sq
28820 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65  lite3ExplainSele
28830 63 74 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  ct(Vdbe *pVdbe, 
28840 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66  Select *p){.  if
28850 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ( p==0 ){.    sq
28860 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
28870 74 66 28 70 56 64 62 65 2c 20 22 28 6e 75 6c 6c  tf(pVdbe, "(null
28880 2d 73 65 6c 65 63 74 29 22 29 3b 0a 20 20 20 20  -select)");.    
28890 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 77 68  return;.  }.  wh
288a0 69 6c 65 28 20 70 2d 3e 70 50 72 69 6f 72 20 29  ile( p->pPrior )
288b0 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a   p = p->pPrior;.
288c0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
288d0 50 75 73 68 28 70 56 64 62 65 29 3b 0a 20 20 77  Push(pVdbe);.  w
288e0 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 65  hile( p ){.    e
288f0 78 70 6c 61 69 6e 4f 6e 65 53 65 6c 65 63 74 28  xplainOneSelect(
28900 70 56 64 62 65 2c 20 70 29 3b 0a 20 20 20 20 70  pVdbe, p);.    p
28910 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   = p->pNext;.   
28920 20 69 66 28 20 70 3d 3d 30 20 29 20 62 72 65 61   if( p==0 ) brea
28930 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  k;.    sqlite3Ex
28940 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
28950 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
28960 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
28970 22 25 73 5c 6e 22 2c 20 73 65 6c 65 63 74 4f 70  "%s\n", selectOp
28980 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
28990 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  }.  sqlite3Expla
289a0 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
289b0 22 45 4e 44 22 29 3b 0a 20 20 73 71 6c 69 74 65  "END");.  sqlite
289c0 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 56 64 62  3ExplainPop(pVdb
289d0 65 29 3b 0a 7d 0a 0a 2f 2a 20 45 6e 64 20 6f 66  e);.}../* End of
289e0 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 64   the structure d
289f0 65 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f  ebug printing co
28a00 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  de.*************
28a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28a50 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  /.#endif /* defi
28a60 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
28a70 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 20  E_TREE_EXPLAIN) 
28a80 2a 2f 0a                                         */.