/ Hex Artifact Content
Login

Artifact 696f245c519c83b5d3b8892db22cfa6c55ef3bd0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
0210: 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  l the content of
0220: 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74   a Select struct
0230: 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ure but do not d
0240: 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65  eallocate.** the
0250: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
0260: 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61  e itself..*/.sta
0270: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0280: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0290: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
02a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c  elete(db, p->pEL
02c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
02d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
02e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c   p->pSrc);.  sql
02f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0300: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
0310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0330: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
0340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0350: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0380: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
0390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
03a0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
03b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
03c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
03d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
03e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
03f0: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
0400: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c  Initialize a Sel
0410: 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
0420: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
0430: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
0440: 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65  (SelectDest *pDe
0450: 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  st, int eDest, i
0460: 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65  nt iParm){.  pDe
0470: 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29  st->eDest = (u8)
0480: 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e  eDest;.  pDest->
0490: 69 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20  iParm = iParm;. 
04a0: 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79   pDest->affinity
04b0: 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69   = 0;.  pDest->i
04c0: 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  Mem = 0;.  pDest
04d0: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 7d 0a 0a 0a  ->nMem = 0;.}...
04e0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
04f0: 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75   new Select stru
0500: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
0510: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0520: 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  at.** structure.
0530: 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  .*/.Select *sqli
0540: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
0550: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0560: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0570: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
0580: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
0590: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
05a0: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
05b0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
05c0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
05d0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
05e0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
05f0: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0600: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0610: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0620: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0630: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0640: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0650: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0660: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0670: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
0680: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
0690: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
06a0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
06b0: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
06c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
06d0: 69 73 44 69 73 74 69 6e 63 74 2c 20 20 20 20 20  isDistinct,     
06e0: 20 20 2f 2a 20 74 72 75 65 20 69 66 20 74 68 65    /* true if the
06f0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
0700: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
0710: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
0720: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54          /* LIMIT
0730: 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65   value.  NULL me
0740: 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a  ans not used */.
0750: 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20    Expr *pOffset 
0760: 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45          /* OFFSE
0770: 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d  T value.  NULL m
0780: 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a  eans no offset *
0790: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
07a0: 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74  New;.  Select st
07b0: 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  andin;.  sqlite3
07c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
07d0: 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
07e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
07f0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
0800: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ) );.  assert( d
0810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0820: 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70  || !pOffset || p
0830: 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f 46 46 53  Limit ); /* OFFS
0840: 45 54 20 69 6d 70 6c 69 65 73 20 4c 49 4d 49 54  ET implies LIMIT
0850: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   */.  if( pNew==
0860: 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  0 ){.    pNew = 
0870: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65  &standin;.    me
0880: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
0890: 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
08a0: 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  }.  if( pEList==
08b0: 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20  0 ){.    pEList 
08c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
08d0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
08e0: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
08f0: 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20  b,TK_ALL,0));.  
0900: 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  }.  pNew->pEList
0910: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65   = pEList;.  pNe
0920: 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  w->pSrc = pSrc;.
0930: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
0940: 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d   pWhere;.  pNew-
0950: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
0960: 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  upBy;.  pNew->pH
0970: 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b  aving = pHaving;
0980: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
0990: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
09a0: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
09b0: 20 69 73 44 69 73 74 69 6e 63 74 20 3f 20 53 46   isDistinct ? SF
09c0: 5f 44 69 73 74 69 6e 63 74 20 3a 20 30 3b 0a 20  _Distinct : 0;. 
09d0: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53   pNew->op = TK_S
09e0: 45 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70  ELECT;.  pNew->p
09f0: 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
0a00: 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
0a10: 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73  = pOffset;.  ass
0a20: 65 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20  ert( pOffset==0 
0a30: 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a  || pLimit!=0 );.
0a40: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0a50: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
0a60: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0a70: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
0a80: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0a90: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  [2] = -1;.  if( 
0aa0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
0ab0: 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65   ) {.    clearSe
0ac0: 6c 65 63 74 28 64 62 2c 20 70 4e 65 77 29 3b 0a  lect(db, pNew);.
0ad0: 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 26 73      if( pNew!=&s
0ae0: 74 61 6e 64 69 6e 20 29 20 73 71 6c 69 74 65 33  tandin ) sqlite3
0af0: 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29  DbFree(db, pNew)
0b00: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
0b10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
0b20: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  w;.}../*.** Dele
0b30: 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c  te the given Sel
0b40: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e  ect structure an
0b50: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
0b60: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
0b70: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0b80: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
0b90: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  *db, Select *p){
0ba0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
0bb0: 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20  clearSelect(db, 
0bc0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
0bd0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
0be0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
0bf0: 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69   1 to 3 identifi
0c00: 65 72 73 20 70 72 65 63 65 65 64 69 6e 67 20 74  ers preceeding t
0c10: 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c  he JOIN keyword,
0c20: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a   determine the.*
0c30: 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20  * type of join. 
0c40: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
0c50: 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74  er constant that
0c60: 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20   expresses that 
0c70: 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73  type.** in terms
0c80: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0c90: 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a  g bit values:.**
0ca0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52  .**     JT_INNER
0cb0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53  .**     JT_CROSS
0cc0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52  .**     JT_OUTER
0cd0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52  .**     JT_NATUR
0ce0: 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46  AL.**     JT_LEF
0cf0: 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48  T.**     JT_RIGH
0d00: 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f  T.**.** A full o
0d10: 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65  uter join is the
0d20: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
0d30: 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52  JT_LEFT and JT_R
0d40: 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  IGHT..**.** If a
0d50: 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73  n illegal or uns
0d60: 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79  upported join ty
0d70: 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e  pe is seen, then
0d80: 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a   still return.**
0d90: 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75   a join type, bu
0da0: 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69  t put an error i
0db0: 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
0dc0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
0dd0: 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50  qlite3JoinType(P
0de0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
0df0: 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a  ken *pA, Token *
0e00: 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a  pB, Token *pC){.
0e10: 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d    int jointype =
0e20: 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41   0;.  Token *apA
0e30: 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a  ll[3];.  Token *
0e40: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p;.             
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e60: 2f 2a 20 20 20 30 31 32 33 34 35 36 37 38 39 20  /*   0123456789 
0e70: 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36  123456789 123456
0e80: 37 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61  789 123 */.  sta
0e90: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
0ea0: 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74  KeyText[] = "nat
0eb0: 75 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74  uraleftouteright
0ec0: 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b  fullinnercross";
0ed0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
0ee0: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20  struct {.    u8 
0ef0: 69 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67  i;        /* Beg
0f00: 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72  inning of keywor
0f10: 64 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65  d text in zKeyTe
0f20: 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e  xt[] */.    u8 n
0f30: 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67  Char;    /* Leng
0f40: 74 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72  th of the keywor
0f50: 64 20 69 6e 20 63 68 61 72 61 63 74 65 72 73 20  d in characters 
0f60: 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20  */.    u8 code; 
0f70: 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65      /* Join type
0f80: 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65   mask */.  } aKe
0f90: 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  yword[] = {.    
0fa0: 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20  /* natural */ { 
0fb0: 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41  0,  7, JT_NATURA
0fc0: 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L               
0fd0: 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20   },.    /* left 
0fe0: 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a     */ { 6,  4, J
0ff0: 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20  T_LEFT|JT_OUTER 
1000: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1010: 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20  /* outer   */ { 
1020: 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20  10, 5, JT_OUTER 
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1040: 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74   },.    /* right
1050: 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a     */ { 14, 5, J
1060: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
1070: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1080: 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20  /* full    */ { 
1090: 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a  19, 4, JT_LEFT|J
10a0: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
10b0: 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72   },.    /* inner
10c0: 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a     */ { 23, 5, J
10d0: 54 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20  T_INNER         
10e0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
10f0: 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20  /* cross   */ { 
1100: 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c  28, 5, JT_INNER|
1110: 4a 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20  JT_CROSS        
1120: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
1130: 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20  , j;.  apAll[0] 
1140: 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d  = pA;.  apAll[1]
1150: 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32   = pB;.  apAll[2
1160: 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d  ] = pC;.  for(i=
1170: 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b  0; i<3 && apAll[
1180: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  i]; i++){.    p 
1190: 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20  = apAll[i];.    
11a0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79  for(j=0; j<Array
11b0: 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20  Size(aKeyword); 
11c0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
11d0: 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a  p->n==aKeyword[j
11e0: 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20  ].nChar .       
11f0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
1200: 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e  NICmp((char*)p->
1210: 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65  z, &zKeyText[aKe
1220: 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e  yword[j].i], p->
1230: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  n)==0 ){.       
1240: 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65   jointype |= aKe
1250: 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20  yword[j].code;. 
1260: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1270: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1280: 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c  testcase( j==0 |
1290: 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c  | j==1 || j==2 |
12a0: 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c  | j==3 || j==4 |
12b0: 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29  | j==5 || j==6 )
12c0: 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72  ;.    if( j>=Arr
12d0: 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29  aySize(aKeyword)
12e0: 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   ){.      jointy
12f0: 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a  pe |= JT_ERROR;.
1300: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1310: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20   }.  }.  if(.   
1320: 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a    (jointype & (J
1330: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
1340: 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54  ))==(JT_INNER|JT
1350: 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20  _OUTER) ||.     
1360: 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45  (jointype & JT_E
1370: 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20  RROR)!=0.  ){.  
1380: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1390: 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73  p = " ";.    ass
13a0: 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20  ert( pB!=0 );.  
13b0: 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a    if( pC==0 ){ z
13c0: 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69  Sp++; }.    sqli
13d0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13e0: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20  se, "unknown or 
13f0: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
1400: 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20   type: ".       
1410: 22 25 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c  "%T %T%s%T", pA,
1420: 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20   pB, zSp, pC);. 
1430: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
1440: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20  _INNER;.  }else 
1450: 69 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20  if( (jointype & 
1460: 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20  JT_OUTER)!=0 .  
1470: 20 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74         && (joint
1480: 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  ype & (JT_LEFT|J
1490: 54 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45  T_RIGHT))!=JT_LE
14a0: 46 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  FT ){.    sqlite
14b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14c0: 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48 54 20  , .      "RIGHT 
14d0: 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a  and FULL OUTER J
14e0: 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72  OINs are not cur
14f0: 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64  rently supported
1500: 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65  ");.    jointype
1510: 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d   = JT_INNER;.  }
1520: 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79  .  return jointy
1530: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  pe;.}../*.** Ret
1540: 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
1550: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74   a column in a t
1560: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31  able.  Return -1
1570: 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a   if the column.*
1580: 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  * is not contain
1590: 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ed in the table.
15a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
15b0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65  olumnIndex(Table
15c0: 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68   *pTab, const ch
15d0: 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74  ar *zCol){.  int
15e0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
15f0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
1600: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1610: 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e  e3StrICmp(pTab->
1620: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  aCol[i].zName, z
1630: 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Col)==0 ) return
1640: 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
1650: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   -1;.}../*.** Th
1660: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
1670: 73 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73  sed to add terms
1680: 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e   implied by JOIN
1690: 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a   syntax to the.*
16a0: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65  * WHERE clause e
16b0: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53  xpression of a S
16c0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
16d0: 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77   The new term, w
16e0: 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64  hich.** is ANDed
16f0: 20 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69   with the existi
1700: 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  ng WHERE clause,
1710: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
1720: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e  .**.**    (tab1.
1730: 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32  col1 = tab2.col2
1740: 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61  ).**.** where ta
1750: 62 31 20 69 73 20 74 68 65 20 69 53 72 63 27 74  b1 is the iSrc't
1760: 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69  h table in SrcLi
1770: 73 74 20 70 53 72 63 20 61 6e 64 20 74 61 62 32  st pSrc and tab2
1780: 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72   is the .** (iSr
1790: 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20  c+1)'th. Column 
17a0: 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69  col1 is column i
17b0: 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c  ColLeft of tab1,
17c0: 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20   and col2 is.** 
17d0: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74  column iColRight
17e0: 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61   of tab2..*/.sta
17f0: 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72  tic void addWher
1800: 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a  eTerm(.  Parse *
1810: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
1820: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1830: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1840: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1860: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
1870: 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  es in FROM claus
1880: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 72 63 2c  e */.  int iSrc,
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
18b0: 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65 20 74  of first table t
18c0: 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a  o join in pSrc *
18d0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74  /.  int iColLeft
18e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18f0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1900: 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20  column in first 
1910: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1920: 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20 20 20  ColRight,       
1930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1940: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
1950: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f   second table */
1960: 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f  .  int isOuterJo
1970: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
1980: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1990: 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52 20 6a  is is an OUTER j
19a0: 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  oin */.  Expr **
19b0: 70 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20  ppWhere         
19c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
19d0: 55 54 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c  UT: The WHERE cl
19e0: 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f 20 2a  ause to add to *
19f0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
1a00: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1a10: 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a 20 20  .  Expr *pE1;.  
1a20: 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45 78 70  Expr *pE2;.  Exp
1a30: 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65 72  r *pEq;..  asser
1a40: 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 28 69  t( pSrc->nSrc>(i
1a50: 53 72 63 2b 31 29 20 29 3b 0a 20 20 61 73 73 65  Src+1) );.  asse
1a60: 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 53 72 63  rt( pSrc->a[iSrc
1a70: 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65  ].pTab );.  asse
1a80: 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 53 72 63  rt( pSrc->a[iSrc
1a90: 2b 31 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70  +1].pTab );..  p
1aa0: 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  E1 = sqlite3Crea
1ab0: 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c  teColumnExpr(db,
1ac0: 20 70 53 72 63 2c 20 69 53 72 63 2c 20 69 43 6f   pSrc, iSrc, iCo
1ad0: 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20  lLeft);.  pE2 = 
1ae0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c  sqlite3CreateCol
1af0: 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63  umnExpr(db, pSrc
1b00: 2c 20 69 53 72 63 2b 31 2c 20 69 43 6f 6c 52 69  , iSrc+1, iColRi
1b10: 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73  ght);..  pEq = s
1b20: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
1b30: 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20  se, TK_EQ, pE1, 
1b40: 70 45 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  pE2, 0);.  if( p
1b50: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
1b60: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
1b70: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
1b80: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
1b90: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1ba0: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 71 2c  AnyProperty(pEq,
1bb0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
1bc0: 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
1bd0: 20 45 78 70 72 53 65 74 49 72 72 65 64 75 63 69   ExprSetIrreduci
1be0: 62 6c 65 28 70 45 71 29 3b 0a 20 20 20 20 70 45  ble(pEq);.    pE
1bf0: 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  q->iRightJoinTab
1c00: 6c 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69  le = (i16)pE2->i
1c10: 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70  Table;.  }.  *pp
1c20: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
1c30: 78 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68  xprAnd(db, *ppWh
1c40: 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a  ere, pEq);.}../*
1c50: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46  .** Set the EP_F
1c60: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
1c70: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66   on all terms of
1c80: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
1c90: 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65  ssion..** And se
1ca0: 74 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68  t the Expr.iRigh
1cb0: 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54  tJoinTable to iT
1cc0: 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74  able for every t
1cd0: 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78  erm in the.** ex
1ce0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
1cf0: 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  The EP_FromJoin 
1d00: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
1d10: 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20   on terms of an 
1d20: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65  expression to te
1d30: 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f  ll.** the LEFT O
1d40: 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73  UTER JOIN proces
1d50: 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20  sing logic that 
1d60: 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72  this term is par
1d70: 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e  t of the.** join
1d80: 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65   restriction spe
1d90: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e  cified in the ON
1da0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
1db0: 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a   and not a part.
1dc0: 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67  ** of the more g
1dd0: 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61  eneral WHERE cla
1de0: 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d  use.  These term
1df0: 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72  s are moved over
1e00: 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45   to the.** WHERE
1e10: 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a   clause during j
1e20: 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62  oin processing b
1e30: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  ut we need to re
1e40: 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79  member that they
1e50: 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69  .** originated i
1e60: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
1e70: 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  G clause..**.** 
1e80: 54 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  The Expr.iRightJ
1e90: 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74  oinTable tells t
1ea0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1eb0: 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20  processing that 
1ec0: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
1ed0: 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62  n depends on tab
1ee0: 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  le iRightJoinTab
1ef0: 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  le even if that 
1f00: 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20  table is not.** 
1f10: 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69  explicitly menti
1f20: 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72  oned in the expr
1f30: 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e  ession.  That in
1f40: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65  formation is nee
1f50: 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73  ded.** for cases
1f60: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1f70: 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
1f80: 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
1f90: 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20  t2 ON t1.a=t2.b 
1fa0: 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a  AND t1.x=5.**.**
1fb0: 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73   The where claus
1fc0: 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72  e needs to defer
1fd0: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
1fe0: 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74   the t1.x=5.** t
1ff0: 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20  erm until after 
2000: 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74  the t2 loop of t
2010: 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61  he join.  In tha
2020: 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c  t way, a.** NULL
2030: 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20   t2 row will be 
2040: 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65  inserted wheneve
2050: 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77  r t1.x!=5.  If w
2060: 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65  e do not.** defe
2070: 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f  r the handling o
2080: 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c  f t1.x=5, it wil
2090: 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69  l be processed i
20a0: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66  mmediately.** af
20b0: 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ter the t1 loop 
20c0: 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31  and rows with t1
20d0: 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72  .x!=5 will never
20e0: 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68   appear in.** th
20f0: 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20  e output, which 
2100: 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f  is incorrect..*/
2110: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
2120: 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70  JoinExpr(Expr *p
2130: 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20  , int iTable){. 
2140: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
2150: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
2160: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
2170: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
2180: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
2190: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
21a0: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
21b0: 0a 20 20 20 20 45 78 70 72 53 65 74 49 72 72 65  .    ExprSetIrre
21c0: 64 75 63 69 62 6c 65 28 70 29 3b 0a 20 20 20 20  ducible(p);.    
21d0: 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  p->iRightJoinTab
21e0: 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65  le = (i16)iTable
21f0: 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70  ;.    setJoinExp
2200: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  r(p->pLeft, iTab
2210: 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  le);.    p = p->
2220: 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a  pRight;.  } .}..
2230: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2240: 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65  ne processes the
2250: 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f   join informatio
2260: 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73  n for a SELECT s
2270: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20  tatement..** ON 
2280: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
2290: 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  s are converted 
22a0: 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73  into extra terms
22b0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
22c0: 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c  ause..** NATURAL
22d0: 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61   joins also crea
22e0: 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63  te extra WHERE c
22f0: 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a  lause terms..**.
2300: 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20  ** The terms of 
2310: 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72  a FROM clause ar
2320: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
2330: 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73  he Select.pSrc s
2340: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65  tructure..** The
2350: 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65   left most table
2360: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e   is the first en
2370: 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53  try in Select.pS
2380: 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d  rc.  The right-m
2390: 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  ost.** table is 
23a0: 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20  the last entry. 
23b0: 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   The join operat
23c0: 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68  or is held in th
23d0: 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68  e entry to.** th
23e0: 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e  e left.  Thus en
23f0: 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74  try 0 contains t
2400: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
2410: 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65   for the join be
2420: 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73  tween.** entries
2430: 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f   0 and 1.  Any O
2440: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2450: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
2460: 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a  th the join are.
2470: 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64  ** also attached
2480: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74   to the left ent
2490: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
24a0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
24b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
24c0: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  ors encountered.
24d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
24e0: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
24f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2500: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72  Select *p){.  Sr
2510: 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2530: 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74   All tables in t
2540: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
2550: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2570: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2580: 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ters */.  struct
2590: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
25a0: 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66  Left;     /* Lef
25b0: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
25c0: 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ined */.  struct
25d0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
25e0: 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67  Right;    /* Rig
25f0: 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ht table being j
2600: 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63  oined */..  pSrc
2610: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c   = p->pSrc;.  pL
2620: 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30  eft = &pSrc->a[0
2630: 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70  ];.  pRight = &p
2640: 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69  Left[1];.  for(i
2650: 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
2660: 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b  -1; i++, pRight+
2670: 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20  +, pLeft++){.   
2680: 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62   Table *pLeftTab
2690: 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a   = pLeft->pTab;.
26a0: 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68      Table *pRigh
26b0: 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70  tTab = pRight->p
26c0: 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f  Tab;.    int isO
26d0: 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e  uter;..    if( N
26e0: 45 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d 30  EVER(pLeftTab==0
26f0: 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30   || pRightTab==0
2700: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2710: 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69    isOuter = (pRi
2720: 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  ght->jointype & 
2730: 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20  JT_OUTER)!=0;.. 
2740: 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e     /* When the N
2750: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69  ATURAL keyword i
2760: 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57  s present, add W
2770: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
2780: 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65  s for.    ** eve
2790: 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74  ry column that t
27a0: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61  he two tables ha
27b0: 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20  ve in common..  
27c0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
27d0: 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  ght->jointype & 
27e0: 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20  JT_NATURAL ){.  
27f0: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
2800: 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70  pOn || pRight->p
2810: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  Using ){.       
2820: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2830: 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55  (pParse, "a NATU
2840: 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74  RAL join may not
2850: 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20   have ".        
2860: 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49     "an ON or USI
2870: 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a  NG clause", 0);.
2880: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
2890: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28a0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 65 66 74  for(j=0; j<pLeft
28b0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
28c0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
28d0: 4e 61 6d 65 20 3d 20 70 4c 65 66 74 54 61 62 2d  Name = pLeftTab-
28e0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
28f0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67          int iRig
2900: 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e  htCol = columnIn
2910: 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a  dex(pRightTab, z
2920: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
2930: 66 28 20 69 52 69 67 68 74 43 6f 6c 3e 3d 30 20  f( iRightCol>=0 
2940: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
2950: 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65  WhereTerm(pParse
2960: 2c 20 70 53 72 63 2c 20 69 2c 20 6a 2c 20 69 52  , pSrc, i, j, iR
2970: 69 67 68 74 43 6f 6c 2c 20 69 73 4f 75 74 65 72  ightCol, isOuter
2980: 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  , &p->pWhere);. 
2990: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
29b0: 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20  isallow both ON 
29c0: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
29d0: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
29e0: 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  in.    */.    if
29f0: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26  ( pRight->pOn &&
2a00: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
2a10: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2a20: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2a30: 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f   "cannot have bo
2a40: 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  th ON and USING 
2a50: 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73  ".        "claus
2a60: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
2a70: 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  oin");.      ret
2a80: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 1;.    }..  
2a90: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20    /* Add the ON 
2aa0: 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e  clause to the en
2ab0: 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  d of the WHERE c
2ac0: 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64  lause, connected
2ad0: 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e   by.    ** an AN
2ae0: 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20  D operator..    
2af0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
2b00: 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20  t->pOn ){.      
2b10: 69 66 28 20 69 73 4f 75 74 65 72 20 29 20 73 65  if( isOuter ) se
2b20: 74 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74  tJoinExpr(pRight
2b30: 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69  ->pOn, pRight->i
2b40: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70  Cursor);.      p
2b50: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
2b60: 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
2b70: 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  ->db, p->pWhere,
2b80: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20   pRight->pOn);. 
2b90: 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e       pRight->pOn
2ba0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
2bb0: 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72 61   /* Create extra
2bc0: 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48   terms on the WH
2bd0: 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65  ERE clause for e
2be0: 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64  ach column named
2bf0: 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55  .    ** in the U
2c00: 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78  SING clause.  Ex
2c10: 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77  ample: If the tw
2c20: 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a  o tables to be j
2c30: 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a  oined are .    *
2c40: 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68  * A and B and th
2c50: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e  e USING clause n
2c60: 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a  ames X, Y, and Z
2c70: 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a  , then add this.
2c80: 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48      ** to the WH
2c90: 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41  ERE clause:    A
2ca0: 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42  .X=B.X AND A.Y=B
2cb0: 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20  .Y AND A.Z=B.Z. 
2cc0: 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20     ** Report an 
2cd0: 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c  error if any col
2ce0: 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e  umn mentioned in
2cf0: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
2d00: 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  e is.    ** not 
2d10: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74  contained in bot
2d20: 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a  h tables to be j
2d30: 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  oined..    */.  
2d40: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55    if( pRight->pU
2d50: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64  sing ){.      Id
2d60: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52  List *pList = pR
2d70: 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20  ight->pUsing;.  
2d80: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2d90: 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b  List->nId; j++){
2da0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
2db0: 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Name = pList->a[
2dc0: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
2dd0: 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 20 3d    int iLeftCol =
2de0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65   columnIndex(pLe
2df0: 66 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ftTab, zName);. 
2e00: 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67 68         int iRigh
2e10: 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64  tCol = columnInd
2e20: 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e  ex(pRightTab, zN
2e30: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
2e40: 28 20 69 4c 65 66 74 43 6f 6c 3c 30 20 7c 7c 20  ( iLeftCol<0 || 
2e50: 69 52 69 67 68 74 43 6f 6c 3c 30 20 29 7b 0a 20  iRightCol<0 ){. 
2e60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2e70: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2e80: 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73   "cannot join us
2e90: 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20  ing column %s - 
2ea0: 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20  column ".       
2eb0: 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e       "not presen
2ec0: 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  t in both tables
2ed0: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
2ee0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2ef0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f00: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50   addWhereTerm(pP
2f10: 61 72 73 65 2c 20 70 53 72 63 2c 20 69 2c 20 69  arse, pSrc, i, i
2f20: 4c 65 66 74 43 6f 6c 2c 20 69 52 69 67 68 74 43  LeftCol, iRightC
2f30: 6f 6c 2c 20 69 73 4f 75 74 65 72 2c 20 26 70 2d  ol, isOuter, &p-
2f40: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  >pWhere);.      
2f50: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
2f60: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2f70: 20 49 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74   Insert code int
2f80: 6f 20 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20  o "v" that will 
2f90: 70 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20  push the record 
2fa0: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  on the top of th
2fb0: 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20  e.** stack into 
2fc0: 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73  the sorter..*/.s
2fd0: 74 61 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f  tatic void pushO
2fe0: 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50 61 72  ntoSorter(.  Par
2ff0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
3000: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
3010: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
3020: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
3030: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
3040: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65  Y clause */.  Se
3050: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
3060: 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c       /* The whol
3070: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
3080: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44  nt */.  int regD
3090: 61 74 61 20 20 20 20 20 20 20 20 20 20 20 20 2f  ata            /
30a0: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
30b0: 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f  ng data to be so
30c0: 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  rted */.){.  Vdb
30d0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
30e0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 6e 45 78 70  Vdbe;.  int nExp
30f0: 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  r = pOrderBy->nE
3100: 78 70 72 3b 0a 20 20 69 6e 74 20 72 65 67 42 61  xpr;.  int regBa
3110: 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  se = sqlite3GetT
3120: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
3130: 20 6e 45 78 70 72 2b 32 29 3b 0a 20 20 69 6e 74   nExpr+2);.  int
3140: 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
3150: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
3160: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
3170: 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
3180: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
3190: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
31a0: 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
31b0: 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29  rBy, regBase, 0)
31c0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
31d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp2(v, OP_Sequ
31e0: 65 6e 63 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ence, pOrderBy->
31f0: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73  iECursor, regBas
3200: 65 2b 6e 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  e+nExpr);.  sqli
3210: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
3220: 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61 2c  pParse, regData,
3230: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b 31   regBase+nExpr+1
3240: 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 1);.  sqlite3V
3250: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
3260: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
3270: 61 73 65 2c 20 6e 45 78 70 72 20 2b 20 32 2c 20  ase, nExpr + 2, 
3280: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
3290: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
32a0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
32b0: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
32c0: 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  sor, regRecord);
32d0: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
32e0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
32f0: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
3300: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
3310: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
3320: 65 67 42 61 73 65 2c 20 6e 45 78 70 72 2b 32 29  egBase, nExpr+2)
3330: 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d  ;.  if( pSelect-
3340: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69  >iLimit ){.    i
3350: 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b  nt addr1, addr2;
3360: 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b  .    int iLimit;
3370: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
3380: 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->iOffset ){.   
3390: 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c     iLimit = pSel
33a0: 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 3b 0a  ect->iOffset+1;.
33b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33c0: 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63   iLimit = pSelec
33d0: 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 7d  t->iLimit;.    }
33e0: 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
33f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
3400: 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69  , OP_IfZero, iLi
3410: 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mit);.    sqlite
3420: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3430: 50 5f 41 64 64 49 6d 6d 2c 20 69 4c 69 6d 69 74  P_AddImm, iLimit
3440: 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 32  , -1);.    addr2
3450: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
3460: 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
3470: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3480: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
3490: 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r1);.    sqlite3
34a0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
34b0: 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79 2d  _Last, pOrderBy-
34c0: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
34d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34e0: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
34f0: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
3500: 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  or);.    sqlite3
3510: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
3520: 61 64 64 72 32 29 3b 0a 20 20 20 20 70 53 65 6c  addr2);.    pSel
3530: 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b  ect->iLimit = 0;
3540: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
3550: 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d  d code to implem
3560: 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a  ent the OFFSET.*
3570: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
3580: 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65  deOffset(.  Vdbe
3590: 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a   *v,          /*
35a0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
35b0: 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20  nto this VM */. 
35c0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
35d0: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
35e0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
35f0: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
3600: 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a  iContinue     /*
3610: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
3620: 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ip the current r
3630: 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  ecord */.){.  if
3640: 28 20 70 2d 3e 69 4f 66 66 73 65 74 20 26 26 20  ( p->iOffset && 
3650: 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a  iContinue!=0 ){.
3660: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
3670: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3680: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
3690: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 2d 31  , p->iOffset, -1
36a0: 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71  );.    addr = sq
36b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
36c0: 76 2c 20 4f 50 5f 49 66 4e 65 67 2c 20 70 2d 3e  v, OP_IfNeg, p->
36d0: 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71  iOffset);.    sq
36e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
36f0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
3700: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56  Continue);.    V
3710: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
3720: 73 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f  skip OFFSET reco
3730: 72 64 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  rds"));.    sqli
3740: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
3750: 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a  v, addr);.  }.}.
3760: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
3770: 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20  that will check 
3780: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
3790: 20 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61   N registers sta
37a0: 72 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a  rting at iMem.**
37b0: 20 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74   form a distinct
37c0: 20 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73   entry.  iTab is
37d0: 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
37e0: 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76   that holds prev
37f0: 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63  iously.** seen c
3800: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74  ombinations of t
3810: 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20  he N values.  A 
3820: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64  new entry is mad
3830: 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20  e in iTab.** if 
3840: 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61  the current N va
3850: 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a  lues are new..**
3860: 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64  .** A jump to ad
3870: 64 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65  drRepeat is made
3880: 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c   and the N+1 val
3890: 75 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66  ues are popped f
38a0: 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b  rom the.** stack
38b0: 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c   if the top N el
38c0: 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64  ements are not d
38d0: 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74  istinct..*/.stat
38e0: 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74  ic void codeDist
38f0: 69 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  inct(.  Parse *p
3900: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
3910: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
3920: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
3930: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c  t */.  int iTab,
3940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
3950: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65  orting index use
3960: 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69  d to test for di
3970: 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20  stinctness */.  
3980: 69 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20  int addrRepeat, 
3990: 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65     /* Jump to he
39a0: 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e  re if not distin
39b0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20  ct */.  int N,  
39c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
39d0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
39e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20   */.  int iMem  
39f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
3a00: 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  t element */.){.
3a10: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
3a20: 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72   r1;..  v = pPar
3a30: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20  se->pVdbe;.  r1 
3a40: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
3a50: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
3a60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
3a70: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
3a80: 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b  d, iMem, N, r1);
3a90: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3aa0: 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  dOp3(v, OP_Found
3ab0: 2c 20 69 54 61 62 2c 20 61 64 64 72 52 65 70 65  , iTab, addrRepe
3ac0: 61 74 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74  at, r1);.  sqlit
3ad0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3ae0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54  OP_IdxInsert, iT
3af0: 61 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74  ab, r1);.  sqlit
3b00: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
3b10: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
3b20: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
3b30: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
3b40: 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69   when a SELECT i
3b50: 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  s used within a 
3b60: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  subexpression.**
3b70: 20 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49   (example:  "a I
3b80: 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N (SELECT * FROM
3b90: 20 74 61 62 6c 65 29 22 29 20 62 75 74 20 69 74   table)") but it
3ba0: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31   has more than 1
3bb0: 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d   result.** colum
3bc0: 6e 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20 69  n.  We do this i
3bd0: 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62  n a subroutine b
3be0: 65 63 61 75 73 65 20 74 68 65 20 65 72 72 6f 72  ecause the error
3bf0: 20 6f 63 63 75 72 73 20 69 6e 20 6d 75 6c 74 69   occurs in multi
3c00: 70 6c 65 0a 2a 2a 20 70 6c 61 63 65 73 2e 0a 2a  ple.** places..*
3c10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
3c20: 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e  ckForMultiColumn
3c30: 53 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50  SelectError(.  P
3c40: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3c50: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
3c60: 74 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  text. */.  Selec
3c70: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
3c80: 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f  /* Destination o
3c90: 66 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73  f SELECT results
3ca0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20   */.  int nExpr 
3cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3cc0: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
3cd0: 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
3ce0: 62 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a  by SELECT */.){.
3cf0: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44    int eDest = pD
3d00: 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66  est->eDest;.  if
3d10: 28 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44  ( nExpr>1 && (eD
3d20: 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20  est==SRT_Mem || 
3d30: 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20  eDest==SRT_Set) 
3d40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
3d50: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3d60: 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65  only a single re
3d70: 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72  sult allowed for
3d80: 20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c   ".       "a SEL
3d90: 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74  ECT that is part
3da0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
3db0: 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n");.    return 
3dc0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
3dd0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a  return 0;.  }.}.
3de0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3df0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
3e00: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69  e code for the i
3e10: 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e  nside of the inn
3e20: 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20  er loop.** of a 
3e30: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  SELECT..**.** If
3e40: 20 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c   srcTab and nCol
3e50: 75 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72  umn are both zer
3e60: 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69  o, then the pELi
3e70: 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  st expressions.*
3e80: 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  * are evaluated 
3e90: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
3ea0: 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69  the data for thi
3eb0: 73 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75  s row.  If nColu
3ec0: 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74  mn>0.** then dat
3ed0: 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d  a is pulled from
3ee0: 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69   srcTab and pELi
3ef0: 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  st is used only 
3f00: 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61  to get the.** da
3f10: 74 61 74 79 70 65 73 20 66 6f 72 20 65 61 63 68  tatypes for each
3f20: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74   column..*/.stat
3f30: 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e  ic void selectIn
3f40: 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65  nerLoop(.  Parse
3f50: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3f60: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
3f70: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
3f80: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
3f90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
3fa0: 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61  plete select sta
3fb0: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
3fc0: 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
3fd0: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
3fe0: 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65  /* List of value
3ff0: 73 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65  s being extracte
4000: 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61  d */.  int srcTa
4010: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b,             /
4020: 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d  * Pull data from
4030: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
4040: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
4050: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4060: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
4070: 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
4080: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
4090: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
40a0: 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73  * If not NULL, s
40b0: 6f 72 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e  ort results usin
40c0: 67 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20  g this key */.  
40d0: 69 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20 20  int distinct,   
40e0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d          /* If >=
40f0: 30 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65 73  0, make sure res
4100: 75 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e 63  ults are distinc
4110: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  t */.  SelectDes
4120: 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
4130: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
4140: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
4150: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
4160: 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ue,          /* 
4170: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
4180: 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20  tinue with next 
4190: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  row */.  int iBr
41a0: 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
41b0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
41c0: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
41d0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a  e inner loop */.
41e0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
41f0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
4200: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73  int i;.  int has
4210: 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
4220: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
4230: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
4240: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
4250: 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20   int regResult; 
4260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4270: 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20  Start of memory 
4280: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 73  holding result s
4290: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  et */.  int eDes
42a0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
42b0: 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69  ;   /* How to di
42c0: 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73  spose of results
42d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20   */.  int iParm 
42e0: 3d 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 20  = pDest->iParm; 
42f0: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
4300: 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20  ent to disposal 
4310: 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20  method */.  int 
4320: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20  nResultCol;     
4330: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4340: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
4350: 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  mns */..  assert
4360: 28 20 76 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ( v );.  if( NEV
4370: 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
4380: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  n;.  assert( pEL
4390: 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44  ist!=0 );.  hasD
43a0: 69 73 74 69 6e 63 74 20 3d 20 64 69 73 74 69 6e  istinct = distin
43b0: 63 74 3e 3d 30 3b 0a 20 20 69 66 28 20 70 4f 72  ct>=0;.  if( pOr
43c0: 64 65 72 42 79 3d 3d 30 20 26 26 20 21 68 61 73  derBy==0 && !has
43d0: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
43e0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c  codeOffset(v, p,
43f0: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d   iContinue);.  }
4400: 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20  ..  /* Pull the 
4410: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e  requested column
4420: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43  s..  */.  if( nC
4430: 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 6e  olumn>0 ){.    n
4440: 52 65 73 75 6c 74 43 6f 6c 20 3d 20 6e 43 6f 6c  ResultCol = nCol
4450: 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  umn;.  }else{.  
4460: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70    nResultCol = p
4470: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
4480: 7d 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69  }.  if( pDest->i
4490: 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  Mem==0 ){.    pD
44a0: 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72  est->iMem = pPar
44b0: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
44c0: 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 6e 52  pDest->nMem = nR
44d0: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 70 50  esultCol;.    pP
44e0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
44f0: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73  esultCol;.  }els
4500: 65 7b 20 0a 20 20 20 20 61 73 73 65 72 74 28 20  e{ .    assert( 
4510: 70 44 65 73 74 2d 3e 6e 4d 65 6d 3d 3d 6e 52 65  pDest->nMem==nRe
4520: 73 75 6c 74 43 6f 6c 20 29 3b 0a 20 20 7d 0a 20  sultCol );.  }. 
4530: 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65   regResult = pDe
4540: 73 74 2d 3e 69 4d 65 6d 3b 0a 20 20 69 66 28 20  st->iMem;.  if( 
4550: 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20  nColumn>0 ){.   
4560: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
4570: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
4580: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4590: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
45a0: 20 73 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52   srcTab, i, regR
45b0: 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 7d 0a  esult+i);.    }.
45c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
45d0: 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b  t!=SRT_Exists ){
45e0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64  .    /* If the d
45f0: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e  estination is an
4600: 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70   EXISTS(...) exp
4610: 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74  ression, the act
4620: 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ual.    ** value
4630: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
4640: 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74  e SELECT are not
4650: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
4660: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  /.    sqlite3Exp
4670: 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
4680: 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  se);.    sqlite3
4690: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
46a0: 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c  (pParse, pEList,
46b0: 20 72 65 67 52 65 73 75 6c 74 2c 20 65 44 65 73   regResult, eDes
46c0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 29 3b 0a  t==SRT_Output);.
46d0: 20 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20    }.  nColumn = 
46e0: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 2f  nResultCol;..  /
46f0: 2a 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43  * If the DISTINC
4700: 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72  T keyword was pr
4710: 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c  esent on the SEL
4720: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
4730: 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20  ** and this row 
4740: 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65  has been seen be
4750: 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  fore, then do no
4760: 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a  t make this row.
4770: 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65    ** part of the
4780: 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20   result..  */.  
4790: 69 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20  if( hasDistinct 
47a0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
47b0: 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  EList!=0 );.    
47c0: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e  assert( pEList->
47d0: 6e 45 78 70 72 3d 3d 6e 43 6f 6c 75 6d 6e 20 29  nExpr==nColumn )
47e0: 3b 0a 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e  ;.    codeDistin
47f0: 63 74 28 70 50 61 72 73 65 2c 20 64 69 73 74 69  ct(pParse, disti
4800: 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  nct, iContinue, 
4810: 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 65 73 75  nColumn, regResu
4820: 6c 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72  lt);.    if( pOr
4830: 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
4840: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
4850: 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  p, iContinue);. 
4860: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
4870: 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c  checkForMultiCol
4880: 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70  umnSelectError(p
4890: 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45  Parse, pDest, pE
48a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
48b0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
48c0: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
48d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
48e0: 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65  is mode, write e
48f0: 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ach query result
4900: 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74   to the key of t
4910: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
4920: 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e   ** table iParm.
4930: 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
4940: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
4950: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20  OUND_SELECT.    
4960: 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20  case SRT_Union: 
4970: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a  {.      int r1;.
4980: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
4990: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
49a0: 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
49b0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
49c0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
49d0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
49e0: 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  mn, r1);.      s
49f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4a00: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
4a10: 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20  , iParm, r1);.  
4a20: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
4a30: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
4a40: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
4a50: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
4a60: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65  * Construct a re
4a70: 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75  cord from the qu
4a80: 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20  ery result, but 
4a90: 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a  instead of.    *
4aa0: 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65  * saving that re
4ab0: 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20  cord, use it as 
4ac0: 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20  a key to delete 
4ad0: 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20  elements from.  
4ae0: 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61    ** the tempora
4af0: 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ry table iParm..
4b00: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
4b10: 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20  SRT_Except: {.  
4b20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4b30: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44  ddOp3(v, OP_IdxD
4b40: 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65  elete, iParm, re
4b50: 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e  gResult, nColumn
4b60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4b70: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
4b80: 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
4b90: 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73  esult as data us
4ba0: 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79  ing a unique key
4bb0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
4bc0: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
4bd0: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
4be0: 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab: {.      int 
4bf0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
4c00: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
4c10: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
4c20: 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65  eDest==SRT_Table
4c30: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
4c40: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45  se( eDest==SRT_E
4c50: 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
4c60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4c70: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
4c80: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
4c90: 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20  nColumn, r1);.  
4ca0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
4cb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
4cc0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
4cd0: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20  e, pOrderBy, p, 
4ce0: 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r1);.      }else
4cf0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32  {.        int r2
4d00: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
4d10: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
4d20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4d30: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
4d40: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
4d50: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
4d60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4d70: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
4d80: 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
4d90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
4da0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
4db0: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
4dc0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
4dd0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
4de0: 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
4df0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
4e00: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
4e10: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
4e20: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
4e30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
4e40: 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
4e50: 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
4e60: 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
4e70: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
4e80: 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
4e90: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
4ea0: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
4eb0: 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
4ec0: 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
4ed0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
4ee0: 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
4ef0: 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
4f00: 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
4f10: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
4f20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
4f30: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
4f40: 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20    p->affinity = 
4f50: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
4f60: 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61  finity(pEList->a
4f70: 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74  [0].pExpr, pDest
4f80: 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20  ->affinity);.   
4f90: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
4fa0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
4fb0: 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f   first glance yo
4fc0: 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65  u would think we
4fd0: 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20   could optimize 
4fe0: 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  out the.        
4ff0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74  ** ORDER BY in t
5000: 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74  his case since t
5010: 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72  he order of entr
5020: 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20  ies in the set. 
5030: 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e         ** does n
5040: 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20  ot matter.  But 
5050: 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61  there might be a
5060: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69   LIMIT clause, i
5070: 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  n which.        
5080: 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65  ** case the orde
5090: 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f  r does matter */
50a0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
50b0: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
50c0: 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67  pOrderBy, p, reg
50d0: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d  Result);.      }
50e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
50f0: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
5100: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
5110: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5120: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
5130: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
5140: 67 52 65 73 75 6c 74 2c 20 31 2c 20 72 31 2c 20  gResult, 1, r1, 
5150: 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29  &p->affinity, 1)
5160: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5170: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
5180: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
5190: 20 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a   regResult, 1);.
51a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
51b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
51c0: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
51d0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
51e0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
51f0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
5200: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5210: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
5220: 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
5230: 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
5240: 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
5250: 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
5260: 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
5270: 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
5280: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
5290: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
52a0: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61  _Integer, 1, iPa
52b0: 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
52c0: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
52d0: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
52e0: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
52f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5300: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
5310: 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
5320: 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
5330: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
5340: 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
5350: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
5360: 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
5370: 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
5380: 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
5390: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
53a0: 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
53b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
53c0: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
53d0: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
53e0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
53f0: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rBy ){.        p
5400: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
5410: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
5420: 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  p, regResult);. 
5430: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5440: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
5450: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
5460: 72 65 67 52 65 73 75 6c 74 2c 20 69 50 61 72 6d  regResult, iParm
5470: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  , 1);.        /*
5480: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
5490: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
54a0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
54b0: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
54c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
54d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
54e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
54f0: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
5500: 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74 61  /* Send the data
5510: 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
5520: 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20   function or to 
5530: 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 49  a subroutine.  I
5540: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 73  n the.    ** cas
5550: 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
5560: 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  e, the subroutin
5570: 65 20 69 74 73 65 6c 66 20 69 73 20 72 65 73 70  e itself is resp
5580: 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20 20 20  onsible for.    
5590: 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65 20 64  ** popping the d
55a0: 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ata from the sta
55b0: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ck..    */.    c
55c0: 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  ase SRT_Coroutin
55d0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
55e0: 4f 75 74 70 75 74 3a 20 7b 0a 20 20 20 20 20 20  Output: {.      
55f0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
5600: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
5610: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
5620: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
5630: 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  put );.      if(
5640: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
5650: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
5660: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
5670: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
5680: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5690: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
56a0: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
56b0: 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20  nColumn, r1);.  
56c0: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
56d0: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
56e0: 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20  derBy, p, r1);. 
56f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
5700: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
5710: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
5720: 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d  }else if( eDest=
5730: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
5740: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5750: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
5760: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
5770: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  iParm);.      }e
5780: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5790: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
57a0: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
57b0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
57c0: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  mn);.        sql
57d0: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
57e0: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
57f0: 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  se, regResult, n
5800: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
5810: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5820: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
5830: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
5840: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
5850: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
5860: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
5870: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
5880: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
5890: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
58a0: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
58b0: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
58c0: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
58d0: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
58e0: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
58f0: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
5900: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
5910: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
5920: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
5930: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
5940: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
5950: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
5960: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
5970: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
5980: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5990: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
59a0: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
59b0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
59c0: 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
59d0: 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f  is reached..  */
59e0: 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
59f0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
5a00: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 20 20  pOrderBy==0 );  
5a10: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
5a20: 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20  n ORDER BY, the 
5a30: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20  call to.        
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a50: 20 20 20 20 2a 2a 20 70 75 73 68 4f 6e 74 6f 53      ** pushOntoS
5a60: 6f 72 74 65 72 28 29 20 77 6f 75 6c 64 20 68 61  orter() would ha
5a70: 76 65 20 63 6c 65 61 72 65 64 20 70 2d 3e 69 4c  ve cleared p->iL
5a80: 69 6d 69 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69  imit */.    sqli
5a90: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5aa0: 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69   OP_IfZero, p->i
5ab0: 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d  Limit, iBreak, -
5ac0: 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
5ad0: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
5ae0: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
5af0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
5b00: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
5b10: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
5b20: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
5b30: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
5b40: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
5b50: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
5b60: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
5b70: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
5b80: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
5b90: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
5ba0: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
5bb0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
5bc0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
5bd0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
5be0: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
5bf0: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
5c00: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
5c10: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
5c20: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
5c30: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
5c40: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
5c50: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
5c60: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
5c70: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
5c80: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
5c90: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
5ca0: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
5cb0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
5cc0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
5cd0: 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20   is obtain from 
5ce0: 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c  malloc.  The cal
5cf0: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
5d00: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
5d10: 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20  for seeing that 
5d20: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
5d30: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
5d40: 66 72 65 65 64 2e 20 20 41 64 64 20 74 68 65 20  freed.  Add the 
5d50: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
5d60: 65 20 74 6f 20 74 68 65 20 50 34 20 66 69 65 6c  e to the P4 fiel
5d70: 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 75  d of an opcode u
5d80: 73 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49 4e  sing.** P4_KEYIN
5d90: 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74 68  FO_HANDOFF is th
5da0: 65 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20 64  e usual way of d
5db0: 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73  ealing with this
5dc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
5dd0: 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d  nfo *keyInfoFrom
5de0: 45 78 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a  ExprList(Parse *
5df0: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
5e00: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pList){.  sqli
5e10: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5e20: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70  ->db;.  int nExp
5e30: 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49  r;.  KeyInfo *pI
5e40: 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78  nfo;.  struct Ex
5e50: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
5e60: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  em;.  int i;..  
5e70: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
5e80: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
5e90: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
5ea0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
5eb0: 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28  pInfo) + nExpr*(
5ec0: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
5ed0: 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  +1) );.  if( pIn
5ee0: 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  fo ){.    pInfo-
5ef0: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
5f00: 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  8*)&pInfo->aColl
5f10: 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e  [nExpr];.    pIn
5f20: 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31  fo->nField = (u1
5f30: 36 29 6e 45 78 70 72 3b 0a 20 20 20 20 70 49 6e  6)nExpr;.    pIn
5f40: 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62  fo->enc = ENC(db
5f50: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 64 62  );.    pInfo->db
5f60: 20 3d 20 64 62 3b 0a 20 20 20 20 66 6f 72 28 69   = db;.    for(i
5f70: 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
5f80: 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  >a; i<nExpr; i++
5f90: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
5fa0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
5fb0: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ;.      pColl = 
5fc0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
5fd0: 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
5fe0: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
5ff0: 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
6000: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62        pColl = db
6010: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
6020: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f     }.      pInfo
6030: 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
6040: 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  ll;.      pInfo-
6050: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
6060: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
6070: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
6080: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
6090: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
60a0: 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e  ner loop was gen
60b0: 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e  erated using a n
60c0: 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79  on-null pOrderBy
60d0: 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68   argument,.** th
60e0: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77  en the results w
60f0: 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20  ere placed in a 
6100: 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74  sorter.  After t
6110: 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69  he loop is termi
6120: 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64  nated.** we need
6130: 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74   to run the sort
6140: 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  er and output th
6150: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20  e results.  The 
6160: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75  following.** rou
6170: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
6180: 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74  he code needed t
6190: 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74  o do that..*/.st
61a0: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
61b0: 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61  teSortTail(.  Pa
61c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
61d0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
61e0: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
61f0: 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p,        /* The
6200: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6210: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20  t */.  Vdbe *v, 
6220: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
6230: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
6240: 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e  his VDBE */.  in
6250: 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t nColumn,      
6260: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
6270: 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a  umns of data */.
6280: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
6290: 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65  est /* Write the
62a0: 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20   sorted results 
62b0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
62c0: 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c   addrBreak = sql
62d0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
62e0: 6c 28 76 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d  l(v);     /* Jum
62f0: 70 20 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c  p here to exit l
6300: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
6310: 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69  rContinue = sqli
6320: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
6330: 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65  (v);  /* Jump he
6340: 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c  re for next cycl
6350: 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b  e */.  int addr;
6360: 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 69  .  int iTab;.  i
6370: 6e 74 20 70 73 65 75 64 6f 54 61 62 20 3d 20 30  nt pseudoTab = 0
6380: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ;.  ExprList *pO
6390: 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
63a0: 65 72 42 79 3b 0a 0a 20 20 69 6e 74 20 65 44 65  erBy;..  int eDe
63b0: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
63c0: 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d  t;.  int iParm =
63d0: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 0a 0a   pDest->iParm;..
63e0: 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20    int regRow;.  
63f0: 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20  int regRowid;.. 
6400: 20 69 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79   iTab = pOrderBy
6410: 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 72 65  ->iECursor;.  re
6420: 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65  gRow = sqlite3Ge
6430: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
6440: 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  ;.  if( eDest==S
6450: 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65  RT_Output || eDe
6460: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
6470: 65 20 29 7b 0a 20 20 20 20 70 73 65 75 64 6f 54  e ){.    pseudoT
6480: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
6490: 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  b++;.    sqlite3
64a0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
64b0: 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 73 65  _OpenPseudo, pse
64c0: 75 64 6f 54 61 62 2c 20 72 65 67 52 6f 77 2c 20  udoTab, regRow, 
64d0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 72 65  nColumn);.    re
64e0: 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 7d 65  gRowid = 0;.  }e
64f0: 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69  lse{.    regRowi
6500: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
6510: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
6520: 20 7d 0a 20 20 61 64 64 72 20 3d 20 31 20 2b 20   }.  addr = 1 + 
6530: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6540: 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54  2(v, OP_Sort, iT
6550: 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  ab, addrBreak);.
6560: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
6570: 70 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  p, addrContinue)
6580: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
6590: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
65a0: 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65 72  mn, iTab, pOrder
65b0: 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 2c 20 72  By->nExpr + 1, r
65c0: 65 67 52 6f 77 29 3b 0a 20 20 73 77 69 74 63 68  egRow);.  switch
65d0: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
65e0: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
65f0: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
6600: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 74 65  mTab: {.      te
6610: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
6620: 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  RT_Table );.    
6630: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
6640: 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
6650: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6660: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6670: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d  _NewRowid, iParm
6680: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
6690: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
66a0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
66b0: 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  t, iParm, regRow
66c0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
66d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
66e0: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
66f0: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
6700: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
6710: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6720: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
6730: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
6740: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
6750: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
6760: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6770: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
6780: 72 64 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20 72  rd, regRow, 1, r
6790: 65 67 52 6f 77 69 64 2c 20 26 70 2d 3e 61 66 66  egRowid, &p->aff
67a0: 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20  inity, 1);.     
67b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
67c0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
67d0: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20  pParse, regRow, 
67e0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
67f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6800: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
6810: 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  rm, regRowid);. 
6820: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6830: 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  }.    case SRT_M
6840: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
6850: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
6860: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
6870: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
6880: 73 65 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72  se, regRow, iPar
6890: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20  m, 1);.      /* 
68a0: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
68b0: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
68c0: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
68d0: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
68e0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
68f0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
6900: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 61    int i;.      a
6910: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
6920: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
6930: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
6940: 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63   ); .      testc
6950: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
6960: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
6970: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
6980: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
6990: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
69a0: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
69b0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
69c0: 28 20 72 65 67 52 6f 77 21 3d 70 44 65 73 74 2d  ( regRow!=pDest-
69d0: 3e 69 4d 65 6d 2b 69 20 29 3b 0a 20 20 20 20 20  >iMem+i );.     
69e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
69f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
6a00: 6e 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 69 2c  n, pseudoTab, i,
6a10: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 29 3b   pDest->iMem+i);
6a20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d  .        if( i==
6a30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
6a40: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6a50: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45  P5(v, OPFLAG_CLE
6a60: 41 52 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20  ARCACHE);.      
6a70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6a80: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
6a90: 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
6aa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6ab0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
6ac0: 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 4d 65  tRow, pDest->iMe
6ad0: 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  m, nColumn);.   
6ae0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
6af0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
6b00: 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73  nge(pParse, pDes
6b10: 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e  t->iMem, nColumn
6b20: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6b30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6b40: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
6b50: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50  Yield, pDest->iP
6b60: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arm);.      }.  
6b70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6b80: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
6b90: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
6ba0: 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  rse, regRow);.  
6bb0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
6bc0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
6bd0: 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 4c  gRowid);..  /* L
6be0: 49 4d 49 54 20 68 61 73 20 62 65 65 6e 20 69 6d  IMIT has been im
6bf0: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65  plemented by the
6c00: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
6c10: 29 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  ) routine..  */.
6c20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 4c 69    assert( p->iLi
6c30: 6d 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  mit==0 );..  /* 
6c40: 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  The bottom of th
6c50: 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
6c60: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
6c70: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e  Label(v, addrCon
6c80: 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65  tinue);.  sqlite
6c90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6ca0: 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
6cb0: 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dr);.  sqlite3Vd
6cc0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
6cd0: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
6ce0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
6cf0: 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d  utput || eDest==
6d00: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b  SRT_Coroutine ){
6d10: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6d20: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
6d30: 73 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30  se, pseudoTab, 0
6d40: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6d50: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
6d60: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e   to a string con
6d70: 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63  taining the 'dec
6d80: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f  laration type' o
6d90: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
6da0: 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73  ion pExpr. The s
6db0: 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65  tring may be tre
6dc0: 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62  ated as static b
6dd0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  y the caller..**
6de0: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
6df0: 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20  ion type is the 
6e00: 65 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64  exact datatype d
6e10: 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63  efinition extrac
6e20: 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ted from the.** 
6e30: 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20  original CREATE 
6e40: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
6e50: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
6e60: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54  n is a column. T
6e70: 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f  he.** declaratio
6e80: 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57  n type for a ROW
6e90: 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45  ID field is INTE
6ea0: 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65  GER. Exactly whe
6eb0: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  n an expression.
6ec0: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
6ed0: 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65   a column can be
6ee0: 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20   complex in the 
6ef0: 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71  presence of subq
6f00: 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72  ueries. The.** r
6f10: 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73  esult-set expres
6f20: 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74  sion in all of t
6f30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c  he following SEL
6f40: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
6f50: 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64  s .** considered
6f60: 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69   a column by thi
6f70: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
6f80: 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46  *   SELECT col F
6f90: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
6fa0: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
6fb0: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
6fc0: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
6fd0: 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a  ol FROM tbl);.**
6fe0: 20 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52     SELECT abc FR
6ff0: 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41  OM (SELECT col A
7000: 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b  S abc FROM tbl);
7010: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c  .** .** The decl
7020: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
7030: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
7040: 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c  other than a col
7050: 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  umn is NULL..*/.
7060: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
7070: 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20  r *columnType(. 
7080: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
7090: 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  C, .  Expr *pExp
70a0: 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  r,.  const char 
70b0: 2a 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20  **pzOriginDb,.  
70c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
70d0: 72 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73  riginTab,.  cons
70e0: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69  t char **pzOrigi
70f0: 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63  nCol.){.  char c
7100: 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b  onst *zType = 0;
7110: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
7120: 4f 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20  OriginDb = 0;.  
7130: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
7140: 67 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63 68  ginTab = 0;.  ch
7150: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69  ar const *zOrigi
7160: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nCol = 0;.  int 
7170: 6a 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  j;.  if( NEVER(p
7180: 45 78 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d  Expr==0) || pNC-
7190: 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72  >pSrcList==0 ) r
71a0: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74  eturn 0;..  swit
71b0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
71c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
71d0: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
71e0: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
71f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
7200: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
7210: 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74  mn. Locate the t
7220: 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  able the column 
7230: 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a  is being.      *
7240: 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  * extracted from
7250: 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e   in NameContext.
7260: 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74  pSrcList. This t
7270: 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c  able may be real
7280: 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
7290: 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75  se table or a su
72a0: 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f  bquery..      */
72b0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
72c0: 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ab = 0;         
72d0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75     /* Table stru
72e0: 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20  cture column is 
72f0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a  extracted from *
7300: 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
7310: 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pS = 0;         
7320: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68      /* Select th
7330: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72  e column is extr
7340: 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20  acted from */.  
7350: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
7360: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20  Expr->iColumn;  
7370: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
7380: 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20  mn in pTab */.  
7390: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
73a0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
73b0: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
73c0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
73d0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
73e0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
73f0: 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20  NC && !pTab ){. 
7400: 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a         SrcList *
7410: 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pTabList = pNC->
7420: 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20  pSrcList;.      
7430: 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62    for(j=0;j<pTab
7440: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
7450: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
7460: 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61  rsor!=pExpr->iTa
7470: 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20  ble;j++);.      
7480: 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74    if( j<pTabList
7490: 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ->nSrc ){.      
74a0: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
74b0: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
74c0: 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70            pS = p
74d0: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53  TabList->a[j].pS
74e0: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d  elect;.        }
74f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7500: 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74  pNC = pNC->pNext
7510: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7520: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
7530: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
7540: 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65    /* At one time
7550: 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20 22  , code such as "
7560: 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69  SELECT new.x" wi
7570: 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20 77  thin a trigger w
7580: 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ould.        ** 
7590: 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69  cause this condi
75a0: 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69  tion to run.  Si
75b0: 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76  nce then, we hav
75c0: 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20 68  e restructured h
75d0: 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  ow.        ** tr
75e0: 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67 65  igger code is ge
75f0: 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74  nerated and so t
7600: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
7610: 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20   no longer .    
7620: 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e      ** possible.
7630: 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e   However, it can
7640: 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66   still be true f
7650: 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69  or statements li
7660: 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ke.        ** th
7670: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20  e following:.   
7680: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
7690: 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
76a0: 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52  E t1(col INTEGER
76b0: 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  );.        **   
76c0: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74  SELECT (SELECT t
76d0: 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d  1.col) FROM FROM
76e0: 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a   t1;.        **.
76f0: 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20          ** when 
7700: 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20  columnType() is 
7710: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78  called on the ex
7720: 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c  pression "t1.col
7730: 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20  " in the .      
7740: 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e    ** sub-select.
7750: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73   In this case, s
7760: 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  et the column ty
7770: 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e  pe to NULL, even
7780: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75  .        ** thou
7790: 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61  gh it should rea
77a0: 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52 22  lly be "INTEGER"
77b0: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
77c0: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
77d0: 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61  not a problem, a
77e0: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  s the column typ
77f0: 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73  e of "t1.col" is
7800: 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a   never.        *
7810: 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c  * used. When col
7820: 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c  umnType() is cal
7830: 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65  led on the expre
7840: 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a  ssion .        *
7850: 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f  * "(SELECT t1.co
7860: 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74  l)", the correct
7870: 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e 65   type is returne
7880: 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45  d (see the TK_SE
7890: 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20  LECT.        ** 
78a0: 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a  branch below.  *
78b0: 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
78c0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
78d0: 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20  assert( pTab && 
78e0: 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61  pExpr->pTab==pTa
78f0: 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b );.      if( p
7900: 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  S ){.        /* 
7910: 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61  The "table" is a
7920: 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65  ctually a sub-se
7930: 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69  lect or a view i
7940: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
7950: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
7960: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
7970: 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65  ment. Return the
7980: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
7990: 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20  e and origin.   
79a0: 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72       ** data for
79b0: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20   the result-set 
79c0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75  column of the su
79d0: 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20  b-select..      
79e0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
79f0: 20 41 4c 57 41 59 53 28 69 43 6f 6c 3e 3d 30 20   ALWAYS(iCol>=0 
7a00: 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69  && iCol<pS->pELi
7a10: 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
7a20: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43          /* If iC
7a30: 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ol is less than 
7a40: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65  zero, then the e
7a50: 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73  xpression reques
7a60: 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  ts the.         
7a70: 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65   ** rowid of the
7a80: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
7a90: 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73  iew. This expres
7aa0: 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73  sion is legal (s
7ab0: 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ee .          **
7ac0: 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32   test case misc2
7ad0: 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79  .2.2) - it alway
7ae0: 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  s evaluates to N
7af0: 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ULL..          *
7b00: 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65  /.          Name
7b10: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
7b20: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d         Expr *p =
7b30: 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69   pS->pEList->a[i
7b40: 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  Col].pExpr;.    
7b50: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
7b60: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
7b70: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65           sNC.pNe
7b80: 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  xt = pNC;.      
7b90: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
7ba0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
7bb0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
7bc0: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
7bd0: 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20   p, &zOriginDb, 
7be0: 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f  &zOriginTab, &zO
7bf0: 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20  riginCol); .    
7c00: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
7c10: 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61  e if( ALWAYS(pTa
7c20: 62 2d 3e 70 53 63 68 65 6d 61 29 20 29 7b 0a 20  b->pSchema) ){. 
7c30: 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c         /* A real
7c40: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
7c50: 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b    assert( !pS );
7c60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
7c70: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
7c80: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
7c90: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
7ca0: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
7cb0: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
7cc0: 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  l) );.        if
7cd0: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
7ce0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49        zType = "I
7cf0: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20  NTEGER";.       
7d00: 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20     zOriginCol = 
7d10: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20  "rowid";.       
7d20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7d30: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
7d40: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
7d50: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
7d60: 67 69 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61  ginCol = pTab->a
7d70: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
7d80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7d90: 20 20 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20     zOriginTab = 
7da0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
7db0: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50       if( pNC->pP
7dc0: 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  arse ){.        
7dd0: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
7de0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
7df0: 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62  (pNC->pParse->db
7e00: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
7e10: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
7e20: 67 69 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61  ginDb = pNC->pPa
7e30: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
7e40: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
7e50: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
7e60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
7e70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7e80: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
7e90: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
7ea0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  .      /* The ex
7eb0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75  pression is a su
7ec0: 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e  b-select. Return
7ed0: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
7ee0: 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20   type and.      
7ef0: 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66  ** origin info f
7f00: 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f  or the single co
7f10: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
7f20: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
7f30: 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74  LECT.      ** st
7f40: 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  atement..      *
7f50: 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74  /.      NameCont
7f60: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53  ext sNC;.      S
7f70: 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70  elect *pS = pExp
7f80: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
7f90: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53      Expr *p = pS
7fa0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
7fb0: 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
7fc0: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
7fd0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
7fe0: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
7ff0: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
8000: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
8010: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43   sNC.pNext = pNC
8020: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72  ;.      sNC.pPar
8030: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
8040: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  ;.      zType = 
8050: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
8060: 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20   p, &zOriginDb, 
8070: 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f  &zOriginTab, &zO
8080: 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20  riginCol); .    
8090: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
80a0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 69  endif.  }.  .  i
80b0: 66 28 20 70 7a 4f 72 69 67 69 6e 44 62 20 29 7b  f( pzOriginDb ){
80c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f  .    assert( pzO
80d0: 72 69 67 69 6e 54 61 62 20 26 26 20 70 7a 4f 72  riginTab && pzOr
80e0: 69 67 69 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 2a  iginCol );.    *
80f0: 70 7a 4f 72 69 67 69 6e 44 62 20 3d 20 7a 4f 72  pzOriginDb = zOr
8100: 69 67 69 6e 44 62 3b 0a 20 20 20 20 2a 70 7a 4f  iginDb;.    *pzO
8110: 72 69 67 69 6e 54 61 62 20 3d 20 7a 4f 72 69 67  riginTab = zOrig
8120: 69 6e 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  inTab;.    *pzOr
8130: 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69 67 69  iginCol = zOrigi
8140: 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nCol;.  }.  retu
8150: 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zType;.}../*.
8160: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
8170: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
8180: 74 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63  the VDBE the dec
8190: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f  laration types o
81a0: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
81b0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
81c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
81d0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70  enerateColumnTyp
81e0: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
81f0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
8200: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
8210: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
8220: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
8230: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
8240: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
8250: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
8260: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
8270: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66  lt set */.){.#if
8280: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8290: 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65  _DECLTYPE.  Vdbe
82a0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
82b0: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
82c0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
82d0: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
82e0: 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e  = pTabList;.  sN
82f0: 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
8300: 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  e;.  for(i=0; i<
8310: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
8320: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
8330: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
8340: 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74  pExpr;.    const
8350: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69   char *zType;.#i
8360: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8370: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
8380: 54 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  TA.    const cha
8390: 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a  r *zOrigDb = 0;.
83a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
83b0: 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20  zOrigTab = 0;.  
83c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
83d0: 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  rigCol = 0;.    
83e0: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
83f0: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
8400: 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c  igDb, &zOrigTab,
8410: 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20   &zOrigCol);..  
8420: 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75    /* The vdbe mu
8430: 73 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20  st make its own 
8440: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  copy of the colu
8450: 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65  mn-type and othe
8460: 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  r .    ** column
8470: 20 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67   specific string
8480: 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  s, in case the s
8490: 63 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62  chema is reset b
84a0: 65 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a  efore this.    *
84b0: 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
84c0: 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20  e is deleted..  
84d0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
84e0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
84f0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54  , i, COLNAME_DAT
8500: 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20  ABASE, zOrigDb, 
8510: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
8520: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8530: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8540: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45  i, COLNAME_TABLE
8550: 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49  , zOrigTab, SQLI
8560: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
8570: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
8580: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
8590: 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a  OLNAME_COLUMN, z
85a0: 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  OrigCol, SQLITE_
85b0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73  TRANSIENT);.#els
85c0: 65 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  e.    zType = co
85d0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
85e0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  , 0, 0, 0);.#end
85f0: 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  if.    sqlite3Vd
8600: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8610: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54  i, COLNAME_DECLT
8620: 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49  YPE, zType, SQLI
8630: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
8640: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8650: 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
8660: 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  E */.}../*.** Ge
8670: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
8680: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
8690: 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  DBE the names of
86a0: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
86b0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
86c0: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
86d0: 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76   is used to prov
86e0: 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c  ide the.** azCol
86f0: 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  [] values in the
8700: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74   callback..*/.st
8710: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
8720: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20  teColumnNames(. 
8730: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8740: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
8750: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
8760: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
8770: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
8780: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
8790: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
87a0: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
87b0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
87c0: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
87d0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
87e0: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  e;.  int i, j;. 
87f0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8800: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
8810: 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72   fullNames, shor
8820: 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66  tNames;..#ifndef
8830: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
8840: 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69  LAIN.  /* If thi
8850: 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c  s is an EXPLAIN,
8860: 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20   skip this step 
8870: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
8880: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
8890: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
88a0: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  if..  if( pParse
88b0: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c  ->colNamesSet ||
88c0: 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 7c 7c 20   NEVER(v==0) || 
88d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
88e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61   ) return;.  pPa
88f0: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
8900: 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65   = 1;.  fullName
8910: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
8920: 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
8930: 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72  ames)!=0;.  shor
8940: 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  tNames = (db->fl
8950: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
8960: 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  rtColNames)!=0;.
8970: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8980: 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73  NumCols(v, pELis
8990: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72  t->nExpr);.  for
89a0: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
89b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
89c0: 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20   Expr *p;.    p 
89d0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
89e0: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 4e 45  Expr;.    if( NE
89f0: 56 45 52 28 70 3d 3d 30 29 20 29 20 63 6f 6e 74  VER(p==0) ) cont
8a00: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45  inue;.    if( pE
8a10: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
8a20: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
8a30: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
8a40: 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[i].zName;.    
8a50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8a60: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8a70: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
8a80: 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  e, SQLITE_TRANSI
8a90: 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ENT);.    }else 
8aa0: 69 66 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( (p->op==TK_C
8ab0: 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  OLUMN || p->op==
8ac0: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26  TK_AGG_COLUMN) &
8ad0: 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20  & pTabList ){.  
8ae0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
8af0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
8b00: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  l;.      int iCo
8b10: 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  l = p->iColumn;.
8b20: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 41        for(j=0; A
8b30: 4c 57 41 59 53 28 6a 3c 70 54 61 62 4c 69 73 74  LWAYS(j<pTabList
8b40: 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20  ->nSrc); j++){. 
8b50: 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 4c         if( pTabL
8b60: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
8b70: 72 3d 3d 70 2d 3e 69 54 61 62 6c 65 20 29 20 62  r==p->iTable ) b
8b80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
8b90: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54      assert( j<pT
8ba0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
8bb0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61        pTab = pTa
8bc0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  bList->a[j].pTab
8bd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
8be0: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
8bf0: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61  ->iPKey;.      a
8c00: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
8c10: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
8c20: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
8c30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
8c40: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  l<0 ){.        z
8c50: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
8c60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8c70: 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
8c80: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
8c90: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
8ca0: 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73   if( !shortNames
8cb0: 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29   && !fullNames )
8cc0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8cd0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8ce0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8cf0: 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ME, .           
8d00: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8d10: 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  (db, pEList->a[i
8d20: 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45  ].zSpan), SQLITE
8d30: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
8d40: 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e   }else if( fullN
8d50: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
8d60: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
8d70: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
8d80: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
8d90: 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61  db, "%s.%s", pTa
8da0: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b  b->zName, zCol);
8db0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8dc0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8dd0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
8de0: 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  E, zName, SQLITE
8df0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
8e00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8e10: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
8e20: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
8e30: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20  AME_NAME, zCol, 
8e40: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
8e50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8e60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
8e70: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8e80: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8e90: 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20  NAME, .         
8ea0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8eb0: 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  (db, pEList->a[i
8ec0: 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45  ].zSpan), SQLITE
8ed0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
8ee0: 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43  .  }.  generateC
8ef0: 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
8f00: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
8f10: 69 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  ist);.}..#ifndef
8f20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
8f30: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
8f40: 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  ** Name of the c
8f50: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74  onnection operat
8f60: 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72  or, used for err
8f70: 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a  or messages..*/.
8f80: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
8f90: 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  r *selectOpName(
8fa0: 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20  int id){.  char 
8fb0: 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64  *z;.  switch( id
8fc0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
8fd0: 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22  ALL:       z = "
8fe0: 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72  UNION ALL";   br
8ff0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9000: 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20  _INTERSECT: z = 
9010: 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62  "INTERSECT";   b
9020: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9030: 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d  K_EXCEPT:    z =
9040: 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20   "EXCEPT";      
9050: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
9060: 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20  lt:           z 
9070: 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20  = "UNION";      
9080: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
9090: 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66  turn z;.}.#endif
90a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
90b0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
90c0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  */../*.** Given 
90d0: 61 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  a an expression 
90e0: 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72  list (which is r
90f0: 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f  eally the list o
9100: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  f expressions.**
9110: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72   that form the r
9120: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
9130: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29  ELECT statement)
9140: 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72   compute appropr
9150: 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  iate.** column n
9160: 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ames for a table
9170: 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64   that would hold
9180: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9190: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  list..**.** All 
91a0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c  column names wil
91b0: 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a  l be unique..**.
91c0: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  ** Only the colu
91d0: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d  mn names are com
91e0: 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a  puted.  Column.z
91f0: 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  Type, Column.zCo
9200: 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  ll,.** and other
9210: 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d   fields of Colum
9220: 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  n are zeroed..**
9230: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
9240: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
9250: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
9260: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
9270: 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20  ccurs,.** store 
9280: 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61  NULL in *paCol a
9290: 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61  nd 0 in *pnCol a
92a0: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
92b0: 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69  _NOMEM..*/.stati
92c0: 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75  c int selectColu
92d0: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
92e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
92f0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
9300: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
9310: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
9320: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78  ist,       /* Ex
9330: 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69  pr list from whi
9340: 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c  ch to derive col
9350: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
9360: 6e 74 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20  nt *pnCol,      
9370: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
9380: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
9390: 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20  lumns here */.  
93a0: 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20  Column **paCol  
93b0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
93c0: 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20   the new column 
93d0: 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  list here */.){.
93e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
93f0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
9400: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
9410: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  tion */.  int i,
9420: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
9430: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
9440: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
9450: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
9460: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
9470: 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74   added to make t
9480: 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a  he name unique *
9490: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  /.  Column *aCol
94a0: 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20  , *pCol;        
94b0: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
94c0: 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ver result colum
94d0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ns */.  int nCol
94e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
94f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9500: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
9510: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
9520: 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20  Expr *p;        
9530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
9540: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20  xpression for a 
9550: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f  single result co
9560: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
9570: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
9580: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
9590: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
95a0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
95b0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
95c0: 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d   name in zName[]
95d0: 20 2a 2f 0a 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20   */..  *pnCol = 
95e0: 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
95f0: 45 78 70 72 3b 0a 20 20 61 43 6f 6c 20 3d 20 2a  Expr;.  aCol = *
9600: 70 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44  paCol = sqlite3D
9610: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
9620: 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a  sizeof(aCol[0])*
9630: 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 61 43 6f  nCol);.  if( aCo
9640: 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
9650: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 66 6f  LITE_NOMEM;.  fo
9660: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
9670: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ; i<nCol; i++, p
9680: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47  Col++){.    /* G
9690: 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  et an appropriat
96a0: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63  e name for the c
96b0: 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  olumn.    */.   
96c0: 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69   p = pEList->a[i
96d0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ].pExpr;.    ass
96e0: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
96f0: 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  0 || ExprHasProp
9700: 65 72 74 79 28 70 2d 3e 70 52 69 67 68 74 2c 20  erty(p->pRight, 
9710: 45 50 5f 49 6e 74 56 61 6c 75 65 29 0a 20 20 20  EP_IntValue).   
9720: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
9730: 2d 3e 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  ->pRight->u.zTok
9740: 65 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  en==0 || p->pRig
9750: 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21  ht->u.zToken[0]!
9760: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a  =0 );.    if( (z
9770: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
9780: 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  [i].zName)!=0 ){
9790: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
97a0: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
97b0: 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20   an "AS <name>" 
97c0: 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d  phrase, use <nam
97d0: 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a  e> as the name *
97e0: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
97f0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
9800: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
9810: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
9820: 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b  r *pColExpr = p;
9830: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
9840: 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65 20  ion that is the 
9850: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61  result column na
9860: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c  me */.      Tabl
9870: 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
9880: 20 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69   /* Table associ
9890: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 65  ated with this e
98a0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
98b0: 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78     while( pColEx
98c0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  pr->op==TK_DOT )
98d0: 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c   pColExpr = pCol
98e0: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
98f0: 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72      if( pColExpr
9900: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
9910: 26 26 20 41 4c 57 41 59 53 28 70 43 6f 6c 45 78  && ALWAYS(pColEx
9920: 70 72 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a  pr->pTab!=0) ){.
9930: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63          /* For c
9940: 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63  olumns use the c
9950: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20  olumn name name 
9960: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
9970: 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  Col = pColExpr->
9980: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
9990: 20 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72   pTab = pColExpr
99a0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
99b0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
99c0: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
99d0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
99e0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
99f0: 64 62 2c 20 22 25 73 22 2c 0a 20 20 20 20 20 20  db, "%s",.      
9a00: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 3e             iCol>
9a10: 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  =0 ? pTab->aCol[
9a20: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72  iCol].zName : "r
9a30: 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65  owid");.      }e
9a40: 6c 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72  lse if( pColExpr
9a50: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
9a60: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
9a70: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9a80: 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74  pColExpr, EP_Int
9a90: 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
9aa0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
9ab0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
9ac0: 22 2c 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a  ", pColExpr->u.z
9ad0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65  Token);.      }e
9ae0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
9af0: 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  Use the original
9b00: 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c   text of the col
9b10: 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  umn expression a
9b20: 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20  s its name */.  
9b30: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
9b40: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
9b50: 20 22 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61   "%s", pEList->a
9b60: 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  [i].zSpan);.    
9b70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
9b80: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
9b90: 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ed ){.      sqli
9ba0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
9bb0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
9bc0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
9bd0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
9be0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e  olumn name is un
9bf0: 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61  ique.  If the na
9c00: 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65  me is not unique
9c10: 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20  ,.    ** append 
9c20: 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65  a integer to the
9c30: 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74   name so that it
9c40: 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e   becomes unique.
9c50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d  .    */.    nNam
9c60: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
9c70: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n30(zName);.    
9c80: 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69  for(j=cnt=0; j<i
9c90: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
9ca0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
9cb0: 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  (aCol[j].zName, 
9cc0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
9cd0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e       char *zNewN
9ce0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  ame;.        zNa
9cf0: 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20  me[nName] = 0;. 
9d00: 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20         zNewName 
9d10: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
9d20: 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e  (db, "%s:%d", zN
9d30: 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20  ame, ++cnt);.   
9d40: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
9d50: 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
9d60: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a         zName = z
9d70: 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  NewName;.       
9d80: 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   j = -1;.       
9d90: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
9da0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9db0: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a     }.    pCol->z
9dc0: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
9dd0: 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  }.  if( db->mall
9de0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
9df0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  for(j=0; j<i; j+
9e00: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
9e10: 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
9e20: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [j].zName);.    
9e30: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
9e40: 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20  ree(db, aCol);. 
9e50: 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20     *paCol = 0;. 
9e60: 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20     *pnCol = 0;. 
9e70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9e80: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65  _NOMEM;.  }.  re
9e90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9ea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70  }../*.** Add typ
9eb0: 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
9ec0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61  information to a
9ed0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73   column list bas
9ee0: 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43  ed on.** a SELEC
9ef0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
9f00: 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c  .** The column l
9f10: 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63  ist presumably c
9f20: 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43  ame from selectC
9f30: 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78  olumnNamesFromEx
9f40: 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65  prList()..** The
9f50: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73   column list has
9f60: 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74   only names, not
9f70: 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74   types or collat
9f80: 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72  ions.  This.** r
9f90: 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f  outine goes thro
9fa0: 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65  ugh and adds the
9fb0: 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
9fc0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
9fd0: 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72  s routine requir
9fe0: 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e  es that all iden
9ff0: 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53  tifiers in the S
a000: 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
a010: 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  nt be resolved..
a020: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
a030: 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
a040: 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a  peAndCollation(.
a050: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a060: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
a070: 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20  ng contexts */. 
a080: 20 69 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20   int nCol,      
a090: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a0a0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20   of columns */. 
a0b0: 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 20   Column *aCol,  
a0c0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
a0d0: 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 53  f columns */.  S
a0e0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20  elect *pSelect  
a0f0: 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75       /* SELECT u
a100: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
a110: 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
a120: 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  tions */.){.  sq
a130: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a140: 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f  se->db;.  NameCo
a150: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c  ntext sNC;.  Col
a160: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c  umn *pCol;.  Col
a170: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
a180: 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b  nt i;.  Expr *p;
a190: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
a1a0: 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61  st_item *a;..  a
a1b0: 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d  ssert( pSelect!=
a1c0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
a1d0: 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67  pSelect->selFlag
a1e0: 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29  s & SF_Resolved)
a1f0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
a200: 20 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e   nCol==pSelect->
a210: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c  pEList->nExpr ||
a220: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
a230: 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  d );.  if( db->m
a240: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
a250: 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26  turn;.  memset(&
a260: 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
a270: 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63  NC));.  sNC.pSrc
a280: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
a290: 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c  pSrc;.  a = pSel
a2a0: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a  ect->pEList->a;.
a2b0: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
a2c0: 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  aCol; i<nCol; i+
a2d0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
a2e0: 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  p = a[i].pExpr;.
a2f0: 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20      pCol->zType 
a300: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
a310: 70 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65  p(db, columnType
a320: 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
a330: 30 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61  0));.    pCol->a
a340: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
a350: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29  3ExprAffinity(p)
a360: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e  ;.    if( pCol->
a370: 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43  affinity==0 ) pC
a380: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
a390: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
a3a0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
a3b0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
a3c0: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
a3d0: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
a3e0: 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20    pCol->zColl = 
a3f0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
a400: 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  db, pColl->zName
a410: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
a420: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45  /*.** Given a SE
a430: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
a440: 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65  generate a Table
a450: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
a460: 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65  describes.** the
a470: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
a480: 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54  hat SELECT..*/.T
a490: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73  able *sqlite3Res
a4a0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50  ultSetOfSelect(P
a4b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
a4c0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
a4d0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
a4e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
a4f0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
a500: 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20   savedFlags;..  
a510: 73 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d  savedFlags = db-
a520: 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c  >flags;.  db->fl
a530: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46  ags &= ~SQLITE_F
a540: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64  ullColNames;.  d
a550: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
a560: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
a570: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
a580: 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 53  tPrep(pParse, pS
a590: 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28  elect, 0);.  if(
a5a0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
a5b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c  return 0;.  whil
a5c0: 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  e( pSelect->pPri
a5d0: 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70  or ) pSelect = p
a5e0: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a  Select->pPrior;.
a5f0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61    db->flags = sa
a600: 76 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62  vedFlags;.  pTab
a610: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
a620: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
a630: 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66  f(Table) );.  if
a640: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
a650: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a660: 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52   /* The sqlite3R
a670: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
a680: 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  () is only used 
a690: 6e 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65  n contexts where
a6a0: 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20   lookaside.  ** 
a6b0: 69 73 20 64 69 73 61 62 6c 65 64 2c 20 73 6f 20  is disabled, so 
a6c0: 77 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c 6c  we might as well
a6d0: 20 68 61 72 64 2d 63 6f 64 65 20 70 54 61 62 2d   hard-code pTab-
a6e0: 3e 64 62 4d 65 6d 20 74 6f 20 4e 55 4c 4c 2e 20  >dbMem to NULL. 
a6f0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  */.  assert( db-
a700: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
a710: 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54 61 62  led==0 );.  pTab
a720: 2d 3e 64 62 4d 65 6d 20 3d 20 30 3b 0a 20 20 70  ->dbMem = 0;.  p
a730: 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Tab->nRef = 1;. 
a740: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30   pTab->zName = 0
a750: 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  ;.  selectColumn
a760: 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
a770: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70  arse, pSelect->p
a780: 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43  EList, &pTab->nC
a790: 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29  ol, &pTab->aCol)
a7a0: 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c  ;.  selectAddCol
a7b0: 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
a7c0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
a7d0: 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43  ->nCol, pTab->aC
a7e0: 6f 6c 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  ol, pSelect);.  
a7f0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
a800: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
a810: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
a820: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
a830: 6c 65 28 70 54 61 62 29 3b 0a 20 20 20 20 72 65  le(pTab);.    re
a840: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
a850: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
a860: 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66  .** Get a VDBE f
a870: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72  or the given par
a880: 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72  ser context.  Cr
a890: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
a8a0: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
a8b0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
a8c0: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  rs, return NULL 
a8d0: 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73  and leave a mess
a8e0: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
a8f0: 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47  /.Vdbe *sqlite3G
a900: 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
a910: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
a920: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
a930: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
a940: 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e      v = pParse->
a950: 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56  pVdbe = sqlite3V
a960: 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65  dbeCreate(pParse
a970: 2d 3e 64 62 29 3b 0a 23 69 66 6e 64 65 66 20 53  ->db);.#ifndef S
a980: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
a990: 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20  .    if( v ){.  
a9a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a9b0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61 63  ddOp0(v, OP_Trac
a9c0: 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
a9d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b  .  }.  return v;
a9e0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
a9f0: 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
aa00: 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
aa10: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
aa20: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70  ased on the.** p
aa30: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
aa40: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  t expressions.  
aa50: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
aa60: 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  et hold the expr
aa70: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
aa80: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
aa90: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
aaa0: 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c  ment after the L
aab0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
aac0: 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  ** keywords.  Or
aad0: 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b   NULL if those k
aae0: 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
aaf0: 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20  ted. iLimit and 
ab00: 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20  iOffset .** are 
ab10: 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
ab20: 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
ab30: 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73  ers for counters
ab40: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
ab50: 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61   .** the limit a
ab60: 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74  nd offset.  If t
ab70: 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74  here is no limit
ab80: 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
ab90: 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20  then .** iLimit 
aba0: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
abb0: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
abc0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
abd0: 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
abe0: 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  of iLimit and iO
abf0: 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
ac00: 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
ac10: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
ac20: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
ac30: 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64  set.  iLimit and
ac40: 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75  .** iOffset shou
ac50: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
ac60: 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
ac70: 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
ac80: 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75  s.** (usually bu
ac90: 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29  t not always -1)
aca0: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
acb0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
acc0: 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69  ** Only if pLimi
acd0: 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21  t!=0 or pOffset!
ace0: 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  =0 do the limit 
acf0: 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
ad00: 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
ad10: 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
ad20: 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
ad30: 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
ad40: 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
ad50: 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
ad60: 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
ad70: 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
ad80: 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
ad90: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
ada0: 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
adb0: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
adc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
add0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72  lect *p, int iBr
ade0: 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  eak){.  Vdbe *v 
adf0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  = 0;.  int iLimi
ae00: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  t = 0;.  int iOf
ae10: 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72  fset;.  int addr
ae20: 31 2c 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69  1, n;.  if( p->i
ae30: 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a  Limit ) return;.
ae40: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d  .  /* .  ** "LIM
ae50: 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68  IT -1" always sh
ae60: 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54  ows all rows.  T
ae70: 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a  here is some.  *
ae80: 2a 20 63 6f 6e 74 72 61 76 65 72 73 79 20 61 62  * contraversy ab
ae90: 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72  out what the cor
aea0: 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68  rect behavior sh
aeb0: 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68  ould be..  ** Th
aec0: 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
aed0: 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72  entation interpr
aee0: 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f  ets "LIMIT 0" to
aef0: 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f   mean.  ** no ro
af00: 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ws..  */.  sqlit
af10: 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
af20: 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
af30: 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
af40: 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d  0 || p->pLimit!=
af50: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c  0 );.  if( p->pL
af60: 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69  imit ){.    p->i
af70: 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d  Limit = iLimit =
af80: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
af90: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
afa0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
afb0: 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76  .    if( NEVER(v
afc0: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ==0) ) return;  
afd0: 2f 2a 20 56 44 42 45 20 73 68 6f 75 6c 64 20 68  /* VDBE should h
afe0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
aff0: 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
b000: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
b010: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
b020: 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20  imit, &n) ){.   
b030: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
b040: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b050: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
b060: 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b  oto, 0, iBreak);
b070: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b080: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b090: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
b0a0: 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74  teger, n, iLimit
b0b0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
b0c0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
b0d0: 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
b0e0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
b0f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
b100: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
b110: 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74  ->pLimit, iLimit
b120: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b130: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
b140: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d  _MustBeInt, iLim
b150: 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  it);.      VdbeC
b160: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
b170: 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
b180: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b190: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp2(v, OP_IfZe
b1a0: 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65  ro, iLimit, iBre
b1b0: 61 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ak);.    }.    i
b1c0: 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b  f( p->pOffset ){
b1d0: 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
b1e0: 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b  t = iOffset = ++
b1f0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
b200: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
b210: 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  ++;   /* Allocat
b220: 65 20 61 6e 20 65 78 74 72 61 20 72 65 67 69 73  e an extra regis
b230: 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66  ter for limit+of
b240: 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 73 71  fset */.      sq
b250: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
b260: 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74  arse, p->pOffset
b270: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
b280: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b290: 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
b2a0: 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  Int, iOffset);. 
b2b0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
b2c0: 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75  ((v, "OFFSET cou
b2d0: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 61  nter"));.      a
b2e0: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
b2f0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
b300: 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 29 3b 0a  fPos, iOffset);.
b310: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b320: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
b330: 74 65 67 65 72 2c 20 30 2c 20 69 4f 66 66 73 65  teger, 0, iOffse
b340: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
b350: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
b360: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20 73   addr1);.      s
b370: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b380: 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d  (v, OP_Add, iLim
b390: 69 74 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f 66  it, iOffset, iOf
b3a0: 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 56  fset+1);.      V
b3b0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
b3c0: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b  LIMIT+OFFSET"));
b3d0: 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73  .      addr1 = s
b3e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
b3f0: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c  (v, OP_IfPos, iL
b400: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  imit);.      sql
b410: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b420: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31  , OP_Integer, -1
b430: 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20  , iOffset+1);.  
b440: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
b450: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
b460: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
b470: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b480: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
b490: 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ECT./*.** Return
b4a0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
b4b0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
b4c0: 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c  nce for the iCol
b4d0: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  -th column of.**
b4e0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
b4f0: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
b500: 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e  -select statemen
b510: 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e  t "p".  Return N
b520: 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ULL if.** the co
b530: 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61  lumn has no defa
b540: 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ult collating se
b550: 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  quence..**.** Th
b560: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
b570: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  ence for the com
b580: 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20  pound select is 
b590: 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a  taken from the.*
b5a0: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  * left-most term
b5b0: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74   of the select t
b5c0: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  hat has a collat
b5d0: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ing sequence..*/
b5e0: 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20  .static CollSeq 
b5f0: 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c  *multiSelectColl
b600: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
b610: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
b620: 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53  t iCol){.  CollS
b630: 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20  eq *pRet;.  if( 
b640: 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
b650: 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c   pRet = multiSel
b660: 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
b670: 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43  e, p->pPrior, iC
b680: 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol);.  }else{.  
b690: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
b6a0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
b6b0: 30 20 29 3b 0a 20 20 69 66 28 20 70 52 65 74 3d  0 );.  if( pRet=
b6c0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 70 45  =0 && iCol<p->pE
b6d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
b6e0: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
b6f0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
b700: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
b710: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a  a[iCol].pExpr);.
b720: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
b730: 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t;.}.#endif /* S
b740: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
b750: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f  UND_SELECT */../
b760: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
b770: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
b780: 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
b790: 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
b7a0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
b7b0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
b7c0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b7e0: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
b7f0: 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
b800: 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
b810: 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
b820: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
b830: 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
b840: 20 2a 2f 0a 29 3b 0a 0a 0a 23 69 66 6e 64 65 66   */.);...#ifndef
b850: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
b860: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
b870: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b880: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
b890: 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  cess a compound 
b8a0: 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a  query form from.
b8b0: 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  ** two or more s
b8c0: 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20  eparate queries 
b8d0: 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49  using UNION, UNI
b8e0: 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20  ON ALL, EXCEPT, 
b8f0: 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a  or.** INTERSECT.
b900: 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73  **.** "p" points
b910: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
b920: 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75  st of the two qu
b930: 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72  eries.  the quer
b940: 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74  y on the.** left
b950: 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20   is p->pPrior.  
b960: 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63  The left query c
b970: 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63  ould also be a c
b980: 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a  ompound query.**
b990: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
b9a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
b9b0: 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72   be called recur
b9c0: 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54  sively. .**.** T
b9d0: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
b9e0: 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72  e total query ar
b9f0: 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
ba00: 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69  into a destinati
ba10: 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44  on.** of type eD
ba20: 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74  est with paramet
ba30: 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  er iParm..**.** 
ba40: 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73  Example 1:  Cons
ba50: 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79  ider a three-way
ba60: 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74   compound SQL st
ba70: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
ba80: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
ba90: 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
baa0: 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e   b FROM t2 UNION
bab0: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
bac0: 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61  3.**.** This sta
bad0: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
bae0: 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   up as follows:.
baf0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
bb00: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20   c FROM t3.**   
bb10: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d     |.**      `--
bb20: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46  --->  SELECT b F
bb30: 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20  ROM t2.**       
bb40: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d               `--
bb60: 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20  ---->  SELECT a 
bb70: 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68  FROM t1.**.** Th
bb80: 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20  e arrows in the 
bb90: 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65  diagram above re
bba0: 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65  present the Sele
bbb0: 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65  ct.pPrior pointe
bbc0: 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73  r..** So if this
bbd0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
bbe0: 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20  ed with p equal 
bbf0: 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c  to the t3 query,
bc00: 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20   then.** pPrior 
bc10: 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71  will be the t2 q
bc20: 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c  uery.  p->op wil
bc30: 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e  l be TK_UNION in
bc40: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
bc50: 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65  * Notice that be
bc60: 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
bc70: 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63   SQLite parses c
bc80: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c  ompound SELECTs,
bc90: 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
bca0: 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79  al selects alway
bcb0: 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66  s group from lef
bcc0: 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73  t to right..*/.s
bcd0: 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
bce0: 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
bcf0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
bd00: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
bd10: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
bd20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
bd30: 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
bd40: 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
bd50: 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
bd60: 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
bd70: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
bd80: 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
bd90: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
bda0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
bdb0: 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
bdc0: 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e  from a subroutin
bdd0: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
bde0: 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
bdf0: 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
be00: 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
be10: 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
be20: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
be30: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
be40: 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
be50: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
be60: 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c  dest;      /* Al
be70: 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64  ternative data d
be80: 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
be90: 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20  Select *pDelete 
bea0: 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f  = 0;  /* Chain o
beb0: 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73  f simple selects
bec0: 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
bed0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
bee0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
bef0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
bf00: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
bf10: 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
bf20: 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c  R BY or LIMIT cl
bf30: 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45  ause on prior SE
bf40: 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a  LECTs.  Only.  *
bf50: 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68  * the last (righ
bf60: 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69  t-most) SELECT i
bf70: 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79  n the series may
bf80: 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
bf90: 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f  Y or LIMIT..  */
bfa0: 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20  .  assert( p && 
bfb0: 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a  p->pPrior );  /*
bfc0: 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   Calling functio
bfd0: 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 69  n guarantees thi
bfe0: 73 20 6d 75 63 68 20 2a 2f 0a 20 20 64 62 20 3d  s much */.  db =
bff0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
c000: 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
c010: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  r;.  assert( pPr
c020: 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21  ior->pRightmost!
c030: 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73 73  =pPrior );.  ass
c040: 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69  ert( pPrior->pRi
c050: 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67  ghtmost==p->pRig
c060: 68 74 6d 6f 73 74 20 29 3b 0a 20 20 64 65 73 74  htmost );.  dest
c070: 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28   = *pDest;.  if(
c080: 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
c090: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
c0a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
c0b0: 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  "ORDER BY clause
c0c0: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
c0d0: 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
c0e0: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
c0f0: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
c100: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
c110: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
c120: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
c130: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
c140: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
c150: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49  orMsg(pParse,"LI
c160: 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  MIT clause shoul
c170: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
c180: 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
c190: 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
c1a0: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
c1b0: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
c1c0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
c1d0: 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74    }..  v = sqlit
c1e0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
c1f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  );.  assert( v!=
c200: 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42  0 );  /* The VDB
c210: 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65  E already create
c220: 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e  d by calling fun
c230: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43  ction */..  /* C
c240: 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e  reate the destin
c250: 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20  ation temporary 
c260: 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61  table if necessa
c270: 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  ry.  */.  if( de
c280: 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  st.eDest==SRT_Ep
c290: 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73  hemTab ){.    as
c2a0: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
c2b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
c2c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
c2d0: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65  penEphemeral, de
c2e0: 73 74 2e 69 50 61 72 6d 2c 20 70 2d 3e 70 45 4c  st.iParm, p->pEL
c2f0: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
c300: 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
c310: 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  T_Table;.  }..  
c320: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
c330: 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20   SELECTs in the 
c340: 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74  statement have t
c350: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
c360: 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  f elements.  ** 
c370: 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20  in their result 
c380: 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sets..  */.  ass
c390: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26  ert( p->pEList &
c3a0: 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  & pPrior->pEList
c3b0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c   );.  if( p->pEL
c3c0: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69  ist->nExpr!=pPri
c3d0: 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
c3e0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
c3f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
c400: 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
c410: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
c420: 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64  of %s".      " d
c430: 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
c440: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
c450: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
c460: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
c470: 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
c480: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
c490: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
c4a0: 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53  .  /* Compound S
c4b0: 45 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65  ELECTs that have
c4c0: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
c4d0: 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20  use are handled 
c4e0: 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f  separately..  */
c4f0: 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
c500: 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  By ){.    return
c510: 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
c520: 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  rBy(pParse, p, p
c530: 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Dest);.  }..  /*
c540: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
c550: 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  or the left and 
c560: 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61  right SELECT sta
c570: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
c580: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
c590: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
c5a0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
c5b0: 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  dr = 0;.      as
c5c0: 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
c5d0: 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70  Limit );.      p
c5e0: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20  Prior->pLimit = 
c5f0: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
c600: 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74   pPrior->pOffset
c610: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
c620: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
c630: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
c640: 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a  pPrior, &dest);.
c650: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
c660: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  = 0;.      p->pO
c670: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
c680: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
c690: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
c6a0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
c6b0: 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
c6c0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  r = 0;.      p->
c6d0: 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d  iLimit = pPrior-
c6e0: 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >iLimit;.      p
c6f0: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69  ->iOffset = pPri
c700: 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  or->iOffset;.   
c710: 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74     if( p->iLimit
c720: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72   ){.        addr
c730: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c740: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp1(v, OP_IfZer
c750: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20  o, p->iLimit);. 
c760: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
c770: 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65  nt((v, "Jump ahe
c780: 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63  ad if LIMIT reac
c790: 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  hed"));.      }.
c7a0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c7b0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
c7c0: 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20   p, &dest);.    
c7d0: 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
c7e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
c7f0: 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
c800: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
c810: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
c820: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72  ;.      if( addr
c830: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
c840: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
c850: 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
c860: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
c870: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
c880: 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73  _EXCEPT:.    cas
c890: 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20  e TK_UNION: {.  
c8a0: 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
c8b0: 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
c8c0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
c8d0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c  porary table hol
c8e0: 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20  ding result */. 
c8f0: 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20       u8 op = 0; 
c900: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
c910: 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
c920: 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
c930: 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e  self */.      in
c940: 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f  t priorOp;     /
c950: 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61  * The SRT_ opera
c960: 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f  tion to apply to
c970: 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a   prior selects *
c980: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  /.      Expr *pL
c990: 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20  imit, *pOffset; 
c9a0: 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20  /* Saved values 
c9b0: 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64  of p->nLimit and
c9c0: 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20   p->nOffset */. 
c9d0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
c9e0: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
c9f0: 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20  uniondest;..    
ca00: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
ca10: 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a  p==TK_EXCEPT );.
ca20: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ca30: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
ca40: 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70  );.      priorOp
ca50: 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   = SRT_Union;.  
ca60: 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
ca70: 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 41  st==priorOp && A
ca80: 4c 57 41 59 53 28 21 70 2d 3e 70 4c 69 6d 69 74  LWAYS(!p->pLimit
ca90: 20 26 26 21 70 2d 3e 70 4f 66 66 73 65 74 29 20   &&!p->pOffset) 
caa0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
cab0: 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d   can reuse a tem
cac0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e  porary table gen
cad0: 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45  erated by a SELE
cae0: 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20  CT to our.      
caf0: 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20    ** right..    
cb00: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
cb10: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
cb20: 6d 6f 73 74 21 3d 70 20 29 3b 20 20 2f 2a 20 43  most!=p );  /* C
cb30: 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66  an only happen f
cb40: 6f 72 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d  or leftward elem
cb50: 65 6e 74 73 0a 20 20 20 20 20 20 20 20 20 20 20  ents.           
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb70: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20            ** of 
cb80: 61 20 33 2d 77 61 79 20 6f 72 20 6d 6f 72 65 20  a 3-way or more 
cb90: 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  compound */.    
cba0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
cbb0: 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20  Limit==0 );     
cbc0: 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20   /* Not allowed 
cbd0: 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d  on leftward elem
cbe0: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
cbf0: 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73  assert( p->pOffs
cc00: 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20  et==0 );     /* 
cc10: 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c  Not allowed on l
cc20: 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
cc30: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
cc40: 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 50 61 72  nTab = dest.iPar
cc50: 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  m;.      }else{.
cc60: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69          /* We wi
cc70: 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  ll need to creat
cc80: 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72  e our own tempor
cc90: 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c  ary table to hol
cca0: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
ccb0: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
ccc0: 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  sults..        *
ccd0: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
cce0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
ccf0: 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  b++;.        ass
cd00: 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
cd10: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
cd20: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
cd30: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
cd40: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69  enEphemeral, uni
cd50: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
cd60: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
cd70: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
cd80: 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70   -1 );.        p
cd90: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
cda0: 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
cdb0: 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d    p->pRightmost-
cdc0: 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
cdd0: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
cde0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
cdf0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
ce00: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
ce10: 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  de the SELECT st
ce20: 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20  atements to our 
ce30: 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  left.      */.  
ce40: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
ce50: 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b  ior->pOrderBy );
ce60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
ce70: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e  lectDestInit(&un
ce80: 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70  iondest, priorOp
ce90: 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20  , unionTab);.   
cea0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
ceb0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
cec0: 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74  rior, &uniondest
ced0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
cee0: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
cef0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
cf00: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
cf10: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
cf20: 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
cf30: 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20  ement.      */. 
cf40: 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
cf50: 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20  TK_EXCEPT ){.   
cf60: 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78       op = SRT_Ex
cf70: 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  cept;.      }els
cf80: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
cf90: 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  t( p->op==TK_UNI
cfa0: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70  ON );.        op
cfb0: 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   = SRT_Union;.  
cfc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
cfd0: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
cfe0: 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
cff0: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  mit;.      p->pL
d000: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
d010: 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
d020: 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  fset;.      p->p
d030: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
d040: 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73    uniondest.eDes
d050: 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 72 63  t = op;.      rc
d060: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
d070: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69  (pParse, p, &uni
d080: 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  ondest);.      t
d090: 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
d0a0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
d0b0: 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e  /* Query flatten
d0c0: 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65  ing in sqlite3Se
d0d0: 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66  lect() might ref
d0e0: 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e  ill p->pOrderBy.
d0f0: 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72  .      ** Be sur
d100: 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70  e to delete p->p
d110: 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f  OrderBy, therefo
d120: 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  re, to avoid a m
d130: 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20  emory leak. */. 
d140: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d150: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
d160: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
d170: 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
d180: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
d190: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
d1a0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
d1b0: 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  rBy = 0;.      s
d1c0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
d1d0: 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
d1e0: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
d1f0: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
d200: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
d210: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
d220: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
d230: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
d240: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ;..      /* Conv
d250: 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20  ert the data in 
d260: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
d270: 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ble into whateve
d280: 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  r form.      ** 
d290: 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75  it is that we cu
d2a0: 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20  rrently need..  
d2b0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
d2c0: 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64  ert( unionTab==d
d2d0: 65 73 74 2e 69 50 61 72 6d 20 7c 7c 20 64 65 73  est.iParm || des
d2e0: 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
d2f0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65   );.      if( de
d300: 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
d310: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  p ){.        int
d320: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
d330: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20  iStart;.        
d340: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
d350: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t );.        if(
d360: 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
d370: 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
d380: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
d390: 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
d3a0: 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
d3b0: 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
d3c0: 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
d3d0: 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65  or;.          ge
d3e0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
d3f0: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
d400: 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
d410: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d420: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
d430: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
d440: 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20  ;.        iCont 
d450: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
d460: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
d470: 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
d480: 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
d490: 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
d4a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d4b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
d4c0: 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
d4d0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
d4e0: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
d4f0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
d500: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65  v);.        sele
d510: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
d520: 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
d530: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70  , unionTab, p->p
d540: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 20 20 20 20 20 30 2c 20 2d 31 2c 20 26 64 65        0, -1, &de
d570: 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
d580: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
d590: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
d5a0: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
d5b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d5c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
d5d0: 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ext, unionTab, i
d5e0: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20  Start);.        
d5f0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
d600: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
d610: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
d620: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d630: 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e   OP_Close, union
d640: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Tab, 0);.      }
d650: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
d660: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
d670: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
d680: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20  TK_INTERSECT ); 
d690: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31  {.      int tab1
d6a0: 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e  , tab2;.      in
d6b0: 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
d6c0: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45   iStart;.      E
d6d0: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
d6e0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74  ffset;.      int
d6f0: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
d700: 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63  ectDest intersec
d710: 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  tdest;.      int
d720: 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49   r1;..      /* I
d730: 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
d740: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
d750: 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
d760: 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
d770: 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
d780: 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
d790: 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
d7a0: 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
d7b0: 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
d7c0: 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
d7d0: 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
d7e0: 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20  */.      tab1 = 
d7f0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
d800: 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
d810: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
d820: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
d830: 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20  rderBy==0 );..  
d840: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
d850: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d860: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
d870: 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
d880: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
d890: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
d8a0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
d8b0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
d8c0: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
d8d0: 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46  pRightmost->selF
d8e0: 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
d8f0: 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
d900: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
d910: 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  t );..      /* C
d920: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
d930: 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
d940: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
d950: 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
d960: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  /.      sqlite3S
d970: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69  electDestInit(&i
d980: 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52  ntersectdest, SR
d990: 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a  T_Union, tab1);.
d9a0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d9b0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
d9c0: 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73   pPrior, &inters
d9d0: 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
d9e0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
d9f0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
da00: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
da10: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
da20: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
da30: 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  CT into temporar
da40: 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20  y table "tab2". 
da50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
da60: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
da70: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
da80: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32  nEphemeral, tab2
da90: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
daa0: 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
dab0: 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[1] == -1 );.
dac0: 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
dad0: 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b  nEphm[1] = addr;
dae0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
daf0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d   = 0;.      pLim
db00: 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
db10: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
db20: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73  = 0;.      pOffs
db30: 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
db40: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
db50: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
db60: 65 72 73 65 63 74 64 65 73 74 2e 69 50 61 72 6d  ersectdest.iParm
db70: 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20 72   = tab2;.      r
db80: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
db90: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e  t(pParse, p, &in
dba0: 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
dbb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
dbc0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
dbd0: 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
dbe0: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
dbf0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
dc00: 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  or;.      sqlite
dc10: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
dc20: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
dc30: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
dc40: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
dc50: 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
dc60: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
dc70: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
dc80: 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
dc90: 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
dca0: 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a  mporary.      **
dcb0: 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a   tables..      *
dcc0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
dcd0: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
dce0: 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
dcf0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
dd00: 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
dd10: 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20  *pFirst = p;.   
dd20: 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
dd30: 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
dd40: 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
dd50: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65  rior;.        ge
dd60: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
dd70: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
dd80: 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
dd90: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65      }.      iBre
dda0: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
ddb0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
ddc0: 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
ddd0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
dde0: 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75  (v);.      compu
ddf0: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
de00: 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
de10: 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
de20: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
de30: 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c  OP_Rewind, tab1,
de40: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
de50: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
de60: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
de70: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
de80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
de90: 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74  (v, OP_RowKey, t
dea0: 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ab1, r1);.      
deb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dec0: 33 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  3(v, OP_NotFound
ded0: 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72  , tab2, iCont, r
dee0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
def0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
df00: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
df10: 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
df20: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
df30: 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70  >pEList, tab1, p
df40: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
df50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
df60: 20 20 20 20 20 20 20 30 2c 20 2d 31 2c 20 26 64         0, -1, &d
df70: 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65  est, iCont, iBre
df80: 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
df90: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
dfa0: 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
dfb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dfc0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
dfd0: 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b  , tab1, iStart);
dfe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
dff0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
e000: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
e010: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e020: 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
e030: 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
e040: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e050: 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
e060: 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  ab1, 0);.      b
e070: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
e080: 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f  .  /* Compute co
e090: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
e0a0: 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  s used by .  ** 
e0b0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
e0c0: 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65   needed to imple
e0d0: 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e  ment the compoun
e0e0: 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41  d select..  ** A
e0f0: 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66  ttach the KeyInf
e100: 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61  o structure to a
e110: 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ll temporary tab
e120: 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
e130: 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72  his section is r
e140: 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d  un by the right-
e150: 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
e160: 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a  ement only..  **
e170: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
e180: 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  ts to the left a
e190: 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20  lways skip this 
e1a0: 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74  part.  The right
e1b0: 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43  -most.  ** SELEC
e1c0: 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69  T might also ski
e1d0: 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69  p this part if i
e1e0: 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42  t has no ORDER B
e1f0: 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a  Y clause and.  *
e200: 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73  * no temp tables
e210: 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20   are required.. 
e220: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
e230: 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45  Flags & SF_UsesE
e240: 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20  phemeral ){.    
e250: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e270: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
e280: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
e290: 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyInfo;         
e2a0: 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
e2b0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
e2c0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
e2d0: 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
e2e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e2f0: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
e300: 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73  through SELECT s
e310: 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  tatements */.   
e320: 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c   CollSeq **apCol
e330: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
e340: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
e350: 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e  rough pKeyInfo->
e360: 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69  aColl[] */.    i
e370: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
e380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e390: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
e3a0: 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20  s in result set 
e3b0: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
e3c0: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70  p->pRightmost==p
e3d0: 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70   );.    nCol = p
e3e0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
e3f0: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
e400: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
e410: 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20  ero(db,.        
e420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
e430: 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29  izeof(*pKeyInfo)
e440: 2b 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f  +nCol*(sizeof(Co
e450: 6c 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20  llSeq*) + 1));. 
e460: 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f     if( !pKeyInfo
e470: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
e480: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
e490: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
e4a0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
e4b0: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  .    pKeyInfo->e
e4c0: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
e4d0: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65    pKeyInfo->nFie
e4e0: 6c 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c 3b 0a  ld = (u16)nCol;.
e4f0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70  .    for(i=0, ap
e500: 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61  Coll=pKeyInfo->a
e510: 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  Coll; i<nCol; i+
e520: 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20  +, apColl++){.  
e530: 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75      *apColl = mu
e540: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
e550: 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
e560: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70        if( 0==*ap
e570: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
e580: 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  *apColl = db->pD
e590: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
e5a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
e5b0: 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20  pLoop=p; pLoop; 
e5c0: 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72  pLoop=pLoop->pPr
e5d0: 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ior){.      for(
e5e0: 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
e5f0: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
e600: 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70   = pLoop->addrOp
e610: 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20  enEphm[i];.     
e620: 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b     if( addr<0 ){
e630: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
e640: 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74   [0] is unused t
e650: 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20  hen [1] is also 
e660: 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63  unused.  So we c
e670: 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  an.          ** 
e680: 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62  always safely ab
e690: 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ort as soon as t
e6a0: 68 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20  he first unused 
e6b0: 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f  slot is found */
e6c0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
e6d0: 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70  t( pLoop->addrOp
e6e0: 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20  enEphm[1]<0 );. 
e6f0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
e700: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e710: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
e720: 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e  ngeP2(v, addr, n
e730: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
e740: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
e750: 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72  4(v, addr, (char
e760: 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
e770: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20  EYINFO);.       
e780: 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
e790: 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[i] = -1;.  
e7a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e7b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e7c0: 2c 20 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d  , pKeyInfo);.  }
e7d0: 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  ..multi_select_e
e7e0: 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 4d 65  nd:.  pDest->iMe
e7f0: 6d 20 3d 20 64 65 73 74 2e 69 4d 65 6d 3b 0a 20  m = dest.iMem;. 
e800: 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 64   pDest->nMem = d
e810: 65 73 74 2e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  est.nMem;.  sqli
e820: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
e830: 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20  db, pDelete);.  
e840: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
e850: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
e860: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
e870: 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64  CT */../*.** Cod
e880: 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72  e an output subr
e890: 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72  outine for a cor
e8a0: 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
e8b0: 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45  ation of a.** SE
e8c0: 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a  LECT statment..*
e8d0: 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f  *.** The data to
e8e0: 20 62 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f   be output is co
e8f0: 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e  ntained in pIn->
e900: 69 4d 65 6d 2e 20 20 54 68 65 72 65 20 61 72 65  iMem.  There are
e910: 0a 2a 2a 20 70 49 6e 2d 3e 6e 4d 65 6d 20 63 6f  .** pIn->nMem co
e920: 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70  lumns to be outp
e930: 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68  ut.  pDest is wh
e940: 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73  ere the output s
e950: 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74  hould.** be sent
e960: 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72  ..**.** regRetur
e970: 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
e980: 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  of the register 
e990: 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72  holding the subr
e9a0: 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
e9b0: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
e9c0: 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
e9d0: 6e 20 69 74 20 69 73 20 61 20 74 68 65 20 66 69  n it is a the fi
e9e0: 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e 20  rst register in 
e9f0: 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a  a vector that.**
ea00: 20 72 65 63 6f 72 64 73 20 74 68 65 20 70 72 65   records the pre
ea10: 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d  vious output.  m
ea20: 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61  em[regPrev] is a
ea30: 20 66 6c 61 67 20 74 68 61 74 20 69 73 20 66 61   flag that is fa
ea40: 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  lse.** if there 
ea50: 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76  has been no prev
ea60: 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66  ious output.  If
ea70: 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20   regPrev>0 then 
ea80: 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72  code is.** gener
ea90: 61 74 65 64 20 74 6f 20 73 75 70 70 72 65 73 73  ated to suppress
eaa0: 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b   duplicates.  pK
eab0: 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66  eyInfo is used f
eac0: 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20  or comparing.** 
ead0: 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  keys..**.** If t
eae0: 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69  he LIMIT found i
eaf0: 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72  n p->iLimit is r
eb00: 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d  eached, jump imm
eb10: 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69  ediately to.** i
eb20: 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  Break..*/.static
eb30: 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74   int generateOut
eb40: 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20  putSubroutine(. 
eb50: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
eb60: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
eb70: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
eb80: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
eb90: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
eba0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
ebb0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
ebc0: 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a   *pIn,        /*
ebd0: 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c   Coroutine suppl
ebe0: 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53  ying data */.  S
ebf0: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
ec00: 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20  ,      /* Where 
ec10: 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74 61  to send the data
ec20: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74   */.  int regRet
ec30: 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  urn,          /*
ec40: 20 54 68 65 20 72 65 74 75 72 6e 20 61 64 64 72   The return addr
ec50: 65 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ess register */.
ec60: 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20    int regPrev,  
ec70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
ec80: 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67  vious result reg
ec90: 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75  ister.  No uniqu
eca0: 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20  eness if 0 */.  
ecb0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
ecc0: 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63  o,      /* For c
ecd0: 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70 72  omparing with pr
ece0: 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a  evious entry */.
ecf0: 20 20 69 6e 74 20 70 34 74 79 70 65 2c 20 20 20    int p4type,   
ed00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ed10: 20 70 34 20 74 79 70 65 20 66 6f 72 20 70 4b 65   p4 type for pKe
ed20: 79 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 69  yInfo */.  int i
ed30: 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20  Break           
ed40: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
ed50: 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c 49  if we hit the LI
ed60: 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  MIT */.){.  Vdbe
ed70: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
ed80: 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74  dbe;.  int iCont
ed90: 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72  inue;.  int addr
eda0: 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  ;..  addr = sqli
edb0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
edc0: 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e  dr(v);.  iContin
edd0: 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
ede0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
edf0: 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75 70   /* Suppress dup
ee00: 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f  licates for UNIO
ee10: 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
ee20: 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20  NTERSECT .  */. 
ee30: 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a   if( regPrev ){.
ee40: 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a      int j1, j2;.
ee50: 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
ee60: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
ee70: 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29  _IfNot, regPrev)
ee80: 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74  ;.    j2 = sqlit
ee90: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
eea0: 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d  OP_Compare, pIn-
eeb0: 3e 69 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31  >iMem, regPrev+1
eec0: 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 0a 20 20 20  , pIn->nMem,.   
eed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eee0: 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
eef0: 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 70 34 74 79  *)pKeyInfo, p4ty
ef00: 70 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pe);.    sqlite3
ef10: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
ef20: 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f  _Jump, j2+2, iCo
ef30: 6e 74 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20  ntinue, j2+2);. 
ef40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
ef50: 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
ef60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
ef70: 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70  deCopy(pParse, p
ef80: 49 6e 2d 3e 69 4d 65 6d 2c 20 72 65 67 50 72 65  In->iMem, regPre
ef90: 76 2b 31 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b  v+1, pIn->nMem);
efa0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
efb0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
efc0: 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76  eger, 1, regPrev
efd0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
efe0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
eff0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30  ailed ) return 0
f000: 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
f010: 20 74 68 65 20 74 68 65 20 66 69 72 73 74 20 4f   the the first O
f020: 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66  FFSET entries if
f030: 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46   there is an OFF
f040: 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  SET clause.  */.
f050: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
f060: 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a  p, iContinue);..
f070: 20 20 73 77 69 74 63 68 28 20 70 44 65 73 74 2d    switch( pDest-
f080: 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a  >eDest ){.    /*
f090: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
f0a0: 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
f0b0: 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
f0c0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
f0d0: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
f0e0: 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
f0f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d  {.      int r1 =
f100: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
f110: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
f120: 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
f130: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
f140: 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  rse);.      test
f150: 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65  case( pDest->eDe
f160: 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st==SRT_Table );
f170: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f180: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
f190: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
f1a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f1b0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
f1c0: 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 4d  eRecord, pIn->iM
f1d0: 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 20 72  em, pIn->nMem, r
f1e0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
f1f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f200: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73  P_NewRowid, pDes
f210: 74 2d 3e 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20  t->iParm, r2);. 
f220: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f230: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
f240: 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 50 61 72  ert, pDest->iPar
f250: 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
f260: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
f270: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
f280: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73  APPEND);.      s
f290: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
f2a0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
f2b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
f2c0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
f2d0: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
f2e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
f2f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f300: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
f310: 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65  /* If we are cre
f320: 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20  ating a set for 
f330: 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  an "expr IN (SEL
f340: 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72  ECT ...)" constr
f350: 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  uct,.    ** then
f360: 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   there should be
f370: 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f   a single item o
f380: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72  n the stack.  Wr
f390: 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ite this.    ** 
f3a0: 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65  item into the se
f3b0: 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67  t table with bog
f3c0: 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  us data..    */.
f3d0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
f3e0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
f3f0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
f400: 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a  pIn->nMem==1 );.
f410: 20 20 20 20 20 20 70 2d 3e 61 66 66 69 6e 69 74        p->affinit
f420: 79 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73 71  y = .         sq
f430: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
f440: 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e  nity(p->pEList->
f450: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73  a[0].pExpr, pDes
f460: 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20 20  t->affinity);.  
f470: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
f480: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
f490: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
f4a0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
f4b0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
f4c0: 6e 2d 3e 69 4d 65 6d 2c 20 31 2c 20 72 31 2c 20  n->iMem, 1, r1, 
f4d0: 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29  &p->affinity, 1)
f4e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
f4f0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
f500: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
f510: 49 6e 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20  In->iMem, 1);.  
f520: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f530: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
f540: 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 50  nsert, pDest->iP
f550: 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  arm, r1);.      
f560: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
f570: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
f580: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
f590: 20 20 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a      }..#if 0  /*
f5a0: 20 4e 65 76 65 72 20 6f 63 63 75 72 73 20 6f 6e   Never occurs on
f5b0: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 71 75 65   an ORDER BY que
f5c0: 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20  ry */.    /* If 
f5d0: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
f5e0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
f5f0: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
f600: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
f610: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
f620: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
f630: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f640: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
f650: 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69 50 61 72  , 1, pDest->iPar
f660: 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  m);.      /* The
f670: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
f680: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
f690: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
f6a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f6b0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
f6c0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
f6d0: 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
f6e0: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
f6f0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
f700: 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
f710: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
f720: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
f730: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65  ory cell and bre
f740: 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  ak out.    ** of
f750: 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
f760: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
f770: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
f780: 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 4d   assert( pIn->nM
f790: 65 6d 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  em==1 );.      s
f7a0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
f7b0: 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
f7c0: 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69 50 61  iMem, pDest->iPa
f7d0: 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a  rm, 1);.      /*
f7e0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
f7f0: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
f800: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
f810: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
f820: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
f830: 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
f840: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
f850: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  */..    /* The r
f860: 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
f870: 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
f880: 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20  of registers.   
f890: 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
f8a0: 70 44 65 73 74 2d 3e 69 4d 65 6d 2e 20 20 54 68  pDest->iMem.  Th
f8b0: 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  en the co-routin
f8c0: 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f  e yields..    */
f8d0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
f8e0: 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20  routine: {.     
f8f0: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 4d 65 6d   if( pDest->iMem
f900: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
f910: 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 73 71 6c  Dest->iMem = sql
f920: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
f930: 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 4d  (pParse, pIn->nM
f940: 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65  em);.        pDe
f950: 73 74 2d 3e 6e 4d 65 6d 20 3d 20 70 49 6e 2d 3e  st->nMem = pIn->
f960: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nMem;.      }.  
f970: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
f980: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
f990: 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74  pIn->iMem, pDest
f9a0: 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 6e  ->iMem, pDest->n
f9b0: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Mem);.      sqli
f9c0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
f9d0: 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
f9e0: 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  ->iParm);.      
f9f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
fa00: 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20    /* If none of 
fa10: 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  the above, then 
fa20: 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74 69  the result desti
fa30: 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20  nation must be. 
fa40: 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74     ** SRT_Output
fa50: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
fa60: 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
fa70: 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20  with any other. 
fa80: 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f     ** destinatio
fa90: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  n other than the
faa0: 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62   ones handled ab
fab0: 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75  ove or SRT_Outpu
fac0: 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
fad0: 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c   For SRT_Output,
fae0: 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
faf0: 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
fb00: 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20  e of registers. 
fb10: 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68   .    ** Then th
fb20: 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f  e OP_ResultRow o
fb30: 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f  pcode is used to
fb40: 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73   cause sqlite3_s
fb50: 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  tep() to.    ** 
fb60: 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20  return the next 
fb70: 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20  row of result.. 
fb80: 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
fb90: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
fba0: 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  t( pDest->eDest=
fbb0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
fbc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fbd0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
fbe0: 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 4d 65  ultRow, pIn->iMe
fbf0: 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20  m, pIn->nMem);. 
fc00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fc10: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
fc20: 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
fc30: 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d  >iMem, pIn->nMem
fc40: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
fc50: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
fc60: 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
fc70: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74  of the loop if t
fc80: 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
fc90: 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hed..  */.  if( 
fca0: 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
fcb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fcc0: 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p3(v, OP_IfZero,
fcd0: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
fce0: 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20  ak, -1);.  }..  
fcf0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
fd00: 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72  subroutine retur
fd10: 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n.  */.  sqlite3
fd20: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
fd30: 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  (v, iContinue);.
fd40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fd50: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
fd60: 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20  , regReturn);.. 
fd70: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
fd80: 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69  ./*.** Alternati
fd90: 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  ve compound sele
fda0: 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  ct code generato
fdb0: 72 20 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e  r for cases when
fdc0: 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20   there.** is an 
fdd0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
fde0: 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65  .**.** We assume
fdf0: 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
fe00: 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a  following form:.
fe10: 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65  **.**      <sele
fe20: 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e  ctA>  <operator>
fe30: 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44    <selectB>  ORD
fe40: 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69  ER BY <orderbyli
fe50: 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61  st>.**.** <opera
fe60: 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55  tor> is one of U
fe70: 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c  NION ALL, UNION,
fe80: 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45   EXCEPT, or INTE
fe90: 52 53 45 43 54 2e 20 20 54 68 65 20 69 64 65 61  RSECT.  The idea
fea0: 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62  .** is to code b
feb0: 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e  oth <selectA> an
fec0: 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68  d <selectB> with
fed0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
fee0: 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f  ause as.** co-ro
fef0: 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75  utines.  Then ru
ff00: 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
ff10: 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e  s in parallel an
ff20: 64 20 6d 65 72 67 65 20 74 68 65 20 72 65 73 75  d merge the resu
ff30: 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  lts.** into the 
ff40: 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69  output.  In addi
ff50: 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20  tion to the two 
ff60: 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c  coroutines (call
ff70: 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a  ed selectA and.*
ff80: 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65 72 65  * selectB) there
ff90: 20 61 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e   are 7 subroutin
ffa0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74  es:.**.**    out
ffb0: 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f  A:    Move the o
ffc0: 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c  utput of the sel
ffd0: 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69  ectA coroutine i
ffe0: 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  nto the output.*
fff0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  *             of
10000 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
10010 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75  ery..**.**    ou
10020 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20  tB:    Move the 
10030 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65  output of the se
10040 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20  lectB coroutine 
10050 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  into the output.
10060 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
10070 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
10080 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e  uery.  (Only gen
10090 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e  erated for UNION
100a0 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
100b0 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20      UNION ALL.  
100c0 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52  EXCEPT and INSER
100d0 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70  TSECT never outp
100e0 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a  ut a row that.**
100f0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
10100 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29  ears only in B.)
10110 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20  .**.**    AltB: 
10120 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
10130 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
10140 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
10150 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a  s and A<B..**.**
10160 20 20 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c      AeqB:    Cal
10170 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
10180 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
10190 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
101a0 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  A==B..**.**    A
101b0 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  gtB:    Called w
101c0 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
101d0 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
101e0 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a  utines and A>B..
101f0 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20  **.**    EofA:  
10200 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61    Called when da
10210 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
10220 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a  from selectA..**
10230 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20  .**    EofB:    
10240 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
10250 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
10260 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a  om selectB..**.*
10270 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
10280 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74  tion of the latt
10290 65 72 20 66 69 76 65 20 73 75 62 72 6f 75 74 69  er five subrouti
102a0 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68  nes depend on wh
102b0 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  ich .** <operato
102c0 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a  r> is used:.**.*
102d0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
102e0 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20   UNION ALL      
102f0 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20     UNION        
10300 20 20 20 20 45 58 43 45 50 54 20 20 20 20 20 20      EXCEPT      
10310 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a      INTERSECT.**
10320 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
10330 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
10340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
10350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
10360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
10370 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c     AltB:   outA,
10380 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41   nextA      outA
10390 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75  , nextA       ou
103a0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
103b0 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20    nextA.**.**   
103c0 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  AeqB:   outA, ne
103d0 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74  xtA         next
103e0 41 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  A             ne
103f0 78 74 41 20 20 20 20 20 20 20 20 20 6f 75 74 41  xtA         outA
10400 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20  , nextA.**.**   
10410 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65  AgtB:   outB, ne
10420 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e  xtB      outB, n
10430 65 78 74 42 20 20 20 20 20 20 20 20 20 20 6e 65  extB          ne
10440 78 74 42 20 20 20 20 20 20 20 20 20 20 20 20 6e  xtB            n
10450 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66  extB.**.**   Eof
10460 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42  A:   outB, nextB
10470 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74        outB, next
10480 42 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 20  B          halt 
10490 20 20 20 20 20 20 20 20 20 20 20 20 68 61 6c 74              halt
104a0 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20  .**.**   EofB:  
104b0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
104c0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
104d0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
104e0 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a          halt.**.
104f0 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20  ** In the AltB, 
10500 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73  AeqB, and AgtB s
10510 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45  ubroutines, an E
10520 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e  OF on A followin
10530 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65  g nextA.** cause
10540 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a  s an immediate j
10550 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20  ump to EofA and 
10560 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c  an EOF on B foll
10570 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73  owing nextB caus
10580 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61  es.** an immedia
10590 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e  te jump to EofB.
105a0 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e    Within EofA an
105b0 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20  d EofB, and EOF 
105c0 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66  on entry or.** f
105d0 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63  ollowing nextX c
105e0 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20  auses a jump to 
105f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73  the end of the s
10600 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67  elect processing
10610 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74  ..**.** Duplicat
10620 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65  e removal in the
10630 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
10640 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63 61  and INTERSECT ca
10650 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a  ses is handled.*
10660 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74  * within the out
10670 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  put subroutine. 
10680 20 54 68 65 20 72 65 67 50 72 65 76 20 72 65 67   The regPrev reg
10690 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20  ister set holds 
106a0 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  the previously.*
106b0 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20  * output value. 
106c0 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73   A comparison is
106d0 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74 68   made against th
106e0 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  is value and the
106f0 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b   output.** is sk
10700 69 70 70 65 64 20 69 66 20 74 68 65 20 6e 65 78  ipped if the nex
10710 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20  t results would 
10720 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
10730 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a  he previous..**.
10740 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
10750 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f  ation plan is to
10760 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74   implement the t
10770 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  wo coroutines an
10780 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f  d seven.** subro
10790 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68  utines first, th
107a0 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72  en put the contr
107b0 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20  ol logic at the 
107c0 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68  bottom.  Like th
107d0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
107e0 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20     goto Init.** 
107f0 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69      coA: corouti
10800 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72  ne for left quer
10810 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42  y (A).**     coB
10820 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  : coroutine for 
10830 72 69 67 68 74 20 71 75 65 72 79 20 28 42 29 0a  right query (B).
10840 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70  **    outA: outp
10850 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a  ut one row of A.
10860 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70  **    outB: outp
10870 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20  ut one row of B 
10880 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e  (UNION and UNION
10890 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20   ALL only).**   
108a0 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   EofA: ....**   
108b0 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   EofB: ....**   
108c0 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AltB: ....**   
108d0 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AeqB: ....**   
108e0 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AgtB: ....**   
108f0 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a   Init: initializ
10900 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69  e coroutine regi
10910 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20  sters.**        
10920 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20    yield coA.**  
10930 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 41          if eof(A
10940 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20  ) goto EofA.**  
10950 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
10960 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  B.**          if
10970 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66   eof(B) goto Eof
10980 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f  B.**    Cmpr: Co
10990 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20  mpare A, B.**   
109a0 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42         Jump AltB
109b0 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20  , AeqB, AgtB.** 
109c0 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a      End: ....**.
109d0 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c  ** We call AltB,
109e0 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66   AeqB, AgtB, Eof
109f0 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62  A, and EofB "sub
10a00 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74 68  routines" but th
10a10 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63  ey are not.** ac
10a20 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73  tually called us
10a30 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68  ing Gosub and th
10a40 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e  ey do not Return
10a50 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42  .  EofA and EofB
10a60 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61   loop.** until a
10a70 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68 61 75  ll data is exhau
10a80 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74  sted then jump t
10a90 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65  o the "end" labe
10aa0 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a  .  AltB, AeqB,.*
10ab0 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20  * and AgtB jump 
10ac0 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20  to either L2 or 
10ad0 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f  to one of EofA o
10ae0 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64  r EofB..*/.#ifnd
10af0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
10b00 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73  OMPOUND_SELECT.s
10b10 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
10b20 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20  electOrderBy(.  
10b30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10b40 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
10b50 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
10b60 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
10b70 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
10b80 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
10b90 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
10ba0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
10bb0 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
10bc0 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
10bd0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
10be0 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
10bf0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
10c00 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c  ounters */.  Sel
10c10 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
10c20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
10c30 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
10c40 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
10c50 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
10c60 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
10c70 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
10c80 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63   VDBE */.  Selec
10c90 74 44 65 73 74 20 64 65 73 74 41 3b 20 20 20 20  tDest destA;    
10ca0 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
10cb0 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20  for coroutine A 
10cc0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
10cd0 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65  destB;     /* De
10ce0 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f  stination for co
10cf0 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69  routine B */.  i
10d00 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20 20 20  nt regAddrA;    
10d10 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
10d20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
10d30 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
10d40 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 41  */.  int regEofA
10d50 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  ;          /* Fl
10d60 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77  ag to indicate w
10d70 68 65 6e 20 73 65 6c 65 63 74 2d 41 20 69 73 20  hen select-A is 
10d80 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  complete */.  in
10d90 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20  t regAddrB;     
10da0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
10db0 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
10dc0 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
10dd0 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 42 3b  /.  int regEofB;
10de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
10df0 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68  g to indicate wh
10e00 65 6e 20 73 65 6c 65 63 74 2d 42 20 69 73 20 63  en select-B is c
10e10 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74  omplete */.  int
10e20 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20   addrSelectA;   
10e30 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
10e40 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f   the select-A co
10e50 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
10e60 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20   addrSelectB;   
10e70 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
10e80 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f   the select-B co
10e90 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
10ea0 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20   regOutA;       
10eb0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
10ec0 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
10ed0 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
10ee0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ne */.  int regO
10ef0 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  utB;          /*
10f00 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
10f10 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74  r for the output
10f20 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -B subroutine */
10f30 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b  .  int addrOutA;
10f40 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
10f50 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
10f60 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
10f70 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42  /.  int addrOutB
10f80 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64   = 0;     /* Add
10f90 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
10fa0 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-B subroutine 
10fb0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
10fc0 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
10fd0 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
10fe0 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20  ect-A-exhausted 
10ff0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
11000 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20  int addrEofB;   
11010 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
11020 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
11030 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
11040 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
11050 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20  ddrAltB;        
11060 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
11070 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e  he A<B subroutin
11080 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
11090 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eqB;         /* 
110a0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
110b0 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ==B subroutine *
110c0 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42  /.  int addrAgtB
110d0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
110e0 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20  ress of the A>B 
110f0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
11100 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20  int regLimitA;  
11110 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
11120 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
11130 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
11140 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20  gLimitB;        
11150 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
11160 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
11170 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b  /.  int regPrev;
11180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72            /* A r
11190 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
111a0 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f  s to hold previo
111b0 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  us output */.  i
111c0 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20  nt savedLimit;  
111d0 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
111e0 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74  lue of p->iLimit
111f0 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f   */.  int savedO
11200 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  ffset;      /* S
11210 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
11220 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  >iOffset */.  in
11230 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20  t labelCmpr;    
11240 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
11250 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
11260 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  e merge algorith
11270 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  m */.  int label
11280 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  End;         /* 
11290 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e  Label for the en
112a0 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c  d of the overall
112b0 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a   SELECT stmt */.
112c0 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20    int j1;       
112d0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
112e0 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
112f0 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65  t get retargette
11300 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  d */.  int op;  
11310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11320 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54  One of TK_ALL, T
11330 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
11340 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  PT, TK_INTERSECT
11350 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
11360 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43  KeyDup = 0; /* C
11370 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
11380 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
11390 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20  ate removal */. 
113a0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65   KeyInfo *pKeyMe
113b0 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72  rge;   /* Compar
113c0 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
113d0 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77   for merging row
113e0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
113f0 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
11400 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
11410 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
11420 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f  t *pOrderBy;   /
11430 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
11440 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
11450 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
11460 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
11470 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
11480 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
11490 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20  int *aPermute;  
114a0 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
114b0 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74   from ORDER BY t
114c0 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73  erms to result s
114d0 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20  et columns */.. 
114e0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
114f0 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73  erBy!=0 );.  ass
11500 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20  ert( pKeyDup==0 
11510 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20  ); /* "Managed" 
11520 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e  code needs this.
11530 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20    Ticket #3382. 
11540 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
11550 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72  ->db;.  v = pPar
11560 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
11570 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20  ert( v!=0 );    
11580 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68     /* Already th
11590 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69  rown the error i
115a0 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69  f VDBE alloc fai
115b0 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e  led */.  labelEn
115c0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
115d0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c  akeLabel(v);.  l
115e0 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74  abelCmpr = sqlit
115f0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
11600 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68  v);...  /* Patch
11610 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59   up the ORDER BY
11620 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f   clause.  */.  o
11630 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70  p = p->op;  .  p
11640 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
11650 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  r;.  assert( pPr
11660 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ior->pOrderBy==0
11670 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d   );.  pOrderBy =
11680 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
11690 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
116a0 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   );.  nOrderBy =
116b0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
116c0 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72  ;..  /* For oper
116d0 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e  ators other than
116e0 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61   UNION ALL we ha
116f0 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ve to make sure 
11700 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52  that.  ** the OR
11710 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f  DER BY clause co
11720 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20  vers every term 
11730 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
11740 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72  t.  Add.  ** ter
11750 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  ms to the ORDER 
11760 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63  BY clause as nec
11770 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69  essary..  */.  i
11780 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op!=TK_ALL ){
11790 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62  .    for(i=1; db
117a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
117b0 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73  0 && i<=p->pELis
117c0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
117d0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
117e0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
117f0 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  m;.      for(j=0
11800 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79  , pItem=pOrderBy
11810 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b  ->a; j<nOrderBy;
11820 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
11830 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11840 70 49 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20 29 3b  pItem->iCol>0 );
11850 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
11860 65 6d 2d 3e 69 43 6f 6c 3d 3d 69 20 29 20 62 72  em->iCol==i ) br
11870 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
11880 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72     if( j==nOrder
11890 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  By ){.        Ex
118a0 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
118b0 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e  e3Expr(db, TK_IN
118c0 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20  TEGER, 0);.     
118d0 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
118e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
118f0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e  OMEM;.        pN
11900 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
11910 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  IntValue;.      
11920 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65    pNew->u.iValue
11930 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 4f   = i;.        pO
11940 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
11950 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
11960 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
11970 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   pNew);.        
11980 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64  pOrderBy->a[nOrd
11990 65 72 42 79 2b 2b 5d 2e 69 43 6f 6c 20 3d 20 28  erBy++].iCol = (
119a0 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  u16)i;.      }. 
119b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
119c0 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61  ompute the compa
119d0 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f  rison permutatio
119e0 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68  n and keyinfo th
119f0 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68 0a  at is used with.
11a00 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61    ** the permuta
11a10 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74  tion used to det
11a20 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65  ermine if the ne
11a30 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72  xt.  ** row of r
11a40 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f  esults comes fro
11a50 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c  m selectA or sel
11a60 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20  ectB.  Also add 
11a70 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f  explicit.  ** co
11a80 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  llations to the 
11a90 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
11aa0 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68  terms so that wh
11ab0 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65  en the subquerie
11ac0 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69  s.  ** to the ri
11ad0 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74  ght and the left
11ae0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20   are evaluated, 
11af0 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f 72  they use the cor
11b00 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  rect.  ** collat
11b10 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72  ion..  */.  aPer
11b20 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62  mute = sqlite3Db
11b30 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
11b40 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72  zeof(int)*nOrder
11b50 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d  By);.  if( aPerm
11b60 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ute ){.    struc
11b70 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
11b80 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28  *pItem;.    for(
11b90 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  i=0, pItem=pOrde
11ba0 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72  rBy->a; i<nOrder
11bb0 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  By; i++, pItem++
11bc0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
11bd0 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20 20   pItem->iCol>0  
11be0 26 26 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3c 3d  && pItem->iCol<=
11bf0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
11c00 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75   );.      aPermu
11c10 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 69  te[i] = pItem->i
11c20 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20  Col - 1;.    }. 
11c30 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 0a 20     pKeyMerge =. 
11c40 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 4d 61       sqlite3DbMa
11c50 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
11c60 6f 66 28 2a 70 4b 65 79 4d 65 72 67 65 29 2b 6e  of(*pKeyMerge)+n
11c70 4f 72 64 65 72 42 79 2a 28 73 69 7a 65 6f 66 28  OrderBy*(sizeof(
11c80 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20  CollSeq*)+1));. 
11c90 20 20 20 69 66 28 20 70 4b 65 79 4d 65 72 67 65     if( pKeyMerge
11ca0 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65   ){.      pKeyMe
11cb0 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  rge->aSortOrder 
11cc0 3d 20 28 75 38 2a 29 26 70 4b 65 79 4d 65 72 67  = (u8*)&pKeyMerg
11cd0 65 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42  e->aColl[nOrderB
11ce0 79 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65  y];.      pKeyMe
11cf0 72 67 65 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75  rge->nField = (u
11d00 31 36 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20  16)nOrderBy;.   
11d10 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 65 6e     pKeyMerge->en
11d20 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
11d30 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
11d40 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
11d50 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
11d60 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 45 78  Coll;.        Ex
11d70 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 4f 72 64  pr *pTerm = pOrd
11d80 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
11d90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
11da0 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  erm->flags & EP_
11db0 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  ExpCollate ){.  
11dc0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
11dd0 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c 3b 0a 20 20  pTerm->pColl;.  
11de0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11df0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d         pColl = m
11e00 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
11e10 71 28 70 50 61 72 73 65 2c 20 70 2c 20 61 50 65  q(pParse, p, aPe
11e20 72 6d 75 74 65 5b 69 5d 29 3b 0a 20 20 20 20 20  rmute[i]);.     
11e30 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67       pTerm->flag
11e40 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61  s |= EP_ExpColla
11e50 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54  te;.          pT
11e60 65 72 6d 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f  erm->pColl = pCo
11e70 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ll;.        }.  
11e80 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d        pKeyMerge-
11e90 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c  >aColl[i] = pCol
11ea0 6c 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d  l;.        pKeyM
11eb0 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72  erge->aSortOrder
11ec0 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  [i] = pOrderBy->
11ed0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
11ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11ef0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d  }else{.    pKeyM
11f00 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erge = 0;.  }.. 
11f10 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65   /* Reattach the
11f20 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
11f30 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20   to the query.. 
11f40 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
11f50 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
11f60 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
11f70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
11f80 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  stDup(pParse->db
11f90 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a  , pOrderBy, 0);.
11fa0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
11fb0 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72   range of tempor
11fc0 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e  ary registers an
11fd0 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65  d the KeyInfo ne
11fe0 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68  eded.  ** for th
11ff0 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d  e logic that rem
12000 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72  oves duplicate r
12010 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20  esult rows when 
12020 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  the.  ** operato
12030 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45  r is UNION, EXCE
12040 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
12050 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20   (but not UNION 
12060 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ALL)..  */.  if(
12070 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
12080 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a     regPrev = 0;.
12090 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
120a0 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   nExpr = p->pELi
120b0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61  st->nExpr;.    a
120c0 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
120d0 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61  =nExpr || db->ma
120e0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
120f0 20 20 72 65 67 50 72 65 76 20 3d 20 73 71 6c 69    regPrev = sqli
12100 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
12110 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 31 29  pParse, nExpr+1)
12120 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12130 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
12140 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65  teger, 0, regPre
12150 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20  v);.    pKeyDup 
12160 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
12170 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20  cZero(db,.      
12180 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
12190 6f 66 28 2a 70 4b 65 79 44 75 70 29 20 2b 20 6e  of(*pKeyDup) + n
121a0 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  Expr*(sizeof(Col
121b0 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 20  lSeq*)+1) );.   
121c0 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a   if( pKeyDup ){.
121d0 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
121e0 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
121f0 29 26 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c  )&pKeyDup->aColl
12200 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 20 20 70  [nExpr];.      p
12210 4b 65 79 44 75 70 2d 3e 6e 46 69 65 6c 64 20 3d  KeyDup->nField =
12220 20 28 75 31 36 29 6e 45 78 70 72 3b 0a 20 20 20   (u16)nExpr;.   
12230 20 20 20 70 4b 65 79 44 75 70 2d 3e 65 6e 63 20     pKeyDup->enc 
12240 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20  = ENC(db);.     
12250 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
12260 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
12270 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b   pKeyDup->aColl[
12280 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  i] = multiSelect
12290 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
122a0 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70  p, i);.        p
122b0 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64  KeyDup->aSortOrd
122c0 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  er[i] = 0;.     
122d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20   }.    }.  }. . 
122e0 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65   /* Separate the
122f0 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69   left and the ri
12300 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f  ght query from o
12310 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a  ne another.  */.
12320 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
12330 0a 20 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68  .  pPrior->pRigh
12340 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 73 71 6c  tmost = 0;.  sql
12350 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
12360 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
12370 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  p, p->pOrderBy, 
12380 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20  "ORDER");.  if( 
12390 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d  pPrior->pPrior==
123a0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
123b0 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
123c0 70 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69  pBy(pParse, pPri
123d0 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  or, pPrior->pOrd
123e0 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
123f0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
12400 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69  e the limit regi
12410 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75  sters */.  compu
12420 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
12430 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65  (pParse, p, labe
12440 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  lEnd);.  if( p->
12450 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b  iLimit && op==TK
12460 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c  _ALL ){.    regL
12470 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65  imitA = ++pParse
12480 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c  ->nMem;.    regL
12490 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  imitB = ++pParse
124a0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
124b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
124c0 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66   OP_Copy, p->iOf
124d0 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65  fset ? p->iOffse
124e0 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c  t+1 : p->iLimit,
124f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12510 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20     regLimitA);. 
12520 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12530 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
12540 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c   regLimitA, regL
12550 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b  imitB);.  }else{
12560 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d  .    regLimitA =
12570 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a   regLimitB = 0;.
12580 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
12590 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
125a0 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69  Limit);.  p->pLi
125b0 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  mit = 0;.  sqlit
125c0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
125d0 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20   p->pOffset);.  
125e0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
125f0 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b  .  regAddrA = ++
12600 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
12610 72 65 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72  regEofA = ++pPar
12620 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41  se->nMem;.  regA
12630 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrB = ++pParse-
12640 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42  >nMem;.  regEofB
12650 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
12660 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b  m;.  regOutA = +
12670 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
12680 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61   regOutB = ++pPa
12690 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
126a0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
126b0 69 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43  it(&destA, SRT_C
126c0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
126d0 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  rA);.  sqlite3Se
126e0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
126f0 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  stB, SRT_Corouti
12700 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a  ne, regAddrB);..
12710 20 20 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20 74    /* Jump past t
12720 68 65 20 76 61 72 69 6f 75 73 20 73 75 62 72 6f  he various subro
12730 75 74 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75  utines and corou
12740 74 69 6e 65 73 20 74 6f 20 74 68 65 20 6d 61 69  tines to the mai
12750 6e 0a 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f  n.  ** merge loo
12760 70 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71  p.  */.  j1 = sq
12770 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
12780 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61  v, OP_Goto);.  a
12790 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c  ddrSelectA = sql
127a0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
127b0 64 64 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47  ddr(v);...  /* G
127c0 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
127d0 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
127e0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
127f0 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ment to the.  **
12800 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d   left of the com
12810 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d  pound operator -
12820 20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e   the "A" select.
12830 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
12840 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67  Comment((v, "Beg
12850 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  in coroutine for
12860 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b   left SELECT"));
12870 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69  .  pPrior->iLimi
12880 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20  t = regLimitA;. 
12890 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
128a0 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
128b0 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  destA);.  sqlite
128c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
128d0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65  P_Integer, 1, re
128e0 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65  gEofA);.  sqlite
128f0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12900 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
12910 41 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f  A);.  VdbeNoopCo
12920 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 63  mment((v, "End c
12930 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66  oroutine for lef
12940 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20  t SELECT"));..  
12950 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f  /* Generate a co
12960 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75  routine to evalu
12970 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ate the SELECT s
12980 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a  tatement on .  *
12990 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20 74 68  * the right - th
129a0 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a  e "B" select.  *
129b0 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42 20  /.  addrSelectB 
129c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
129d0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 56  rentAddr(v);.  V
129e0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
129f0 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74  v, "Begin corout
12a00 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53 45  ine for right SE
12a10 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64  LECT"));.  saved
12a20 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
12a30 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74  t;.  savedOffset
12a40 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
12a50 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67   p->iLimit = reg
12a60 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66  LimitB;.  p->iOf
12a70 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 73 71  fset = 0;  .  sq
12a80 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
12a90 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a  se, p, &destB);.
12aa0 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61    p->iLimit = sa
12ab0 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69  vedLimit;.  p->i
12ac0 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66  Offset = savedOf
12ad0 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56  fset;.  sqlite3V
12ae0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12af0 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45  Integer, 1, regE
12b00 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofB);.  sqlite3V
12b10 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
12b20 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29  Yield, regAddrB)
12b30 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ;.  VdbeNoopComm
12b40 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72  ent((v, "End cor
12b50 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
12b60 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f   SELECT"));..  /
12b70 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
12b80 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
12b90 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
12ba0 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20   row of the A.  
12bb0 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
12bc0 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
12bd0 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
12be0 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
12bf0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
12c00 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74  (v, "Output rout
12c10 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20  ine for A"));.  
12c20 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72  addrOutA = gener
12c30 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
12c40 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
12c50 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
12c60 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72  &destA, pDest, r
12c70 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20  egOutA,.        
12c80 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
12c90 2c 20 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45  , pKeyDup, P4_KE
12ca0 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 2c 20 6c  YINFO_HANDOFF, l
12cb0 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f  abelEnd);.  .  /
12cc0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
12cd0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
12ce0 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
12cf0 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20   row of the B.  
12d00 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
12d10 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
12d20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
12d30 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
12d40 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  if( op==TK_ALL |
12d50 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  | op==TK_UNION )
12d60 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
12d70 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
12d80 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22  t routine for B"
12d90 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42  ));.    addrOutB
12da0 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
12db0 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
12dc0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
12dd0 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20       p, &destB, 
12de0 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a  pDest, regOutB,.
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e00 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
12e10 70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54  p, P4_KEYINFO_ST
12e20 41 54 49 43 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  ATIC, labelEnd);
12e30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
12e40 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
12e50 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
12e60 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
12e70 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20  lect A.  ** are 
12e80 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
12e90 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
12ea0 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t B remains..  *
12eb0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
12ec0 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73  ent((v, "eof-A s
12ed0 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
12ee0 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50  if( op==TK_EXCEP
12ef0 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45  T || op==TK_INTE
12f00 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
12f10 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56  rEofA = sqlite3V
12f20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12f30 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 45 6e  Goto, 0, labelEn
12f40 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  d);.  }else{  . 
12f50 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71     addrEofA = sq
12f60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12f70 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
12f80 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  B, labelEnd);.  
12f90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12fa0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
12fb0 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
12fc0 74 42 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tB);.    sqlite3
12fd0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
12fe0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
12ff0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13000 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
13010 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 41  oto, 0, addrEofA
13020 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
13030 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
13040 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74  ne to run when t
13050 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
13060 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72  select B.  ** ar
13070 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20  e exhausted and 
13080 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c  only data in sel
13090 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20  ect A remains.. 
130a0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
130b0 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
130c0 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64    addrEofB = add
130d0 72 45 6f 66 41 3b 0a 20 20 7d 65 6c 73 65 7b 20  rEofA;.  }else{ 
130e0 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f   .    VdbeNoopCo
130f0 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42  mment((v, "eof-B
13100 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
13110 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73      addrEofB = s
13120 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13130 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
13140 66 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  fA, labelEnd);. 
13150 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13160 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
13170 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
13180 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  utA);.    sqlite
13190 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
131a0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
131b0 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
131c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
131d0 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66  Goto, 0, addrEof
131e0 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  B);.  }..  /* Ge
131f0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
13200 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
13210 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A<B.  */.  Vdb
13220 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
13230 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74   "A-lt-B subrout
13240 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c  ine"));.  addrAl
13250 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
13260 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
13270 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
13280 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  rOutA);.  sqlite
13290 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
132a0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
132b0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
132c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
132d0 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45  , regEofA, addrE
132e0 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofA);.  sqlite3V
132f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13300 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d  Goto, 0, labelCm
13310 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  pr);..  /* Gener
13320 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
13330 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
13340 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ==B.  */.  if( o
13350 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
13360 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
13370 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66  AltB;.  }else if
13380 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ( op==TK_INTERSE
13390 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65  CT ){.    addrAe
133a0 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20  qB = addrAltB;. 
133b0 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20     addrAltB++;. 
133c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65   }else{.    Vdbe
133d0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
133e0 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69  "A-eq-B subrouti
133f0 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41  ne"));.    addrA
13400 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65  eqB =.    sqlite
13410 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
13420 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
13430 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
13440 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13450 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64  If, regEofA, add
13460 72 45 6f 66 41 29 3b 0a 20 20 20 20 73 71 6c 69  rEofA);.    sqli
13470 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13480 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
13490 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  elCmpr);.  }..  
134a0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
134b0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
134c0 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a  ase of A>B.  */.
134d0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
134e0 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75  t((v, "A-gt-B su
134f0 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
13500 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65  ddrAgtB = sqlite
13510 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
13520 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  (v);.  if( op==T
13530 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
13540 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c  UNION ){.    sql
13550 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13560 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
13570 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
13580 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
13590 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
135a0 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  eld, regAddrB);.
135b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
135c0 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
135d0 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29  gEofB, addrEofB)
135e0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
135f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
13600 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  , 0, labelCmpr);
13610 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65  ..  /* This code
13620 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e   runs once to in
13630 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68  itialize everyth
13640 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ing..  */.  sqli
13650 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
13660 76 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65  v, j1);.  sqlite
13670 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13680 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
13690 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65  gEofA);.  sqlite
136a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
136b0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
136c0 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65  gEofB);.  sqlite
136d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
136e0 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72  P_Gosub, regAddr
136f0 41 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b  A, addrSelectA);
13700 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13710 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
13720 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72  , regAddrB, addr
13730 53 65 6c 65 63 74 42 29 3b 0a 20 20 73 71 6c 69  SelectB);.  sqli
13740 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13750 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c   OP_If, regEofA,
13760 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71   addrEofA);.  sq
13770 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13780 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
13790 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 0a 20  B, addrEofB);.. 
137a0 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68   /* Implement th
137b0 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f  e main merge loo
137c0 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
137d0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
137e0 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
137f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13800 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74  Op4(v, OP_Permut
13810 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20  ation, 0, 0, 0, 
13820 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c  (char*)aPermute,
13830 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20   P4_INTARRAY);. 
13840 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13850 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
13860 2c 20 64 65 73 74 41 2e 69 4d 65 6d 2c 20 64 65  , destA.iMem, de
13870 73 74 42 2e 69 4d 65 6d 2c 20 6e 4f 72 64 65 72  stB.iMem, nOrder
13880 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
13890 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
138a0 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50  ar*)pKeyMerge, P
138b0 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
138c0 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  F);.  sqlite3Vdb
138d0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
138e0 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64  mp, addrAltB, ad
138f0 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42  drAeqB, addrAgtB
13900 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65  );..  /* Release
13910 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
13920 74 65 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ters.  */.  if( 
13930 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 73  regPrev ){.    s
13940 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
13950 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
13960 65 67 50 72 65 76 2c 20 6e 4f 72 64 65 72 42 79  egPrev, nOrderBy
13970 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  +1);.  }..  /* J
13980 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73 20  ump to the this 
13990 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  point in order t
139a0 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
139b0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71  query..  */.  sq
139c0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
139d0 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e  Label(v, labelEn
139e0 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  d);..  /* Set th
139f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
13a00 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ut columns.  */.
13a10 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
13a20 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
13a30 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46  {.    Select *pF
13a40 69 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20  irst = pPrior;. 
13a50 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
13a60 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
13a70 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
13a80 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65  or;.    generate
13a90 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
13aa0 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
13ab0 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  EList);.  }..  /
13ac0 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65  * Reassembly the
13ad0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
13ae0 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
13af0 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74  be freed correct
13b00 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63  ly.  ** by the c
13b10 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
13b20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
13b30 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
13b40 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
13b50 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
13b60 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  }.  p->pPrior = 
13b70 70 50 72 69 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20  pPrior;..  /*** 
13b80 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62  TBD:  Insert sub
13b90 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f  routine calls to
13ba0 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f   close cursors o
13bb0 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a  n incomplete.  *
13bc0 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a  *** subqueries *
13bd0 2a 2a 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51  ***/.  return SQ
13be0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
13bf0 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
13c00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
13c10 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
13c20 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
13c30 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44  EW)./* Forward D
13c40 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73  eclarations */.s
13c50 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
13c60 45 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33  ExprList(sqlite3
13c70 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e  *, ExprList*, in
13c80 74 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  t, ExprList*);.s
13c90 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
13ca0 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c  Select(sqlite3*,
13cb0 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20   Select *, int, 
13cc0 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a  ExprList *);../*
13cd0 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68  .** Scan through
13ce0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
13cf0 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20  pExpr.  Replace 
13d00 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20  every reference 
13d10 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69  to.** a column i
13d20 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  n table number i
13d30 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70  Table with a cop
13d40 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e  y of the iColumn
13d50 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  -th.** entry in 
13d60 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65  pEList.  (But le
13d70 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ave references t
13d80 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75  o the ROWID colu
13d90 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  mn .** unchanged
13da0 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .).**.** This ro
13db0 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66  utine is part of
13dc0 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20   the flattening 
13dd0 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75  procedure.  A su
13de0 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20  bquery.** whose 
13df0 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65  result set is de
13e00 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20  fined by pEList 
13e10 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79  appears as entry
13e20 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20   in the.** FROM 
13e30 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
13e40 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65  CT such that the
13e50 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73   VDBE cursor ass
13e60 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a  igned to that.**
13e70 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74   FORM clause ent
13e80 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54  ry is iTable.  T
13e90 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
13ea0 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a   the necessary .
13eb0 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45  ** changes to pE
13ec0 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72  xpr so that it r
13ed0 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
13ee0 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  o the source tab
13ef0 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62  le.** of the sub
13f00 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65  query rather the
13f10 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
13f20 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  he subquery..*/.
13f30 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75 62  static Expr *sub
13f40 73 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65  stExpr(.  sqlite
13f50 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a  3 *db,        /*
13f60 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65   Report malloc e
13f70 72 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f  rrors to this co
13f80 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  nnection */.  Ex
13f90 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
13fa0 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69    /* Expr in whi
13fb0 63 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  ch substitution 
13fc0 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20  occurs */.  int 
13fd0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
13fe0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73  /* Table to be s
13ff0 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20  ubstituted */.  
14000 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
14010 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
14020 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f  e expressions */
14030 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  .){.  if( pExpr=
14040 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
14050 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
14060 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
14070 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  pr->iTable==iTab
14080 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  le ){.    if( pE
14090 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
140a0 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  {.      pExpr->o
140b0 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
140c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78   }else{.      Ex
140d0 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  pr *pNew;.      
140e0 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
140f0 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  0 && pExpr->iCol
14100 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  umn<pEList->nExp
14110 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
14120 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
14130 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69  =0 && pExpr->pRi
14140 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
14150 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
14160 70 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  prDup(db, pEList
14170 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ->a[pExpr->iColu
14180 6d 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20  mn].pExpr, 0);. 
14190 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26       if( pNew &&
141a0 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 7b   pExpr->pColl ){
141b0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
141c0 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43  Coll = pExpr->pC
141d0 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
141e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
141f0 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
14200 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
14210 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  New;.    }.  }el
14220 73 65 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70  se{.    pExpr->p
14230 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70 72  Left = substExpr
14240 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  (db, pExpr->pLef
14250 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
14260 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70  t);.    pExpr->p
14270 52 69 67 68 74 20 3d 20 73 75 62 73 74 45 78 70  Right = substExp
14280 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69  r(db, pExpr->pRi
14290 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ght, iTable, pEL
142a0 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78  ist);.    if( Ex
142b0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
142c0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
142d0 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73  t) ){.      subs
142e0 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70  tSelect(db, pExp
142f0 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 54  r->x.pSelect, iT
14300 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
14310 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14320 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
14330 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
14340 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
14350 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
14360 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73  eturn pExpr;.}.s
14370 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
14380 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69  ExprList(.  sqli
14390 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
143a0 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
143b0 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f  c errors here */
143c0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
143d0 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st,     /* List 
143e0 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77  to scan and in w
143f0 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
14400 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e  stitutes */.  in
14410 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
14420 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
14430 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f  e substituted */
14440 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
14450 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74  ist     /* Subst
14460 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a  itute values */.
14470 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
14480 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
14490 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
144a0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
144b0 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d  i++){.    pList-
144c0 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75  >a[i].pExpr = su
144d0 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73  bstExpr(db, pLis
144e0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
144f0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
14500 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
14510 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20  d substSelect(. 
14520 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
14530 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
14540 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65  malloc errors he
14550 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  re */.  Select *
14560 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
14570 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
14580 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b   in which to mak
14590 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
145a0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
145b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
145c0 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65  le to be replace
145d0 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
145e0 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
145f0 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
14600 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
14610 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74   *pSrc;.  struct
14620 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
14630 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
14640 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
14650 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
14660 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  t(db, p->pEList,
14670 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
14680 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
14690 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42  t(db, p->pGroupB
146a0 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  y, iTable, pELis
146b0 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  t);.  substExprL
146c0 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ist(db, p->pOrde
146d0 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  rBy, iTable, pEL
146e0 69 73 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76 69  ist);.  p->pHavi
146f0 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ng = substExpr(d
14700 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69  b, p->pHaving, i
14710 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
14720 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75    p->pWhere = su
14730 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70  bstExpr(db, p->p
14740 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70  Where, iTable, p
14750 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53  EList);.  substS
14760 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72  elect(db, p->pPr
14770 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ior, iTable, pEL
14780 69 73 74 29 3b 0a 20 20 70 53 72 63 20 3d 20 70  ist);.  pSrc = p
14790 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
147a0 28 20 70 53 72 63 20 29 3b 20 20 2f 2a 20 45 76  ( pSrc );  /* Ev
147b0 65 6e 20 66 6f 72 20 28 53 45 4c 45 43 54 20 31  en for (SELECT 1
147c0 29 20 77 65 20 68 61 76 65 3a 20 70 53 72 63 21  ) we have: pSrc!
147d0 3d 30 20 62 75 74 20 70 53 72 63 2d 3e 6e 53 72  =0 but pSrc->nSr
147e0 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41 4c  c==0 */.  if( AL
147f0 57 41 59 53 28 70 53 72 63 29 20 29 7b 0a 20 20  WAYS(pSrc) ){.  
14800 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
14810 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e  rc, pItem=pSrc->
14820 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
14830 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62  em++){.      sub
14840 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 49 74  stSelect(db, pIt
14850 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61  em->pSelect, iTa
14860 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
14870 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
14880 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
14890 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
148a0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
148b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
148c0 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
148d0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
148e0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
148f0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
14900 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73  VIEW)./*.** This
14910 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
14920 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62  s to flatten sub
14930 71 75 65 72 69 65 73 20 69 6e 20 6f 72 64 65 72  queries in order
14940 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78 65   to speed.** exe
14950 63 75 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75  cution.  It retu
14960 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65  rns 1 if it make
14970 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20  s changes and 0 
14980 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67  if no flattening
14990 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  .** occurs..**.*
149a0 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  * To understand 
149b0 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66  the concept of f
149c0 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69  lattening, consi
149d0 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
149e0 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  g.** query:.**.*
149f0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
14a00 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20  ROM (SELECT x+y 
14a10 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
14a20 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20  RE z<100) WHERE 
14a30 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  a>5.**.** The de
14a40 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70  fault way of imp
14a50 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71  lementing this q
14a60 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75  uery is to execu
14a70 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65  te the.** subque
14a80 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f  ry first and sto
14a90 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
14aa0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
14ab0 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e  ble, then.** run
14ac0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
14ad0 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
14ae0 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  ry table.  This 
14af0 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20  requires two.** 
14b00 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20  passes over the 
14b10 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f  data.  Furthermo
14b20 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  re, because the 
14b30 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
14b40 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65  ** has no indice
14b50 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  s, the WHERE cla
14b60 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72  use on the outer
14b70 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65   query cannot be
14b80 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a  .** optimized..*
14b90 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14ba0 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  e attempts to re
14bb0 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75  write queries su
14bc0 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20  ch as the above 
14bd0 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
14be0 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69   flat select, li
14bf0 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
14c00 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53     SELECT x+y AS
14c10 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
14c20 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a   z<100 AND a>5.*
14c30 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65  *.** The code ge
14c40 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73  nerated for this
14c50 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67   simpification g
14c60 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65  ives the same re
14c70 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79  sult.** but only
14c80 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65   has to scan the
14c90 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64   data once.  And
14ca0 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73   because indices
14cb0 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74   might .** exist
14cc0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31   on the table t1
14cd0 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61  , a complete sca
14ce0 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69  n of the data mi
14cf0 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65  ght be.** avoide
14d00 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e  d..**.** Flatten
14d10 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65  ing is only atte
14d20 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20  mpted if all of 
14d30 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
14d40 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
14d50 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (1)  The subquer
14d60 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
14d70 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
14d80 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  h use aggregates
14d90 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54  ..**.**   (2)  T
14da0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
14db0 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
14dc0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
14dd0 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
14de0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54  ..**.**   (3)  T
14df0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
14e00 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  ot the right ope
14e10 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f  rand of a left o
14e20 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20  uter join.**    
14e30 20 20 20 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20      (Originally 
14e40 74 69 63 6b 65 74 20 23 33 30 36 2e 20 20 53 74  ticket #306.  St
14e50 72 65 6e 67 68 74 65 6e 65 64 20 62 79 20 74 69  renghtened by ti
14e60 63 6b 65 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a  cket #3300).**.*
14e70 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62  *   (4)  The sub
14e80 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53  query is not DIS
14e90 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74  TINCT or the out
14ea0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
14eb0 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
14ec0 28 35 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (5)  The subquer
14ed0 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
14ee0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
14ef0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
14f00 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72  e.**        aggr
14f10 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  egates..**.**   
14f20 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (6)  The subquer
14f30 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
14f40 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
14f50 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
14f60 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
14f70 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
14f80 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
14f90 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61  y has a FROM cla
14fa0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29  use..**.**   (8)
14fb0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
14fc0 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
14fd0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
14fe0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
14ff0 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20  in..**.**   (9) 
15000 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
15010 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
15020 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
15030 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
15040 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
15050 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  gates..**.**  (1
15060 30 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  0)  The subquery
15070 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
15080 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
15090 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
150a0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75   not.**        u
150b0 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20  se LIMIT..**.** 
150c0 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75   (11)  The subqu
150d0 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
150e0 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
150f0 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42  oth have ORDER B
15100 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  Y clauses..**.**
15110 20 20 28 31 32 29 20 20 4e 6f 74 20 69 6d 70 6c    (12)  Not impl
15120 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d  emented.  Subsum
15130 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74  ed into restrict
15140 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72  ion (3).  Was pr
15150 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20  eviously.**     
15160 20 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65     a separate re
15170 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69  striction derivi
15180 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23  ng from ticket #
15190 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29  350..**.**  (13)
151a0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
151b0 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  nd outer query d
151c0 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c  o not both use L
151d0 49 4d 49 54 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29  IMIT.**.**  (14)
151e0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
151f0 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53  oes not use OFFS
15200 45 54 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20  ET.**.**  (15)  
15210 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
15220 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
15230 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
15240 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   or the.**      
15250 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20    subquery does 
15260 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 61 6e  not have both an
15270 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 61 20   ORDER BY and a 
15280 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a  LIMIT clause..**
15290 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63          (See tic
152a0 6b 65 74 20 23 32 33 33 39 29 0a 2a 2a 0a 2a 2a  ket #2339).**.**
152b0 20 20 28 31 36 29 20 20 54 68 65 20 6f 75 74 65    (16)  The oute
152c0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
152d0 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74  n aggregate or t
152e0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
152f0 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74 20 63  .**        not c
15300 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2e  ontain ORDER BY.
15310 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29    (Ticket #2942)
15320 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e    This used to n
15330 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20  ot matter.**    
15340 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74      until we int
15350 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75  roduced the grou
15360 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74  p_concat() funct
15370 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31  ion.  .**.**  (1
15380 37 29 20 20 54 68 65 20 73 75 62 2d 71 75 65 72  7)  The sub-quer
15390 79 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f  y is not a compo
153a0 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72 20 69  und select, or i
153b0 74 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t is a UNION ALL
153c0 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70   .**        comp
153d0 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d 61 64 65  ound clause made
153e0 20 75 70 20 65 6e 74 69 72 65 6c 79 20 6f 66 20   up entirely of 
153f0 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75  non-aggregate qu
15400 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20  eries, and .**  
15410 20 20 20 20 20 20 74 68 65 20 70 61 72 65 6e 74        the parent
15420 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
15430 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
15440 69 74 73 65 6c 66 20 70 61 72 74 20 6f 66 20 61  itself part of a
15450 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
15460 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20  ,.**          * 
15470 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
15480 61 74 65 20 6f 72 20 44 49 53 54 49 4e 43 54 20  ate or DISTINCT 
15490 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20  query, and.**   
154a0 20 20 20 20 20 20 20 2a 20 68 61 73 20 6e 6f 20         * has no 
154b0 6f 74 68 65 72 20 74 61 62 6c 65 73 20 6f 72 20  other tables or 
154c0 73 75 62 2d 73 65 6c 65 63 74 73 20 69 6e 20 74  sub-selects in t
154d0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
154e0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65  **.**        The
154f0 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d   parent and sub-
15500 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69  query may contai
15510 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  n WHERE clauses.
15520 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20   Subject to.**  
15530 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29        rules (11)
15540 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c  , (13) and (14),
15550 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63   they may also c
15560 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c  ontain ORDER BY,
15570 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54  .**        LIMIT
15580 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75   and OFFSET clau
15590 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29  ses..**.**  (18)
155a0 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
155b0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
155c0 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c   select, then al
155d0 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  l terms of the.*
155e0 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 62  *        ORDER b
155f0 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  y clause of the 
15600 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73  parent must be s
15610 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  imple references
15620 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63   to .**        c
15630 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75  olumns of the su
15640 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
15650 28 31 39 29 20 20 54 68 65 20 73 75 62 71 75 65  (19)  The subque
15660 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
15670 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
15680 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
15690 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65  t.**        have
156a0 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
156b0 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66  .**.**  (20)  If
156c0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
156d0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
156e0 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ect, then it mus
156f0 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  t not use.**    
15700 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20      an ORDER BY 
15710 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20  clause.  Ticket 
15720 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64  #3773.  We could
15730 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73   relax this cons
15740 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20  traint.**       
15750 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79   somewhat by say
15760 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72  ing that the ter
15770 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
15780 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a  BY clause must.*
15790 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20  *        appear 
157a0 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65  as unmodified re
157b0 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  sult columns in 
157c0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
157d0 20 20 42 75 74 0a 2a 2a 20 20 20 20 20 20 20 20    But.**        
157e0 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d  have other optim
157f0 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64  izations in mind
15800 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68   to deal with th
15810 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  at case..**.** I
15820 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  n this routine, 
15830 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  the "p" paramete
15840 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
15850 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
15860 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65  y..** The subque
15870 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61  ry is p->pSrc->a
15880 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20  [iFrom].  isAgg 
15890 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
158a0 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73  uter query.** us
158b0 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e  es aggregates an
158c0 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  d subqueryIsAgg 
158d0 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73  is true if the s
158e0 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
158f0 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  regates..**.** I
15900 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
15910 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74  not attempted, t
15920 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
15930 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72   no-op and retur
15940 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74  ns 0..** If flat
15950 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70  tening is attemp
15960 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ted this routine
15970 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a   returns 1..**.*
15980 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70  * All of the exp
15990 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
159a0 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62   must occur on b
159b0 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75  oth the outer qu
159c0 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ery and.** the s
159d0 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74  ubquery before t
159e0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
159f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15a00 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
15a10 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
15a20 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
15a30 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
15a40 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
15a50 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65       /* The pare
15a60 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45  nt or outer SELE
15a70 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
15a80 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20    int iFrom,    
15a90 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
15aa0 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20  in p->pSrc->a[] 
15ab0 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62  of the inner sub
15ac0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
15ad0 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20  sAgg,           
15ae0 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72  /* True if outer
15af0 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67   SELECT uses agg
15b00 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
15b10 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65   */.  int subque
15b20 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72  ryIsAgg    /* Tr
15b30 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
15b40 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
15b50 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
15b60 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
15b70 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
15b80 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
15b90 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65  hContext;.  Sele
15ba0 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53  ct *pParent;.  S
15bb0 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20  elect *pSub;    
15bc0 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20     /* The inner 
15bd0 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65  query or "subque
15be0 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ry" */.  Select 
15bf0 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20  *pSub1;      /* 
15c00 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  Pointer to the r
15c10 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20  ightmost select 
15c20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a  in sub-query */.
15c30 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
15c40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
15c50 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
15c60 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
15c70 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72   SrcList *pSubSr
15c80 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
15c90 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
15ca0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70  ubquery */.  Exp
15cb0 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
15cc0 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
15cd0 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  et of the outer 
15ce0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
15cf0 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f  Parent;        /
15d00 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  * VDBE cursor nu
15d10 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62  mber of the pSub
15d20 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70   result set temp
15d30 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
15d40 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
15d50 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
15d60 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
15d70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
15d80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
15d90 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
15da0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
15db0 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20  em *pSubitem;   
15dc0 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
15dd0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
15de0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
15df0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
15e00 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  e if flattening 
15e10 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52  is permitted.  R
15e20 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a  eturn 0 if not..
15e30 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
15e40 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
15e50 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
15e60 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66    /* Unable to f
15e70 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20  latten compound 
15e80 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 70 53 72  queries */.  pSr
15e90 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
15ea0 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69  ssert( pSrc && i
15eb0 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d  From>=0 && iFrom
15ec0 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20  <pSrc->nSrc );. 
15ed0 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72   pSubitem = &pSr
15ee0 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69  c->a[iFrom];.  i
15ef0 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65  Parent = pSubite
15f00 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53  m->iCursor;.  pS
15f10 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  ub = pSubitem->p
15f20 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74  Select;.  assert
15f30 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69  ( pSub!=0 );.  i
15f40 66 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71  f( isAgg && subq
15f50 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
15f60 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
15f70 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
15f80 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69  tion (1)  */.  i
15f90 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67  f( subqueryIsAgg
15fa0 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31   && pSrc->nSrc>1
15fb0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
15fc0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
15fd0 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70  tion (2)  */.  p
15fe0 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
15ff0 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
16000 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50  SubSrc );.  /* P
16010 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20  rior to version 
16020 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49  3.1.2, when LIMI
16030 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64  T and OFFSET had
16040 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f   to be simple co
16050 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f  nstants,.  ** no
16060 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  t arbitrary expr
16070 65 73 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c  esssions, we all
16080 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e  owed some combin
16090 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64  ing of LIMIT and
160a0 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
160b0 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20  ause they could 
160c0 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63  be computed at c
160d0 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75  ompile-time.  Bu
160e0 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  t when LIMIT and
160f0 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
16100 61 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78  ame arbitrary ex
16110 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65  pressions, we we
16120 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64  re forced to add
16130 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31   restrictions (1
16140 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29  3).  ** and (14)
16150 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  . */.  if( pSub-
16160 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c  >pLimit && p->pL
16170 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16190 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33   Restriction (13
161a0 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
161b0 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72  >pOffset ) retur
161c0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
161e0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34   Restriction (14
161f0 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 52  ) */.  if( p->pR
16200 69 67 68 74 6d 6f 73 74 20 26 26 20 70 53 75 62  ightmost && pSub
16210 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 53 75 62  ->pLimit && pSub
16220 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
16230 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16260 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
16270 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20  ction (15) */.  
16280 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d  }.  if( pSubSrc-
16290 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  >nSrc==0 ) retur
162a0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
162b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
162c0 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a  striction (7)  *
162d0 2f 0a 20 20 69 66 28 20 28 28 70 53 75 62 2d 3e  /.  if( ((pSub->
162e0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
162f0 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53  stinct)!=0 || pS
16300 75 62 2d 3e 70 4c 69 6d 69 74 29 20 0a 20 20 20  ub->pLimit) .   
16310 20 20 20 20 20 20 26 26 20 28 70 53 72 63 2d 3e        && (pSrc->
16320 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29  nSrc>1 || isAgg)
16330 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   ){          /* 
16340 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29  Restrictions (4)
16350 28 35 29 28 38 29 28 39 29 20 2a 2f 0a 20 20 20  (5)(8)(9) */.   
16360 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
16370 20 20 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d    .  }.  if( (p-
16380 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
16390 69 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73  istinct)!=0 && s
163a0 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
163b0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
163c0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
163d0 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20  ction (6)  */.  
163e0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  }.  if( p->pOrde
163f0 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  rBy && pSub->pOr
16400 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65  derBy ){.     re
16410 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
16420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16440 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
16450 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (11) */.  }.  i
16460 66 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62  f( isAgg && pSub
16470 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74  ->pOrderBy ) ret
16480 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
16490 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
164a0 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69  tion (16) */.  i
164b0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
164c0 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  && p->pWhere ) r
164d0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
164e0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
164f0 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 0a 20 20  tion (19) */..  
16500 2f 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d  /* OBSOLETE COMM
16510 45 4e 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74  ENT 1:.  ** Rest
16520 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74  riction 3:  If t
16530 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61  he subquery is a
16540 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
16550 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
16560 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20   .  ** not used 
16570 61 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  as the right ope
16580 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72  rand of an outer
16590 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73   join.  Examples
165a0 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a   of why this.  *
165b0 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  * is not allowed
165c0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
165d0 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
165e0 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20  R JOIN (t2 JOIN 
165f0 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  t3).  **.  ** If
16600 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
16610 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
16620 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
16630 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
16640 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f  UTER JOIN t2) JO
16650 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20  IN t3.  **.  ** 
16660 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20  which is not at 
16670 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69  all the same thi
16680 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42  ng..  **.  ** OB
16690 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32  SOLETE COMMENT 2
166a0 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69  :.  ** Restricti
166b0 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73  on 12:  If the s
166c0 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
166d0 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
166e0 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a  a left outer.  *
166f0 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72  * join, make sur
16700 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68  e the subquery h
16710 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  as no WHERE clau
16720 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d  se..  ** An exam
16730 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
16740 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a   is not allowed:
16750 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
16760 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
16770 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20   JOIN (SELECT * 
16780 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32  FROM t2 WHERE t2
16790 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  .x>0).  **.  ** 
167a0 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
167b0 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
167c0 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
167d0 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
167e0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
167f0 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a  WHERE t2.x>0.  *
16800 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74  *.  ** But the t
16810 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20  2.x>0 test will 
16820 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61  always fail on a
16830 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c   NULL row of t2,
16840 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65   which.  ** effe
16850 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73  ctively converts
16860 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20   the OUTER JOIN 
16870 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f  into an INNER JO
16880 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48  IN..  **.  ** TH
16890 49 53 20 4f 56 45 52 52 49 44 45 53 20 4f 42 53  IS OVERRIDES OBS
168a0 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31  OLETE COMMENTS 1
168b0 20 41 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20 20   AND 2 ABOVE:.  
168c0 2a 2a 20 54 69 63 6b 65 74 20 23 33 33 30 30 20  ** Ticket #3300 
168d0 73 68 6f 77 73 20 74 68 61 74 20 66 6c 61 74 74  shows that flatt
168e0 65 6e 69 6e 67 20 74 68 65 20 72 69 67 68 74 20  ening the right 
168f0 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a  term of a LEFT J
16900 4f 49 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61 75  OIN.  ** is frau
16910 67 68 74 20 77 69 74 68 20 64 61 6e 67 65 72 2e  ght with danger.
16920 20 20 42 65 73 74 20 74 6f 20 61 76 6f 69 64 20    Best to avoid 
16930 74 68 65 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e  the whole thing.
16940 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 73 75    If the.  ** su
16950 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69  bquery is the ri
16960 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45  ght term of a LE
16970 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f  FT JOIN, then do
16980 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20   not flatten..  
16990 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69 74  */.  if( (pSubit
169a0 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  em->jointype & J
169b0 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20  T_OUTER)!=0 ){. 
169c0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
169d0 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ..  /* Restricti
169e0 6f 6e 20 31 37 3a 20 49 66 20 74 68 65 20 73 75  on 17: If the su
169f0 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
16a00 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68  pound SELECT, th
16a10 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20  en it must.  ** 
16a20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49  use only the UNI
16a30 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e  ON ALL operator.
16a40 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65   And none of the
16a50 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71   simple select q
16a60 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74  ueries.  ** that
16a70 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d   make up the com
16a80 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65  pound SELECT are
16a90 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61   allowed to be a
16aa0 67 67 72 65 67 61 74 65 20 6f 72 20 64 69 73 74  ggregate or dist
16ab0 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65  inct.  ** querie
16ac0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
16ad0 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20  ub->pPrior ){.  
16ae0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64    if( pSub->pOrd
16af0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72 65  erBy ){.      re
16b00 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74  turn 0;  /* Rest
16b10 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20  riction 20 */.  
16b20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67    }.    if( isAg
16b30 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67  g || (p->selFlag
16b40 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
16b50 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72  !=0 || pSrc->nSr
16b60 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65  c!=1 ){.      re
16b70 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
16b80 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62    for(pSub1=pSub
16b90 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70  ; pSub1; pSub1=p
16ba0 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Sub1->pPrior){. 
16bb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
16bc0 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
16bd0 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
16be0 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
16bf0 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  F_Distinct );.  
16c00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
16c10 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
16c20 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
16c30 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
16c40 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20  _Aggregate );.  
16c50 20 20 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e      if( (pSub1->
16c60 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
16c70 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
16c80 67 61 74 65 29 29 21 3d 30 0a 20 20 20 20 20 20  gate))!=0.      
16c90 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69   || (pSub1->pPri
16ca0 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21  or && pSub1->op!
16cb0 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20  =TK_ALL) .      
16cc0 20 7c 7c 20 4e 45 56 45 52 28 70 53 75 62 31 2d   || NEVER(pSub1-
16cd0 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 70 53 75  >pSrc==0) || pSu
16ce0 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d  b1->pSrc->nSrc!=
16cf0 31 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  1.      ){.     
16d00 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
16d10 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
16d20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  /* Restriction 1
16d30 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  8. */.    if( p-
16d40 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
16d50 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
16d60 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d   for(ii=0; ii<p-
16d70 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
16d80 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
16d90 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
16da0 2d 3e 61 5b 69 69 5d 2e 69 43 6f 6c 3d 3d 30 20  ->a[ii].iCol==0 
16db0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
16dc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
16dd0 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65   /***** If we re
16de0 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
16df0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
16e00 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a  rmitted. *****/.
16e10 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20  .  /* Authorize 
16e20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
16e30 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
16e40 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74 65  ontext = pSubite
16e50 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69  m->zName;.  sqli
16e60 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
16e70 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
16e80 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  CT, 0, 0, 0);.  
16e90 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
16ea0 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74  text = zSavedAut
16eb0 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20  hContext;..  /* 
16ec0 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
16ed0 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
16ee0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
16ef0 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72 69   then (by restri
16f00 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61  ctions.  ** 17 a
16f10 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74 20  nd 18 above) it 
16f20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20  must be a UNION 
16f30 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65  ALL and the pare
16f40 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20  nt query must . 
16f50 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f   ** be of the fo
16f60 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  rm:.  **.  **   
16f70 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c    SELECT <expr-l
16f80 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d  ist> FROM (<sub-
16f90 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63  query>) <where-c
16fa0 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a  lause> .  **.  *
16fb0 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e  * followed by an
16fc0 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49  y ORDER BY, LIMI
16fd0 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20  T and/or OFFSET 
16fe0 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c  clauses. This bl
16ff0 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73  ock.  ** creates
17000 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74   N-1 copies of t
17010 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
17020 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45  without any ORDE
17030 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a  R BY, LIMIT or .
17040 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75    ** OFFSET clau
17050 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68  ses and joins th
17060 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68  em to the left-h
17070 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20  and-side of the 
17080 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73  original.  ** us
17090 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  ing UNION ALL op
170a0 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73  erators. In this
170b0 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e   case N is the n
170c0 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a  umber of simple.
170d0 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74    ** select stat
170e0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f  ements in the co
170f0 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
17100 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
17110 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
17120 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52     SELECT a+1 FR
17130 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20  OM (.  **       
17140 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
17150 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
17160 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
17170 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46 52       SELECT y FR
17180 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20  OM tab.  **     
17190 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
171a0 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
171b0 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61  abs(z*2) FROM ta
171c0 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48  b2.  **     ) WH
171d0 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42  ERE a!=5 ORDER B
171e0 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72  Y 1.  **.  ** Tr
171f0 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a  ansformed into:.
17200 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
17210 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61  LECT x+1 FROM ta
17220 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20  b WHERE x+1!=5. 
17230 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c   **     UNION AL
17240 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  L.  **     SELEC
17250 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T y+1 FROM tab W
17260 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a  HERE y+1!=5.  **
17270 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
17280 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
17290 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74  bs(z*2)+1 FROM t
172a0 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a  ab2 WHERE abs(z*
172b0 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20  2)+1!=5.  **    
172c0 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
172d0 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68  .  ** We call th
172e0 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64  is the "compound
172f0 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
17300 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ning"..  */.  fo
17310 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  r(pSub=pSub->pPr
17320 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ior; pSub; pSub=
17330 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
17340 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b     Select *pNew;
17350 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
17360 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
17370 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20  derBy;.    Expr 
17380 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  *pLimit = p->pLi
17390 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  mit;.    Select 
173a0 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72  *pPrior = p->pPr
173b0 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  ior;.    p->pOrd
173c0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
173d0 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70  >pSrc = 0;.    p
173e0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
173f0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
17400 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
17410 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
17420 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70   p, 0);.    p->p
17430 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
17440 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
17450 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
17460 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
17470 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41      p->op = TK_A
17480 4c 4c 3b 0a 20 20 20 20 70 2d 3e 70 52 69 67 68  LL;.    p->pRigh
17490 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 69  tmost = 0;.    i
174a0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
174b0 20 20 20 20 70 4e 65 77 20 3d 20 70 50 72 69 6f      pNew = pPrio
174c0 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
174d0 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72      pNew->pPrior
174e0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
174f0 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73   pNew->pRightmos
17500 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
17510 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65   p->pPrior = pNe
17520 77 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  w;.    if( db->m
17530 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
17540 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
17550 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69  * Begin flatteni
17560 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20  ng the iFrom-th 
17570 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
17580 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69  M clause .  ** i
17590 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
175a0 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d  y..  */.  pSub =
175b0 20 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65   pSub1 = pSubite
175c0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f  m->pSelect;..  /
175d0 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61  * Delete the tra
175e0 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72  nsient table str
175f0 75 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65  ucture associate
17600 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
17610 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20  subquery.  */.  
17620 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
17630 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74  , pSubitem->zDat
17640 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  abase);.  sqlite
17650 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
17660 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  item->zName);.  
17670 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
17680 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69  , pSubitem->zAli
17690 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  as);.  pSubitem-
176a0 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a  >zDatabase = 0;.
176b0 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d    pSubitem->zNam
176c0 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  e = 0;.  pSubite
176d0 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20  m->zAlias = 0;. 
176e0 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
176f0 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65  ct = 0;..  /* De
17700 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65  fer deleting the
17710 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73   Table object as
17720 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
17730 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
17740 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72  until code gener
17750 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ation is.  ** co
17760 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68  mplete, since th
17770 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78  ere may still ex
17780 69 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e  ist Expr.pTab en
17790 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  tries that.  ** 
177a0 72 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62  refer to the sub
177b0 71 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72  query even after
177c0 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69   flattening.  Ti
177d0 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a  cket #3346..  **
177e0 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e  .  ** pSubitem->
177f0 70 54 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e  pTab is always n
17800 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20  on-NULL by test 
17810 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64  restrictions and
17820 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20   tests above..  
17830 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  */.  if( ALWAYS(
17840 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d  pSubitem->pTab!=
17850 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  0) ){.    Table 
17860 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75  *pTabToDel = pSu
17870 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bitem->pTab;.   
17880 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e   if( pTabToDel->
17890 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nRef==1 ){.     
178a0 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
178b0 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
178c0 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
178d0 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65  ;.      pTabToDe
178e0 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d  l->pNextZombie =
178f0 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d   pToplevel->pZom
17900 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54  bieTab;.      pT
17910 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
17920 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b  Tab = pTabToDel;
17930 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17940 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65    pTabToDel->nRe
17950 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  f--;.    }.    p
17960 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20  Subitem->pTab = 
17970 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  0;.  }..  /* The
17980 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20   following loop 
17990 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
179a0 63 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d  ch term in a com
179b0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20  pound-subquery. 
179c0 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28   ** flattening (
179d0 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
179e0 76 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20  ve).  If we are 
179f0 64 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  doing a differen
17a00 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66  t kind.  ** of f
17a10 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c  lattening - a fl
17a20 61 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74  attening other t
17a30 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73  han a compound-s
17a40 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69  ubquery flatteni
17a50 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ng -.  ** then t
17a60 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75  his loop only ru
17a70 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20  ns once..  **.  
17a80 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76  ** This loop mov
17a90 65 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52  es all of the FR
17aa0 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  OM elements of t
17ab0 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
17ac0 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52   the.  ** the FR
17ad0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
17ae0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
17af0 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73  efore doing this
17b00 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  , remember.  ** 
17b10 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
17b20 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  r for the origin
17b30 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46  al outer query F
17b40 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20  ROM element in. 
17b50 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68   ** iParent.  Th
17b60 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72  e iParent cursor
17b70 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
17b80 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74  sed.  Subsequent
17b90 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   code.  ** will 
17ba0 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  scan expressions
17bb0 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61   looking for iPa
17bc0 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  rent references 
17bd0 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a  and replace.  **
17be0 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65   those reference
17bf0 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f  s with expressio
17c00 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20  ns that resolve 
17c10 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
17c20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e  FROM.  ** elemen
17c30 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f  ts we are now co
17c40 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20  pying in..  */. 
17c50 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20   for(pParent=p; 
17c60 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74  pParent; pParent
17c70 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72  =pParent->pPrior
17c80 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  , pSub=pSub->pPr
17c90 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  ior){.    int nS
17ca0 75 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f  ubSrc;.    u8 jo
17cb0 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  intype = 0;.    
17cc0 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
17cd0 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f  pSrc;     /* FRO
17ce0 4d 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71  M clause of subq
17cf0 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62  uery */.    nSub
17d00 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e  Src = pSubSrc->n
17d10 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  Src;  /* Number 
17d20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71  of terms in subq
17d30 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65  uery FROM clause
17d40 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70   */.    pSrc = p
17d50 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20  Parent->pSrc;   
17d60 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
17d70 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
17d80 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  ery */..    if( 
17d90 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73  pSrc ){.      as
17da0 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70  sert( pParent==p
17db0 20 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69   );  /* First ti
17dc0 6d 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  me through the l
17dd0 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69  oop */.      joi
17de0 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d  ntype = pSubitem
17df0 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  ->jointype;.    
17e00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
17e10 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20  ert( pParent!=p 
17e20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73  );  /* 2nd and s
17e30 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20  ubsequent times 
17e40 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
17e50 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d   */.      pSrc =
17e60 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
17e70 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
17e80 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20  ppend(db, 0, 0, 
17e90 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  0);.      if( pS
17ea0 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc==0 ){.       
17eb0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
17ec0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
17ed0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17ee0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
17ef0 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75  * The subquery u
17f00 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f  ses a single slo
17f10 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
17f20 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
17f30 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20  r.    ** query. 
17f40 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
17f50 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
17f60 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74  ne element in it
17f70 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20  s FROM clause,. 
17f80 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e     ** then expan
17f90 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
17fa0 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20  y to make space 
17fb0 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61  for it to hold a
17fc0 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20  ll elements.    
17fd0 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
17fe0 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry..    **.    *
17ff0 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
18000 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45  *.    **    SELE
18010 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20  CT * FROM tabA, 
18020 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  (SELECT * FROM s
18030 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42  ub1, sub2), tabB
18040 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
18050 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
18060 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69  has 3 slots in i
18070 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ts FROM clause. 
18080 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65   One slot of the
18090 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
180a0 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20  ery (the middle 
180b0 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79  slot) is used by
180c0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
180d0 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  The next.    ** 
180e0 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69  block of code wi
180f0 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75  ll expand the ou
18100 74 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f  t query to 4 slo
18110 74 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a  ts.  The middle.
18120 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65      ** slot is e
18130 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73  xpanded to two s
18140 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  lots in order to
18150 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20   make space for 
18160 74 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65  the.    ** two e
18170 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46  lements in the F
18180 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
18190 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  e subquery..    
181a0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53  */.    if( nSubS
181b0 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50  rc>1 ){.      pP
181c0 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53  arent->pSrc = pS
181d0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
181e0 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
181f0 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69  Src, nSubSrc-1,i
18200 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69  From+1);.      i
18210 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
18220 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62  led ){.        b
18230 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
18240 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e    }..    /* Tran
18250 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c  sfer the FROM cl
18260 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20  ause terms from 
18270 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
18280 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  o the.    ** out
18290 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f  er query..    */
182a0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
182b0 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
182c0 20 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69       sqlite3IdLi
182d0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72  stDelete(db, pSr
182e0 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55  c->a[i+iFrom].pU
182f0 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72  sing);.      pSr
18300 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20  c->a[i+iFrom] = 
18310 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  pSubSrc->a[i];. 
18320 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75       memset(&pSu
18330 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73  bSrc->a[i], 0, s
18340 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61  izeof(pSubSrc->a
18350 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  [i]));.    }.   
18360 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
18370 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74  jointype = joint
18380 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e  ype;.  .    /* N
18390 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74  ow begin substit
183a0 75 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72  uting subquery r
183b0 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73  esult set expres
183c0 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a  sions for .    *
183d0 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * references to 
183e0 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74  the iParent in t
183f0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
18400 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45      ** .    ** E
18410 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
18420 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61     **   SELECT a
18430 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53  +5, b*10 FROM (S
18440 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20  ELECT x*3 AS a, 
18450 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74  y+10 AS b FROM t
18460 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20  1) WHERE a>b;.  
18470 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20    **   \        
18480 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
18490 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71  ___________ subq
184a0 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  uery __________/
184b0 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20            /.    
184c0 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  **    \_________
184d0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74  ____________ out
184e0 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  er query _______
184f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18500 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a  _______/.    **.
18510 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61      ** We look a
18520 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  t every expressi
18530 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  on in the outer 
18540 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20  query and every 
18550 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20  place we see.   
18560 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74   ** "a" we subst
18570 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20  itute "x*3" and 
18580 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
18590 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69  ee "b" we substi
185a0 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20  tute "y+10"..   
185b0 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   */.    pList = 
185c0 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b  pParent->pEList;
185d0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
185e0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
185f0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  +){.      if( pL
18600 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d  ist->a[i].zName=
18610 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
18620 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 61 6e 20  nst char *zSpan 
18630 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53  = pList->a[i].zS
18640 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pan;.        if(
18650 20 41 4c 57 41 59 53 28 7a 53 70 61 6e 29 20 29   ALWAYS(zSpan) )
18660 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 69 73  {.          pLis
18670 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
18680 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
18690 64 62 2c 20 7a 53 70 61 6e 29 3b 0a 20 20 20 20  db, zSpan);.    
186a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
186b0 20 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70    }.    substExp
186c0 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e  rList(db, pParen
186d0 74 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65  t->pEList, iPare
186e0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
186f0 29 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67  );.    if( isAgg
18700 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45   ){.      substE
18710 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
18720 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  ent->pGroupBy, i
18730 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
18740 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61  List);.      pPa
18750 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
18760 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50  substExpr(db, pP
18770 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20  arent->pHaving, 
18780 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
18790 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
187a0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64    if( pSub->pOrd
187b0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 61 73  erBy ){.      as
187c0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
187d0 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
187e0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72      pParent->pOr
187f0 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f  derBy = pSub->pO
18800 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53  rderBy;.      pS
18810 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ub->pOrderBy = 0
18820 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
18830 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
18840 79 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  y ){.      subst
18850 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61  ExprList(db, pPa
18860 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20  rent->pOrderBy, 
18870 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
18880 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
18890 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65    if( pSub->pWhe
188a0 72 65 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65  re ){.      pWhe
188b0 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
188c0 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57  Dup(db, pSub->pW
188d0 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65  here, 0);.    }e
188e0 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72  lse{.      pWher
188f0 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 0;.    }.   
18900 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
18910 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  gg ){.      asse
18920 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  rt( pParent->pHa
18930 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ving==0 );.     
18940 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
18950 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  g = pParent->pWh
18960 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65  ere;.      pPare
18970 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  nt->pWhere = pWh
18980 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65  ere;.      pPare
18990 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75  nt->pHaving = su
189a0 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72  bstExpr(db, pPar
189b0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  ent->pHaving, iP
189c0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
189d0 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
189e0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
189f0 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
18a00 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  , pParent->pHavi
18a10 6e 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ng, .           
18a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
18a40 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  prDup(db, pSub->
18a50 70 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20  pHaving, 0));.  
18a60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
18a70 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ent->pGroupBy==0
18a80 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
18a90 74 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  t->pGroupBy = sq
18aa0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
18ab0 28 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75  (db, pSub->pGrou
18ac0 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  pBy, 0);.    }el
18ad0 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  se{.      pParen
18ae0 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73  t->pWhere = subs
18af0 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e  tExpr(db, pParen
18b00 74 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65  t->pWhere, iPare
18b10 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
18b20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
18b30 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
18b40 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50  e3ExprAnd(db, pP
18b50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70  arent->pWhere, p
18b60 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Where);.    }.  
18b70 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74  .    /* The flat
18b80 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64  tened query is d
18b90 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65  istinct if eithe
18ba0 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74  r the inner or t
18bb0 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
18bc0 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
18bd0 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  t. .    */.    p
18be0 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73  Parent->selFlags
18bf0 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61   |= pSub->selFla
18c00 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
18c10 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ;.  .    /*.    
18c20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  ** SELECT ... FR
18c30 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c  OM (SELECT ... L
18c40 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29  IMIT a OFFSET b)
18c50 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20   LIMIT x OFFSET 
18c60 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y;.    **.    **
18c70 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20   One is tempted 
18c80 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20  to try to add a 
18c90 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65  and b to combine
18ca0 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75   the limits.  Bu
18cb0 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f  t this.    ** do
18cc0 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65  es not work if e
18cd0 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e  ither limit is n
18ce0 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a  egative..    */.
18cf0 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c      if( pSub->pL
18d00 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50  imit ){.      pP
18d10 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20  arent->pLimit = 
18d20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20  pSub->pLimit;.  
18d30 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74      pSub->pLimit
18d40 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
18d50 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20  .  /* Finially, 
18d60 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c  delete what is l
18d70 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  eft of the subqu
18d80 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ery and return. 
18d90 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a   ** success..  *
18da0 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  /.  sqlite3Selec
18db0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
18dc0 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b  1);..  return 1;
18dd0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
18de0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
18df0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
18e00 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
18e10 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a  MIT_VIEW) */../*
18e20 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
18e30 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
18e40 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
18e50 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66  gument to see if
18e60 20 69 74 0a 2a 2a 20 69 73 20 61 20 6d 69 6e 28   it.** is a min(
18e70 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
18e80 2e 20 52 65 74 75 72 6e 20 57 48 45 52 45 5f 4f  . Return WHERE_O
18e90 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48  RDERBY_MIN or WH
18ea0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 20  ERE_ORDERBY_MAX 
18eb0 69 66 20 0a 2a 2a 20 69 74 20 69 73 2c 20 6f 72  if .** it is, or
18ec0 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20 41 74   0 otherwise. At
18ed0 20 70 72 65 73 65 6e 74 2c 20 61 20 71 75 65 72   present, a quer
18ee0 79 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  y is considered 
18ef0 74 6f 20 62 65 0a 2a 2a 20 61 20 6d 69 6e 28 29  to be.** a min()
18f00 2f 6d 61 78 28 29 20 71 75 65 72 79 20 69 66 3a  /max() query if:
18f10 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54 68 65 72  .**.**   1. Ther
18f20 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20 6f 62  e is a single ob
18f30 6a 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d  ject in the FROM
18f40 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
18f50 20 32 2e 20 54 68 65 72 65 20 69 73 20 61 20 73   2. There is a s
18f60 69 6e 67 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  ingle expression
18f70 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
18f80 65 74 2c 20 61 6e 64 20 69 74 20 69 73 0a 2a 2a  et, and it is.**
18f90 20 20 20 20 20 20 65 69 74 68 65 72 20 6d 69 6e        either min
18fa0 28 78 29 20 6f 72 20 6d 61 78 28 78 29 2c 20 77  (x) or max(x), w
18fb0 68 65 72 65 20 78 20 69 73 20 61 20 63 6f 6c 75  here x is a colu
18fc0 6d 6e 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2f  mn reference..*/
18fd0 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61  .static u8 minMa
18fe0 78 51 75 65 72 79 28 53 65 6c 65 63 74 20 2a 70  xQuery(Select *p
18ff0 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  ){.  Expr *pExpr
19000 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
19010 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
19020 3b 0a 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d  ;..  if( pEList-
19030 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
19040 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  rn WHERE_ORDERBY
19050 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70 45 78 70 72  _NORMAL;.  pExpr
19060 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e   = pEList->a[0].
19070 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78  pExpr;.  if( pEx
19080 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
19090 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
190a0 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   0;.  if( NEVER(
190b0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
190c0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
190d0 65 63 74 29 29 20 29 20 72 65 74 75 72 6e 20 30  ect)) ) return 0
190e0 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78  ;.  pEList = pEx
190f0 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69  pr->x.pList;.  i
19100 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20  f( pEList==0 || 
19110 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
19120 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
19130 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  f( pEList->a[0].
19140 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
19150 47 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  G_COLUMN ) retur
19160 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  n WHERE_ORDERBY_
19170 4e 4f 52 4d 41 4c 3b 0a 20 20 61 73 73 65 72 74  NORMAL;.  assert
19180 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
19190 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
191a0 56 61 6c 75 65 29 20 29 3b 0a 20 20 69 66 28 20  Value) );.  if( 
191b0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
191c0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22  Expr->u.zToken,"
191d0 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  min")==0 ){.    
191e0 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44  return WHERE_ORD
191f0 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d 65 6c 73  ERBY_MIN;.  }els
19200 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
19210 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
19220 6f 6b 65 6e 2c 22 6d 61 78 22 29 3d 3d 30 20 29  oken,"max")==0 )
19230 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 48 45  {.    return WHE
19240 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a  RE_ORDERBY_MAX;.
19250 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 48 45    }.  return WHE
19260 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
19270 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  L;.}../*.** The 
19280 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
19290 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
192a0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
192b0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75   an aggregate qu
192c0 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ery..** The seco
192d0 6e 64 20 61 72 67 6d 65 6e 74 20 69 73 20 74 68  nd argment is th
192e0 65 20 61 73 73 6f 63 69 61 74 65 64 20 61 67 67  e associated agg
192f0 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65  regate-info obje
19300 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  ct. This .** fun
19310 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74  ction tests if t
19320 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20  he SELECT is of 
19330 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
19340 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
19350 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a  ) FROM <tbl>.**.
19360 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20 69  ** where table i
19370 73 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  s a database tab
19380 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65  le, not a sub-se
19390 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66  lect or view. If
193a0 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f   the query.** do
193b0 65 73 20 6d 61 74 63 68 20 74 68 69 73 20 70 61  es match this pa
193c0 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f  ttern, then a po
193d0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62  inter to the Tab
193e0 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73  le object repres
193f0 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20  enting.** <tbl> 
19400 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
19410 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74  erwise, 0 is ret
19420 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
19430 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65   Table *isSimple
19440 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c  Count(Select *p,
19450 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
19460 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  fo){.  Table *pT
19470 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  ab;.  Expr *pExp
19480 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  r;..  assert( !p
19490 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20  ->pGroupBy );.. 
194a0 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c   if( p->pWhere |
194b0 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  | p->pEList->nEx
194c0 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e  pr!=1 .   || p->
194d0 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c  pSrc->nSrc!=1 ||
194e0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
194f0 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20  Select.  ){.    
19500 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
19510 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pTab = p->pSrc->
19520 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78  a[0].pTab;.  pEx
19530 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
19540 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73  a[0].pExpr;.  as
19550 73 65 72 74 28 20 70 54 61 62 20 26 26 20 21 70  sert( pTab && !p
19560 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20  Tab->pSelect && 
19570 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20  pExpr );..  if( 
19580 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
19590 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
195a0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
195b0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72  AGG_FUNCTION ) r
195c0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
195d0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
195e0 30 5d 2e 70 46 75 6e 63 2d 3e 66 6c 61 67 73 26  0].pFunc->flags&
195f0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e  SQLITE_FUNC_COUN
19600 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  T)==0 ) return 0
19610 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66  ;.  if( pExpr->f
19620 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74  lags&EP_Distinct
19630 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
19640 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
19650 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75  /*.** If the sou
19660 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61  rce-list item pa
19670 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
19680 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65  ent was augmente
19690 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44  d with an.** IND
196a0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
196b0 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61  then try to loca
196c0 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  te the specified
196d0 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65   index. If there
196e0 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20 63  .** was such a c
196f0 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61  lause and the na
19700 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74  med index cannot
19710 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
19720 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  n .** SQLITE_ERR
19730 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20  OR and leave an 
19740 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
19750 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75   Otherwise, popu
19760 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e  late .** pFrom->
19770 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72  pIndex and retur
19780 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
19790 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78  int sqlite3Index
197a0 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65  edByLookup(Parse
197b0 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74   *pParse, struct
197c0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
197d0 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72  From){.  if( pFr
197e0 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f  om->pTab && pFro
197f0 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a 20 20 20  m->zIndex ){.   
19800 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
19810 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
19820 63 68 61 72 20 2a 7a 49 6e 64 65 78 20 3d 20 70  char *zIndex = p
19830 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20  From->zIndex;.  
19840 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
19850 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
19860 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20  ->pIndex; .     
19870 20 20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74     pIdx && sqlit
19880 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e  e3StrICmp(pIdx->
19890 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 29 3b 20  zName, zIndex); 
198a0 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d 70 49  .        pIdx=pI
198b0 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b  dx->pNext.    );
198c0 0a 20 20 20 20 69 66 28 20 21 70 49 64 78 20 29  .    if( !pIdx )
198d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
198e0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
198f0 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
19900 25 73 22 2c 20 7a 49 6e 64 65 78 2c 20 30 29 3b  %s", zIndex, 0);
19910 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
19920 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
19930 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 6e  }.    pFrom->pIn
19940 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a  dex = pIdx;.  }.
19950 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19960 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
19970 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57  s routine is a W
19980 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66  alker callback f
19990 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61  or "expanding" a
199a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
199b0 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67  t..** "Expanding
199c0 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68  " means to do th
199d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
199e0 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20  **    (1)  Make 
199f0 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72  sure VDBE cursor
19a00 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
19a10 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  en assigned to e
19a20 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  very.**         
19a30 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46  element of the F
19a40 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
19a50 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69  *    (2)  Fill i
19a60 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e  n the pTabList->
19a70 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20  a[].pTab fields 
19a80 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  in the SrcList t
19a90 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  hat .**         
19aa0 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61  defines FROM cla
19ab0 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73  use.  When views
19ac0 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
19ad0 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20  ROM clause,.**  
19ae0 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62         fill pTab
19af0 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63  List->a[].pSelec
19b00 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  t with a copy of
19b10 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
19b20 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
19b30 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
19b40 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f   the view.  A co
19b50 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68  py is made of th
19b60 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a  e view's SELECT.
19b70 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65  **         state
19b80 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20  ment so that we 
19b90 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66  can freely modif
19ba0 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74  y or delete that
19bb0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
19bc0 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f        without wo
19bd0 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73  rrying about mes
19be0 73 69 6e 67 20 75 70 20 74 68 65 20 70 72 65 73  sing up the pres
19bf0 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74  istent represent
19c00 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20  ation.**        
19c10 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a   of the view..**
19c20 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20  .**    (3)  Add 
19c30 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45  terms to the WHE
19c40 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63  RE clause to acc
19c50 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55  omodate the NATU
19c60 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20  RAL keyword.**  
19c70 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20         on joins 
19c80 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55  and the ON and U
19c90 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a  SING clause of j
19ca0 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  oins..**.**    (
19cb0 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73  4)  Scan the lis
19cc0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  t of columns in 
19cd0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28  the result set (
19ce0 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a  pEList) looking.
19cf0 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69  **         for i
19d00 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
19d10 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  "*" operator or 
19d20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72  the TABLE.* oper
19d30 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ator..**        
19d40 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e   If found, expan
19d50 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65  d each "*" to be
19d60 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
19d70 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20   every table.** 
19d80 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c          and TABL
19d90 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20  E.* to be every 
19da0 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e  column in TABLE.
19db0 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
19dc0 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  t selectExpander
19dd0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
19de0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
19df0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
19e00 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
19e10 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a  .  int i, j, k;.
19e20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
19e30 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
19e40 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  *pEList;.  struc
19e50 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
19e60 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pFrom;.  sqlite3
19e70 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
19e80 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  b;..  if( db->ma
19e90 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20  llocFailed  ){. 
19ea0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
19eb0 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e  ort;.  }.  if( N
19ec0 45 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29  EVER(p->pSrc==0)
19ed0 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   || (p->selFlags
19ee0 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21   & SF_Expanded)!
19ef0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
19f00 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a   WRC_Prune;.  }.
19f10 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
19f20 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20   SF_Expanded;.  
19f30 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
19f40 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  rc;.  pEList = p
19f50 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20  ->pEList;..  /* 
19f60 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72  Make sure cursor
19f70 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
19f80 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  en assigned to a
19f90 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ll entries in.  
19fa0 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
19fb0 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  se of the SELECT
19fc0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
19fd0 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
19fe0 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
19ff0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29  Parse, pTabList)
1a000 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20  ;..  /* Look up 
1a010 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  every table name
1a020 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
1a030 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65  ause of the sele
1a040 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20  ct.  If.  ** an 
1a050 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
1a060 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75  M clause is a su
1a070 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f  bquery instead o
1a080 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
1a090 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65  w,.  ** then cre
1a0a0 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ate a transient 
1a0b0 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
1a0c0 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20  to describe the 
1a0d0 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  subquery..  */. 
1a0e0 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
1a0f0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
1a100 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
1a110 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
1a120 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
1a130 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54     if( pFrom->pT
1a140 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ab!=0 ){.      /
1a150 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
1a160 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1a170 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 65  n prepared.  The
1a180 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
1a190 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72      ** to go fur
1a1a0 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ther. */.      a
1a1b0 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20  ssert( i==0 );. 
1a1c0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
1a1d0 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Prune;.    }.   
1a1e0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d   if( pFrom->zNam
1a1f0 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  e==0 ){.#ifndef 
1a200 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1a210 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63  UERY.      Selec
1a220 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d  t *pSel = pFrom-
1a230 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
1a240 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
1a250 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1a260 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
1a270 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a280 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Sel!=0 );.      
1a290 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
1a2a0 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
1a2b0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
1a2c0 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29  t(pWalker, pSel)
1a2d0 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
1a2e0 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c  Tab = pTab = sql
1a2f0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
1a300 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
1a310 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e));.      if( p
1a320 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
1a330 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
1a340 20 70 54 61 62 2d 3e 64 62 4d 65 6d 20 3d 20 64   pTab->dbMem = d
1a350 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
1a360 61 62 6c 65 64 20 3f 20 64 62 20 3a 20 30 3b 0a  abled ? db : 0;.
1a370 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
1a380 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 61 62   = 1;.      pTab
1a390 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
1a3a0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71  3MPrintf(db, "sq
1a3b0 6c 69 74 65 5f 73 75 62 71 75 65 72 79 5f 25 70  lite_subquery_%p
1a3c0 5f 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29  _", (void*)pTab)
1a3d0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
1a3e0 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70  Sel->pPrior ){ p
1a3f0 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
1a400 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c 65  or; }.      sele
1a410 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  ctColumnsFromExp
1a420 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
1a430 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61  el->pEList, &pTa
1a440 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
1a450 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61  aCol);.      pTa
1a460 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
1a470 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c       pTab->tabFl
1a480 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
1a490 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ral;.#endif.    
1a4a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
1a4b0 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
1a4c0 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69  e or view name i
1a4d0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1a4e0 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
1a4f0 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
1a500 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
1a510 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
1a520 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a530 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
1a540 73 65 2c 30 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d  se,0,pFrom->zNam
1a550 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61  e,pFrom->zDataba
1a560 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  se);.      if( p
1a570 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
1a580 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
1a590 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23   pTab->nRef++;.#
1a5a0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1a5b0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
1a5c0 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54   !defined (SQLIT
1a5d0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1a5e0 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 70  BLE).      if( p
1a5f0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20  Tab->pSelect || 
1a600 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
1a610 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
1a620 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74   reach here if t
1a630 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
1a640 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65  s a really a vie
1a650 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  w */.        if(
1a660 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
1a670 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
1a680 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72  e, pTab) ) retur
1a690 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
1a6a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
1a6b0 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
1a6c0 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  ;.        pFrom-
1a6d0 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
1a6e0 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
1a6f0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pTab->pSelect, 0
1a700 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1a710 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
1a720 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65  lker, pFrom->pSe
1a730 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  lect);.      }.#
1a740 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
1a750 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69   /* Locate the i
1a760 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68  ndex named by th
1a770 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  e INDEXED BY cla
1a780 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a  use, if any. */.
1a790 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1a7a0 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70  ndexedByLookup(p
1a7b0 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b  Parse, pFrom) ){
1a7c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
1a7d0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  C_Abort;.    }. 
1a7e0 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73   }..  /* Process
1a7f0 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
1a800 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53  s, and ON and US
1a810 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a  ING clauses of j
1a820 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  oins..  */.  if(
1a830 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1a840 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65  d || sqliteProce
1a850 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70  ssJoin(pParse, p
1a860 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1a870 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
1a880 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22    /* For every "
1a890 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  *" that occurs i
1a8a0 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
1a8b0 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  t, insert the na
1a8c0 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20  mes of.  ** all 
1a8d0 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
1a8e0 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20  ables.  And for 
1a8f0 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e  every TABLE.* in
1a900 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20  sert the names. 
1a910 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d   ** of all colum
1a920 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68  ns in TABLE.  Th
1a930 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65  e parser inserte
1a940 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72  d a special expr
1a950 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68  ession.  ** with
1a960 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72   the TK_ALL oper
1a970 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a  ator for each "*
1a980 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20  " that it found 
1a990 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
1a9a0 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c  st..  ** The fol
1a9b0 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74  lowing code just
1a9c0 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74   has to locate t
1a9d0 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73  he TK_ALL expres
1a9e0 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64  sions and expand
1a9f0 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74  .  ** each one t
1aa00 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
1aa10 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
1aa20 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
1aa30 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f  ** The first loo
1aa40 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f  p just checks to
1aa50 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
1aa60 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74  e any "*" operat
1aa70 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65  ors.  ** that ne
1aa80 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20  ed expanding..  
1aa90 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  */.  for(k=0; k<
1aaa0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
1aab0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
1aac0 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d  E = pEList->a[k]
1aad0 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
1aae0 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  pE->op==TK_ALL )
1aaf0 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65   break;.    asse
1ab00 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
1ab10 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74  OT || pE->pRight
1ab20 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
1ab30 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
1ab40 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21  T || (pE->pLeft!
1ab50 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d  =0 && pE->pLeft-
1ab60 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20  >op==TK_ID) );. 
1ab70 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
1ab80 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69  K_DOT && pE->pRi
1ab90 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  ght->op==TK_ALL 
1aba0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
1abb0 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
1abc0 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
1abd0 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
1abe0 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
1abf0 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
1ac00 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
1ac10 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
1ac20 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
1ac30 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
1ac40 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
1ac50 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
1ac60 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
1ac70 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
1ac80 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
1ac90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
1aca0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1acb0 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
1acc0 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
1acd0 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e  pNew = 0;.    in
1ace0 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65  t flags = pParse
1acf0 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ->db->flags;.   
1ad00 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d   int longNames =
1ad10 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1ad20 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
1ad30 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
1ad40 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67          && (flag
1ad50 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
1ad60 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20  ColNames)==0;.. 
1ad70 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45     for(k=0; k<pE
1ad80 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
1ad90 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
1ada0 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  E = a[k].pExpr;.
1adb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1adc0 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
1add0 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b  pE->pRight!=0 );
1ade0 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  .      if( pE->o
1adf0 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45  p!=TK_ALL && (pE
1ae00 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
1ae10 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d  pE->pRight->op!=
1ae20 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20  TK_ALL) ){.     
1ae30 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
1ae40 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
1ae50 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
1ae60 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
1ae70 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1ae80 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
1ae90 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
1aea0 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b  Parse, pNew, a[k
1aeb0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
1aec0 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
1aed0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
1aee0 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
1aef0 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
1af00 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e;.          pNe
1af10 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
1af20 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d  -1].zSpan = a[k]
1af30 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20  .zSpan;.        
1af40 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
1af50 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
1af60 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20  .zSpan = 0;.    
1af70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b      }.        a[
1af80 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  k].pExpr = 0;.  
1af90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1afa0 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
1afb0 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
1afc0 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
1afd0 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
1afe0 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
1aff0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
1b000 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
1b010 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
1b020 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
1b030 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
1b040 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20  char *zTName;   
1b050 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74           /* text
1b060 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c   of name of TABL
1b070 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  E */.        if(
1b080 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
1b090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
1b0a0 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d  ert( pE->pLeft!=
1b0b0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
1b0c0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1b0d0 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66  roperty(pE->pLef
1b0e0 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  t, EP_IntValue) 
1b0f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  );.          zTN
1b100 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d  ame = pE->pLeft-
1b110 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
1b120 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b130 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a      zTName = 0;.
1b140 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b150 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
1b160 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
1b170 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
1b180 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
1b190 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a           Table *
1b1a0 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
1b1b0 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  ab;.          ch
1b1c0 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
1b1d0 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  From->zAlias;.  
1b1e0 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
1b1f0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
1b200 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20         zTabName 
1b210 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
1b220 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1b230 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
1b240 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
1b250 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  k;.          if(
1b260 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74   zTName && sqlit
1b270 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65  e3StrICmp(zTName
1b280 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29  , zTabName)!=0 )
1b290 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
1b2a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1b2b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61    }.          ta
1b2c0 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20  bleSeen = 1;.   
1b2d0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
1b2e0 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
1b2f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
1b300 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 52  Expr *pExpr, *pR
1b310 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
1b320 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
1b330 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
1b340 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
1b350 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b   char *zColname;
1b360 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65    /* The compute
1b370 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  d column name */
1b380 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
1b390 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a  r *zToFree;   /*
1b3a0 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67   Malloced string
1b3b0 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
1b3c0 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20  e freed */.     
1b3d0 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f         Token sCo
1b3e0 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75  lname;  /* Compu
1b3f0 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ted column name 
1b400 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20  as a token */.. 
1b410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1b420 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72   a column is mar
1b430 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 20  ked as 'hidden' 
1b440 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20  (currently only 
1b450 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
1b460 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74       ** for virt
1b470 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20  ual tables), do 
1b480 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69  not include it i
1b490 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20  n the expanded. 
1b4a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65             ** re
1b4b0 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20  sult-set list.. 
1b4c0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
1b4d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73            if( Is
1b4e0 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54  HiddenColumn(&pT
1b4f0 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a  ab->aCol[j]) ){.
1b500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1b510 73 65 72 74 28 49 73 56 69 72 74 75 61 6c 28 70  sert(IsVirtual(p
1b520 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Tab));.         
1b530 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1b540 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20             }..  
1b550 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
1b560 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29  0 && zTName==0 )
1b570 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1b580 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1b590 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70 54  tem *pLeft = &pT
1b5a0 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a  abList->a[i-1];.
1b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1b5c0 28 20 28 70 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e  ( (pLeft[1].join
1b5d0 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
1b5e0 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20  L)!=0 &&.       
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b600 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65   columnIndex(pLe
1b610 66 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29  ft->pTab, zName)
1b620 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
1b630 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e         /* In a N
1b640 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69  ATURAL join, omi
1b650 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d  t the join colum
1b660 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  ns from the .   
1b670 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1b680 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
1b690 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ht */.          
1b6a0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1b6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1b6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1b6d0 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  ( sqlite3IdListI
1b6e0 6e 64 65 78 28 70 4c 65 66 74 5b 31 5d 2e 70 55  ndex(pLeft[1].pU
1b6f0 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  sing, zName)>=0 
1b700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1b710 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20     /* In a join 
1b720 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61  with a USING cla
1b730 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e  use, omit column
1b740 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s in the.       
1b750 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e           ** usin
1b760 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68  g clause from th
1b770 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  e table on the r
1b780 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ight. */.       
1b790 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1b7a0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
1b7b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
1b7c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
1b7d0 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
1b7e0 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61  r(db, TK_ID, zNa
1b7f0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
1b800 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d   zColname = zNam
1b810 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  e;.            z
1b820 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  ToFree = 0;.    
1b830 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
1b840 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73  Names || pTabLis
1b850 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20  t->nSrc>1 ){.   
1b860 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
1b870 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20  *pLeft;.        
1b880 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71        pLeft = sq
1b890 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
1b8a0 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a  _ID, zTabName);.
1b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1b8c0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
1b8d0 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f  pr(pParse, TK_DO
1b8e0 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  T, pLeft, pRight
1b8f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1b900 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
1b910 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
1b920 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20       zColname = 
1b930 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
1b940 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  b, "%s.%s", zTab
1b950 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Name, zName);.  
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
1b970 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65  oFree = zColname
1b980 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1b990 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  }.            }e
1b9a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1b9b0 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68     pExpr = pRigh
1b9c0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  t;.            }
1b9d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
1b9e0 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
1b9f0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1ba00 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a  , pNew, pExpr);.
1ba10 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c              sCol
1ba20 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d  name.z = zColnam
1ba30 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e;.            s
1ba40 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69  Colname.n = sqli
1ba50 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c  te3Strlen30(zCol
1ba60 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
1ba70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
1ba80 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65  stSetName(pParse
1ba90 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d  , pNew, &sColnam
1baa0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 0);.         
1bab0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1bac0 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20  (db, zToFree);. 
1bad0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1bae0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1baf0 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20   !tableSeen ){. 
1bb00 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
1bb10 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
1bb20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1bb30 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
1bb40 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
1bb50 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  zTName);.       
1bb60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bb70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1bb80 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
1bb90 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69  o tables specifi
1bba0 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed");.          
1bbb0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1bbc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
1bbd0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
1bbe0 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b  ete(db, pEList);
1bbf0 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  .    p->pEList =
1bc00 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53   pNew;.  }.#if S
1bc10 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
1bc20 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
1bc30 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   && p->pEList->n
1bc40 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Expr>db->aLimit[
1bc50 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
1bc60 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  UMN] ){.    sqli
1bc70 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1bc80 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
1bc90 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
1bca0 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  set");.  }.#endi
1bcb0 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  f.  return WRC_C
1bcc0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
1bcd0 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20  * No-op routine 
1bce0 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72  for the parse-tr
1bcf0 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a  ee walker..**.**
1bd00 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
1bd10 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72  ne is the Walker
1bd20 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74  .xExprCallback t
1bd30 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  hen expression t
1bd40 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b  rees.** are walk
1bd50 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61  ed without any a
1bd60 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b  ctions being tak
1bd70 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e  en at each node.
1bd80 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a    Presumably,.**
1bd90 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
1bda0 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 57  ne is used for W
1bdb0 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
1bdc0 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c  ack then .** Wal
1bdd0 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
1bde0 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f  ack is set to do
1bdf0 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75   something usefu
1be00 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20  l for every .** 
1be10 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20  subquery in the 
1be20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a  parser tree..*/.
1be30 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 57  static int exprW
1be40 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a  alkNoop(Walker *
1be50 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e  NotUsed, Expr *N
1be60 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
1be70 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
1be80 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
1be90 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
1bea0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
1beb0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22  * This routine "
1bec0 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43  expands" a SELEC
1bed0 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  T statement and 
1bee0 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75  all of its subqu
1bef0 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64  eries..** For ad
1bf00 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
1bf10 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20  tion on what it 
1bf20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64  means to "expand
1bf30 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  " a SELECT.** st
1bf40 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65  atement, see the
1bf50 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
1bf60 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72  selectExpand wor
1bf70 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f  ker callback abo
1bf80 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64  ve..**.** Expand
1bf90 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74 61  ing a SELECT sta
1bfa0 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  tement is the fi
1bfb0 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63  rst step in proc
1bfc0 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45  essing a.** SELE
1bfd0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  CT statement.  T
1bfe0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1bff0 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70 61  ent must be expa
1c000 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e  nded before.** n
1c010 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69  ame resolution i
1c020 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a  s performed..**.
1c030 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67  ** If anything g
1c040 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72  oes wrong, an er
1c050 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77  ror message is w
1c060 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72  ritten into pPar
1c070 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  se..** The calli
1c080 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20  ng function can 
1c090 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c  detect the probl
1c0a0 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  em by looking at
1c0b0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a   pParse->nErr.**
1c0c0 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e   and/or pParse->
1c0d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c0e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1c0f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
1c100 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72  pand(Parse *pPar
1c110 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
1c120 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  ect){.  Walker w
1c130 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
1c140 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78  lback = selectEx
1c150 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 45 78 70  pander;.  w.xExp
1c160 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
1c170 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
1c180 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
1c190 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
1c1a0 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
1c1b0 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
1c1c0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1c1d0 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  Y./*.** This is 
1c1e0 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  a Walker.xSelect
1c1f0 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63  Callback callbac
1c200 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  k for the sqlite
1c210 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28  3SelectTypeInfo(
1c220 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a  ).** interface..
1c230 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46  **.** For each F
1c240 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
1c250 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e  ery, add Column.
1c260 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e  zType and Column
1c270 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  .zColl.** inform
1c280 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62  ation to the Tab
1c290 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
1c2a0 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
1c2b0 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f   result set.** o
1c2c0 66 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e  f that subquery.
1c2d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  .**.** The Table
1c2e0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1c2f0 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
1c300 65 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f  esult set was co
1c310 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20  nstructed.** by 
1c320 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29  selectExpander()
1c330 20 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e   but the type an
1c340 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
1c350 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74  rmation was omit
1c360 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70  ted.** at that p
1c370 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65  oint because ide
1c380 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74  ntifiers had not
1c390 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76   yet been resolv
1c3a0 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ed.  This.** rou
1c3b0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
1c3c0 66 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20  fter identifier 
1c3d0 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73  resolution..*/.s
1c3e0 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
1c3f0 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
1c400 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  nfo(Walker *pWal
1c410 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
1c420 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1c430 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63  ;.  int i;.  Src
1c440 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
1c450 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1c460 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20  _item *pFrom;.. 
1c470 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46   assert( p->selF
1c480 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
1c490 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ed );.  assert( 
1c4a0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1c4b0 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d  F_HasTypeInfo)==
1c4c0 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  0 );.  p->selFla
1c4d0 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65  gs |= SF_HasType
1c4e0 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d  Info;.  pParse =
1c4f0 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
1c500 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
1c510 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->pSrc;.  for(i=
1c520 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
1c530 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
1c540 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
1c550 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  om++){.    Table
1c560 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
1c570 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 41 4c  pTab;.    if( AL
1c580 57 41 59 53 28 70 54 61 62 21 3d 30 29 20 26 26  WAYS(pTab!=0) &&
1c590 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
1c5a0 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
1c5b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
1c5c0 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
1c5d0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1c5e0 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
1c5f0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
1c600 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
1c610 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
1c620 20 70 53 65 6c 20 29 3b 0a 20 20 20 20 20 20 77   pSel );.      w
1c630 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69  hile( pSel->pPri
1c640 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c  or ) pSel = pSel
1c650 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
1c660 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  selectAddColumnT
1c670 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
1c680 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43  pParse, pTab->nC
1c690 6f 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20  ol, pTab->aCol, 
1c6a0 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pSel);.    }.  }
1c6b0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
1c6c0 6e 74 69 6e 75 65 3b 0a 7d 0a 23 65 6e 64 69 66  ntinue;.}.#endif
1c6d0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
1c6e0 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74  utine adds datat
1c6f0 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ype and collatin
1c700 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72  g sequence infor
1c710 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65  mation to.** the
1c720 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
1c730 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  s of all FROM-cl
1c740 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20  ause subqueries 
1c750 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  in a.** SELECT s
1c760 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
1c770 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  Use this routine
1c780 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f   after name reso
1c790 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
1c7a0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
1c7b0 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
1c7c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1c7d0 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
1c7e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c7f0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
1c800 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53  Walker w;.  w.xS
1c810 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
1c820 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72  selectAddSubquer
1c830 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78  yTypeInfo;.  w.x
1c840 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
1c850 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
1c860 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
1c870 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  ;.  sqlite3WalkS
1c880 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
1c890 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  t);.#endif.}.../
1c8a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1c8b0 65 20 73 65 74 73 20 6f 66 20 61 20 53 45 4c 45  e sets of a SELE
1c8c0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  CT statement for
1c8d0 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68   processing.  Th
1c8e0 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  e.** following i
1c8f0 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a  s accomplished:.
1c900 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42  **.**     *  VDB
1c910 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E Cursor numbers
1c920 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f   are assigned to
1c930 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
1c940 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a   terms..**     *
1c950 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c    Ephemeral Tabl
1c960 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72  e objects are cr
1c970 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52  eated for all FR
1c980 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
1c990 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  ries..**     *  
1c9a0 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
1c9b0 75 73 65 73 20 61 72 65 20 73 68 69 66 74 65 64  uses are shifted
1c9c0 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74   into WHERE stat
1c9d0 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20  ements.**     * 
1c9e0 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61   Wildcards "*" a
1c9f0 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20  nd "TABLE.*" in 
1ca00 72 65 73 75 6c 74 20 73 65 74 73 20 61 72 65 20  result sets are 
1ca10 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20  expanded..**    
1ca20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73 20   *  Identifiers 
1ca30 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72  in expression ar
1ca40 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62  e matched to tab
1ca50 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  les..**.** This 
1ca60 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65 63  routine acts rec
1ca70 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20  ursively on all 
1ca80 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68 69  subqueries withi
1ca90 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f  n the SELECT..*/
1caa0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
1cab0 65 63 74 50 72 65 70 28 0a 20 20 50 61 72 73 65  ectPrep(.  Parse
1cac0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1cad0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
1cae0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
1caf0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1cb00 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
1cb10 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
1cb20 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61  g coded. */.  Na
1cb30 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65  meContext *pOute
1cb40 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  rNC  /* Name con
1cb50 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e  text for contain
1cb60 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  er */.){.  sqlit
1cb70 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45  e3 *db;.  if( NE
1cb80 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75  VER(p==0) ) retu
1cb90 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  rn;.  db = pPars
1cba0 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e  e->db;.  if( p->
1cbb0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
1cbc0 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75  sTypeInfo ) retu
1cbd0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  rn;.  sqlite3Sel
1cbe0 65 63 74 45 78 70 61 6e 64 28 70 50 61 72 73 65  ectExpand(pParse
1cbf0 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , p);.  if( pPar
1cc00 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
1cc10 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
1cc20 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
1cc30 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d  ResolveSelectNam
1cc40 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f  es(pParse, p, pO
1cc50 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70  uterNC);.  if( p
1cc60 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
1cc70 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1cc80 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
1cc90 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65  te3SelectAddType
1cca0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b  Info(pParse, p);
1ccb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20  .}../*.** Reset 
1ccc0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
1ccd0 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  cumulator..**.**
1cce0 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61   The aggregate a
1ccf0 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20  ccumulator is a 
1cd00 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65  set of memory ce
1cd10 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a  lls that hold.**
1cd20 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
1cd30 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63  sults while calc
1cd40 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65  ulating an aggre
1cd50 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72  gate.  This.** r
1cd60 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79 20 73 74  outine simply st
1cd70 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c  ores NULLs in al
1cd80 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72  l of those memor
1cd90 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  y cells..*/.stat
1cda0 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63  ic void resetAcc
1cdb0 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
1cdc0 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
1cdd0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
1cde0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1cdf0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
1ce00 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
1ce10 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20  _func *pFunc;.  
1ce20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  if( pAggInfo->nF
1ce30 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  unc+pAggInfo->nC
1ce40 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  olumn==0 ){.    
1ce50 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f  return;.  }.  fo
1ce60 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
1ce70 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  o->nColumn; i++)
1ce80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1ce90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1cea0 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d  ll, 0, pAggInfo-
1ceb0 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b 0a  >aCol[i].iMem);.
1cec0 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d    }.  for(pFunc=
1ced0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c  pAggInfo->aFunc,
1cee0 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f   i=0; i<pAggInfo
1cef0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
1cf00 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  unc++){.    sqli
1cf10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1cf20 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46 75   OP_Null, 0, pFu
1cf30 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 69  nc->iMem);.    i
1cf40 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  f( pFunc->iDisti
1cf50 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
1cf60 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63  Expr *pE = pFunc
1cf70 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
1cf80 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1cf90 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78  roperty(pE, EP_x
1cfa0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
1cfb0 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69     if( pE->x.pLi
1cfc0 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70  st==0 || pE->x.p
1cfd0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
1cfe0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1cff0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1d000 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67 67 72  , "DISTINCT aggr
1d010 65 67 61 74 65 73 20 6d 75 73 74 20 68 61 76 65  egates must have
1d020 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20   exactly one ". 
1d030 20 20 20 20 20 20 20 20 20 20 22 61 72 67 75 6d            "argum
1d040 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70  ent");.        p
1d050 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20  Func->iDistinct 
1d060 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1d070 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e  e{.        KeyIn
1d080 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b  fo *pKeyInfo = k
1d090 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
1d0a0 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78  st(pParse, pE->x
1d0b0 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  .pList);.       
1d0c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d0d0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
1d0e0 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69  emeral, pFunc->i
1d0f0 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a  Distinct, 0, 0,.
1d100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d110 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
1d120 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
1d130 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
1d140 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d150 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
1d160 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61  e the OP_AggFina
1d170 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20  lize opcode for 
1d180 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20  every aggregate 
1d190 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
1d1a0 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
1d1b0 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
1d1c0 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67  void finalizeAgg
1d1d0 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20  Functions(Parse 
1d1e0 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
1d1f0 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
1d200 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1d210 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
1d220 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
1d230 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f  o_func *pF;.  fo
1d240 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
1d250 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
1d260 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
1d270 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78  +, pF++){.    Ex
1d280 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
1d290 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
1d2a0 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
1d2b0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1d2c0 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
1d2d0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
1d2e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d2f0 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p4(v, OP_AggFina
1d300 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
1d310 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
1d320 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  r : 0, 0,.      
1d330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d340 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
1d350 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
1d360 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
1d370 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
1d380 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
1d390 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
1d3a0 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
1d3b0 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
1d3c0 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
1d3d0 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
1d3e0 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
1d3f0 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
1d400 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
1d410 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1d420 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
1d430 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
1d440 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73  fo_func *pF;.  s
1d450 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
1d460 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e  l *pC;..  pAggIn
1d470 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
1d480 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   1;.  sqlite3Exp
1d490 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
1d4a0 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  se);.  for(i=0, 
1d4b0 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  pF=pAggInfo->aFu
1d4c0 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  nc; i<pAggInfo->
1d4d0 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b  nFunc; i++, pF++
1d4e0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  ){.    int nArg;
1d4f0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78  .    int addrNex
1d500 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
1d510 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c  egAgg;.    ExprL
1d520 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
1d530 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b  >pExpr->x.pList;
1d540 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
1d550 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
1d560 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
1d570 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66  elect) );.    if
1d580 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
1d590 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e   nArg = pList->n
1d5a0 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41  Expr;.      regA
1d5b0 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  gg = sqlite3GetT
1d5c0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1d5d0 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71   nArg);.      sq
1d5e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
1d5f0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c  rList(pParse, pL
1d600 69 73 74 2c 20 72 65 67 41 67 67 2c 20 30 29 3b  ist, regAgg, 0);
1d610 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d620 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20    nArg = 0;.    
1d630 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20    regAgg = 0;.  
1d640 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e    }.    if( pF->
1d650 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
1d660 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d        addrNext =
1d670 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1d680 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1d690 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20  assert( nArg==1 
1d6a0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73  );.      codeDis
1d6b0 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46  tinct(pParse, pF
1d6c0 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64  ->iDistinct, add
1d6d0 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67  rNext, 1, regAgg
1d6e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1d6f0 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61 67   pF->pFunc->flag
1d700 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
1d710 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20  NEEDCOLL ){.    
1d720 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1d730 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75   = 0;.      stru
1d740 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1d750 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69   *pItem;.      i
1d760 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65  nt j;.      asse
1d770 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20  rt( pList!=0 ); 
1d780 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20   /* pList!=0 if 
1d790 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45  pF->pFunc has NE
1d7a0 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  EDCOLL */.      
1d7b0 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
1d7c0 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20  List->a; !pColl 
1d7d0 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20  && j<nArg; j++, 
1d7e0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1d7f0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1d800 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
1d810 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
1d820 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
1d830 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
1d840 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
1d850 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
1d860 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
1d870 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d880 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
1d890 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28  lSeq, 0, 0, 0, (
1d8a0 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
1d8b0 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d  _COLLSEQ);.    }
1d8c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d8d0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67  AddOp4(v, OP_Agg
1d8e0 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c  Step, 0, regAgg,
1d8f0 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20   pF->iMem,.     
1d900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d910 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
1d920 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
1d930 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1d940 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
1d950 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
1d960 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
1d970 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67  e(pParse, regAgg
1d980 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  , nArg);.    sql
1d990 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
1d9a0 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
1d9b0 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
1d9c0 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e  );.    if( addrN
1d9d0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ext ){.      sql
1d9e0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1d9f0 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74  abel(v, addrNext
1da00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1da10 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
1da20 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
1da30 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d  }.  for(i=0, pC=
1da40 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20  pAggInfo->aCol; 
1da50 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63  i<pAggInfo->nAcc
1da60 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70  umulator; i++, p
1da70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  C++){.    sqlite
1da80 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1da90 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d  , pC->pExpr, pC-
1daa0 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41  >iMem);.  }.  pA
1dab0 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
1dac0 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  de = 0;.  sqlite
1dad0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
1dae0 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pParse);.}../*.*
1daf0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1db00 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20 73  for the SELECT s
1db10 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69  tatement given i
1db20 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74  n the p argument
1db30 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  .  .**.** The re
1db40 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 72 69  sults are distri
1db50 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73  buted in various
1db60 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20   ways depending 
1db70 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  on the.** conten
1db80 74 73 20 6f 66 20 74 68 65 20 53 65 6c 65 63 74  ts of the Select
1db90 44 65 73 74 20 73 74 72 75 63 74 75 72 65 20 70  Dest structure p
1dba0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 61 72 67  ointed to by arg
1dbb0 75 6d 65 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61  ument pDest.** a
1dbc0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
1dbd0 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
1dbe0 74 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20  t    Result.**  
1dbf0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20     ------------ 
1dc00 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
1dc10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1dc20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
1dc30 2a 20 20 20 20 20 53 52 54 5f 4f 75 74 70 75 74  *     SRT_Output
1dc40 20 20 20 20 20 20 47 65 6e 65 72 61 74 65 20 61        Generate a
1dc50 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 28   row of output (
1dc60 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 73  using the OP_Res
1dc70 75 6c 74 52 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ultRow.**       
1dc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
1dc90 63 6f 64 65 29 20 66 6f 72 20 65 61 63 68 20 72  code) for each r
1dca0 6f 77 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ow in the result
1dcb0 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20   set..**.**     
1dcc0 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20  SRT_Mem         
1dcd0 4f 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 74 68  Only valid if th
1dce0 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 73 69  e result is a si
1dcf0 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20  ngle column..** 
1dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd10 20 20 20 20 53 74 6f 72 65 20 74 68 65 20 66 69      Store the fi
1dd20 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  rst column of th
1dd30 65 20 66 69 72 73 74 20 72 65 73 75 6c 74 20 72  e first result r
1dd40 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
1dd50 20 20 20 20 20 20 20 20 20 20 69 6e 20 72 65 67            in reg
1dd60 69 73 74 65 72 20 70 44 65 73 74 2d 3e 69 50 61  ister pDest->iPa
1dd70 72 6d 20 74 68 65 6e 20 61 62 61 6e 64 6f 6e 20  rm then abandon 
1dd80 74 68 65 20 72 65 73 74 0a 2a 2a 20 20 20 20 20  the rest.**     
1dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dda0 6f 66 20 74 68 65 20 71 75 65 72 79 2e 20 20 54  of the query.  T
1ddb0 68 69 73 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  his destination 
1ddc0 69 6d 70 6c 69 65 73 20 22 4c 49 4d 49 54 20 31  implies "LIMIT 1
1ddd0 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  "..**.**     SRT
1dde0 5f 53 65 74 20 20 20 20 20 20 20 20 20 54 68 65  _Set         The
1ddf0 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20   result must be 
1de00 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e  a single column.
1de10 20 20 53 74 6f 72 65 20 65 61 63 68 0a 2a 2a 20    Store each.** 
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de30 20 20 20 20 72 6f 77 20 6f 66 20 72 65 73 75 6c      row of resul
1de40 74 20 61 73 20 74 68 65 20 6b 65 79 20 69 6e 20  t as the key in 
1de50 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61  table pDest->iPa
1de60 72 6d 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  rm. .**         
1de70 20 20 20 20 20 20 20 20 20 20 20 20 41 70 70 6c              Appl
1de80 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 70  y the affinity p
1de90 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 20 62  Dest->affinity b
1dea0 65 66 6f 72 65 20 73 74 6f 72 69 6e 67 0a 2a 2a  efore storing.**
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dec0 20 20 20 20 20 72 65 73 75 6c 74 73 2e 20 20 55       results.  U
1ded0 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
1dee0 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e   "IN (SELECT ...
1def0 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  )"..**.**     SR
1df00 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74  T_Union       St
1df10 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 61  ore results as a
1df20 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72   key in a tempor
1df30 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d  ary table pDest-
1df40 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20  >iParm..**.**   
1df50 20 20 53 52 54 5f 45 78 63 65 70 74 20 20 20 20    SRT_Except    
1df60 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73    Remove results
1df70 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72   from the tempor
1df80 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d  ary table pDest-
1df90 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20  >iParm..**.**   
1dfa0 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20    SRT_Table     
1dfb0 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
1dfc0 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  in temporary tab
1dfd0 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e  le pDest->iParm.
1dfe0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1dff0 20 20 20 20 20 20 20 20 54 68 69 73 20 69 73 20          This is 
1e000 6c 69 6b 65 20 53 52 54 5f 45 70 68 65 6d 54 61  like SRT_EphemTa
1e010 62 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  b except that th
1e020 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  e table.**      
1e030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1e040 73 20 61 73 73 75 6d 65 64 20 74 6f 20 61 6c 72  s assumed to alr
1e050 65 61 64 79 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  eady be open..**
1e060 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 70 68 65  .**     SRT_Ephe
1e070 6d 54 61 62 20 20 20 20 43 72 65 61 74 65 20 61  mTab    Create a
1e080 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
1e090 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 61  e pDest->iParm a
1e0a0 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 20 20 20 20  nd store.**     
1e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0c0 74 68 65 20 72 65 73 75 6c 74 20 74 68 65 72 65  the result there
1e0d0 2e 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20  . The cursor is 
1e0e0 6c 65 66 74 20 6f 70 65 6e 20 61 66 74 65 72 0a  left open after.
1e0f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1e100 20 20 20 20 20 20 20 72 65 74 75 72 6e 69 6e 67         returning
1e110 2e 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20  .  This is like 
1e120 53 52 54 5f 54 61 62 6c 65 20 65 78 63 65 70 74  SRT_Table except
1e130 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
1e140 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
1e150 73 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 75 73  s destination us
1e160 65 73 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  es OP_OpenEpheme
1e170 72 61 6c 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a  ral to create.**
1e180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e190 20 20 20 20 20 74 68 65 20 74 61 62 6c 65 20 66       the table f
1e1a0 69 72 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  irst..**.**     
1e1b0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 20 20  SRT_Coroutine   
1e1c0 47 65 6e 65 72 61 74 65 20 61 20 63 6f 2d 72 6f  Generate a co-ro
1e1d0 75 74 69 6e 65 20 74 68 61 74 20 72 65 74 75 72  utine that retur
1e1e0 6e 73 20 61 20 6e 65 77 20 72 6f 77 20 6f 66 0a  ns a new row of.
1e1f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1e200 20 20 20 20 20 20 20 72 65 73 75 6c 74 73 20 65         results e
1e210 61 63 68 20 74 69 6d 65 20 69 74 20 69 73 20 69  ach time it is i
1e220 6e 76 6f 6b 65 64 2e 20 20 54 68 65 20 65 6e 74  nvoked.  The ent
1e230 72 79 20 70 6f 69 6e 74 0a 2a 2a 20 20 20 20 20  ry point.**     
1e240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e250 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  of the co-routin
1e260 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72  e is stored in r
1e270 65 67 69 73 74 65 72 20 70 44 65 73 74 2d 3e 69  egister pDest->i
1e280 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
1e290 53 52 54 5f 45 78 69 73 74 73 20 20 20 20 20 20  SRT_Exists      
1e2a0 53 74 6f 72 65 20 61 20 31 20 69 6e 20 6d 65 6d  Store a 1 in mem
1e2b0 6f 72 79 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e  ory cell pDest->
1e2c0 69 50 61 72 6d 20 69 66 20 74 68 65 20 72 65 73  iParm if the res
1e2d0 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
1e2e0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 69             set i
1e2f0 73 20 6e 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a  s not empty..**.
1e300 2a 2a 20 20 20 20 20 53 52 54 5f 44 69 73 63 61  **     SRT_Disca
1e310 72 64 20 20 20 20 20 54 68 72 6f 77 20 74 68 65  rd     Throw the
1e320 20 72 65 73 75 6c 74 73 20 61 77 61 79 2e 20 20   results away.  
1e330 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
1e340 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  SELECT.**       
1e350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
1e360 61 74 65 6d 65 6e 74 73 20 77 69 74 68 69 6e 20  atements within 
1e370 74 72 69 67 67 65 72 73 20 77 68 6f 73 65 20 6f  triggers whose o
1e380 6e 6c 79 20 70 75 72 70 6f 73 65 20 69 73 0a 2a  nly purpose is.*
1e390 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1e3a0 20 20 20 20 20 20 74 68 65 20 73 69 64 65 2d 65        the side-e
1e3b0 66 66 65 63 74 73 20 6f 66 20 66 75 6e 63 74 69  ffects of functi
1e3c0 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
1e3d0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1e3e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
1e3f0 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72  rors.  If any er
1e400 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f  rors are.** enco
1e410 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e  untered, then an
1e420 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
1e430 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
1e440 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  ft in.** pParse-
1e450 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
1e460 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
1e470 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53  s NOT free the S
1e480 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
1e490 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a  passed in.  The.
1e4a0 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  ** calling funct
1e4b0 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20  ion needs to do 
1e4c0 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  that..*/.int sql
1e4d0 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61  ite3Select(.  Pa
1e4e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1e4f0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
1e500 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
1e510 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
1e520 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
1e530 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
1e540 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
1e550 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
1e560 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20  st      /* What 
1e570 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71  to do with the q
1e580 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
1e590 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
1e5a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1e5b0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
1e5c0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
1e5d0 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75  nfo;     /* Retu
1e5e0 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57  rn from sqlite3W
1e5f0 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20  hereBegin() */. 
1e600 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
1e610 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
1e620 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75  irtual machine u
1e630 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1e640 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  n */.  int isAgg
1e650 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1e660 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74   True for select
1e670 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75   lists like "cou
1e680 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72  nt(*)" */.  Expr
1e690 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
1e6a0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
1e6b0 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74  lumns to extract
1e6c0 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  . */.  SrcList *
1e6d0 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a  pTabList;     /*
1e6e0 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
1e6f0 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a  to select from *
1e700 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
1e710 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
1e720 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
1e730 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
1e740 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
1e750 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  erBy;    /* The 
1e760 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
1e770 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
1e780 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
1e790 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  oupBy;    /* The
1e7a0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
1e7b0 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
1e7c0 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
1e7d0 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g;         /* Th
1e7e0 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e  e HAVING clause.
1e7f0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
1e800 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63  .  int isDistinc
1e810 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
1e820 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
1e830 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
1e840 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69  sent */.  int di
1e850 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20  stinct;         
1e860 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65   /* Table to use
1e870 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
1e880 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72  t set */.  int r
1e890 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  c = 1;          
1e8a0 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
1e8b0 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66  turn from this f
1e8c0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  unction */.  int
1e8d0 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20   addrSortIndex; 
1e8e0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1e8f0 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65  f an OP_OpenEphe
1e900 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
1e910 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73  n */.  AggInfo s
1e920 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a  AggInfo;      /*
1e930 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65   Information use
1e940 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71  d by aggregate q
1e950 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ueries */.  int 
1e960 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  iEnd;           
1e970 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1e980 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1e990 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
1e9a0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
1e9b0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1e9c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1e9d0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
1e9e0 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  db;.  if( p==0 |
1e9f0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1ea00 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
1ea10 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rr ){.    return
1ea20 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   1;.  }.  if( sq
1ea30 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1ea40 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
1ea50 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29  LECT, 0, 0, 0) )
1ea60 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d   return 1;.  mem
1ea70 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30  set(&sAggInfo, 0
1ea80 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66  , sizeof(sAggInf
1ea90 6f 29 29 3b 0a 0a 20 20 69 66 28 20 49 67 6e 6f  o));..  if( Igno
1eaa0 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65  rableOrderby(pDe
1eab0 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  st) ){.    asser
1eac0 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  t(pDest->eDest==
1ead0 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44  SRT_Exists || pD
1eae0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
1eaf0 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20  Union || .      
1eb00 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
1eb10 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c  t==SRT_Except ||
1eb20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
1eb30 52 54 5f 44 69 73 63 61 72 64 29 3b 0a 20 20 20  RT_Discard);.   
1eb40 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20   /* If ORDER BY 
1eb50 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65  makes no differe
1eb60 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75  nce in the outpu
1eb70 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64  t then neither d
1eb80 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49  oes.    ** DISTI
1eb90 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65  NCT so it can be
1eba0 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f   removed too. */
1ebb0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1ebc0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1ebd0 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
1ebe0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
1ebf0 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
1ec00 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63  s &= ~SF_Distinc
1ec10 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  t;.  }.  sqlite3
1ec20 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73  SelectPrep(pPars
1ec30 65 2c 20 70 2c 20 30 29 3b 0a 20 20 70 4f 72 64  e, p, 0);.  pOrd
1ec40 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
1ec50 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  By;.  pTabList =
1ec60 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
1ec70 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
1ec80 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1ec90 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
1eca0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
1ecb0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
1ecc0 20 7d 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d   }.  isAgg = (p-
1ecd0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
1ece0 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20  ggregate)!=0;.  
1ecf0 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
1ed00 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  0 );..  /* Begin
1ed10 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65   generating code
1ed20 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
1ed30 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1ed40 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
1ed50 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
1ed60 64 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  d;..  /* Generat
1ed70 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73  e code for all s
1ed80 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68  ub-queries in th
1ed90 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
1eda0 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
1edb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1edc0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1edd0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1ede0 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21  EW).  for(i=0; !
1edf0 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70  p->pPrior && i<p
1ee00 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
1ee10 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
1ee20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1ee30 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
1ee40 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
1ee50 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
1ee60 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
1ee70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Item->pSelect;. 
1ee80 20 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b     int isAggSub;
1ee90 0a 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d  ..    if( pSub==
1eea0 30 20 7c 7c 20 70 49 74 65 6d 2d 3e 69 73 50 6f  0 || pItem->isPo
1eeb0 70 75 6c 61 74 65 64 20 29 20 63 6f 6e 74 69 6e  pulated ) contin
1eec0 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72  ue;..    /* Incr
1eed0 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69  ement Parse.nHei
1eee0 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68  ght by the heigh
1eef0 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  t of the largest
1ef00 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
1ef10 2a 2a 20 74 72 65 65 20 72 65 66 65 72 65 64 20  ** tree refered 
1ef20 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
1ef30 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
1ef40 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
1ef50 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
1ef60 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
1ef70 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
1ef80 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
1ef90 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
1efa0 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
1efb0 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
1efc0 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
1efd0 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
1efe0 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
1eff0 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
1f000 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
1f010 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
1f020 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
1f030 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
1f040 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
1f050 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
1f060 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1f070 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
1f080 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20  can be absorbed 
1f090 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e  into the parent.
1f0a0 20 2a 2f 0a 20 20 20 20 69 73 41 67 67 53 75 62   */.    isAggSub
1f0b0 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61   = (pSub->selFla
1f0c0 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
1f0d0 65 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66  e)!=0;.    if( f
1f0e0 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70  lattenSubquery(p
1f0f0 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41  Parse, p, i, isA
1f100 67 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b  gg, isAggSub) ){
1f110 0a 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67  .      if( isAgg
1f120 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Sub ){.        i
1f130 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
1f140 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
1f150 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20   SF_Aggregate;. 
1f160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d       }.      i =
1f170 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
1f180 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
1f190 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
1f1a0 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c  t, SRT_EphemTab,
1f1b0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
1f1c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f1d0 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74  pItem->isPopulat
1f1e0 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ed==0 );.      s
1f1f0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1f200 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
1f210 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
1f220 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b  isPopulated = 1;
1f230 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2f  .    }.    if( /
1f240 2a 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c  *pParse->nErr ||
1f250 2a 2f 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  */ db->mallocFai
1f260 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  led ){.      got
1f270 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1f280 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
1f290 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74  nHeight -= sqlit
1f2a0 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
1f2b0 68 74 28 70 29 3b 0a 20 20 20 20 70 54 61 62 4c  ht(p);.    pTabL
1f2c0 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
1f2d0 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c     if( !Ignorabl
1f2e0 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
1f2f0 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  ){.      pOrderB
1f300 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
1f310 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c  .    }.  }.  pEL
1f320 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
1f330 0a 23 65 6e 64 69 66 0a 20 20 70 57 68 65 72 65  .#endif.  pWhere
1f340 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
1f350 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
1f360 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
1f370 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
1f380 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 28    isDistinct = (
1f390 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1f3a0 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a  _Distinct)!=0;..
1f3b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f3c0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
1f3d0 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  ECT.  /* If ther
1f3e0 65 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65  e is are a seque
1f3f0 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20  nce of queries, 
1f400 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f  do the earlier o
1f410 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a  nes first..  */.
1f420 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
1f430 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52  ){.    if( p->pR
1f440 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20  ightmost==0 ){. 
1f450 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f       Select *pLo
1f460 6f 70 2c 20 2a 70 52 69 67 68 74 20 3d 20 30 3b  op, *pRight = 0;
1f470 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
1f480 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78   0;.      int mx
1f490 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 66 6f  Select;.      fo
1f4a0 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
1f4b0 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
1f4c0 50 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20  Prior, cnt++){. 
1f4d0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52         pLoop->pR
1f4e0 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20  ightmost = p;.  
1f4f0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65        pLoop->pNe
1f500 78 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  xt = pRight;.   
1f510 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c       pRight = pL
1f520 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oop;.      }.   
1f530 20 20 20 6d 78 53 65 6c 65 63 74 20 3d 20 64 62     mxSelect = db
1f540 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
1f550 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
1f560 45 4c 45 43 54 5d 3b 0a 20 20 20 20 20 20 69 66  ELECT];.      if
1f570 28 20 6d 78 53 65 6c 65 63 74 20 26 26 20 63 6e  ( mxSelect && cn
1f580 74 3e 6d 78 53 65 6c 65 63 74 20 29 7b 0a 20 20  t>mxSelect ){.  
1f590 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1f5a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
1f5b0 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e  oo many terms in
1f5c0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1f5d0 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
1f5e0 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
1f5f0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6d    }.    return m
1f600 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73  ultiSelect(pPars
1f610 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
1f620 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
1f630 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d  f writing to mem
1f640 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e  ory or generatin
1f650 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c  g a set.  ** onl
1f660 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  y a single colum
1f670 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e  n may be output.
1f680 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
1f690 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1f6a0 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f  RY.  if( checkFo
1f6b0 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65  rMultiColumnSele
1f6c0 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
1f6d0 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e  pDest, pEList->n
1f6e0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f 74  Expr) ){.    got
1f6f0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1f700 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
1f710 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 77 72  f possible, rewr
1f720 69 74 65 20 74 68 65 20 71 75 65 72 79 20 74 6f  ite the query to
1f730 20 75 73 65 20 47 52 4f 55 50 20 42 59 20 69 6e   use GROUP BY in
1f740 73 74 65 61 64 20 6f 66 20 44 49 53 54 49 4e 43  stead of DISTINC
1f750 54 2e 0a 20 20 2a 2a 20 47 52 4f 55 50 20 42 59  T..  ** GROUP BY
1f760 20 6d 69 67 68 74 20 75 73 65 20 61 6e 20 69 6e   might use an in
1f770 64 65 78 2c 20 44 49 53 54 49 4e 43 54 20 6e 65  dex, DISTINCT ne
1f780 76 65 72 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20  ver does..  */. 
1f790 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
1f7a0 75 70 42 79 3d 3d 30 20 7c 7c 20 28 70 2d 3e 73  upBy==0 || (p->s
1f7b0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
1f7c0 72 65 67 61 74 65 29 21 3d 30 20 29 3b 0a 20 20  regate)!=0 );.  
1f7d0 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
1f7e0 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
1f7f0 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
1f800 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  SF_Distinct ){. 
1f810 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d     p->pGroupBy =
1f820 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1f830 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  Dup(db, p->pELis
1f840 74 2c 20 30 29 3b 0a 20 20 20 20 70 47 72 6f 75  t, 0);.    pGrou
1f850 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
1f860 79 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  y;.    p->selFla
1f870 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e  gs &= ~SF_Distin
1f880 63 74 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e  ct;.    isDistin
1f890 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ct = 0;.  }..  /
1f8a0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
1f8b0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1f8c0 2c 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74  , then this sort
1f8d0 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d  ing.  ** index m
1f8e0 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e  ight end up bein
1f8f0 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20  g unused if the 
1f900 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a  data can be .  *
1f910 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70  * extracted in p
1f920 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e  re-sorted order.
1f930 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65    If that is the
1f940 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a   case, then the.
1f950 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65    ** OP_OpenEphe
1f960 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
1f970 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  n will be change
1f980 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20  d to an OP_Noop 
1f990 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67  once.  ** we fig
1f9a0 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65  ure out that the
1f9b0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
1f9c0 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54  s not needed.  T
1f9d0 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  he addrSortIndex
1f9e0 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69  .  ** variable i
1f9f0 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69  s used to facili
1fa00 74 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65  tate that change
1fa10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
1fa20 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79  derBy ){.    Key
1fa30 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
1fa40 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
1fa50 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
1fa60 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
1fa70 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72  rBy);.    pOrder
1fa80 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70  By->iECursor = p
1fa90 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
1faa0 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
1fab0 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74  hm[2] = addrSort
1fac0 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71  Index =.      sq
1fad0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1fae0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
1faf0 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ral,.           
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb10 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
1fb20 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  or, pOrderBy->nE
1fb30 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20  xpr+2, 0,.      
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb50 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
1fb60 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
1fb70 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c  _HANDOFF);.  }el
1fb80 73 65 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74  se{.    addrSort
1fb90 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a  Index = -1;.  }.
1fba0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74  .  /* If the out
1fbb0 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20  put is destined 
1fbc0 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  for a temporary 
1fbd0 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74  table, open that
1fbe0 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
1fbf0 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
1fc00 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
1fc10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1fc20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
1fc30 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73  nEphemeral, pDes
1fc40 74 2d 3e 69 50 61 72 6d 2c 20 70 45 4c 69 73 74  t->iParm, pEList
1fc50 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20  ->nExpr);.  }.. 
1fc60 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69   /* Set the limi
1fc70 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64  ter..  */.  iEnd
1fc80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1fc90 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f  keLabel(v);.  co
1fca0 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
1fcb0 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
1fcc0 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  End);..  /* Open
1fcd0 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
1fce0 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
1fcf0 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
1fd00 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69  */.  if( isDisti
1fd10 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  nct ){.    KeyIn
1fd20 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
1fd30 20 20 61 73 73 65 72 74 28 20 69 73 41 67 67 20    assert( isAgg 
1fd40 7c 7c 20 70 47 72 6f 75 70 42 79 20 29 3b 0a 20  || pGroupBy );. 
1fd50 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50     distinct = pP
1fd60 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
1fd70 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
1fd80 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
1fd90 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
1fda0 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
1fdb0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1fdc0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
1fdd0 64 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a  distinct, 0, 0,.
1fde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdf0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1fe00 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
1fe10 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
1fe20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69  }else{.    disti
1fe30 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  nct = -1;.  }.. 
1fe40 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 61 6e   /* Aggregate an
1fe50 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  d non-aggregate 
1fe60 71 75 65 72 69 65 73 20 61 72 65 20 68 61 6e 64  queries are hand
1fe70 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
1fe80 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  */.  if( !isAgg 
1fe90 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  && pGroupBy==0 )
1fea0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
1feb0 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67  se is for non-ag
1fec0 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 0a  gregate queries.
1fed0 20 20 20 20 2a 2a 20 42 65 67 69 6e 20 74 68 65      ** Begin the
1fee0 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20   database scan. 
1fef0 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f     */.    pWInfo
1ff00 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
1ff10 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
1ff20 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26  bList, pWhere, &
1ff30 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20  pOrderBy, 0);.  
1ff40 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
1ff50 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
1ff60 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f  d;..    /* If so
1ff70 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
1ff80 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
1ff90 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
1ffa0 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
1ffb0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
1ffc0 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
1ffd0 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
1ffe0 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
1fff0 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
20000 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
20010 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
20020 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
20030 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   && pOrderBy==0 
20040 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20050 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
20060 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65  (v, addrSortInde
20070 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e  x, 1);.      p->
20080 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
20090 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  = -1;.    }..   
200a0 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
200b0 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a  dard inner loop.
200c0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
200d0 74 28 21 69 73 44 69 73 74 69 6e 63 74 29 3b 0a  t(!isDistinct);.
200e0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
200f0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
20100 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
20110 64 65 72 42 79 2c 20 2d 31 2c 20 70 44 65 73 74  derBy, -1, pDest
20120 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20130 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43        pWInfo->iC
20140 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d  ontinue, pWInfo-
20150 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 20 20 2f  >iBreak);..    /
20160 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61  * End the databa
20170 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  se scan loop..  
20180 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
20190 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
201a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
201b0 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 70 72  * This is the pr
201c0 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67  ocessing for agg
201d0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a  regate queries *
201e0 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  /.    NameContex
201f0 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d  t sNC;    /* Nam
20200 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72  e context for pr
20210 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61  ocessing aggrega
20220 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  te information *
20230 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b  /.    int iAMem;
20240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
20250 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
20260 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65  or storing curre
20270 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  nt GROUP BY */. 
20280 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20     int iBMem;   
20290 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
202a0 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
202b0 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42  previous GROUP B
202c0 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73  Y */.    int iUs
202d0 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  eFlag;       /* 
202e0 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64  Mem address hold
202f0 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74  ing flag indicat
20300 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73  ing that at leas
20310 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
20320 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65            ** one
20330 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75   row of the inpu
20340 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  t to the aggrega
20350 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20  tor has been.   
20360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20370 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
20380 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62  d */.    int iAb
20390 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20  ortFlag;     /* 
203a0 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63  Mem address whic
203b0 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61  h causes query a
203c0 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65  bort if positive
203d0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75   */.    int grou
203e0 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52  pBySort;    /* R
203f0 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f  ows come from so
20400 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59  urce in GROUP BY
20410 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e   order */.    in
20420 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
20430 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63    /* End of proc
20440 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20  essing for this 
20450 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f  SELECT */..    /
20460 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64  * Remove any and
20470 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74   all aliases bet
20480 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  ween the result 
20490 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20  set and the.    
204a0 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  ** GROUP BY clau
204b0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
204c0 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
204d0 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20       int k;     
204e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204f0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
20500 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  er */.      stru
20510 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
20520 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72   *pItem;  /* For
20530 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78   looping over ex
20540 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69  pression in a li
20550 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72  st */..      for
20560 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  (k=p->pEList->nE
20570 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45  xpr, pItem=p->pE
20580 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  List->a; k>0; k-
20590 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
205a0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69       pItem->iAli
205b0 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  as = 0;.      }.
205c0 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f        for(k=pGro
205d0 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74  upBy->nExpr, pIt
205e0 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20  em=pGroupBy->a; 
205f0 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b  k>0; k--, pItem+
20600 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
20610 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20  m->iAlias = 0;. 
20620 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 0a       }.    }.. .
20630 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
20640 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f  label to jump to
20650 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f   when we want to
20660 20 61 62 6f 72 74 20 74 68 65 20 71 75 65 72 79   abort the query
20670 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20   */.    addrEnd 
20680 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
20690 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20  eLabel(v);..    
206a0 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f  /* Convert TK_CO
206b0 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20  LUMN nodes into 
206c0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e  TK_AGG_COLUMN an
206d0 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69  d make entries i
206e0 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66  n.    ** sAggInf
206f0 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47  o for all TK_AGG
20700 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20  _FUNCTION nodes 
20710 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  in expressions o
20720 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c  f the.    ** SEL
20730 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
20740 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74     */.    memset
20750 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
20760 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e  (sNC));.    sNC.
20770 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
20780 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
20790 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
207a0 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d    sNC.pAggInfo =
207b0 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20   &sAggInfo;.    
207c0 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
207d0 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70  gColumn = pGroup
207e0 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e  By ? pGroupBy->n
207f0 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20  Expr+1 : 0;.    
20800 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42  sAggInfo.pGroupB
20810 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
20820 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
20830 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
20840 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
20850 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
20860 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70  eAggList(&sNC, p
20870 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66  OrderBy);.    if
20880 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
20890 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
208a0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
208b0 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a  &sNC, pHaving);.
208c0 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
208d0 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  fo.nAccumulator 
208e0 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  = sAggInfo.nColu
208f0 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  mn;.    for(i=0;
20900 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e   i<sAggInfo.nFun
20910 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  c; i++){.      a
20920 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
20930 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f  roperty(sAggInfo
20940 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c  .aFunc[i].pExpr,
20950 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
20960 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
20970 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
20980 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f  t(&sNC, sAggInfo
20990 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d  .aFunc[i].pExpr-
209a0 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
209b0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
209c0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
209d0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
209e0 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20    /* Processing 
209f0 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77  for aggregates w
20a00 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20  ith GROUP BY is 
20a10 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61  very different a
20a20 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d  nd.    ** much m
20a30 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e  ore complex than
20a40 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
20a50 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a  out a GROUP BY..
20a60 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
20a70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
20a80 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
20a90 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69  fo;  /* Keying i
20aa0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
20ab0 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75  he group by clau
20ac0 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  se */.      int 
20ad0 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  j1;             
20ae0 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72  /* A-vs-B compar
20af0 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20  ision jump */.  
20b00 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70      int addrOutp
20b10 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74  utRow;  /* Start
20b20 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74   of subroutine t
20b30 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65  hat outputs a re
20b40 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  sult row */.    
20b50 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52    int regOutputR
20b60 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ow;   /* Return 
20b70 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
20b80 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72   for output subr
20b90 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20  outine */.      
20ba0 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74  int addrSetAbort
20bb0 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61  ;   /* Set the a
20bc0 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65  bort flag and re
20bd0 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  turn */.      in
20be0 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b  t addrTopOfLoop;
20bf0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
20c00 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20  input loop */.  
20c10 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74      int addrSort
20c20 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f  ingIdx; /* The O
20c30 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
20c40 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  for the sorting 
20c50 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
20c60 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20  nt addrReset;   
20c70 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65     /* Subroutine
20c80 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74   for resetting t
20c90 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a  he accumulator *
20ca0 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52  /.      int regR
20cb0 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52  eset;       /* R
20cc0 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
20cd0 67 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74  gister for reset
20ce0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a   subroutine */..
20cf0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
20d00 65 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20  e is a GROUP BY 
20d10 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20  clause we might 
20d20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69  need a sorting i
20d30 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ndex to.      **
20d40 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20   implement it.  
20d50 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f  Allocate that so
20d60 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e  rting index now.
20d70 20 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75    If it turns ou
20d80 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  t.      ** that 
20d90 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69  we do not need i
20da0 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65  t after all, the
20db0 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69   OpenEphemeral i
20dc0 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20  nstruction.     
20dd0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76   ** will be conv
20de0 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f  erted into a Noo
20df0 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  p.  .      */.  
20e00 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
20e10 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65  tingIdx = pParse
20e20 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
20e30 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
20e40 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
20e50 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29  Parse, pGroupBy)
20e60 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74  ;.      addrSort
20e70 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33  ingIdx = sqlite3
20e80 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
20e90 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
20ea0 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
20eb0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
20ec0 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
20ed0 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20  gColumn, .      
20ee0 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b      0, (char*)pK
20ef0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
20f00 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20  FO_HANDOFF);..  
20f10 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
20f20 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
20f30 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50  ns used by GROUP
20f40 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72   BY aggregate pr
20f50 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a  ocessing.      *
20f60 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67  /.      iUseFlag
20f70 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
20f80 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46  m;.      iAbortF
20f90 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
20fa0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f  nMem;.      regO
20fb0 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61  utputRow = ++pPa
20fc0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
20fd0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
20fe0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
20ff0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
21000 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61  regReset = ++pPa
21010 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
21020 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c   addrReset = sql
21030 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
21040 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65  l(v);.      iAMe
21050 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
21060 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
21070 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
21080 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
21090 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73     iBMem = pPars
210a0 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
210b0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
210c0 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
210d0 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
210e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
210f0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41  P_Integer, 0, iA
21100 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
21110 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
21120 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c   "clear abort fl
21130 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
21140 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21150 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
21160 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
21170 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
21180 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75  , "indicate accu
21190 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29  mulator empty"))
211a0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;..      /* Begi
211b0 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  n a loop that wi
211c0 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73  ll extract all s
211d0 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52  ource rows in GR
211e0 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20  OUP BY order..  
211f0 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
21200 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65  t involve two se
21210 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74  parate loops wit
21220 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20  h an OP_Sort in 
21230 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20  between, or.    
21240 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
21250 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74   a single loop t
21260 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65  hat uses an inde
21270 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66  x to extract inf
21280 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  ormation.      *
21290 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f  * in the right o
212a0 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69  rder to begin wi
212b0 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  th..      */.   
212c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
212d0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
212e0 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
212f0 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57  Reset);.      pW
21300 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
21310 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
21320 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
21330 65 2c 20 26 70 47 72 6f 75 70 42 79 2c 20 30 29  e, &pGroupBy, 0)
21340 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
21350 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
21360 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69  ect_end;.      i
21370 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  f( pGroupBy==0 )
21380 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
21390 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62   optimizer is ab
213a0 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f  le to deliver ro
213b0 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f  ws in group by o
213c0 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20  rder so.        
213d0 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76  ** we do not hav
213e0 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20  e to sort.  The 
213f0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
21400 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20   table will be. 
21410 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c         ** cancel
21420 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73  led later becaus
21430 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  e we still need 
21440 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49  to use the pKeyI
21450 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  nfo.        */. 
21460 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79 20         pGroupBy 
21470 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
21480 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
21490 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rt = 0;.      }e
214a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
214b0 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20  Rows are coming 
214c0 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69  out in undetermi
214d0 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68  ned order.  We h
214e0 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20  ave to push.    
214f0 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20      ** each row 
21500 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69  into a sorting i
21510 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20  ndex, terminate 
21520 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a  the first loop,.
21530 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
21540 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f  loop over the so
21550 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f  rting index in o
21560 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20  rder to get the 
21570 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a  output.        *
21580 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  * in sorted orde
21590 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  r.        */.   
215a0 20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65       int regBase
215b0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  ;.        int re
215c0 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20  gRecord;.       
215d0 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
215e0 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b     int nGroupBy;
215f0 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  ..        groupB
21600 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  ySort = 1;.     
21610 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47     nGroupBy = pG
21620 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
21630 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47         nCol = nG
21640 72 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20  roupBy + 1;.    
21650 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
21660 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  +1;.        for(
21670 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
21680 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
21690 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67           if( sAg
216a0 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53  gInfo.aCol[i].iS
216b0 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
216c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43  {.            nC
216d0 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ol++;.          
216e0 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
216f0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
21700 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73       regBase = s
21710 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
21720 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29  ge(pParse, nCol)
21730 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
21740 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
21750 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
21760 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
21770 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
21780 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61   pGroupBy, regBa
21790 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  se, 0);.        
217a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
217b0 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
217c0 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
217d0 6e 67 49 64 78 2c 72 65 67 42 61 73 65 2b 6e 47  ngIdx,regBase+nG
217e0 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20  roupBy);.       
217f0 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b   j = nGroupBy+1;
21800 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
21810 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  ; i<sAggInfo.nCo
21820 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
21830 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
21840 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d  Info_col *pCol =
21850 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b   &sAggInfo.aCol[
21860 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
21870 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
21880 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20  olumn>=j ){.    
21890 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
218a0 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20   j + regBase;.  
218b0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32            int r2
218c0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ;..            r
218d0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
218e0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
218f0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21910 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c       pCol->pTab,
21920 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20   pCol->iColumn, 
21930 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31  pCol->iTable, r1
21940 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
21950 20 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a    if( r1!=r2 ){.
21960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
21970 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21980 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c  v, OP_SCopy, r2,
21990 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
219a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
219b0 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
219c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
219d0 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73     regRecord = s
219e0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
219f0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
21a00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21a10 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
21a20 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e  cord, regBase, n
21a30 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Col, regRecord);
21a40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21a50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21a60 5f 49 64 78 49 6e 73 65 72 74 2c 20 73 41 67 67  _IdxInsert, sAgg
21a70 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
21a80 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
21a90 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
21aa0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
21ab0 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
21ac0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
21ad0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
21ae0 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
21af0 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
21b00 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
21b10 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
21b20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21b30 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73 41  2(v, OP_Sort, sA
21b40 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
21b50 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  x, addrEnd);.   
21b60 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
21b70 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73  ((v, "GROUP BY s
21b80 6f 72 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20  ort"));.        
21b90 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74  sAggInfo.useSort
21ba0 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20  ingIdx = 1;.    
21bb0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
21bc0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
21bd0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
21be0 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
21bf0 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
21c00 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f  BY terms and sto
21c10 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32  re in b0, b1, b2
21c20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30  ....      ** (b0
21c30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74   is memory locat
21c40 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20  ion iBMem+0, b1 
21c50 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20  is iBMem+1, and 
21c60 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20  so forth).      
21c70 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20  ** Then compare 
21c80 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
21c90 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e  P BY terms again
21ca0 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  st the GROUP BY 
21cb0 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66  terms.      ** f
21cc0 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
21cd0 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73   row currently s
21ce0 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c  tored in a0, a1,
21cf0 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a   a2....      */.
21d00 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c        addrTopOfL
21d10 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
21d20 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
21d30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
21d40 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
21d50 72 73 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  rse);.      for(
21d60 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d  j=0; j<pGroupBy-
21d70 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
21d80 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
21d90 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
21da0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21db0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
21dc0 6e 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  n, sAggInfo.sort
21dd0 69 6e 67 49 64 78 2c 20 6a 2c 20 69 42 4d 65 6d  ingIdx, j, iBMem
21de0 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  +j);.        }el
21df0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41  se{.          sA
21e00 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64  ggInfo.directMod
21e10 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
21e20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
21e30 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
21e40 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69  y->a[j].pExpr, i
21e50 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
21e60 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
21e70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21e80 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
21e90 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20  , iAMem, iBMem, 
21ea0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
21eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21ec0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
21ed0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
21ee0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a  EYINFO);.      j
21ef0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  1 = sqlite3VdbeC
21f00 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
21f10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21f20 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
21f30 70 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31  p, j1+1, 0, j1+1
21f40 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
21f50 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
21f60 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68  runs whenever th
21f70 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67  e GROUP BY chang
21f80 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61  es..      ** Cha
21f90 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55  nges in the GROU
21fa0 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65  P BY are detecte
21fb0 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
21fc0 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20  s code.      ** 
21fd0 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65  block.  If there
21fe0 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73   were no changes
21ff0 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  , this block is 
22000 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a  skipped..      *
22010 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  *.      ** This 
22020 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72  code copies curr
22030 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72  ent group by ter
22040 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e  ms in b0,b1,b2,.
22050 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  ...      ** over
22060 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49   to a0,a1,a2.  I
22070 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65  t then calls the
22080 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
22090 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ne.      ** and 
220a0 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65  resets the aggre
220b0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
220c0 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72   registers in pr
220d0 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20  eparation.      
220e0 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  ** for the next 
220f0 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a  GROUP BY batch..
22100 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
22110 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
22120 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d  ve(pParse, iBMem
22130 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42  , iAMem, pGroupB
22140 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  y->nExpr);.     
22150 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22160 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
22170 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64  regOutputRow, ad
22180 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
22190 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
221a0 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20  (v, "output one 
221b0 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71  row"));.      sq
221c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
221d0 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62  v, OP_IfPos, iAb
221e0 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64  ortFlag, addrEnd
221f0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
22200 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20  ment((v, "check 
22210 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
22220 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22230 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
22240 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64  ub, regReset, ad
22250 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
22260 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
22270 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74  "reset accumulat
22280 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
22290 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72   Update the aggr
222a0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
222b0 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  rs based on the 
222c0 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20  content of.     
222d0 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
222e0 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  row.      */.   
222f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
22300 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
22310 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
22320 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
22330 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
22340 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22350 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
22360 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 1, iUseFlag);.
22370 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
22380 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
22390 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61  data in accumula
223a0 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
223b0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
223c0 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  p.      */.     
223d0 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
223e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
223f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22400 20 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e   OP_Next, sAggIn
22410 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61  fo.sortingIdx, a
22420 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20  ddrTopOfLoop);. 
22430 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22440 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
22450 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
22460 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22470 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
22480 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 2c 20  addrSortingIdx, 
22490 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1);.      }..   
224a0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65     /* Output the
224b0 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65   final row of re
224c0 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sult.      */.  
224d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
224e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
224f0 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c  b, regOutputRow,
22500 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
22510 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
22520 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66  nt((v, "output f
22530 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20  inal row"));..  
22540 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72      /* Jump over
22550 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73   the subroutines
22560 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22570 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22580 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
22590 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20   addrEnd);..    
225a0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
225b0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
225c0 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65  outputs a single
225d0 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
225e0 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e  lt.      ** set.
225f0 20 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e    This subroutin
22600 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74  e first looks at
22610 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20   the iUseFlag.  
22620 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20  If iUseFlag.    
22630 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61    ** is less tha
22640 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
22650 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ro, the subrouti
22660 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  ne is a no-op.  
22670 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  If.      ** the 
22680 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73  processing calls
22690 20 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74   for the query t
226a0 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75  o abort, this su
226b0 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
226c0 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65  * increments the
226d0 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f   iAbortFlag memo
226e0 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f  ry location befo
226f0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a  re returning in.
22700 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74        ** order t
22710 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c  o signal the cal
22720 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20  ler to abort..  
22730 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
22740 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69  rSetAbort = sqli
22750 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
22760 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
22770 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
22780 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
22790 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
227a0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
227b0 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66  (v, "set abort f
227c0 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
227d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
227e0 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
227f0 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
22800 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
22810 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
22820 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
22830 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
22840 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  w = sqlite3VdbeC
22850 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
22860 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22870 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
22880 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64  os, iUseFlag, ad
22890 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a  drOutputRow+2);.
228a0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
228b0 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72  t((v, "Groupby r
228c0 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20  esult generator 
228d0 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a  entry point"));.
228e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
228f0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
22900 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
22910 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c  ow);.      final
22920 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
22930 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
22940 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
22950 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
22960 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
22970 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53  drOutputRow+1, S
22980 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
22990 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
229a0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
229b0 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30   p, p->pEList, 0
229c0 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20  , 0, pOrderBy,. 
229d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229e0 20 20 20 20 20 64 69 73 74 69 6e 63 74 2c 20 70       distinct, p
229f0 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
22a00 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72              addr
22a10 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64  OutputRow+1, add
22a20 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20  rSetAbort);.    
22a30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22a40 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
22a50 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
22a60 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
22a70 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75  nt((v, "end grou
22a80 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
22a90 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
22aa0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
22ab0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
22ac0 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f  ll reset the gro
22ad0 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f  up-by accumulato
22ae0 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r.      */.     
22af0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
22b00 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
22b10 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65  Reset);.      re
22b20 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
22b30 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
22b40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22b50 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
22b60 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65  _Return, regRese
22b70 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20  t);.     .    } 
22b80 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42  /* endif pGroupB
22b90 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65 67  y.  Begin aggreg
22ba0 61 74 65 20 71 75 65 72 69 65 73 20 77 69 74 68  ate queries with
22bb0 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f  out GROUP BY: */
22bc0 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20  .    else {.    
22bd0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c    ExprList *pDel
22be0 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
22bf0 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
22c00 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65  OUNT.      Table
22c10 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66   *pTab;.      if
22c20 28 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70  ( (pTab = isSimp
22c30 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67  leCount(p, &sAgg
22c40 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20  Info))!=0 ){.   
22c50 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d       /* If isSim
22c60 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72  pleCount() retur
22c70 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
22c80 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
22c90 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  e, then.        
22ca0 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
22cb0 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  ment is of the f
22cc0 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  orm:.        **.
22cd0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
22ce0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
22cf0 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20  M <tbl>.        
22d00 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68  **.        ** wh
22d10 65 72 65 20 74 68 65 20 54 61 62 6c 65 20 73 74  ere the Table st
22d20 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64  ructure returned
22d30 20 72 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c   represents tabl
22d40 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20  e <tbl>..       
22d50 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
22d60 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
22d70 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20   so common that 
22d80 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20  it is optimized 
22d90 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20  specially. The. 
22da0 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75         ** OP_Cou
22db0 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  nt instruction i
22dc0 73 20 65 78 65 63 75 74 65 64 20 65 69 74 68 65  s executed eithe
22dd0 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20  r on the intkey 
22de0 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20  table that.     
22df0 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
22e00 68 65 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c  he data for tabl
22e10 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e  e <tbl> or on on
22e20 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73  e of its indexes
22e30 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  . It.        ** 
22e40 69 73 20 62 65 74 74 65 72 20 74 6f 20 65 78 65  is better to exe
22e50 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61  cute the op on a
22e60 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65  n index, as inde
22e70 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20  xes are almost. 
22e80 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
22e90 20 73 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c   spread across l
22ea0 65 73 73 20 70 61 67 65 73 20 74 68 61 6e 20 74  ess pages than t
22eb0 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69  heir correspondi
22ec0 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ng tables..     
22ed0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f     */.        co
22ee0 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71  nst int iDb = sq
22ef0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
22f00 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
22f10 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
22f20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
22f30 20 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e   iCsr = pParse->
22f40 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43  nTab++;     /* C
22f50 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d  ursor to scan b-
22f60 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  tree */.        
22f70 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
22f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f90 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
22fa0 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
22fb0 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
22fc0 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  eyInfo = 0;     
22fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
22fe0 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64  info for scanned
22ff0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
23000 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d    Index *pBest =
23010 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
23020 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69         /* Best i
23030 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61  ndex found so fa
23040 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  r */.        int
23050 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74   iRoot = pTab->t
23060 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
23070 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
23080 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65  f scanned b-tree
23090 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c   */..        sql
230a0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
230b0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
230c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
230d0 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
230e0 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
230f0 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
23100 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ame);..        /
23110 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
23120 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 73 20   index that has 
23130 74 68 65 20 6c 65 61 73 74 20 61 6d 6f 75 6e 74  the least amount
23140 20 6f 66 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 0a   of columns. If.
23150 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 72 65          ** there
23160 20 69 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65   is such an inde
23170 78 2c 20 61 6e 64 20 69 74 20 68 61 73 20 6c 65  x, and it has le
23180 73 73 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 20  ss columns than 
23190 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20  the table.      
231a0 20 20 2a 2a 20 64 6f 65 73 2c 20 74 68 65 6e 20    ** does, then 
231b0 77 65 20 63 61 6e 20 61 73 73 75 6d 65 20 74 68  we can assume th
231c0 61 74 20 69 74 20 63 6f 6e 73 75 6d 65 73 20 6c  at it consumes l
231d0 65 73 73 20 73 70 61 63 65 20 6f 6e 20 64 69 73  ess space on dis
231e0 6b 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  k and.        **
231f0 20 77 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20   will therefore 
23200 62 65 20 63 68 65 61 70 65 72 20 74 6f 20 73 63  be cheaper to sc
23210 61 6e 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  an to determine 
23220 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74  the query result
23230 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  ..        ** In 
23240 74 68 69 73 20 63 61 73 65 20 73 65 74 20 69 52  this case set iR
23250 6f 6f 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  oot to the root 
23260 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
23270 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65 0a  he index b-tree.
23280 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70          ** and p
23290 4b 65 79 49 6e 66 6f 20 74 6f 20 74 68 65 20 4b  KeyInfo to the K
232a0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
232b0 20 72 65 71 75 69 72 65 64 20 74 6f 20 6e 61 76   required to nav
232c0 69 67 61 74 65 20 74 68 65 0a 20 20 20 20 20 20  igate the.      
232d0 20 20 2a 2a 20 69 6e 64 65 78 2e 0a 20 20 20 20    ** index..    
232e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
232f0 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20 74 68  * In practice th
23300 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
23310 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ure will not be 
23320 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79  used. It is only
23330 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73   .        ** pas
23340 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f  sed to keep OP_O
23350 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20  penRead happy.. 
23360 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
23370 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
23380 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
23390 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
233a0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
233b0 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e  !pBest || pIdx->
233c0 6e 43 6f 6c 75 6d 6e 3c 70 42 65 73 74 2d 3e 6e  nColumn<pBest->n
233d0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
233e0 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49        pBest = pI
233f0 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  dx;.          }.
23400 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23410 20 20 69 66 28 20 70 42 65 73 74 20 26 26 20 70    if( pBest && p
23420 42 65 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 54  Best->nColumn<pT
23430 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
23440 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42        iRoot = pB
23450 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  est->tnum;.     
23460 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
23470 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
23480 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 42 65 73  nfo(pParse, pBes
23490 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  t);.        }.. 
234a0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61         /* Open a
234b0 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
234c0 72 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 4f  r, execute the O
234d0 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74  P_Count, close t
234e0 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20  he cursor. */.  
234f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23500 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
23510 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52  enRead, iCsr, iR
23520 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  oot, iDb);.     
23530 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
23540 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
23550 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
23560 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29  (v, -1, (char *)
23570 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
23580 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
23590 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
235a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
235b0 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20  p2(v, OP_Count, 
235c0 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61  iCsr, sAggInfo.a
235d0 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20  Func[0].iMem);. 
235e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
235f0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
23600 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20  lose, iCsr);.   
23610 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20     }else.#endif 
23620 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
23630 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20  TREECOUNT */.   
23640 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20     {.        /* 
23650 43 68 65 63 6b 20 69 66 20 74 68 65 20 71 75 65  Check if the que
23660 72 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20  ry is of one of 
23670 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
23680 72 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  rms:.        **.
23690 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
236a0 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20  ECT min(x) FROM 
236b0 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  ....        **  
236c0 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46   SELECT max(x) F
236d0 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20  ROM ....        
236e0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66  **.        ** If
236f0 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b   it is, then ask
23700 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65   the code in whe
23710 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20  re.c to attempt 
23720 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a  to sort results.
23730 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66          ** as if
23740 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f   there was an "O
23750 52 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f  RDER ON x" or "O
23760 52 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20  RDER ON x DESC" 
23770 63 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20  clause. .       
23780 20 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69   ** If where.c i
23790 73 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63  s able to produc
237a0 65 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64  e results sorted
237b0 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20   in this order, 
237c0 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  then.        ** 
237d0 61 64 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f  add vdbe code to
237e0 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
237f0 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f  e processing loo
23800 70 20 61 66 74 65 72 20 74 68 65 20 0a 20 20 20  p after the .   
23810 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74       ** first it
23820 65 72 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74  eration (since t
23830 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
23840 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  on of the loop i
23850 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75  s .        ** gu
23860 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72  aranteed to oper
23870 61 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77  ate on the row w
23880 69 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20  ith the minimum 
23890 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20  or maximum .    
238a0 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
238b0 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20  x, the only row 
238c0 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20  required)..     
238d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
238e0 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20   A special flag 
238f0 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20 74  must be passed t
23900 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
23910 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c  gin() to slightl
23920 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64  y.        ** mod
23930 69 66 79 20 62 65 68 61 76 69 6f 75 72 20 61 73  ify behaviour as
23940 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20   follows:.      
23950 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
23960 20 20 2b 20 49 66 20 74 68 65 20 71 75 65 72 79    + If the query
23970 20 69 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69   is a "SELECT mi
23980 6e 28 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20  n(x)", then the 
23990 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20  loop coded by.  
239a0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65        **     whe
239b0 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20  re.c should not 
239c0 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79  iterate over any
239d0 20 76 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e   values with a N
239e0 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20  ULL value.      
239f0 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a    **     for x..
23a00 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
23a10 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70     **   + The op
23a20 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20  timizer code in 
23a30 77 68 65 72 65 2e 63 20 28 74 68 65 20 74 68 69  where.c (the thi
23a40 6e 67 20 74 68 61 74 20 64 65 63 69 64 65 73 20  ng that decides 
23a50 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a  which.        **
23a60 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e       index or in
23a70 64 69 63 65 73 20 74 6f 20 75 73 65 29 20 73 68  dices to use) sh
23a80 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66  ould place a dif
23a90 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20  ferent priority 
23aa0 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  on .        **  
23ab0 20 20 20 73 61 74 69 73 66 79 69 6e 67 20 74 68     satisfying th
23ac0 65 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61  e 'ORDER BY' cla
23ad0 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73  use than it does
23ae0 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e   in other cases.
23af0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
23b00 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e  Refer to code an
23b10 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68  d comments in wh
23b20 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c  ere.c for detail
23b30 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
23b40 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
23b50 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20  pMinMax = 0;.   
23b60 20 20 20 20 20 75 38 20 66 6c 61 67 20 3d 20 6d       u8 flag = m
23b70 69 6e 4d 61 78 51 75 65 72 79 28 70 29 3b 0a 20  inMaxQuery(p);. 
23b80 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 20         if( flag 
23b90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
23ba0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
23bb0 70 65 72 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d  perty(p->pEList-
23bc0 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 45 50 5f  >a[0].pExpr, EP_
23bd0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
23be0 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20          pMinMax 
23bf0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
23c00 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
23c10 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  st->a[0].pExpr->
23c20 78 2e 70 4c 69 73 74 2c 30 29 3b 0a 20 20 20 20  x.pList,0);.    
23c30 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69        pDel = pMi
23c40 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20  nMax;.          
23c50 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21  if( pMinMax && !
23c60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
23c70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23c80 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f  pMinMax->a[0].so
23c90 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d  rtOrder = flag!=
23ca0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
23cb0 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20  N ?1:0;.        
23cc0 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30      pMinMax->a[0
23cd0 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b  ].pExpr->op = TK
23ce0 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
23cf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
23d00 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69   .        /* Thi
23d10 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74  s case runs if t
23d20 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73  he aggregate has
23d30 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
23d40 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  use.  The.      
23d50 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
23d60 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20  is much simpler 
23d70 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f  since there is o
23d80 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nly a single row
23d90 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f  .        ** of o
23da0 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a  utput..        *
23db0 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 74 41  /.        resetA
23dc0 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
23dd0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
23de0 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20         pWInfo = 
23df0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
23e00 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
23e10 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4d 69  st, pWhere, &pMi
23e20 6e 4d 61 78 2c 20 66 6c 61 67 29 3b 0a 20 20 20  nMax, flag);.   
23e30 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d       if( pWInfo=
23e40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
23e50 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
23e60 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b  elete(db, pDel);
23e70 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
23e80 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
23e90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 70      }.        up
23ea0 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
23eb0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
23ec0 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
23ed0 21 70 4d 69 6e 4d 61 78 20 26 26 20 66 6c 61 67  !pMinMax && flag
23ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
23ef0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
23f00 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
23f10 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a  WInfo->iBreak);.
23f20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
23f30 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20  mment((v, "%s() 
23f40 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20  by index",.     
23f50 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67             (flag
23f60 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  ==WHERE_ORDERBY_
23f70 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29  MIN?"min":"max")
23f80 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
23f90 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
23fa0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
23fb0 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41         finalizeA
23fc0 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
23fd0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
23fe0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
23ff0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
24000 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
24010 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
24020 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20  aving, addrEnd, 
24030 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
24040 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74  L);.      select
24050 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
24060 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
24070 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20  0, 0, 0, -1, .  
24080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24090 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45      pDest, addrE
240a0 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  nd, addrEnd);.  
240b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
240c0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
240d0 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  el);.    }.    s
240e0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
240f0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e  eLabel(v, addrEn
24100 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20  d);.    .  } /* 
24110 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20  endif aggregate 
24120 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49  query */..  /* I
24130 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
24140 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
24150 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73  hen we need to s
24160 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ort the results.
24170 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68    ** and send th
24180 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  em to the callba
24190 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  ck one by one.. 
241a0 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
241b0 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  By ){.    genera
241c0 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73  teSortTail(pPars
241d0 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d  e, p, v, pEList-
241e0 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a  >nExpr, pDest);.
241f0 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68    }..  /* Jump h
24200 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73  ere to skip this
24210 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71   query.  */.  sq
24220 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
24230 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a  Label(v, iEnd);.
24240 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54  .  /* The SELECT
24250 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
24260 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74  y coded.   Set t
24270 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
24280 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  o 0.  ** to indi
24290 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a  cate no errors..
242a0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a    */.  rc = 0;..
242b0 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d    /* Control jum
242c0 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e  ps to here if an
242d0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
242e0 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20  tered above, or 
242f0 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  upon.  ** succes
24300 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74  sful coding of t
24310 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a  he SELECT..  */.
24320 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f  select_end:..  /
24330 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d  * Identify colum
24340 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c  n names if resul
24350 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ts of the SELECT
24360 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75   are to be outpu
24370 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  t..  */.  if( rc
24380 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
24390 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
243a0 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67  _Output ){.    g
243b0 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
243c0 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
243d0 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ist, pEList);.  
243e0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  }..  sqlite3DbFr
243f0 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
24400 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  aCol);.  sqlite3
24410 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49  DbFree(db, sAggI
24420 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65  nfo.aFunc);.  re
24430 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
24440 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
24450 45 42 55 47 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a  EBUG)./*.*******
24460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
244a0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20  ********.** The 
244b0 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 69  following code i
244c0 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
244d0 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
244e0 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 64 65   only.  The code
244f0 0a 2a 2a 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  .** that follows
24500 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72   does not appear
24510 20 69 6e 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64   in normal build
24520 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  s..**.** These r
24530 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
24540 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 74 68   to print out th
24550 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6c 6c  e content of all
24560 20 6f 72 20 70 61 72 74 20 6f 66 20 61 20 0a 2a   or part of a .*
24570 2a 20 70 61 72 73 65 20 73 74 72 75 63 74 75 72  * parse structur
24580 65 73 20 73 75 63 68 20 61 73 20 53 65 6c 65 63  es such as Selec
24590 74 20 6f 72 20 45 78 70 72 2e 20 20 53 75 63 68  t or Expr.  Such
245a0 20 70 72 69 6e 74 6f 75 74 73 20 61 72 65 20 75   printouts are u
245b0 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c  seful.** for hel
245c0 70 69 6e 67 20 74 6f 20 75 6e 64 65 72 73 74 61  ping to understa
245d0 6e 64 20 77 68 61 74 20 69 73 20 68 61 70 70 65  nd what is happe
245e0 6e 69 6e 67 20 69 6e 73 69 64 65 20 74 68 65 20  ning inside the 
245f0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a  code generator.*
24600 2a 20 64 75 72 69 6e 67 20 74 68 65 20 65 78 65  * during the exe
24610 63 75 74 69 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65  cution of comple
24620 78 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  x SELECT stateme
24630 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  nts..**.** These
24640 20 72 6f 75 74 69 6e 65 20 61 72 65 20 6e 6f 74   routine are not
24650 20 63 61 6c 6c 65 64 20 61 6e 79 77 68 65 72 65   called anywhere
24660 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
24670 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20   normal.** code 
24680 62 61 73 65 2e 20 20 54 68 65 6e 20 61 72 65 20  base.  Then are 
24690 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 63  intended to be c
246a0 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
246b0 6e 20 74 68 65 20 64 65 62 75 67 67 65 72 0a 2a  n the debugger.*
246c0 2a 20 6f 72 20 66 72 6f 6d 20 74 65 6d 70 6f 72  * or from tempor
246d0 61 72 79 20 22 70 72 69 6e 74 66 22 20 73 74 61  ary "printf" sta
246e0 74 65 6d 65 6e 74 73 20 69 6e 73 65 72 74 65 64  tements inserted
246f0 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0a   for debugging..
24700 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
24710 72 69 6e 74 45 78 70 72 28 45 78 70 72 20 2a 70  rintExpr(Expr *p
24720 29 7b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  ){.  if( !ExprHa
24730 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
24740 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e  IntValue) && p->
24750 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
24760 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24770 74 66 28 22 28 25 73 22 2c 20 70 2d 3e 75 2e 7a  tf("(%s", p->u.z
24780 54 6f 6b 65 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b  Token);.  }else{
24790 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
247a0 67 50 72 69 6e 74 66 28 22 28 25 64 22 2c 20 70  gPrintf("(%d", p
247b0 2d 3e 6f 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ->op);.  }.  if(
247c0 20 70 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20   p->pLeft ){.   
247d0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
247e0 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71  ntf(" ");.    sq
247f0 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70  lite3PrintExpr(p
24800 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 20 20  ->pLeft);.  }.  
24810 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b  if( p->pRight ){
24820 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
24830 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20  gPrintf(" ");.  
24840 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
24850 70 72 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20  pr(p->pRight);. 
24860 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75   }.  sqlite3Debu
24870 67 50 72 69 6e 74 66 28 22 29 22 29 3b 0a 7d 0a  gPrintf(")");.}.
24880 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e  void sqlite3Prin
24890 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  tExprList(ExprLi
248a0 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
248b0 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
248c0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
248d0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
248e0 33 50 72 69 6e 74 45 78 70 72 28 70 4c 69 73 74  3PrintExpr(pList
248f0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
24900 20 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e     if( i<pList->
24910 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20  nExpr-1 ){.     
24920 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24930 6e 74 66 28 22 2c 20 22 29 3b 0a 20 20 20 20 7d  ntf(", ");.    }
24940 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
24950 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28 53  te3PrintSelect(S
24960 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 6e  elect *p, int in
24970 64 65 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  dent){.  sqlite3
24980 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73  DebugPrintf("%*s
24990 53 45 4c 45 43 54 28 25 70 29 20 22 2c 20 69 6e  SELECT(%p) ", in
249a0 64 65 6e 74 2c 20 22 22 2c 20 70 29 3b 0a 20 20  dent, "", p);.  
249b0 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
249c0 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 29 3b  List(p->pEList);
249d0 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
249e0 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 69  rintf("\n");.  i
249f0 66 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20  f( p->pSrc ){.  
24a00 20 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78 3b    char *zPrefix;
24a10 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
24a20 7a 50 72 65 66 69 78 20 3d 20 22 46 52 4f 4d 22  zPrefix = "FROM"
24a30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
24a40 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20  <p->pSrc->nSrc; 
24a50 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
24a60 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
24a70 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72  *pItem = &p->pSr
24a80 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73  c->a[i];.      s
24a90 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24aa0 66 28 22 25 2a 73 20 22 2c 20 69 6e 64 65 6e 74  f("%*s ", indent
24ab0 2b 36 2c 20 7a 50 72 65 66 69 78 29 3b 0a 20 20  +6, zPrefix);.  
24ac0 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22 22      zPrefix = ""
24ad0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
24ae0 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
24af0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
24b00 75 67 50 72 69 6e 74 66 28 22 28 5c 6e 22 29 3b  ugPrintf("(\n");
24b10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24b20 50 72 69 6e 74 53 65 6c 65 63 74 28 70 49 74 65  PrintSelect(pIte
24b30 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 6e 64 65  m->pSelect, inde
24b40 6e 74 2b 31 30 29 3b 0a 20 20 20 20 20 20 20 20  nt+10);.        
24b50 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24b60 74 66 28 22 25 2a 73 29 22 2c 20 69 6e 64 65 6e  tf("%*s)", inden
24b70 74 2b 38 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  t+8, "");.      
24b80 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d  }else if( pItem-
24b90 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  >zName ){.      
24ba0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24bb0 69 6e 74 66 28 22 25 73 22 2c 20 70 49 74 65 6d  intf("%s", pItem
24bc0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
24bd0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  }.      if( pIte
24be0 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20  m->pTab ){.     
24bf0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24c00 72 69 6e 74 66 28 22 28 74 61 62 6c 65 3a 20 25  rintf("(table: %
24c10 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  s)", pItem->pTab
24c20 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
24c30 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  }.      if( pIte
24c40 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
24c50 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
24c60 67 50 72 69 6e 74 66 28 22 20 41 53 20 25 73 22  gPrintf(" AS %s"
24c70 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  , pItem->zAlias)
24c80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24c90 69 66 28 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e  if( i<p->pSrc->n
24ca0 53 72 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  Src-1 ){.       
24cb0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24cc0 6e 74 66 28 22 2c 22 29 3b 0a 20 20 20 20 20 20  ntf(",");.      
24cd0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  }.      sqlite3D
24ce0 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
24cf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
24d00 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20  ( p->pWhere ){. 
24d10 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24d20 72 69 6e 74 66 28 22 25 2a 73 20 57 48 45 52 45  rintf("%*s WHERE
24d30 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b   ", indent, "");
24d40 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
24d50 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 29  tExpr(p->pWhere)
24d60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
24d70 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
24d80 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72    }.  if( p->pGr
24d90 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  oupBy ){.    sql
24da0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24db0 22 25 2a 73 20 47 52 4f 55 50 20 42 59 20 22 2c  "%*s GROUP BY ",
24dc0 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20   indent, "");.  
24dd0 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
24de0 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
24df0 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
24e00 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
24e10 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
24e20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73  pHaving ){.    s
24e30 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24e40 66 28 22 25 2a 73 20 48 41 56 49 4e 47 20 22 2c  f("%*s HAVING ",
24e50 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20   indent, "");.  
24e60 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
24e70 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  pr(p->pHaving);.
24e80 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24e90 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
24ea0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  }.  if( p->pOrde
24eb0 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
24ec0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
24ed0 2a 73 20 4f 52 44 45 52 20 42 59 20 22 2c 20 69  *s ORDER BY ", i
24ee0 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20  ndent, "");.    
24ef0 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
24f00 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
24f10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
24f20 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
24f30 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66  .  }.}./* End of
24f40 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 64   the structure d
24f50 65 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f  ebug printing co
24f60 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  de.*************
24f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24fb0 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  /.#endif /* defi
24fc0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
24fd0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
24fe0 54 45 5f 44 45 42 55 47 29 20 2a 2f 0a           TE_DEBUG) */.