/ Hex Artifact Content
Login

Artifact 8a7ba246b0b4bb45df7fbc52681728a0e3deaaa7:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
0210: 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  l the content of
0220: 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74   a Select struct
0230: 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ure but do not d
0240: 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65  eallocate.** the
0250: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
0260: 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61  e itself..*/.sta
0270: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0280: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0290: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
02a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c  elete(db, p->pEL
02c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
02d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
02e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c   p->pSrc);.  sql
02f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0300: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
0310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0330: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
0340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0350: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0380: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
0390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
03a0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
03b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
03c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
03d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
03e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
03f0: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
0400: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c  Initialize a Sel
0410: 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
0420: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
0430: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
0440: 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65  (SelectDest *pDe
0450: 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  st, int eDest, i
0460: 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65  nt iParm){.  pDe
0470: 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29  st->eDest = (u8)
0480: 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e  eDest;.  pDest->
0490: 69 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20  iParm = iParm;. 
04a0: 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79   pDest->affinity
04b0: 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69   = 0;.  pDest->i
04c0: 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  Mem = 0;.  pDest
04d0: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 7d 0a 0a 0a  ->nMem = 0;.}...
04e0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
04f0: 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75   new Select stru
0500: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
0510: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0520: 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  at.** structure.
0530: 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  .*/.Select *sqli
0540: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
0550: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0560: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0570: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
0580: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
0590: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
05a0: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
05b0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
05c0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
05d0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
05e0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
05f0: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0600: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0610: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0620: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0630: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0640: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0650: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0660: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0670: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
0680: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
0690: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
06a0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
06b0: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
06c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
06d0: 69 73 44 69 73 74 69 6e 63 74 2c 20 20 20 20 20  isDistinct,     
06e0: 20 20 2f 2a 20 74 72 75 65 20 69 66 20 74 68 65    /* true if the
06f0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
0700: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
0710: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
0720: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54          /* LIMIT
0730: 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65   value.  NULL me
0740: 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a  ans not used */.
0750: 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20    Expr *pOffset 
0760: 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45          /* OFFSE
0770: 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d  T value.  NULL m
0780: 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a  eans no offset *
0790: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
07a0: 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74  New;.  Select st
07b0: 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  andin;.  sqlite3
07c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
07d0: 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
07e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
07f0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
0800: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ) );.  assert( d
0810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0820: 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70  || !pOffset || p
0830: 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f 46 46 53  Limit ); /* OFFS
0840: 45 54 20 69 6d 70 6c 69 65 73 20 4c 49 4d 49 54  ET implies LIMIT
0850: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   */.  if( pNew==
0860: 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  0 ){.    pNew = 
0870: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65  &standin;.    me
0880: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
0890: 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
08a0: 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  }.  if( pEList==
08b0: 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20  0 ){.    pEList 
08c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
08d0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
08e0: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
08f0: 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20  b,TK_ALL,0));.  
0900: 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  }.  pNew->pEList
0910: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65   = pEList;.  pNe
0920: 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  w->pSrc = pSrc;.
0930: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
0940: 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d   pWhere;.  pNew-
0950: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
0960: 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  upBy;.  pNew->pH
0970: 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b  aving = pHaving;
0980: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
0990: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
09a0: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
09b0: 20 69 73 44 69 73 74 69 6e 63 74 20 3f 20 53 46   isDistinct ? SF
09c0: 5f 44 69 73 74 69 6e 63 74 20 3a 20 30 3b 0a 20  _Distinct : 0;. 
09d0: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53   pNew->op = TK_S
09e0: 45 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70  ELECT;.  pNew->p
09f0: 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
0a00: 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
0a10: 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73  = pOffset;.  ass
0a20: 65 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20  ert( pOffset==0 
0a30: 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a  || pLimit!=0 );.
0a40: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0a50: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
0a60: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0a70: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
0a80: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0a90: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  [2] = -1;.  if( 
0aa0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
0ab0: 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65   ) {.    clearSe
0ac0: 6c 65 63 74 28 64 62 2c 20 70 4e 65 77 29 3b 0a  lect(db, pNew);.
0ad0: 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 26 73      if( pNew!=&s
0ae0: 74 61 6e 64 69 6e 20 29 20 73 71 6c 69 74 65 33  tandin ) sqlite3
0af0: 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29  DbFree(db, pNew)
0b00: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
0b10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
0b20: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  w;.}../*.** Dele
0b30: 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c  te the given Sel
0b40: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e  ect structure an
0b50: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
0b60: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
0b70: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0b80: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
0b90: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  *db, Select *p){
0ba0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
0bb0: 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20  clearSelect(db, 
0bc0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
0bd0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
0be0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
0bf0: 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69   1 to 3 identifi
0c00: 65 72 73 20 70 72 65 63 65 65 64 69 6e 67 20 74  ers preceeding t
0c10: 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c  he JOIN keyword,
0c20: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a   determine the.*
0c30: 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20  * type of join. 
0c40: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
0c50: 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74  er constant that
0c60: 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20   expresses that 
0c70: 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73  type.** in terms
0c80: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0c90: 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a  g bit values:.**
0ca0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52  .**     JT_INNER
0cb0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53  .**     JT_CROSS
0cc0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52  .**     JT_OUTER
0cd0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52  .**     JT_NATUR
0ce0: 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46  AL.**     JT_LEF
0cf0: 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48  T.**     JT_RIGH
0d00: 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f  T.**.** A full o
0d10: 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65  uter join is the
0d20: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
0d30: 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52  JT_LEFT and JT_R
0d40: 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  IGHT..**.** If a
0d50: 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73  n illegal or uns
0d60: 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79  upported join ty
0d70: 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e  pe is seen, then
0d80: 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a   still return.**
0d90: 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75   a join type, bu
0da0: 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69  t put an error i
0db0: 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
0dc0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
0dd0: 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50  qlite3JoinType(P
0de0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
0df0: 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a  ken *pA, Token *
0e00: 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a  pB, Token *pC){.
0e10: 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d    int jointype =
0e20: 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41   0;.  Token *apA
0e30: 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a  ll[3];.  Token *
0e40: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p;.             
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e60: 2f 2a 20 20 20 30 31 32 33 34 35 36 37 38 39 20  /*   0123456789 
0e70: 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36  123456789 123456
0e80: 37 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61  789 123 */.  sta
0e90: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
0ea0: 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74  KeyText[] = "nat
0eb0: 75 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74  uraleftouteright
0ec0: 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b  fullinnercross";
0ed0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
0ee0: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20  struct {.    u8 
0ef0: 69 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67  i;        /* Beg
0f00: 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72  inning of keywor
0f10: 64 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65  d text in zKeyTe
0f20: 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e  xt[] */.    u8 n
0f30: 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67  Char;    /* Leng
0f40: 74 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72  th of the keywor
0f50: 64 20 69 6e 20 63 68 61 72 61 63 74 65 72 73 20  d in characters 
0f60: 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20  */.    u8 code; 
0f70: 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65      /* Join type
0f80: 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65   mask */.  } aKe
0f90: 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  yword[] = {.    
0fa0: 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20  /* natural */ { 
0fb0: 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41  0,  7, JT_NATURA
0fc0: 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L               
0fd0: 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20   },.    /* left 
0fe0: 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a     */ { 6,  4, J
0ff0: 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20  T_LEFT|JT_OUTER 
1000: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1010: 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20  /* outer   */ { 
1020: 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20  10, 5, JT_OUTER 
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1040: 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74   },.    /* right
1050: 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a     */ { 14, 5, J
1060: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
1070: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1080: 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20  /* full    */ { 
1090: 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a  19, 4, JT_LEFT|J
10a0: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
10b0: 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72   },.    /* inner
10c0: 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a     */ { 23, 5, J
10d0: 54 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20  T_INNER         
10e0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
10f0: 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20  /* cross   */ { 
1100: 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c  28, 5, JT_INNER|
1110: 4a 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20  JT_CROSS        
1120: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
1130: 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20  , j;.  apAll[0] 
1140: 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d  = pA;.  apAll[1]
1150: 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32   = pB;.  apAll[2
1160: 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d  ] = pC;.  for(i=
1170: 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b  0; i<3 && apAll[
1180: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  i]; i++){.    p 
1190: 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20  = apAll[i];.    
11a0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79  for(j=0; j<Array
11b0: 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20  Size(aKeyword); 
11c0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
11d0: 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a  p->n==aKeyword[j
11e0: 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20  ].nChar .       
11f0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
1200: 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e  NICmp((char*)p->
1210: 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65  z, &zKeyText[aKe
1220: 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e  yword[j].i], p->
1230: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  n)==0 ){.       
1240: 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65   jointype |= aKe
1250: 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20  yword[j].code;. 
1260: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1270: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1280: 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c  testcase( j==0 |
1290: 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c  | j==1 || j==2 |
12a0: 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c  | j==3 || j==4 |
12b0: 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29  | j==5 || j==6 )
12c0: 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72  ;.    if( j>=Arr
12d0: 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29  aySize(aKeyword)
12e0: 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   ){.      jointy
12f0: 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a  pe |= JT_ERROR;.
1300: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1310: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20   }.  }.  if(.   
1320: 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a    (jointype & (J
1330: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
1340: 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54  ))==(JT_INNER|JT
1350: 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20  _OUTER) ||.     
1360: 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45  (jointype & JT_E
1370: 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20  RROR)!=0.  ){.  
1380: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1390: 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73  p = " ";.    ass
13a0: 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20  ert( pB!=0 );.  
13b0: 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a    if( pC==0 ){ z
13c0: 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69  Sp++; }.    sqli
13d0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13e0: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20  se, "unknown or 
13f0: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
1400: 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20   type: ".       
1410: 22 25 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c  "%T %T%s%T", pA,
1420: 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20   pB, zSp, pC);. 
1430: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
1440: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20  _INNER;.  }else 
1450: 69 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20  if( (jointype & 
1460: 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20  JT_OUTER)!=0 .  
1470: 20 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74         && (joint
1480: 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  ype & (JT_LEFT|J
1490: 54 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45  T_RIGHT))!=JT_LE
14a0: 46 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  FT ){.    sqlite
14b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14c0: 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48 54 20  , .      "RIGHT 
14d0: 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a  and FULL OUTER J
14e0: 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72  OINs are not cur
14f0: 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64  rently supported
1500: 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65  ");.    jointype
1510: 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d   = JT_INNER;.  }
1520: 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79  .  return jointy
1530: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  pe;.}../*.** Ret
1540: 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
1550: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74   a column in a t
1560: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31  able.  Return -1
1570: 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a   if the column.*
1580: 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  * is not contain
1590: 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ed in the table.
15a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
15b0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65  olumnIndex(Table
15c0: 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68   *pTab, const ch
15d0: 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74  ar *zCol){.  int
15e0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
15f0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
1600: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1610: 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e  e3StrICmp(pTab->
1620: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  aCol[i].zName, z
1630: 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Col)==0 ) return
1640: 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
1650: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   -1;.}../*.** Se
1660: 61 72 63 68 20 74 68 65 20 66 69 72 73 74 20 4e  arch the first N
1670: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c   tables in pSrc,
1680: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
1690: 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ght, looking for
16a0: 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74   a.** table that
16b0: 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61   has a column na
16c0: 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a  med zCol.  .**.*
16d0: 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65  * When found, se
16e0: 74 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69  t *piTab and *pi
16f0: 43 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65  Col to the table
1700: 20 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d   index and colum
1710: 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68  n index.** of th
1720: 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  e matching colum
1730: 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55  n and return TRU
1740: 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20  E..**.** If not 
1750: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41  found, return FA
1760: 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LSE..*/.static i
1770: 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  nt tableAndColum
1780: 6e 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73  nIndex(.  SrcLis
1790: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f  t *pSrc,       /
17a0: 2a 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65  * Array of table
17b0: 73 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  s to search */. 
17c0: 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
17d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17e0: 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72  of tables in pSr
17f0: 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68  c->a[] to search
1800: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1810: 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61   *zCol,    /* Na
1820: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
1830: 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20   we are looking 
1840: 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  for */.  int *pi
1850: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Tab,          /*
1860: 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20   Write index of 
1870: 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a  pSrc->a[] here *
1880: 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20  /.  int *piCol  
1890: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
18a0: 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d  e index of pSrc-
18b0: 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d  >a[*piTab].pTab-
18c0: 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a  >aCol[] here */.
18d0: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
18e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
18f0: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61   looping over ta
1900: 62 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a  bles in pSrc */.
1910: 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
1920: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1930: 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69  of column matchi
1940: 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73  ng zCol */..  as
1950: 73 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29  sert( (piTab==0)
1960: 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20  ==(piCol==0) ); 
1970: 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74   /* Both or neit
1980: 68 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a  her are NULL */.
1990: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20    for(i=0; i<N; 
19a0: 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  i++){.    iCol =
19b0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72   columnIndex(pSr
19c0: 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43  c->a[i].pTab, zC
19d0: 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  ol);.    if( iCo
19e0: 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  l>=0 ){.      if
19f0: 28 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20  ( piTab ){.     
1a00: 20 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20     *piTab = i;. 
1a10: 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20         *piCol = 
1a20: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iCol;.      }.  
1a30: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1a40: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1a50: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
1a60: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
1a70: 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20  ed to add terms 
1a80: 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20  implied by JOIN 
1a90: 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a  syntax to the.**
1aa0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78   WHERE clause ex
1ab0: 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45  pression of a SE
1ac0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
1ad0: 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68  The new term, wh
1ae0: 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20  ich.** is ANDed 
1af0: 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69 6e  with the existin
1b00: 67 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  g WHERE clause, 
1b10: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
1b20: 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63  **.**    (tab1.c
1b30: 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29  ol1 = tab2.col2)
1b40: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62  .**.** where tab
1b50: 31 20 69 73 20 74 68 65 20 69 53 72 63 27 74 68  1 is the iSrc'th
1b60: 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73   table in SrcLis
1b70: 74 20 70 53 72 63 20 61 6e 64 20 74 61 62 32 20  t pSrc and tab2 
1b80: 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63  is the .** (iSrc
1b90: 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63  +1)'th. Column c
1ba0: 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43  ol1 is column iC
1bb0: 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20  olLeft of tab1, 
1bc0: 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63  and col2 is.** c
1bd0: 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20  olumn iColRight 
1be0: 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74  of tab2..*/.stat
1bf0: 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72 65  ic void addWhere
1c00: 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
1c10: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
1c20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1c30: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1c40: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
1c70: 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65  s in FROM clause
1c80: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c   */.  int iLeft,
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1cb0: 66 20 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f  f first table to
1cc0: 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f   join in pSrc */
1cd0: 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c  .  int iColLeft,
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
1d00: 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74  olumn in first t
1d10: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
1d20: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
1d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1d40: 65 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62  ex of second tab
1d50: 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  le in pSrc */.  
1d60: 69 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20  int iColRight,  
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
1d90: 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62  mn in second tab
1da0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75  le */.  int isOu
1db0: 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20  terJoin,        
1dc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1dd0: 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55  if this is an OU
1de0: 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78  TER join */.  Ex
1df0: 70 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20  pr **ppWhere    
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e10: 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45   IN/OUT: The WHE
1e20: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64  RE clause to add
1e30: 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69   to */.){.  sqli
1e40: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1e50: 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  ->db;.  Expr *pE
1e60: 31 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a  1;.  Expr *pE2;.
1e70: 20 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20    Expr *pEq;..  
1e80: 61 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52  assert( iLeft<iR
1e90: 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74  ight );.  assert
1ea0: 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69  ( pSrc->nSrc>iRi
1eb0: 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ght );.  assert(
1ec0: 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e   pSrc->a[iLeft].
1ed0: 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74  pTab );.  assert
1ee0: 28 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74  ( pSrc->a[iRight
1ef0: 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31  ].pTab );..  pE1
1f00: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
1f10: 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70  ColumnExpr(db, p
1f20: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c  Src, iLeft, iCol
1f30: 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73  Left);.  pE2 = s
1f40: 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75  qlite3CreateColu
1f50: 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c  mnExpr(db, pSrc,
1f60: 20 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67   iRight, iColRig
1f70: 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71  ht);..  pEq = sq
1f80: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1f90: 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70  e, TK_EQ, pE1, p
1fa0: 45 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45  E2, 0);.  if( pE
1fb0: 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e  q && isOuterJoin
1fc0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
1fd0: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
1fe0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
1ff0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41  ssert( !ExprHasA
2000: 6e 79 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  nyProperty(pEq, 
2010: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
2020: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
2030: 45 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62  ExprSetIrreducib
2040: 6c 65 28 70 45 71 29 3b 0a 20 20 20 20 70 45 71  le(pEq);.    pEq
2050: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2060: 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69 54  e = (i16)pE2->iT
2070: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 57  able;.  }.  *ppW
2080: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
2090: 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68 65  prAnd(db, *ppWhe
20a0: 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a  re, pEq);.}../*.
20b0: 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72  ** Set the EP_Fr
20c0: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
20d0: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  on all terms of 
20e0: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
20f0: 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74  sion..** And set
2100: 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   the Expr.iRight
2110: 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61  JoinTable to iTa
2120: 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65  ble for every te
2130: 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70  rm in the.** exp
2140: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ression..**.** T
2150: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
2160: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
2170: 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65  on terms of an e
2180: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c  xpression to tel
2190: 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55  l.** the LEFT OU
21a0: 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73  TER JOIN process
21b0: 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74  ing logic that t
21c0: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
21d0: 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20   of the.** join 
21e0: 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63  restriction spec
21f0: 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  ified in the ON 
2200: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
2210: 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a  and not a part.*
2220: 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65  * of the more ge
2230: 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75  neral WHERE clau
2240: 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73  se.  These terms
2250: 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20   are moved over 
2260: 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  to the.** WHERE 
2270: 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f  clause during jo
2280: 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75  in processing bu
2290: 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d  t we need to rem
22a0: 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a  ember that they.
22b0: 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e  ** originated in
22c0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
22d0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54   clause..**.** T
22e0: 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  he Expr.iRightJo
22f0: 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68  inTable tells th
2300: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
2310: 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74  rocessing that t
2320: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
2330: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c   depends on tabl
2340: 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  e iRightJoinTabl
2350: 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74  e even if that t
2360: 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65  able is not.** e
2370: 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f  xplicitly mentio
2380: 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65  ned in the expre
2390: 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66  ssion.  That inf
23a0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64  ormation is need
23b0: 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20  ed.** for cases 
23c0: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
23d0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
23e0: 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
23f0: 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41  2 ON t1.a=t2.b A
2400: 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20  ND t1.x=5.**.** 
2410: 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  The where clause
2420: 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20   needs to defer 
2430: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
2440: 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65  the t1.x=5.** te
2450: 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74  rm until after t
2460: 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68  he t2 loop of th
2470: 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74  e join.  In that
2480: 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20   way, a.** NULL 
2490: 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69  t2 row will be i
24a0: 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72  nserted whenever
24b0: 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65   t1.x!=5.  If we
24c0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72   do not.** defer
24d0: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
24e0: 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c   t1.x=5, it will
24f0: 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d   be processed im
2500: 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74  mediately.** aft
2510: 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61  er the t1 loop a
2520: 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e  nd rows with t1.
2530: 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20  x!=5 will never 
2540: 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65  appear in.** the
2550: 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69   output, which i
2560: 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a  s incorrect..*/.
2570: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a  static void setJ
2580: 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c  oinExpr(Expr *p,
2590: 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
25a0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
25b0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
25c0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  p, EP_FromJoin);
25d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
25e0: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
25f0: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
2600: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
2610: 20 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64      ExprSetIrred
2620: 75 63 69 62 6c 65 28 70 29 3b 0a 20 20 20 20 70  ucible(p);.    p
2630: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2640: 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b  e = (i16)iTable;
2650: 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72  .    setJoinExpr
2660: 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  (p->pLeft, iTabl
2670: 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  e);.    p = p->p
2680: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
2690: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26a0: 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  e processes the 
26b0: 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  join information
26c0: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
26d0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61  atement..** ON a
26e0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
26f0: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
2700: 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20  nto extra terms 
2710: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
2720: 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20  use..** NATURAL 
2730: 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74  joins also creat
2740: 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  e extra WHERE cl
2750: 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a  ause terms..**.*
2760: 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61  * The terms of a
2770: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65   FROM clause are
2780: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
2790: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74  e Select.pSrc st
27a0: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20  ructure..** The 
27b0: 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20  left most table 
27c0: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  is the first ent
27d0: 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72  ry in Select.pSr
27e0: 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  c.  The right-mo
27f0: 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74  st.** table is t
2800: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20  he last entry.  
2810: 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  The join operato
2820: 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65  r is held in the
2830: 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65   entry to.** the
2840: 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74   left.  Thus ent
2850: 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68  ry 0 contains th
2860: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
2870: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74  for the join bet
2880: 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ween.** entries 
2890: 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e  0 and 1.  Any ON
28a0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
28b0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
28c0: 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a  h the join are.*
28d0: 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20  * also attached 
28e0: 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72  to the left entr
28f0: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
2900: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
2910: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
2920: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  rs encountered..
2930: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
2940: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
2950: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
2960: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
2970: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2990: 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  All tables in th
29a0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
29b0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
29e0: 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ers */.  struct 
29f0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
2a00: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74  eft;     /* Left
2a10: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
2a20: 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
2a30: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52  SrcList_item *pR
2a40: 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68  ight;    /* Righ
2a50: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
2a60: 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20  ined */..  pSrc 
2a70: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65  = p->pSrc;.  pLe
2a80: 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d  ft = &pSrc->a[0]
2a90: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c  ;.  pRight = &pL
2aa0: 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  eft[1];.  for(i=
2ab0: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
2ac0: 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b  1; i++, pRight++
2ad0: 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20  , pLeft++){.    
2ae0: 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20  Table *pLeftTab 
2af0: 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20  = pLeft->pTab;. 
2b00: 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74     Table *pRight
2b10: 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54  Tab = pRight->pT
2b20: 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75  ab;.    int isOu
2b30: 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45  ter;..    if( NE
2b40: 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d 30 20  VER(pLeftTab==0 
2b50: 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29  || pRightTab==0)
2b60: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2b70: 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67   isOuter = (pRig
2b80: 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ht->jointype & J
2b90: 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20  T_OUTER)!=0;..  
2ba0: 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41    /* When the NA
2bb0: 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73  TURAL keyword is
2bc0: 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48   present, add WH
2bd0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
2be0: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72   for.    ** ever
2bf0: 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68  y column that th
2c00: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76  e two tables hav
2c10: 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20  e in common..   
2c20: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
2c30: 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ht->jointype & J
2c40: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
2c50: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
2c60: 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55  On || pRight->pU
2c70: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  sing ){.        
2c80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2c90: 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52  pParse, "a NATUR
2ca0: 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20  AL join may not 
2cb0: 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20  have ".         
2cc0: 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e    "an ON or USIN
2cd0: 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20  G clause", 0);. 
2ce0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
2cf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2d00: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74  or(j=0; j<pRight
2d10: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
2d20: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
2d30: 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
2d40: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  of column in the
2d50: 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a   right table */.
2d60: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
2d70: 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69  t;     /* Matchi
2d80: 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f  ng left table */
2d90: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
2da0: 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68  ftCol;  /* Match
2db0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ing column in th
2dc0: 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  e left table */.
2dd0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
2de0: 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c   pRightTab->aCol
2df0: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
2e00: 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43     if( tableAndC
2e10: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c  olumnIndex(pSrc,
2e20: 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c   i+1, zName, &iL
2e30: 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20  eft, &iLeftCol) 
2e40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
2e50: 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65  WhereTerm(pParse
2e60: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
2e70: 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c  LeftCol, i+1, j,
2e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e90: 20 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c          isOuter,
2ea0: 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   &p->pWhere);.  
2eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2ec0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
2ed0: 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61  sallow both ON a
2ee0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
2ef0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
2f00: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  n.    */.    if(
2f10: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20   pRight->pOn && 
2f20: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
2f30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2f40: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2f50: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
2f60: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
2f70: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
2f80: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
2f90: 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  in");.      retu
2fa0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
2fb0: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
2fc0: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
2fd0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2fe0: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
2ff0: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44  by.    ** an AND
3000: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
3010: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3020: 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  ->pOn ){.      i
3030: 66 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74  f( isOuter ) set
3040: 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d  JoinExpr(pRight-
3050: 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43  >pOn, pRight->iC
3060: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d  ursor);.      p-
3070: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
3080: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
3090: 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  >db, p->pWhere, 
30a0: 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20  pRight->pOn);.  
30b0: 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20      pRight->pOn 
30c0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
30d0: 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20  /* Create extra 
30e0: 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45  terms on the WHE
30f0: 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61  RE clause for ea
3100: 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a  ch column named.
3110: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53      ** in the US
3120: 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61  ING clause.  Exa
3130: 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f  mple: If the two
3140: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3150: 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a  ined are .    **
3160: 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65   A and B and the
3170: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61   USING clause na
3180: 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c  mes X, Y, and Z,
3190: 20 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20   then add this. 
31a0: 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45     ** to the WHE
31b0: 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e  RE clause:    A.
31c0: 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e  X=B.X AND A.Y=B.
31d0: 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20  Y AND A.Z=B.Z.  
31e0: 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65    ** Report an e
31f0: 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75  rror if any colu
3200: 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  mn mentioned in 
3210: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3220: 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63   is.    ** not c
3230: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68  ontained in both
3240: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3250: 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ined..    */.   
3260: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73   if( pRight->pUs
3270: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c  ing ){.      IdL
3280: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69  ist *pList = pRi
3290: 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20  ght->pUsing;.   
32a0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
32b0: 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a  ist->nId; j++){.
32c0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
32d0: 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame;     /* Name
32e0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20   of the term in 
32f0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3300: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3310: 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20  iLeft;       /* 
3320: 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66  Table on the lef
3330: 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20  t with matching 
3340: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
3350: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
3360: 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col;    /* Colum
3370: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  n number of matc
3380: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74  hing column on t
3390: 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20  he left */.     
33a0: 20 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c     int iRightCol
33b0: 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75  ;   /* Column nu
33c0: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67  mber of matching
33d0: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72   column on the r
33e0: 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ight */..       
33f0: 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e   zName = pList->
3400: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
3410: 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20      iRightCol = 
3420: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67  columnIndex(pRig
3430: 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  htTab, zName);. 
3440: 20 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68         if( iRigh
3450: 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20  tCol<0.         
3460: 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75  || !tableAndColu
3470: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b  mnIndex(pSrc, i+
3480: 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74  1, zName, &iLeft
3490: 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20  , &iLeftCol).   
34a0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
34b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
34c0: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
34d0: 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c  t join using col
34e0: 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20  umn %s - column 
34f0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e  ".            "n
3500: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f  ot present in bo
3510: 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d  th tables", zNam
3520: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
3530: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
3540: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65  }.        addWhe
3550: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  reTerm(pParse, p
3560: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66  Src, iLeft, iLef
3570: 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68  tCol, i+1, iRigh
3580: 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tCol,.          
3590: 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74             isOut
35a0: 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b  er, &p->pWhere);
35b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
35c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
35d0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63  ../*.** Insert c
35e0: 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61  ode into "v" tha
35f0: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
3600: 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f  record on the to
3610: 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63  p of the.** stac
3620: 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65  k into the sorte
3630: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
3640: 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72  d pushOntoSorter
3650: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3660: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
3670: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
3680: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
3690: 65 72 42 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  erBy,    /* The 
36a0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
36b0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
36c0: 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  lect,       /* T
36d0: 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20  he whole SELECT 
36e0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
36f0: 6e 74 20 72 65 67 44 61 74 61 20 20 20 20 20 20  nt regData      
3700: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
3710: 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 74  r holding data t
3720: 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 29  o be sorted */.)
3730: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
3740: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
3750: 6e 74 20 6e 45 78 70 72 20 3d 20 70 4f 72 64 65  nt nExpr = pOrde
3760: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e  rBy->nExpr;.  in
3770: 74 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69  t regBase = sqli
3780: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
3790: 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 32 29  pParse, nExpr+2)
37a0: 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  ;.  int regRecor
37b0: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
37c0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
37d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
37e0: 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
37f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
3800: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
3810: 2c 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42  , pOrderBy, regB
3820: 61 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ase, 0);.  sqlit
3830: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3840: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72  OP_Sequence, pOr
3850: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
3860: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
3870: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
3880: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
3890: 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b  egData, regBase+
38a0: 6e 45 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73  nExpr+1, 1);.  s
38b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
38c0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
38d0: 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70  d, regBase, nExp
38e0: 72 20 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64  r + 2, regRecord
38f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3900: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
3910: 49 6e 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79  Insert, pOrderBy
3920: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52  ->iECursor, regR
3930: 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
3940: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
3950: 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
3960: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  d);.  sqlite3Rel
3970: 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
3980: 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
3990: 45 78 70 72 2b 32 29 3b 0a 20 20 69 66 28 20 70  Expr+2);.  if( p
39a0: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29  Select->iLimit )
39b0: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c  {.    int addr1,
39c0: 20 61 64 64 72 32 3b 0a 20 20 20 20 69 6e 74 20   addr2;.    int 
39d0: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66 28 20  iLimit;.    if( 
39e0: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
39f0: 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74   ){.      iLimit
3a00: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66   = pSelect->iOff
3a10: 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  set+1;.    }else
3a20: 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d  {.      iLimit =
3a30: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
3a40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72  ;.    }.    addr
3a50: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
3a60: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp1(v, OP_IfZe
3a70: 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  ro, iLimit);.   
3a80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3a90: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
3aa0: 20 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20   iLimit, -1);.  
3ab0: 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
3ac0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
3ad0: 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c  P_Goto);.    sql
3ae0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
3af0: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
3b00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3b10: 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f  1(v, OP_Last, pO
3b20: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
3b30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3b40: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44  beAddOp1(v, OP_D
3b50: 65 6c 65 74 65 2c 20 70 4f 72 64 65 72 42 79 2d  elete, pOrderBy-
3b60: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
3b70: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
3b80: 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20  ere(v, addr2);. 
3b90: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
3ba0: 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
3bb0: 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a  t the OFFSET.*/.
3bc0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
3bd0: 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a  Offset(.  Vdbe *
3be0: 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47  v,          /* G
3bf0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
3c00: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53  o this VM */.  S
3c10: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
3c20: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
3c30: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
3c40: 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  oded */.  int iC
3c50: 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a  ontinue     /* J
3c60: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
3c70: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
3c80: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ord */.){.  if( 
3c90: 70 2d 3e 69 4f 66 66 73 65 74 20 26 26 20 69 43  p->iOffset && iC
3ca0: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20  ontinue!=0 ){.  
3cb0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
3cc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3cd0: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
3ce0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 2d 31 29 3b  p->iOffset, -1);
3cf0: 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
3d00: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
3d10: 20 4f 50 5f 49 66 4e 65 67 2c 20 70 2d 3e 69 4f   OP_IfNeg, p->iO
3d20: 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  ffset);.    sqli
3d30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3d40: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f   OP_Goto, 0, iCo
3d50: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62  ntinue);.    Vdb
3d60: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b  eComment((v, "sk
3d70: 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64  ip OFFSET record
3d80: 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  s"));.    sqlite
3d90: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
3da0: 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   addr);.  }.}../
3db0: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68  *.** Add code th
3dc0: 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f  at will check to
3dd0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e   make sure the N
3de0: 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
3df0: 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66  ing at iMem.** f
3e00: 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65  orm a distinct e
3e10: 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61  ntry.  iTab is a
3e20: 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
3e30: 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f  hat holds previo
3e40: 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d  usly.** seen com
3e50: 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  binations of the
3e60: 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65   N values.  A ne
3e70: 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20  w entry is made 
3e80: 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68  in iTab.** if th
3e90: 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75  e current N valu
3ea0: 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a  es are new..**.*
3eb0: 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72  * A jump to addr
3ec0: 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61  Repeat is made a
3ed0: 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65  nd the N+1 value
3ee0: 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f  s are popped fro
3ef0: 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69  m the.** stack i
3f00: 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d  f the top N elem
3f10: 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73  ents are not dis
3f20: 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  tinct..*/.static
3f30: 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e   void codeDistin
3f40: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
3f50: 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
3f60: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
3f70: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
3f80: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
3f90: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72          /* A sor
3fa0: 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20  ting index used 
3fb0: 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74  to test for dist
3fc0: 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e  inctness */.  in
3fd0: 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20  t addrRepeat,   
3fe0: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
3ff0: 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74   if not distinct
4000: 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20   */.  int N,    
4010: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4020: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a  er of elements *
4030: 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20  /.  int iMem    
4040: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
4050: 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  element */.){.  
4060: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72  Vdbe *v;.  int r
4070: 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65  1;..  v = pParse
4080: 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20  ->pVdbe;.  r1 = 
4090: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
40a0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
40b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
40c0: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
40d0: 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c  Tab, addrRepeat,
40e0: 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c   iMem, N);.  sql
40f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4100: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
4110: 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20   iMem, N, r1);. 
4120: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4130: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
4140: 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20  rt, iTab, r1);. 
4150: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
4160: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
4170: 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  1);.}..#ifndef S
4180: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
4190: 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ERY./*.** Genera
41a0: 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
41b0: 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c 45 43  age when a SELEC
41c0: 54 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e  T is used within
41d0: 20 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e   a subexpression
41e0: 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20 20 22  .** (example:  "
41f0: 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  a IN (SELECT * F
4200: 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62 75 74  ROM table)") but
4210: 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74 68 61   it has more tha
4220: 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f  n 1 result.** co
4230: 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74 68 69  lumn.  We do thi
4240: 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e  s in a subroutin
4250: 65 20 62 65 63 61 75 73 65 20 74 68 65 20 65 72  e because the er
4260: 72 6f 72 20 75 73 65 64 20 74 6f 20 6f 63 63 75  ror used to occu
4270: 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65  r.** in multiple
4280: 20 70 6c 61 63 65 73 2e 20 20 28 54 68 65 20 65   places.  (The e
4290: 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73  rror only occurs
42a0: 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f   in one place no
42b0: 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20 72 65 74  w, but we.** ret
42c0: 61 69 6e 20 74 68 65 20 73 75 62 72 6f 75 74 69  ain the subrouti
42d0: 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63  ne to minimize c
42e0: 6f 64 65 20 64 69 73 72 75 70 74 69 6f 6e 2e 29  ode disruption.)
42f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
4300: 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
4310: 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 0a 20  mnSelectError(. 
4320: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4330: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
4340: 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c  ontext. */.  Sel
4350: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
4360: 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
4370: 20 6f 66 20 53 45 4c 45 43 54 20 72 65 73 75 6c   of SELECT resul
4380: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70  ts */.  int nExp
4390: 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
43a0: 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  Number of result
43b0: 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
43c0: 64 20 62 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29  d by SELECT */.)
43d0: 7b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  {.  int eDest = 
43e0: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20  pDest->eDest;.  
43f0: 69 66 28 20 6e 45 78 70 72 3e 31 20 26 26 20 28  if( nExpr>1 && (
4400: 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c  eDest==SRT_Mem |
4410: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74  | eDest==SRT_Set
4420: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
4430: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4440: 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20   "only a single 
4450: 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66  result allowed f
4460: 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61 20 53  or ".       "a S
4470: 45 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61  ELECT that is pa
4480: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
4490: 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ion");.    retur
44a0: 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 1;.  }else{.  
44b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
44c0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
44d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
44e0: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
44f0: 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f  for the inside o
4500: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
4510: 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e  .** of a SELECT.
4520: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62  .**.** If srcTab
4530: 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65   and nColumn are
4540: 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e   both zero, then
4550: 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70 72   the pEList expr
4560: 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65  essions.** are e
4570: 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65  valuated in orde
4580: 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74  r to get the dat
4590: 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20  a for this row. 
45a0: 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a   If nColumn>0.**
45b0: 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75   then data is pu
45c0: 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62  lled from srcTab
45d0: 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75   and pEList is u
45e0: 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20  sed only to get 
45f0: 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73  the.** datatypes
4600: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
4610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4620: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
4630: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4640: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
4650: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
4660: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
4670: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4680: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
4690: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
46a0: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
46b0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
46c0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
46d0: 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67   of values being
46e0: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20   extracted */.  
46f0: 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20  int srcTab,     
4700: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20          /* Pull 
4710: 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74  data from this t
4720: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
4730: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
4740: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
4750: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f  olumns in the so
4760: 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  urce table */.  
4770: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
4780: 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  By,     /* If no
4790: 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73  t NULL, sort res
47a0: 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73 20  ults using this 
47b0: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  key */.  int dis
47c0: 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20  tinct,          
47d0: 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65   /* If >=0, make
47e0: 20 73 75 72 65 20 72 65 73 75 6c 74 73 20 61 72   sure results ar
47f0: 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  e distinct */.  
4800: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
4810: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
4820: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
4830: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
4840: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
4850: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4860: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
4870: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
4880: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
4890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
48a0: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
48b0: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
48c0: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
48d0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
48e0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
48f0: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
4900: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
4910: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
4920: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
4930: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  sent */.  int re
4940: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
4950: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
4960: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
4970: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
4980: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
4990: 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20  st->eDest;   /* 
49a0: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
49b0: 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  f results */.  i
49c0: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
49d0: 2d 3e 69 50 61 72 6d 3b 20 20 20 2f 2a 20 46 69  ->iParm;   /* Fi
49e0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
49f0: 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
4a00: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  */.  int nResult
4a10: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
4a20: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
4a30: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
4a40: 0a 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a  .  assert( v );.
4a50: 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
4a60: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  ) ) return;.  as
4a70: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
4a80: 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74  );.  hasDistinct
4a90: 20 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30 3b 0a   = distinct>=0;.
4aa0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
4ab0: 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63  0 && !hasDistinc
4ac0: 74 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66  t ){.    codeOff
4ad0: 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69  set(v, p, iConti
4ae0: 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nue);.  }..  /* 
4af0: 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74  Pull the request
4b00: 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f  ed columns..  */
4b10: 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30  .  if( nColumn>0
4b20: 20 29 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43   ){.    nResultC
4b30: 6f 6c 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  ol = nColumn;.  
4b40: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 75  }else{.    nResu
4b50: 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e  ltCol = pEList->
4b60: 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28  nExpr;.  }.  if(
4b70: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20   pDest->iMem==0 
4b80: 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 4d  ){.    pDest->iM
4b90: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
4ba0: 6d 2b 31 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e  m+1;.    pDest->
4bb0: 6e 4d 65 6d 20 3d 20 6e 52 65 73 75 6c 74 43 6f  nMem = nResultCo
4bc0: 6c 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  l;.    pParse->n
4bd0: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
4be0: 6c 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20  l;.  }else{ .   
4bf0: 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e   assert( pDest->
4c00: 6e 4d 65 6d 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c  nMem==nResultCol
4c10: 20 29 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 73   );.  }.  regRes
4c20: 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 4d 65  ult = pDest->iMe
4c30: 6d 3b 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e  m;.  if( nColumn
4c40: 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  >0 ){.    for(i=
4c50: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
4c60: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
4c70: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4c80: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
4c90: 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  , i, regResult+i
4ca0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
4cb0: 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
4cc0: 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a  Exists ){.    /*
4cd0: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
4ce0: 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53  ion is an EXISTS
4cf0: 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
4d00: 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20  , the actual.   
4d10: 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72   ** values retur
4d20: 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
4d30: 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72  T are not requir
4d40: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
4d50: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
4d60: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
4d70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
4d80: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
4d90: 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73  , pEList, regRes
4da0: 75 6c 74 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f  ult, eDest==SRT_
4db0: 4f 75 74 70 75 74 29 3b 0a 20 20 7d 0a 20 20 6e  Output);.  }.  n
4dc0: 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74  Column = nResult
4dd0: 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Col;..  /* If th
4de0: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
4df0: 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f  rd was present o
4e00: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
4e10: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20  tement.  ** and 
4e20: 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65  this row has bee
4e30: 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74  n seen before, t
4e40: 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20  hen do not make 
4e50: 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61  this row.  ** pa
4e60: 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
4e70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73  ..  */.  if( has
4e80: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
4e90: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
4ea0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
4eb0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
4ec0: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 63  nColumn );.    c
4ed0: 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
4ee0: 73 65 2c 20 64 69 73 74 69 6e 63 74 2c 20 69 43  se, distinct, iC
4ef0: 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e  ontinue, nColumn
4f00: 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  , regResult);.  
4f10: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
4f20: 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f  0 ){.      codeO
4f30: 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e  ffset(v, p, iCon
4f40: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
4f50: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
4f60: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
4f70: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
4f80: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
4f90: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
4fa0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
4fb0: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
4fc0: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
4fd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
4fe0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
4ff0: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
5000: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
5010: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
5020: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
5030: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
5040: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5050: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
5060: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
5070: 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20  lumn, r1);.     
5080: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5090: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
50a0: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a  rt, iParm, r1);.
50b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
50c0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
50d0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
50e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
50f0: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20   /* Construct a 
5100: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
5110: 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75  query result, bu
5120: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20  t instead of.   
5130: 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20   ** saving that 
5140: 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61  record, use it a
5150: 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74  s a key to delet
5160: 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a  e elements from.
5170: 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f      ** the tempo
5180: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
5190: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
51a0: 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a  e SRT_Except: {.
51b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
51c0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64  eAddOp3(v, OP_Id
51d0: 78 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20  xDelete, iParm, 
51e0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
51f0: 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
5200: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
5210: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
5220: 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
5230: 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
5240: 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
5250: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
5260: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
5270: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
5280: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
5290: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
52a0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
52b0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62  ( eDest==SRT_Tab
52c0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  le );.      test
52d0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
52e0: 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20  _EphemTab );.   
52f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5300: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
5310: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
5320: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a  , nColumn, r1);.
5330: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
5340: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  By ){.        pu
5350: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
5360: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
5370: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , r1);.      }el
5380: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
5390: 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
53a0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
53b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
53c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
53d0: 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c  NewRowid, iParm,
53e0: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r2);.        sq
53f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5400: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50  v, OP_Insert, iP
5410: 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20  arm, r1, r2);.  
5420: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5430: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
5440: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
5450: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
5460: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5470: 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r2);.      }.
5480: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
5490: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
54a0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
54b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
54c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
54d0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a  _SUBQUERY.    /*
54e0: 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74   If we are creat
54f0: 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e  ing a set for an
5500: 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43   "expr IN (SELEC
5510: 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63  T ...)" construc
5520: 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  t,.    ** then t
5530: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
5540: 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20   single item on 
5550: 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74  the stack.  Writ
5560: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74  e this.    ** it
5570: 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20  em into the set 
5580: 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73  table with bogus
5590: 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
55a0: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
55b0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
55c0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
55d0: 20 20 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20      p->affinity 
55e0: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
55f0: 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d  Affinity(pEList-
5600: 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65  >a[0].pExpr, pDe
5610: 73 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20  st->affinity);. 
5620: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
5630: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  y ){.        /* 
5640: 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20  At first glance 
5650: 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20  you would think 
5660: 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a  we could optimiz
5670: 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20  e out the.      
5680: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e    ** ORDER BY in
5690: 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65   this case since
56a0: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e   the order of en
56b0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74  tries in the set
56c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
56d0: 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75   not matter.  Bu
56e0: 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  t there might be
56f0: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c   a LIMIT clause,
5700: 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   in which.      
5710: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72    ** case the or
5720: 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20  der does matter 
5730: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  */.        pushO
5740: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
5750: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72  , pOrderBy, p, r
5760: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
5770: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5780: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
5790: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
57a0: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
57b0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
57c0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
57d0: 72 65 67 52 65 73 75 6c 74 2c 20 31 2c 20 72 31  regResult, 1, r1
57e0: 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20  , &p->affinity, 
57f0: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
5800: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
5810: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
5820: 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31 29  e, regResult, 1)
5830: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5840: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5850: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
5860: 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  rm, r1);.       
5870: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5880: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5890: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
58a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
58b0: 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f      /* If any ro
58c0: 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72  w exist in the r
58d0: 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72  esult set, recor
58e0: 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20  d that fact and 
58f0: 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  abort..    */.  
5900: 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74    case SRT_Exist
5910: 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s: {.      sqlit
5920: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5930: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
5940: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Parm);.      /* 
5950: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
5960: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
5970: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
5980: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
5990: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
59a0: 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
59b0: 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
59c0: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
59d0: 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
59e0: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
59f0: 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
5a00: 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
5a10: 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
5a20: 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
5a30: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
5a40: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
5a50: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
5a60: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
5a70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
5a80: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
5a90: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
5aa0: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
5ab0: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b  , p, regResult);
5ac0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5ad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
5ae0: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
5af0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 69 50 61  , regResult, iPa
5b00: 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  rm, 1);.        
5b10: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
5b20: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
5b30: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
5b40: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r us */.      }.
5b50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5b60: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
5b70: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5b80: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
5b90: 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61    /* Send the da
5ba0: 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ta to the callba
5bb0: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74  ck function or t
5bc0: 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  o a subroutine. 
5bd0: 20 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   In the.    ** c
5be0: 61 73 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ase of a subrout
5bf0: 69 6e 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ine, the subrout
5c00: 69 6e 65 20 69 74 73 65 6c 66 20 69 73 20 72 65  ine itself is re
5c10: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20  sponsible for.  
5c20: 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65    ** popping the
5c30: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73   data from the s
5c40: 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tack..    */.   
5c50: 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
5c60: 69 6e 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ine:.    case SR
5c70: 54 5f 4f 75 74 70 75 74 3a 20 7b 0a 20 20 20 20  T_Output: {.    
5c80: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
5c90: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
5ca0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
5cb0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  se( eDest==SRT_O
5cc0: 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69  utput );.      i
5cd0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
5ce0: 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
5cf0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
5d00: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
5d10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5d20: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
5d30: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
5d40: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a  , nColumn, r1);.
5d50: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
5d60: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
5d70: 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b  OrderBy, p, r1);
5d80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5d90: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5da0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
5db0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
5dc0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
5dd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
5de0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
5df0: 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
5e00: 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  ->iParm);.      
5e10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5e20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5e30: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
5e40: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
5e50: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  lumn);.        s
5e60: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
5e70: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
5e80: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
5e90: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
5ea0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
5eb0: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
5ec0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
5ed0: 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20  TRIGGER).    /* 
5ee0: 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75  Discard the resu
5ef0: 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  lts.  This is us
5f00: 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74  ed for SELECT st
5f10: 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a  atements inside.
5f20: 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20      ** the body 
5f30: 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54  of a TRIGGER.  T
5f40: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75  he purpose of su
5f50: 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f  ch selects is to
5f60: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   call.    ** use
5f70: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
5f80: 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69  ons that have si
5f90: 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20  de effects.  We 
5fa0: 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20  do not care.    
5fb0: 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74  ** about the act
5fc0: 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74  ual results of t
5fd0: 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a  he select..    *
5fe0: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
5ff0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
6000: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
6010: 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d );.      break
6020: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
6030: 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
6040: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
6050: 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49  loop if the LIMI
6060: 54 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 45  T is reached.  E
6070: 78 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74  xcept, if.  ** t
6080: 68 65 72 65 20 69 73 20 61 20 73 6f 72 74 65 72  here is a sorter
6090: 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  , in which case 
60a0: 74 68 65 20 73 6f 72 74 65 72 20 68 61 73 20 61  the sorter has a
60b0: 6c 72 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20  lready limited. 
60c0: 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66   ** the output f
60d0: 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  or us..  */.  if
60e0: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ( pOrderBy==0 &&
60f0: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
6100: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6110: 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op3(v, OP_IfZero
6120: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
6130: 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d 0a 7d 0a  eak, -1);.  }.}.
6140: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  ./*.** Given an 
6150: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
6160: 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49   generate a KeyI
6170: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
6180: 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68  at records.** th
6190: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
61a0: 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78  ence for each ex
61b0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74  pression in that
61c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
61d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
61e0: 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52  xprList is an OR
61f0: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
6200: 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74  BY clause then t
6210: 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20  he resulting.** 
6220: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
6230: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
6240: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
6250: 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  g a virtual inde
6260: 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  x to.** implemen
6270: 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20  t that clause.  
6280: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
6290: 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  is the result se
62a0: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a  t of a SELECT.**
62b0: 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66   then the KeyInf
62c0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
62d0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
62e0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
62f0: 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74  rtual.** index t
6300: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49  o implement a DI
6310: 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a  STINCT test..**.
6320: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
6330: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
6340: 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
6350: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54   from malloc.  T
6360: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
6370: 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
6380: 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67  sible for seeing
6390: 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63   that this struc
63a0: 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c  ture is eventual
63b0: 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20 41 64  ly.** freed.  Ad
63c0: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
63d0: 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 50  ructure to the P
63e0: 34 20 66 69 65 6c 64 20 6f 66 20 61 6e 20 6f 70  4 field of an op
63f0: 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20 50 34  code using.** P4
6400: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
6410: 20 69 73 20 74 68 65 20 75 73 75 61 6c 20 77 61   is the usual wa
6420: 79 20 6f 66 20 64 65 61 6c 69 6e 67 20 77 69 74  y of dealing wit
6430: 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  h this..*/.stati
6440: 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e  c KeyInfo *keyIn
6450: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 50  foFromExprList(P
6460: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
6470: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
6480: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
6490: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
64a0: 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e  t nExpr;.  KeyIn
64b0: 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72  fo *pInfo;.  str
64c0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
64d0: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
64e0: 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c  i;..  nExpr = pL
64f0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
6500: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
6510: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
6520: 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20 6e  zeof(*pInfo) + n
6530: 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  Expr*(sizeof(Col
6540: 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69  lSeq*)+1) );.  i
6550: 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20  f( pInfo ){.    
6560: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
6570: 72 20 3d 20 28 75 38 2a 29 26 70 49 6e 66 6f 2d  r = (u8*)&pInfo-
6580: 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20  >aColl[nExpr];. 
6590: 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64     pInfo->nField
65a0: 20 3d 20 28 75 31 36 29 6e 45 78 70 72 3b 0a 20   = (u16)nExpr;. 
65b0: 20 20 20 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20     pInfo->enc = 
65c0: 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 49 6e  ENC(db);.    pIn
65d0: 66 6f 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  fo->db = db;.   
65e0: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
65f0: 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70  pList->a; i<nExp
6600: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
6610: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
6620: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43  *pColl;.      pC
6630: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
6640: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
6650: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
6660: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
6670: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
6680: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
6690: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
66a0: 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d   pInfo->aColl[i]
66b0: 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
66c0: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
66d0: 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f  r[i] = pItem->so
66e0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
66f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66   }.  return pInf
6700: 6f 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  o;.}..#ifndef SQ
6710: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
6720: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
6730: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e  Name of the conn
6740: 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c  ection operator,
6750: 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20   used for error 
6760: 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61  messages..*/.sta
6770: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
6780: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74  selectOpName(int
6790: 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b   id){.  char *z;
67a0: 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b  .  switch( id ){
67b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
67c0: 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49  :       z = "UNI
67d0: 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b  ON ALL";   break
67e0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  ;.    case TK_IN
67f0: 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e  TERSECT: z = "IN
6800: 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61  TERSECT";   brea
6810: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
6820: 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45  XCEPT:    z = "E
6830: 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65  XCEPT";      bre
6840: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
6850: 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22             z = "
6860: 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72  UNION";       br
6870: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
6880: 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n z;.}.#endif /*
6890: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
68a0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
68b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
68c0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
68d0: 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58  ** Unless an "EX
68e0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
68f0: 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69  " command is bei
6900: 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68  ng processed, th
6910: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
6920: 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
6930: 77 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20  wise, it adds a 
6940: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75  single row of ou
6950: 74 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20  tput to the EQP 
6960: 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65  result,.** where
6970: 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20   the caption is 
6980: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
6990: 2a 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20 42  **   "USE TEMP B
69a0: 2d 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a  -TREE FOR xxx".*
69b0: 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69  *.** where xxx i
69c0: 73 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e  s one of "DISTIN
69d0: 43 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20  CT", "ORDER BY" 
69e0: 6f 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45  or "GROUP BY". E
69f0: 78 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20  xactly which.** 
6a00: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
6a10: 20 74 68 65 20 7a 55 73 61 67 65 20 61 72 67 75   the zUsage argu
6a20: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
6a30: 76 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70  void explainTemp
6a40: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
6a50: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
6a60: 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69 66 28 20  *zUsage){.  if( 
6a70: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
6a80: 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =2 ){.    Vdbe *
6a90: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
6aa0: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  e;.    char *zMs
6ab0: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
6ac0: 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
6ad0: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
6ae0: 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29  FOR %s", zUsage)
6af0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6b00: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
6b10: 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
6b20: 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
6b30: 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
6b40: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6b50: 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41  Unless an "EXPLA
6b60: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63  IN QUERY PLAN" c
6b70: 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20  ommand is being 
6b80: 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20  processed, this 
6b90: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  function.** is a
6ba0: 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
6bb0: 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e  e, it adds a sin
6bc0: 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  gle row of outpu
6bd0: 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73  t to the EQP res
6be0: 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68  ult,.** where th
6bf0: 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20  e caption is of 
6c00: 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20 66  one of the two f
6c10: 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43  orms:.**.**   "C
6c20: 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52  OMPOSITE SUBQUER
6c30: 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53  IES iSub1 and iS
6c40: 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22  ub2 (op)".**   "
6c50: 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45  COMPOSITE SUBQUE
6c60: 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69  RIES iSub1 and i
6c70: 53 75 62 32 20 55 53 49 4e 47 20 54 45 4d 50 20  Sub2 USING TEMP 
6c80: 42 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a  B-TREE (op)".**.
6c90: 2a 2a 20 77 68 65 72 65 20 69 53 75 62 31 20 61  ** where iSub1 a
6ca0: 6e 64 20 69 53 75 62 32 20 61 72 65 20 74 68 65  nd iSub2 are the
6cb0: 20 69 6e 74 65 67 65 72 73 20 70 61 73 73 65 64   integers passed
6cc0: 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f   as the correspo
6cd0: 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  nding.** functio
6ce0: 6e 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61 6e  n parameters, an
6cf0: 64 20 6f 70 20 69 73 20 74 68 65 20 74 65 78 74  d op is the text
6d00: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
6d10: 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  of the parameter
6d20: 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20  .** of the same 
6d30: 6e 61 6d 65 2e 20 54 68 65 20 70 61 72 61 6d 65  name. The parame
6d40: 74 65 72 20 22 6f 70 22 20 6d 75 73 74 20 62 65  ter "op" must be
6d50: 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e   one of TK_UNION
6d60: 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20  , TK_EXCEPT,.** 
6d70: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f 72 20  TK_INTERSECT or 
6d80: 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72 73  TK_ALL. The firs
6d90: 74 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20 69  t form is used i
6da0: 66 20 61 72 67 75 6d 65 6e 74 20 62 55 73 65 54  f argument bUseT
6db0: 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c  mp is .** false,
6dc0: 20 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 66   or the second f
6dd0: 6f 72 6d 20 69 66 20 69 74 20 69 73 20 74 72 75  orm if it is tru
6de0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
6df0: 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69  d explainComposi
6e00: 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  te(.  Parse *pPa
6e10: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
6e20: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
6e30: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
6e40: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
6e60: 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20  ne of TK_UNION, 
6e70: 54 4b 5f 45 58 43 45 50 54 20 65 74 63 2e 20 2a  TK_EXCEPT etc. *
6e80: 2f 0a 20 20 69 6e 74 20 69 53 75 62 31 2c 20 20  /.  int iSub1,  
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ea0: 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20      /* Subquery 
6eb0: 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53  id 1 */.  int iS
6ec0: 75 62 32 2c 20 20 20 20 20 20 20 20 20 20 20 20  ub2,            
6ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
6ee0: 71 75 65 72 79 20 69 64 20 32 20 2a 2f 0a 20 20  query id 2 */.  
6ef0: 69 6e 74 20 62 55 73 65 54 6d 70 20 20 20 20 20  int bUseTmp     
6f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f10: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74 65 6d  /* True if a tem
6f20: 70 20 74 61 62 6c 65 20 77 61 73 20 75 73 65 64  p table was used
6f30: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
6f40: 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c   op==TK_UNION ||
6f50: 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c   op==TK_EXCEPT |
6f60: 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  | op==TK_INTERSE
6f70: 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c  CT || op==TK_ALL
6f80: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
6f90: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
6fa0: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
6fb0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
6fc0: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
6fd0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20  lite3MPrintf(.  
6fe0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62        pParse->db
6ff0: 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51  , "COMPOUND SUBQ
7000: 55 45 52 49 45 53 20 25 64 20 41 4e 44 20 25 64  UERIES %d AND %d
7010: 20 25 73 28 25 73 29 22 2c 20 69 53 75 62 31 2c   %s(%s)", iSub1,
7020: 20 69 53 75 62 32 2c 0a 20 20 20 20 20 20 20 20   iSub2,.        
7030: 62 55 73 65 54 6d 70 3f 22 55 53 49 4e 47 20 54  bUseTmp?"USING T
7040: 45 4d 50 20 42 2d 54 52 45 45 20 22 3a 22 22 2c  EMP B-TREE ":"",
7050: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70   selectOpName(op
7060: 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  ).    );.    sql
7070: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
7080: 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50  , OP_Explain, pP
7090: 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
70a0: 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f   0, 0, zMsg, P4_
70b0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
70c0: 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78  ./*.** Assign ex
70d0: 70 72 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76  pression b to lv
70e0: 61 6c 75 65 20 61 2e 20 41 20 73 65 63 6f 6e 64  alue a. A second
70f0: 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e  , no-op, version
7100: 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a   of this macro.*
7110: 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20 77 68  * is provided wh
7120: 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  en SQLITE_OMIT_E
7130: 58 50 4c 41 49 4e 20 69 73 20 64 65 66 69 6e 65  XPLAIN is define
7140: 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  d. This allows t
7150: 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71  he code.** in sq
7160: 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 74 6f  lite3Select() to
7170: 20 61 73 73 69 67 6e 20 76 61 6c 75 65 73 20 74   assign values t
7180: 6f 20 73 74 72 75 63 74 75 72 65 20 6d 65 6d 62  o structure memb
7190: 65 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  er variables tha
71a0: 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20  t.** only exist 
71b0: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  if SQLITE_OMIT_E
71c0: 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64 65  XPLAIN is not de
71d0: 66 69 6e 65 64 20 77 69 74 68 6f 75 74 20 70 6f  fined without po
71e0: 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63  lluting the.** c
71f0: 6f 64 65 20 77 69 74 68 20 23 69 66 6e 64 65 66  ode with #ifndef
7200: 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a   directives..*/.
7210: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
7220: 53 65 74 49 6e 74 65 67 65 72 28 61 2c 20 62 29  SetInteger(a, b)
7230: 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a   a = b..#else./*
7240: 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20   No-op versions 
7250: 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58  of the explainXX
7260: 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  X() functions an
7270: 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64  d macros. */.# d
7280: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d  efine explainTem
7290: 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65  pTable(y,z).# de
72a0: 66 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d 70  fine explainComp
72b0: 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a 29  osite(v,w,x,y,z)
72c0: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
72d0: 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29  nSetInteger(y,z)
72e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
72f0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
7300: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75   was generated u
7310: 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20  sing a non-null 
7320: 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e  pOrderBy argumen
7330: 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  t,.** then the r
7340: 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63  esults were plac
7350: 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20  ed in a sorter. 
7360: 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20   After the loop 
7370: 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  is terminated.**
7380: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20   we need to run 
7390: 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f  the sorter and o
73a0: 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74  utput the result
73b0: 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
73c0: 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  g.** routine gen
73d0: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
73e0: 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61  needed to do tha
73f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
7400: 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61  d generateSortTa
7410: 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  il(.  Parse *pPa
7420: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
7430: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
7440: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
7450: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
7460: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56  statement */.  V
7470: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
7480: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
7490: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45  e into this VDBE
74a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
74b0: 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  n,      /* Numbe
74c0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
74d0: 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
74e0: 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57  Dest *pDest /* W
74f0: 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20  rite the sorted 
7500: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
7510: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65  ){.  int addrBre
7520: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
7530: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 20  MakeLabel(v);   
7540: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
7550: 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20  o exit loop */. 
7560: 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75   int addrContinu
7570: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
7580: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a  akeLabel(v);  /*
7590: 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e   Jump here for n
75a0: 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  ext cycle */.  i
75b0: 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69  nt addr;.  int i
75c0: 54 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64  Tab;.  int pseud
75d0: 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72  oTab = 0;.  Expr
75e0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
75f0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20   p->pOrderBy;.. 
7600: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
7610: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74  st->eDest;.  int
7620: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
7630: 69 50 61 72 6d 3b 0a 0a 20 20 69 6e 74 20 72 65  iParm;..  int re
7640: 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52  gRow;.  int regR
7650: 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62 20 3d 20  owid;..  iTab = 
7660: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
7670: 6f 72 3b 0a 20 20 72 65 67 52 6f 77 20 3d 20 73  or;.  regRow = s
7680: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
7690: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
76a0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
76b0: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
76c0: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
76d0: 20 70 73 65 75 64 6f 54 61 62 20 3d 20 70 50 61   pseudoTab = pPa
76e0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
76f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7700: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
7710: 75 64 6f 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  udo, pseudoTab, 
7720: 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29  regRow, nColumn)
7730: 3b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d  ;.    regRowid =
7740: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
7750: 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69   regRowid = sqli
7760: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
7770: 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 61 64 64  arse);.  }.  add
7780: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
7790: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
77a0: 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Sort, iTab, addr
77b0: 42 72 65 61 6b 29 3b 0a 20 20 63 6f 64 65 4f 66  Break);.  codeOf
77c0: 66 73 65 74 28 76 2c 20 70 2c 20 61 64 64 72 43  fset(v, p, addrC
77d0: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69  ontinue);.  sqli
77e0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
77f0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
7800: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
7810: 72 20 2b 20 31 2c 20 72 65 67 52 6f 77 29 3b 0a  r + 1, regRow);.
7820: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
7830: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
7840: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
7850: 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
7860: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7870: 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65  eDest==SRT_Table
7880: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7890: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45  se( eDest==SRT_E
78a0: 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
78b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
78c0: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
78d0: 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  d, iParm, regRow
78e0: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
78f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7900: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
7910: 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77  , regRow, regRow
7920: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
7930: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
7940: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
7950: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7960: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
7970: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
7980: 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  Y.    case SRT_S
7990: 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  et: {.      asse
79a0: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
79b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
79c0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
79d0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
79e0: 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c  ow, 1, regRowid,
79f0: 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31   &p->affinity, 1
7a00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7a10: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
7a20: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
7a30: 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20  regRow, 1);.    
7a40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7a50: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
7a60: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
7a70: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65  owid);.      bre
7a80: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7a90: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
7aa0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
7ab0: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
7ac0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
7ad0: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  ove(pParse, regR
7ae0: 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  ow, iParm, 1);. 
7af0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
7b00: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
7b10: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
7b20: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
7b30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
7b40: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
7b50: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  : {.      int i;
7b60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
7b70: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
7b80: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
7b90: 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20  oroutine ); .   
7ba0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
7bb0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
7bc0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7bd0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
7be0: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
7bf0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
7c00: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
7c10: 20 20 61 73 73 65 72 74 28 20 72 65 67 52 6f 77    assert( regRow
7c20: 21 3d 70 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 20  !=pDest->iMem+i 
7c30: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7c40: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7c50: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64  OP_Column, pseud
7c60: 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74 2d 3e  oTab, i, pDest->
7c70: 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20 20 20 20  iMem+i);.       
7c80: 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20   if( i==0 ){.   
7c90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7ca0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
7cb0: 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29  FLAG_CLEARCACHE)
7cc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7cd0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44    }.      if( eD
7ce0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
7cf0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7d00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7d10: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44  OP_ResultRow, pD
7d20: 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75  est->iMem, nColu
7d30: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  mn);.        sql
7d40: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
7d50: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
7d60: 73 65 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c  se, pDest->iMem,
7d70: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
7d80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7d90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7da0: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
7db0: 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20  Dest->iParm);.  
7dc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7dd0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
7de0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
7df0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
7e00: 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  Row);.  sqlite3R
7e10: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
7e20: 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b  arse, regRowid);
7e30: 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f  ..  /* The botto
7e40: 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  m of the loop.  
7e50: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
7e60: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
7e70: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
7e80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7e90: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
7ea0: 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 73 71  Tab, addr);.  sq
7eb0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
7ec0: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65  Label(v, addrBre
7ed0: 61 6b 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74  ak);.  if( eDest
7ee0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
7ef0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
7f00: 74 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  tine ){.    sqli
7f10: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7f20: 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64   OP_Close, pseud
7f30: 6f 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  oTab, 0);.  }.}.
7f40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
7f50: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
7f60: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
7f70: 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20  he 'declaration 
7f80: 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20  type' of the.** 
7f90: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
7fa0: 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79  . The string may
7fb0: 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73   be treated as s
7fc0: 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c  tatic by the cal
7fd0: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ler..**.** The d
7fe0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
7ff0: 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74  is the exact dat
8000: 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e  atype definition
8010: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
8020: 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
8030: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
8040: 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78  tement if the ex
8050: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
8060: 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63  lumn. The.** dec
8070: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
8080: 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20  r a ROWID field 
8090: 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63  is INTEGER. Exac
80a0: 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72  tly when an expr
80b0: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e  ession.** is con
80c0: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
80d0: 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20   can be complex 
80e0: 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  in the presence 
80f0: 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54  of subqueries. T
8100: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74  he.** result-set
8110: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
8120: 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
8130: 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65  ing SELECT state
8140: 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e  ments is .** con
8150: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
8160: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
8170: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  n..**.**   SELEC
8180: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
8190: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
81a0: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
81b0: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53  ;.**   SELECT (S
81c0: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
81d0: 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  bl);.**   SELECT
81e0: 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43   abc FROM (SELEC
81f0: 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f  T col AS abc FRO
8200: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54  M tbl);.** .** T
8210: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
8220: 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72  ype for any expr
8230: 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  ession other tha
8240: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55  n a column is NU
8250: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  LL..*/.static co
8260: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e  nst char *column
8270: 54 79 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74  Type(.  NameCont
8280: 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70  ext *pNC, .  Exp
8290: 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73  r *pExpr,.  cons
82a0: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69  t char **pzOrigi
82b0: 6e 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  nDb,.  const cha
82c0: 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c  r **pzOriginTab,
82d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
82e0: 70 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20  pzOriginCol.){. 
82f0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79   char const *zTy
8300: 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  pe = 0;.  char c
8310: 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20  onst *zOriginDb 
8320: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
8330: 74 20 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20  t *zOriginTab = 
8340: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
8350: 2a 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b  *zOriginCol = 0;
8360: 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20  .  int j;.  if( 
8370: 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20  NEVER(pExpr==0) 
8380: 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  || pNC->pSrcList
8390: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
83a0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
83b0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
83c0: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
83d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
83e0: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  MN: {.      /* T
83f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
8400: 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74   a column. Locat
8410: 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20  e the table the 
8420: 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a  column is being.
8430: 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74        ** extract
8440: 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43  ed from in NameC
8450: 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e  ontext.pSrcList.
8460: 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20   This table may 
8470: 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a  be real.      **
8480: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
8490: 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20  or a subquery.. 
84a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61       */.      Ta
84b0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
84c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
84d0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c  le structure col
84e0: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
84f0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53   from */.      S
8500: 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20  elect *pS = 0;  
8510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
8520: 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lect the column 
8530: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
8540: 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  m */.      int i
8550: 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
8560: 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20  lumn;  /* Index 
8570: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61  of column in pTa
8580: 62 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  b */.      testc
8590: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
85a0: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
85b0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
85c0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
85d0: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77  OLUMN );.      w
85e0: 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54  hile( pNC && !pT
85f0: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72  ab ){.        Sr
8600: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
8610: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
8620: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
8630: 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ;j<pTabList->nSr
8640: 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61  c && pTabList->a
8650: 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78  [j].iCursor!=pEx
8660: 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b  pr->iTable;j++);
8670: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70  .        if( j<p
8680: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b  TabList->nSrc ){
8690: 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20  .          pTab 
86a0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
86b0: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  .pTab;.         
86c0: 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e   pS = pTabList->
86d0: 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  a[j].pSelect;.  
86e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
86f0: 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43         pNC = pNC
8700: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
8710: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
8720: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
8730: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f  .        /* At o
8740: 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75  ne time, code su
8750: 63 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65  ch as "SELECT ne
8760: 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74 72  w.x" within a tr
8770: 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20  igger would.    
8780: 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69      ** cause thi
8790: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72  s condition to r
87a0: 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c  un.  Since then,
87b0: 20 77 65 20 68 61 76 65 20 72 65 73 74 72 75 63   we have restruc
87c0: 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20  tured how.      
87d0: 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64    ** trigger cod
87e0: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  e is generated a
87f0: 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69  nd so this condi
8800: 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  tion is no longe
8810: 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  r .        ** po
8820: 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c  ssible. However,
8830: 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65   it can still be
8840: 20 74 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d   true for statem
8850: 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20  ents like.      
8860: 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
8870: 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ng:.        **. 
8880: 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41         **   CREA
8890: 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20  TE TABLE t1(col 
88a0: 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20  INTEGER);.      
88b0: 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53    **   SELECT (S
88c0: 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52  ELECT t1.col) FR
88d0: 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  OM FROM t1;.    
88e0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
88f0: 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70  * when columnTyp
8900: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
8910: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
8920: 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20  "t1.col" in the 
8930: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d  .        ** sub-
8940: 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20  select. In this 
8950: 63 61 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f  case, set the co
8960: 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c  lumn type to NUL
8970: 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20  L, even.        
8980: 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f  ** though it sho
8990: 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49  uld really be "I
89a0: 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20  NTEGER"..       
89b0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
89c0: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f  his is not a pro
89d0: 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c  blem, as the col
89e0: 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e  umn type of "t1.
89f0: 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20  col" is never.  
8a00: 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57        ** used. W
8a10: 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29  hen columnType()
8a20: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
8a30: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20  e expression .  
8a40: 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43        ** "(SELEC
8a50: 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20  T t1.col)", the 
8a60: 63 6f 72 72 65 63 74 20 74 79 70 65 20 69 73 20  correct type is 
8a70: 72 65 74 75 72 6e 65 64 20 28 73 65 65 20 74 68  returned (see th
8a80: 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20  e TK_SELECT.    
8a90: 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65      ** branch be
8aa0: 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  low.  */.       
8ab0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
8ac0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8ad0: 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54  Tab && pExpr->pT
8ae0: 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  ab==pTab );.    
8af0: 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20    if( pS ){.    
8b00: 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c      /* The "tabl
8b10: 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  e" is actually a
8b20: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61   sub-select or a
8b30: 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f   view in the FRO
8b40: 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  M clause.       
8b50: 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43   ** of the SELEC
8b60: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74  T statement. Ret
8b70: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
8b80: 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69  ion type and ori
8b90: 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  gin.        ** d
8ba0: 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75  ata for the resu
8bb0: 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66  lt-set column of
8bc0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
8bd0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
8be0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
8bf0: 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70  && ALWAYS(iCol<p
8c00: 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  S->pEList->nExpr
8c10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
8c20: 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73  * If iCol is les
8c30: 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
8c40: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
8c50: 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20   requests the.  
8c60: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64          ** rowid
8c70: 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65   of the sub-sele
8c80: 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73  ct or view. This
8c90: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c   expression is l
8ca0: 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20  egal (see .     
8cb0: 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73       ** test cas
8cc0: 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69  e misc2.2.2) - i
8cd0: 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74  t always evaluat
8ce0: 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20  es to NULL..    
8cf0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
8d00: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
8d10: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  NC;.          Ex
8d20: 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69  pr *p = pS->pELi
8d30: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
8d40: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  r;.          sNC
8d50: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
8d60: 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  pSrc;.          
8d70: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
8d80: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
8d90: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
8da0: 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  rse;.          z
8db0: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
8dc0: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
8dd0: 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54  ginDb, &zOriginT
8de0: 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29  ab, &zOriginCol)
8df0: 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
8e00: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57     }else if( ALW
8e10: 41 59 53 28 70 54 61 62 2d 3e 70 53 63 68 65 6d  AYS(pTab->pSchem
8e20: 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  a) ){.        /*
8e30: 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f   A real table */
8e40: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8e50: 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20   !pS );.        
8e60: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
8e70: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
8e80: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8e90: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
8ea0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
8eb0: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
8ec0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
8ed0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
8ee0: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
8ef0: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69            zOrigi
8f00: 6e 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  nCol = "rowid";.
8f10: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
8f20: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
8f30: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
8f40: 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20  ].zType;.       
8f50: 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20     zOriginCol = 
8f60: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
8f70: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
8f80: 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69  }.        zOrigi
8f90: 6e 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  nTab = pTab->zNa
8fa0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
8fb0: 70 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20  pNC->pParse ){. 
8fc0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62           int iDb
8fd0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
8fe0: 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61  ToIndex(pNC->pPa
8ff0: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
9000: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
9010: 20 20 20 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70     zOriginDb = p
9020: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e  NC->pParse->db->
9030: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
9040: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9050: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
9060: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
9070: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
9080: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  Y.    case TK_SE
9090: 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LECT: {.      /*
90a0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
90b0: 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e  is a sub-select.
90c0: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
90d0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
90e0: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  .      ** origin
90f0: 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69   info for the si
9100: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ngle column in t
9110: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
9120: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
9130: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a    ** statement..
9140: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e        */.      N
9150: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
9160: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
9170: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
9180: 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ect;.      Expr 
9190: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
91a0: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
91b0: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
91c0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
91d0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
91e0: 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72  );.      sNC.pSr
91f0: 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63  cList = pS->pSrc
9200: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78  ;.      sNC.pNex
9210: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73  t = pNC;.      s
9220: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  NC.pParse = pNC-
9230: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a  >pParse;.      z
9240: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
9250: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
9260: 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54  ginDb, &zOriginT
9270: 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29  ab, &zOriginCol)
9280: 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
9290: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
92a0: 0a 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67  .  .  if( pzOrig
92b0: 69 6e 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65  inDb ){.    asse
92c0: 72 74 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20  rt( pzOriginTab 
92d0: 26 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29  && pzOriginCol )
92e0: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44  ;.    *pzOriginD
92f0: 62 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20  b = zOriginDb;. 
9300: 20 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20     *pzOriginTab 
9310: 3d 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20  = zOriginTab;.  
9320: 20 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d    *pzOriginCol =
9330: 20 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d   zOriginCol;.  }
9340: 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b  .  return zType;
9350: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
9360: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
9370: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
9380: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
9390: 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  types of columns
93a0: 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c  .** in the resul
93b0: 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  t set..*/.static
93c0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
93d0: 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72  lumnTypes(.  Par
93e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
93f0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
9400: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
9410: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
9420: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
9430: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
9440: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
9450: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
9460: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
9470: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
9480: 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
9490: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
94a0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
94b0: 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t i;.  NameConte
94c0: 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53  xt sNC;.  sNC.pS
94d0: 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
94e0: 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20  t;.  sNC.pParse 
94f0: 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28  = pParse;.  for(
9500: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
9510: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
9520: 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74  Expr *p = pEList
9530: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
9540: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
9550: 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ype;.#ifdef SQLI
9560: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
9570: 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f  _METADATA.    co
9580: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44  nst char *zOrigD
9590: 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  b = 0;.    const
95a0: 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20   char *zOrigTab 
95b0: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
95c0: 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20  har *zOrigCol = 
95d0: 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63  0;.    zType = c
95e0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
95f0: 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f  p, &zOrigDb, &zO
9600: 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f  rigTab, &zOrigCo
9610: 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  l);..    /* The 
9620: 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69  vdbe must make i
9630: 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74  ts own copy of t
9640: 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61  he column-type a
9650: 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a  nd other .    **
9660: 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63   column specific
9670: 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73   strings, in cas
9680: 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  e the schema is 
9690: 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69  reset before thi
96a0: 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c  s.    ** virtual
96b0: 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65   machine is dele
96c0: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
96d0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
96e0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
96f0: 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f  AME_DATABASE, zO
9700: 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52  rigDb, SQLITE_TR
9710: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
9720: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
9730: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
9740: 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61  E_TABLE, zOrigTa
9750: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
9760: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
9770: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
9780: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f  v, i, COLNAME_CO
9790: 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20  LUMN, zOrigCol, 
97a0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
97b0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79  );.#else.    zTy
97c0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
97d0: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
97e0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
97f0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
9800: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
9810: 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70  E_DECLTYPE, zTyp
9820: 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  e, SQLITE_TRANSI
9830: 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ENT);.  }.#endif
9840: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
9850: 44 45 43 4c 54 59 50 45 20 2a 2f 0a 7d 0a 0a 2f  DECLTYPE */.}../
9860: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
9870: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
9880: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e  l the VDBE the n
9890: 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ames of columns.
98a0: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
98b0: 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f   set.  This info
98c0: 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
98d0: 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a  to provide the.*
98e0: 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73  * azCol[] values
98f0: 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   in the callback
9900: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9910: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
9920: 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ames(.  Parse *p
9930: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
9940: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
9950: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
9960: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
9970: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
9980: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
9990: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
99a0: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
99b0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20  sult set */.){. 
99c0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
99d0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
99e0: 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20  i, j;.  sqlite3 
99f0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9a00: 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65  ;.  int fullName
9a10: 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a  s, shortNames;..
9a20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9a30: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a  MIT_EXPLAIN.  /*
9a40: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45   If this is an E
9a50: 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69  XPLAIN, skip thi
9a60: 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20  s step */.  if( 
9a70: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
9a80: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
9a90: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
9aa0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
9ab0: 73 53 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d  sSet || NEVER(v=
9ac0: 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  =0) || db->mallo
9ad0: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
9ae0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  ;.  pParse->colN
9af0: 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66  amesSet = 1;.  f
9b00: 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e  ullNames = (db->
9b10: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
9b20: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ullColNames)!=0;
9b30: 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20  .  shortNames = 
9b40: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
9b50: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
9b60: 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33  s)!=0;.  sqlite3
9b70: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
9b80: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
9b90: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
9ba0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
9bb0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b  +){.    Expr *p;
9bc0: 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d  .    p = pEList-
9bd0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
9be0: 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
9bf0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9c00: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
9c10: 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
9c20: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
9c30: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
9c40: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
9c50: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
9c60: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
9c70: 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  E, zName, SQLITE
9c80: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
9c90: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f   }else if( (p->o
9ca0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
9cb0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  p->op==TK_AGG_CO
9cc0: 4c 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73  LUMN) && pTabLis
9cd0: 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  t ){.      Table
9ce0: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68   *pTab;.      ch
9cf0: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
9d00: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
9d10: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72  olumn;.      for
9d20: 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70  (j=0; ALWAYS(j<p
9d30: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20  TabList->nSrc); 
9d40: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
9d50: 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  ( pTabList->a[j]
9d60: 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61  .iCursor==p->iTa
9d70: 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ble ) break;.   
9d80: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
9d90: 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  t( j<pTabList->n
9da0: 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61  Src );.      pTa
9db0: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
9dc0: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  j].pTab;.      i
9dd0: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
9de0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
9df0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
9e00: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
9e10: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
9e20: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
9e30: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
9e40: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f        zCol = "ro
9e50: 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  wid";.      }els
9e60: 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  e{.        zCol 
9e70: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
9e80: 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l].zName;.      
9e90: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f  }.      if( !sho
9ea0: 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c  rtNames && !full
9eb0: 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
9ec0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
9ed0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
9ee0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20  NAME_NAME, .    
9ef0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
9f00: 62 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69  bStrDup(db, pELi
9f10: 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c  st->a[i].zSpan),
9f20: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
9f30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
9f40: 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20  ( fullNames ){. 
9f50: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
9f60: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
9f70: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
9f80: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
9f90: 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  s", pTab->zName,
9fa0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   zCol);.        
9fb0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
9fc0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
9fd0: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c  AME_NAME, zName,
9fe0: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
9ff0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a000: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a010: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
a020: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
a030: 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52   zCol, SQLITE_TR
a040: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
a050: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
a060: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
a070: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
a080: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20  OLNAME_NAME, .  
a090: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
a0a0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69  bStrDup(db, pELi
a0b0: 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c  st->a[i].zSpan),
a0c0: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
a0d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65  ;.    }.  }.  ge
a0e0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
a0f0: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
a100: 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a  st, pEList);.}..
a110: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 61 6e  /*.** Given a an
a120: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
a130: 20 28 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c   (which is reall
a140: 79 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78  y the list of ex
a150: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
a160: 74 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c  t form the resul
a170: 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
a180: 54 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d  T statement) com
a190: 70 75 74 65 20 61 70 70 72 6f 70 72 69 61 74 65  pute appropriate
a1a0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  .** column names
a1b0: 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61   for a table tha
a1c0: 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  t would hold the
a1d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
a1e0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75  ..**.** All colu
a1f0: 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65  mn names will be
a200: 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f   unique..**.** O
a210: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
a220: 61 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65  ames are compute
a230: 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  d.  Column.zType
a240: 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a  , Column.zColl,.
a250: 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65  ** and other fie
a260: 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72  lds of Column ar
a270: 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20  e zeroed..**.** 
a280: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
a290: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
a2a0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
a2b0: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
a2c0: 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c  s,.** store NULL
a2d0: 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30   in *paCol and 0
a2e0: 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72   in *pnCol and r
a2f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
a300: 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EM..*/.static in
a310: 74 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46  t selectColumnsF
a320: 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50  romExprList(.  P
a330: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
a340: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
a350: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
a360: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
a370: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c         /* Expr l
a380: 69 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ist from which t
a390: 6f 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20  o derive column 
a3a0: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  names */.  int *
a3b0: 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  pnCol,          
a3c0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
a3d0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
a3e0: 73 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75  s here */.  Colu
a3f0: 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20  mn **paCol      
a400: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
a410: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   new column list
a420: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71   here */.){.  sq
a430: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a440: 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74  se->db;   /* Dat
a450: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
a460: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
a470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a480: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
a490: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b  rs */.  int cnt;
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4b0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64      /* Index add
a4c0: 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e  ed to make the n
a4d0: 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20  ame unique */.  
a4e0: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70  Column *aCol, *p
a4f0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  Col;        /* F
a500: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
a510: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a  result columns *
a520: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20  /.  int nCol;   
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a540: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
a550: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
a560: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72  lt set */.  Expr
a570: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
a580: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
a590: 73 73 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67  ssion for a sing
a5a0: 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  le result column
a5b0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
a5c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
a5d0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
a5e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
a5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a600: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d    /* Size of nam
a610: 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a  e in zName[] */.
a620: 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  .  *pnCol = nCol
a630: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
a640: 3b 0a 20 20 61 43 6f 6c 20 3d 20 2a 70 61 43 6f  ;.  aCol = *paCo
a650: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  l = sqlite3DbMal
a660: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
a670: 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c  of(aCol[0])*nCol
a680: 29 3b 0a 20 20 69 66 28 20 61 43 6f 6c 3d 3d 30  );.  if( aCol==0
a690: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
a6a0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 66 6f 72 28 69 3d  _NOMEM;.  for(i=
a6b0: 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c  0, pCol=aCol; i<
a6c0: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
a6d0: 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61  +){.    /* Get a
a6e0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61  n appropriate na
a6f0: 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  me for the colum
a700: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d  n.    */.    p =
a710: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
a720: 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
a730: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c   p->pRight==0 ||
a740: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
a750: 28 70 2d 3e 70 52 69 67 68 74 2c 20 45 50 5f 49  (p->pRight, EP_I
a760: 6e 74 56 61 6c 75 65 29 0a 20 20 20 20 20 20 20  ntValue).       
a770: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 70 52          || p->pR
a780: 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d  ight->u.zToken==
a790: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e  0 || p->pRight->
a7a0: 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29  u.zToken[0]!=0 )
a7b0: 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65  ;.    if( (zName
a7c0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
a7d0: 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
a7e0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
a7f0: 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  umn contains an 
a800: 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61  "AS <name>" phra
a810: 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61  se, use <name> a
a820: 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  s the name */.  
a830: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
a840: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
a850: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
a860: 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
a870: 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a  ColExpr = p;  /*
a880: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
a890: 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73 75  that is the resu
a8a0: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  lt column name *
a8b0: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
a8c0: 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab;         /* 
a8d0: 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  Table associated
a8e0: 20 77 69 74 68 20 74 68 69 73 20 65 78 70 72 65   with this expre
a8f0: 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77  ssion */.      w
a900: 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e  hile( pColExpr->
a910: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 20 70 43 6f  op==TK_DOT ) pCo
a920: 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72  lExpr = pColExpr
a930: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
a940: 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
a950: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41  ==TK_COLUMN && A
a960: 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e  LWAYS(pColExpr->
a970: 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
a980: 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d      /* For colum
a990: 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d  ns use the colum
a9a0: 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20  n name name */. 
a9b0: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
a9c0: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c  = pColExpr->iCol
a9d0: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61  umn;.        pTa
a9e0: 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54  b = pColExpr->pT
a9f0: 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ab;.        if( 
aa00: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
aa10: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
aa20: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
aa30: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
aa40: 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  "%s",.          
aa50: 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f         iCol>=0 ?
aa60: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
aa70: 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64  ].zName : "rowid
aa80: 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ");.      }else 
aa90: 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
aaa0: 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20  ==TK_ID ){.     
aab0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
aac0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c  HasProperty(pCol
aad0: 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
aae0: 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e  e) );.        zN
aaf0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
ab00: 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70  intf(db, "%s", p
ab10: 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ColExpr->u.zToke
ab20: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
ab30: 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  .        /* Use 
ab40: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78  the original tex
ab50: 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
ab60: 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74  expression as it
ab70: 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  s name */.      
ab80: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
ab90: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
aba0: 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ", pEList->a[i].
abb0: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  zSpan);.      }.
abc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
abd0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
abe0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
abf0: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
ac00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ac10: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b     }..    /* Mak
ac20: 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d  e sure the colum
ac30: 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65  n name is unique
ac40: 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69  .  If the name i
ac50: 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20  s not unique,.  
ac60: 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e    ** append a in
ac70: 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d  teger to the nam
ac80: 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63  e so that it bec
ac90: 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20  omes unique..   
aca0: 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20   */.    nName = 
acb0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
acc0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28  zName);.    for(
acd0: 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  j=cnt=0; j<i; j+
ace0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
acf0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f  lite3StrICmp(aCo
ad00: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  l[j].zName, zNam
ad10: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
ad20: 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b   char *zNewName;
ad30: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e  .        zName[n
ad40: 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20  Name] = 0;.     
ad50: 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71     zNewName = sq
ad60: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
ad70: 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c   "%s:%d", zName,
ad80: 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20   ++cnt);.       
ad90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
ada0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
adb0: 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e     zName = zNewN
adc0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  ame;.        j =
add0: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28   -1;.        if(
ade0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61   zName==0 ) brea
adf0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
ae00: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  .    pCol->zName
ae10: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20   = zName;.  }.  
ae20: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
ae30: 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28  iled ){.    for(
ae40: 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  j=0; j<i; j++){.
ae50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
ae60: 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e  ree(db, aCol[j].
ae70: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
ae80: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
ae90: 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a  db, aCol);.    *
aea0: 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a  paCol = 0;.    *
aeb0: 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72  pnCol = 0;.    r
aec0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
aed0: 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  EM;.  }.  return
aee0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
aef0: 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e  *.** Add type an
af00: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
af10: 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c  rmation to a col
af20: 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f  umn list based o
af30: 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74  n.** a SELECT st
af40: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20  atement..** .** 
af50: 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  The column list 
af60: 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20  presumably came 
af70: 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d  from selectColum
af80: 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69  nNamesFromExprLi
af90: 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c  st()..** The col
afa0: 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c  umn list has onl
afb0: 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70  y names, not typ
afc0: 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73  es or collations
afd0: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
afe0: 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20  ne goes through 
aff0: 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70  and adds the typ
b000: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
b010: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
b020: 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74  utine requires t
b030: 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69  hat all identifi
b040: 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ers in the SELEC
b050: 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62  T.** statement b
b060: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73  e resolved..*/.s
b070: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
b080: 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
b090: 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61  dCollation(.  Pa
b0a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
b0b0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
b0c0: 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 69 6e 74  ontexts */.  int
b0d0: 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   nCol,          
b0e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b0f0: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 43 6f 6c  columns */.  Col
b100: 75 6d 6e 20 2a 61 43 6f 6c 2c 20 20 20 20 20 20  umn *aCol,      
b110: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
b120: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 53 65 6c 65 63  lumns */.  Selec
b130: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
b140: 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20   /* SELECT used 
b150: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70  to determine typ
b160: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
b170: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
b180: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
b190: 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  db;.  NameContex
b1a0: 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20  t sNC;.  Column 
b1b0: 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71  *pCol;.  CollSeq
b1c0: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pColl;.  int i
b1d0: 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73  ;.  Expr *p;.  s
b1e0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
b1f0: 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72  tem *a;..  asser
b200: 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b  t( pSelect!=0 );
b210: 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c  .  assert( (pSel
b220: 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ect->selFlags & 
b230: 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20  SF_Resolved)!=0 
b240: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f  );.  assert( nCo
b250: 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  l==pSelect->pELi
b260: 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d  st->nExpr || db-
b270: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
b280: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
b290: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
b2a0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c  ;.  memset(&sNC,
b2b0: 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
b2c0: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
b2d0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
b2e0: 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d  ;.  a = pSelect-
b2f0: 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f  >pEList->a;.  fo
b300: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
b310: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ; i<nCol; i++, p
b320: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  Col++){.    p = 
b330: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
b340: 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71  pCol->zType = sq
b350: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
b360: 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  , columnType(&sN
b370: 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b  C, p, 0, 0, 0));
b380: 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
b390: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
b3a0: 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20  rAffinity(p);.  
b3b0: 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69    if( pCol->affi
b3c0: 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e  nity==0 ) pCol->
b3d0: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
b3e0: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
b3f0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
b400: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
b410: 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e, p);.    if( p
b420: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43  Coll ){.      pC
b430: 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ol->zColl = sqli
b440: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
b450: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
b460: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
b470: 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54  * Given a SELECT
b480: 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65   statement, gene
b490: 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72  rate a Table str
b4a0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
b4b0: 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73  ribes.** the res
b4c0: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20  ult set of that 
b4d0: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65  SELECT..*/.Table
b4e0: 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53   *sqlite3ResultS
b4f0: 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65  etOfSelect(Parse
b500: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
b510: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61   *pSelect){.  Ta
b520: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c  ble *pTab;.  sql
b530: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
b540: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76  e->db;.  int sav
b550: 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65  edFlags;..  save
b560: 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61  dFlags = db->fla
b570: 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  gs;.  db->flags 
b580: 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43  &= ~SQLITE_FullC
b590: 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66  olNames;.  db->f
b5a0: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
b5b0: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  hortColNames;.  
b5c0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
b5d0: 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  p(pParse, pSelec
b5e0: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61  t, 0);.  if( pPa
b5f0: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
b600: 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70  rn 0;.  while( p
b610: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
b620: 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
b630: 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62  ct->pPrior;.  db
b640: 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46  ->flags = savedF
b650: 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73  lags;.  pTab = s
b660: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
b670: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
b680: 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
b690: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ab==0 ){.    ret
b6a0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20  urn 0;.  }.  /* 
b6b0: 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c  The sqlite3Resul
b6c0: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69  tSetOfSelect() i
b6d0: 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f  s only used n co
b6e0: 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f  ntexts where loo
b6f0: 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64  kaside.  ** is d
b700: 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73  isabled */.  ass
b710: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
b720: 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29  de.bEnabled==0 )
b730: 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d  ;.  pTab->nRef =
b740: 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d   1;.  pTab->zNam
b750: 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e  e = 0;.  pTab->n
b760: 52 6f 77 45 73 74 20 3d 20 31 30 30 30 30 30 30  RowEst = 1000000
b770: 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  ;.  selectColumn
b780: 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
b790: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70  arse, pSelect->p
b7a0: 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43  EList, &pTab->nC
b7b0: 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29  ol, &pTab->aCol)
b7c0: 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c  ;.  selectAddCol
b7d0: 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
b7e0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
b7f0: 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43  ->nCol, pTab->aC
b800: 6f 6c 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  ol, pSelect);.  
b810: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
b820: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
b830: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
b840: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
b850: 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
b860: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
b870: 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
b880: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44  ../*.** Get a VD
b890: 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  BE for the given
b8a0: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e   parser context.
b8b0: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
b8c0: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
b8d0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
b8e0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
b8f0: 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20  ULL and leave a 
b900: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
b910: 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
b920: 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65  te3GetVdbe(Parse
b930: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
b940: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
b950: 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30  Vdbe;.  if( v==0
b960: 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72   ){.    v = pPar
b970: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
b980: 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50  te3VdbeCreate(pP
b990: 61 72 73 65 2d 3e 64 62 29 3b 0a 23 69 66 6e 64  arse->db);.#ifnd
b9a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
b9b0: 52 41 43 45 0a 20 20 20 20 69 66 28 20 76 20 29  RACE.    if( v )
b9c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
b9d0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
b9e0: 54 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65  Trace);.    }.#e
b9f0: 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72  ndif.  }.  retur
ba00: 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  n v;.}.../*.** C
ba10: 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69  ompute the iLimi
ba20: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69  t and iOffset fi
ba30: 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45  elds of the SELE
ba40: 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  CT based on the.
ba50: 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  ** pLimit and pO
ba60: 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  ffset expression
ba70: 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  s.  pLimit and p
ba80: 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20  Offset hold the 
ba90: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74  expressions.** t
baa0: 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  hat appear in th
bab0: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73  e original SQL s
bac0: 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74  tatement after t
bad0: 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
bae0: 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e  SET.** keywords.
baf0: 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f    Or NULL if tho
bb00: 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  se keywords are 
bb10: 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20  omitted. iLimit 
bb20: 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20  and iOffset .** 
bb30: 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  are the integer 
bb40: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20  memory register 
bb50: 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e  numbers for coun
bb60: 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ters used to com
bb70: 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d  pute .** the lim
bb80: 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20  it and offset.  
bb90: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c  If there is no l
bba0: 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73  imit and/or offs
bbb0: 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69  et, then .** iLi
bbc0: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
bbd0: 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  are negative..**
bbe0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
bbf0: 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c   changes the val
bc00: 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e  ues of iLimit an
bc10: 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69  d iOffset only i
bc20: 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20  f.** a limit or 
bc30: 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65  offset is define
bc40: 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20  d by pLimit and 
bc50: 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74  pOffset.  iLimit
bc60: 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20   and.** iOffset 
bc70: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
bc80: 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f   preset to appro
bc90: 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76  priate default v
bca0: 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c  alues.** (usuall
bcb0: 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73  y but not always
bcc0: 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61   -1) prior to ca
bcd0: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
bce0: 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70  ne..** Only if p
bcf0: 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66  Limit!=0 or pOff
bd00: 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69  set!=0 do the li
bd10: 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65  mit registers ge
bd20: 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20  t.** redefined. 
bd30: 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
bd40: 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69  perator uses thi
bd50: 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f  s property to fo
bd60: 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65  rce.** the reuse
bd70: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d   of the same lim
bd80: 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65  it and offset re
bd90: 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d  gisters across m
bda0: 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43  ultiple.** SELEC
bdb0: 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  T statements..*/
bdc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d  .static void com
bdd0: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
bde0: 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
bdf0: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
be00: 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65   iBreak){.  Vdbe
be10: 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *v = 0;.  int i
be20: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  Limit = 0;.  int
be30: 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20   iOffset;.  int 
be40: 61 64 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20  addr1, n;.  if( 
be50: 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75  p->iLimit ) retu
be60: 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  rn;..  /* .  ** 
be70: 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79  "LIMIT -1" alway
be80: 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73  s shows all rows
be90: 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65  .  There is some
bea0: 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73  .  ** contravers
beb0: 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65  y about what the
bec0: 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
bed0: 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a  r should be..  *
bee0: 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d  * The current im
bef0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74  plementation int
bf00: 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30  erprets "LIMIT 0
bf10: 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e  " to mean.  ** n
bf20: 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73  o rows..  */.  s
bf30: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
bf40: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
bf50: 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73  assert( p->pOffs
bf60: 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d  et==0 || p->pLim
bf70: 69 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  it!=0 );.  if( p
bf80: 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
bf90: 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d  p->iLimit = iLim
bfa0: 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  it = ++pParse->n
bfb0: 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c  Mem;.    v = sql
bfc0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
bfd0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  se);.    if( NEV
bfe0: 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
bff0: 6e 3b 20 20 2f 2a 20 56 44 42 45 20 73 68 6f 75  n;  /* VDBE shou
c000: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
c010: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a  been allocated *
c020: 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
c030: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
c040: 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b  ->pLimit, &n) ){
c050: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c060: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
c070: 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69  nteger, n, iLimi
c080: 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
c090: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
c0a0: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
c0b0: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
c0c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c0d0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
c0e0: 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b  oto, 0, iBreak);
c0f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c100: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
c110: 6c 65 63 74 52 6f 77 20 3e 20 28 64 6f 75 62 6c  lectRow > (doubl
c120: 65 29 6e 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  e)n ) p->nSelect
c130: 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 6e 3b  Row = (double)n;
c140: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
c150: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
c160: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
c170: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69  , p->pLimit, iLi
c180: 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  mit);.      sqli
c190: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
c1a0: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
c1b0: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64  Limit);.      Vd
c1c0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
c1d0: 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
c1e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c1f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
c200: 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69  fZero, iLimit, i
c210: 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  Break);.    }.  
c220: 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74    if( p->pOffset
c230: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66   ){.      p->iOf
c240: 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d  fset = iOffset =
c250: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
c260: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
c270: 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f  Mem++;   /* Allo
c280: 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72 65  cate an extra re
c290: 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74  gister for limit
c2a0: 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  +offset */.     
c2b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c2c0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66  (pParse, p->pOff
c2d0: 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  set, iOffset);. 
c2e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c2f0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
c300: 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29  tBeInt, iOffset)
c310: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
c320: 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20  ent((v, "OFFSET 
c330: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
c340: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
c350: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
c360: 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65 74  P_IfPos, iOffset
c370: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c380: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c390: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f 66  _Integer, 0, iOf
c3a0: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
c3b0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
c3c0: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
c3d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c3e0: 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69  Op3(v, OP_Add, i
c3f0: 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c 20  Limit, iOffset, 
c400: 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20  iOffset+1);.    
c410: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
c420: 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22  , "LIMIT+OFFSET"
c430: 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20  ));.      addr1 
c440: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c450: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
c460: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
c470: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c480: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
c490: 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b   -1, iOffset+1);
c4a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c4b0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
c4c0: 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  dr1);.    }.  }.
c4d0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
c4e0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
c4f0: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74  SELECT./*.** Ret
c500: 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
c510: 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ate collating se
c520: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69  quence for the i
c530: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
c540: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
c550: 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  et for the compo
c560: 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65  und-select state
c570: 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72  ment "p".  Retur
c580: 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65  n NULL if.** the
c590: 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64   column has no d
c5a0: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
c5b0: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a   sequence..**.**
c5c0: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
c5d0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
c5e0: 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
c5f0: 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  is taken from th
c600: 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
c610: 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63  erm of the selec
c620: 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c  t that has a col
c630: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
c640: 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
c650: 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43  eq *multiSelectC
c660: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
c670: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
c680: 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f   int iCol){.  Co
c690: 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69  llSeq *pRet;.  i
c6a0: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
c6b0: 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69      pRet = multi
c6c0: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
c6d0: 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  arse, p->pPrior,
c6e0: 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b   iCol);.  }else{
c6f0: 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
c700: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f   }.  assert( iCo
c710: 6c 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  l>=0 );.  if( pR
c720: 65 74 3d 3d 30 20 26 26 20 69 43 6f 6c 3c 70 2d  et==0 && iCol<p-
c730: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
c740: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  {.    pRet = sql
c750: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
c760: 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
c770: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
c780: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
c790: 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pRet;.}.#endif /
c7a0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
c7b0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
c7c0: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
c7d0: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
c7e0: 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
c7f0: 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
c800: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
c810: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
c820: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
c830: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
c840: 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
c850: 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
c860: 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
c870: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
c880: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
c890: 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
c8a0: 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 23 69 66 6e  lts */.);...#ifn
c8b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c8c0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
c8d0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
c8e0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
c8f0: 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75  process a compou
c900: 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72  nd query form fr
c910: 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72  om.** two or mor
c920: 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69  e separate queri
c930: 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20  es using UNION, 
c940: 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50  UNION ALL, EXCEP
c950: 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45  T, or.** INTERSE
c960: 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69  CT.**.** "p" poi
c970: 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74  nts to the right
c980: 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f  -most of the two
c990: 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71   queries.  the q
c9a0: 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c  uery on the.** l
c9b0: 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72  eft is p->pPrior
c9c0: 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72  .  The left quer
c9d0: 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20  y could also be 
c9e0: 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
c9f0: 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73  .** in which cas
ca00: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
ca10: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65  ill be called re
ca20: 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a  cursively. .**.*
ca30: 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  * The results of
ca40: 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
ca50: 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74   are to be writt
ca60: 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e  en into a destin
ca70: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65  ation.** of type
ca80: 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61   eDest with para
ca90: 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a  meter iParm..**.
caa0: 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43  ** Example 1:  C
cab0: 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d  onsider a three-
cac0: 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c  way compound SQL
cad0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
cae0: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
caf0: 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM t1 UNION SEL
cb00: 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e  ECT b FROM t2 UN
cb10: 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f  ION SELECT c FRO
cb20: 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  M t3.**.** This 
cb30: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
cb40: 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77  sed up as follow
cb50: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
cb60: 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
cb70: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
cb80: 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  `----->  SELECT 
cb90: 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20  b FROM t2.**    
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbc0: 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54  `------>  SELECT
cbd0: 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a   a FROM t1.**.**
cbe0: 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74   The arrows in t
cbf0: 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65  he diagram above
cc00: 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53   represent the S
cc10: 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69  elect.pPrior poi
cc20: 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74  nter..** So if t
cc30: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
cc40: 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75  alled with p equ
cc50: 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65  al to the t3 que
cc60: 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69  ry, then.** pPri
cc70: 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74  or will be the t
cc80: 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20  2 query.  p->op 
cc90: 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e  will be TK_UNION
cca0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
ccb0: 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74  *.** Notice that
ccc0: 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
ccd0: 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65  way SQLite parse
cce0: 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  s compound SELEC
ccf0: 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  Ts, the.** indiv
cd00: 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c  idual selects al
cd10: 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20  ways group from 
cd20: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a  left to right..*
cd30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
cd40: 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  tiSelect(.  Pars
cd50: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
cd60: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
cd70: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
cd80: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
cd90: 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
cda0: 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
cdb0: 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
cdc0: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
cdd0: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
cde0: 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
cdf0: 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
ce00: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
ce10: 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f     /* Success co
ce20: 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75  de from a subrou
ce30: 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tine */.  Select
ce40: 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
ce50: 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
ce60: 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
ce70: 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
ce80: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
ce90: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
cea0: 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
ceb0: 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  BE */.  SelectDe
cec0: 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a  st dest;      /*
ced0: 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74   Alternative dat
cee0: 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f  a destination */
cef0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65  .  Select *pDele
cf00: 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69  te = 0;  /* Chai
cf10: 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65  n of simple sele
cf20: 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  cts to delete */
cf30: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
cf40: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
cf50: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
cf60: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
cf70: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
cf80: 20 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20   int iSub1;     
cf90: 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
cfa0: 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75   of left-hand qu
cfb0: 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  ery */.  int iSu
cfc0: 62 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b2;            /
cfd0: 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68  * EQP id of righ
cfe0: 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
cff0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b  #endif..  /* Mak
d000: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
d010: 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  no ORDER BY or L
d020: 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70  IMIT clause on p
d030: 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f  rior SELECTs.  O
d040: 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73  nly.  ** the las
d050: 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53  t (right-most) S
d060: 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72  ELECT in the ser
d070: 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20  ies may have an 
d080: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
d090: 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  T..  */.  assert
d0a0: 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  ( p && p->pPrior
d0b0: 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20   );  /* Calling 
d0c0: 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74  function guarant
d0d0: 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f  ees this much */
d0e0: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
d0f0: 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  db;.  pPrior = p
d100: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65  ->pPrior;.  asse
d110: 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67  rt( pPrior->pRig
d120: 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20 29  htmost!=pPrior )
d130: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
d140: 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d  or->pRightmost==
d150: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29 3b  p->pRightmost );
d160: 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74  .  dest = *pDest
d170: 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
d180: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
d190: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d1a0: 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59  pParse,"ORDER BY
d1b0: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
d1c0: 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
d1d0: 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
d1e0: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
d1f0: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
d200: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
d210: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
d220: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
d230: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
d240: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
d250: 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73  rse,"LIMIT claus
d260: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
d270: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
d280: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
d290: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
d2a0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
d2b0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
d2c0: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20  t_end;.  }..  v 
d2d0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
d2e0: 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
d2f0: 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20  rt( v!=0 );  /* 
d300: 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79  The VDBE already
d310: 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c   created by call
d320: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
d330: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
d340: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d   destination tem
d350: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20  porary table if 
d360: 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20  necessary.  */. 
d370: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
d380: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
d390: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
d3a0: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71  pEList );.    sq
d3b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d3c0: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
d3d0: 72 61 6c 2c 20 64 65 73 74 2e 69 50 61 72 6d 2c  ral, dest.iParm,
d3e0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
d3f0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
d400: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42  dbeChangeP5(v, B
d410: 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b  TREE_UNORDERED);
d420: 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20  .    dest.eDest 
d430: 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d  = SRT_Table;.  }
d440: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
d450: 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20   all SELECTs in 
d460: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61  the statement ha
d470: 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
d480: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20  er of elements. 
d490: 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73   ** in their res
d4a0: 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20  ult sets..  */. 
d4b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
d4c0: 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45  st && pPrior->pE
d4d0: 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d  List );.  if( p-
d4e0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
d4f0: 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e  pPrior->pEList->
d500: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
d510: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
d520: 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f  rse, "SELECTs to
d530: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
d540: 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20  ght of %s".     
d550: 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74   " do not have t
d560: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
d570: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
d580: 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
d590: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
d5a0: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
d5b0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
d5c0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75    }..  /* Compou
d5d0: 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61 74 20  nd SELECTs that 
d5e0: 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
d5f0: 20 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64   clause are hand
d600: 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a  led separately..
d610: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f    */.  if( p->pO
d620: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65  rderBy ){.    re
d630: 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  turn multiSelect
d640: 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20  OrderBy(pParse, 
d650: 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a  p, pDest);.  }..
d660: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
d670: 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20  de for the left 
d680: 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54  and right SELECT
d690: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
d6a0: 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  /.  switch( p->o
d6b0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
d6c0: 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _ALL: {.      in
d6d0: 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  t addr = 0;.    
d6e0: 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20    int nLimit;.  
d6f0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
d700: 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20  ior->pLimit );. 
d710: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69       pPrior->pLi
d720: 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
d730: 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
d740: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
d750: 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  set;.      expla
d760: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
d770: 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
d780: 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
d790: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
d7a0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
d7b0: 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ior, &dest);.   
d7c0: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
d7d0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
d7e0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  et = 0;.      if
d7f0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
d800: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
d810: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
d820: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
d830: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69   0;.      p->iLi
d840: 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c  mit = pPrior->iL
d850: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69  imit;.      p->i
d860: 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d  Offset = pPrior-
d870: 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >iOffset;.      
d880: 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b  if( p->iLimit ){
d890: 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
d8a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d8b0: 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  1(v, OP_IfZero, 
d8c0: 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->iLimit);.    
d8d0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
d8e0: 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20  (v, "Jump ahead 
d8f0: 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64  if LIMIT reached
d900: 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
d910: 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
d920: 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
d930: 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
d940: 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
d950: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
d960: 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
d970: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
d980: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
d990: 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
d9a0: 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
d9b0: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
d9c0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  rior;.      p->n
d9d0: 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72  SelectRow += pPr
d9e0: 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
d9f0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f  .      if( pPrio
da00: 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20  r->pLimit.      
da10: 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
da20: 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72 2d  sInteger(pPrior-
da30: 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74  >pLimit, &nLimit
da40: 29 0a 20 20 20 20 20 20 20 26 26 20 70 2d 3e 6e  ).       && p->n
da50: 53 65 6c 65 63 74 52 6f 77 20 3e 20 28 64 6f 75  SelectRow > (dou
da60: 62 6c 65 29 6e 4c 69 6d 69 74 20 0a 20 20 20 20  ble)nLimit .    
da70: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e    ){.        p->
da80: 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 28 64 6f  nSelectRow = (do
da90: 75 62 6c 65 29 6e 4c 69 6d 69 74 3b 0a 20 20 20  uble)nLimit;.   
daa0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
dab0: 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ddr ){.        s
dac0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
dad0: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
dae0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
daf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
db00: 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20   TK_EXCEPT:.    
db10: 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b  case TK_UNION: {
db20: 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e  .      int union
db30: 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f  Tab;    /* Curso
db40: 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
db50: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
db60: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a  holding result *
db70: 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20  /.      u8 op = 
db80: 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  0;       /* One 
db90: 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72  of the SRT_ oper
dba0: 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20  ations to apply 
dbb0: 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20  to self */.     
dbc0: 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20   int priorOp;   
dbd0: 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70    /* The SRT_ op
dbe0: 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79  eration to apply
dbf0: 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74   to prior select
dc00: 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  s */.      Expr 
dc10: 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
dc20: 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75  t; /* Saved valu
dc30: 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20  es of p->nLimit 
dc40: 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a  and p->nOffset *
dc50: 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
dc60: 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  ;.      SelectDe
dc70: 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20  st uniondest;.. 
dc80: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
dc90: 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
dca0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
dcb0: 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  e( p->op==TK_UNI
dcc0: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f  ON );.      prio
dcd0: 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b  rOp = SRT_Union;
dce0: 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
dcf0: 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26  eDest==priorOp &
dd00: 26 20 41 4c 57 41 59 53 28 21 70 2d 3e 70 4c 69  & ALWAYS(!p->pLi
dd10: 6d 69 74 20 26 26 21 70 2d 3e 70 4f 66 66 73 65  mit &&!p->pOffse
dd20: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  t) ){.        /*
dd30: 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20   We can reuse a 
dd40: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
dd50: 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53  generated by a S
dd60: 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20  ELECT to our.   
dd70: 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20       ** right.. 
dd80: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
dd90: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
dda0: 67 68 74 6d 6f 73 74 21 3d 70 20 29 3b 20 20 2f  ghtmost!=p );  /
ddb0: 2a 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  * Can only happe
ddc0: 6e 20 66 6f 72 20 6c 65 66 74 77 61 72 64 20 65  n for leftward e
ddd0: 6c 65 6d 65 6e 74 73 0a 20 20 20 20 20 20 20 20  lements.        
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
de00: 6f 66 20 61 20 33 2d 77 61 79 20 6f 72 20 6d 6f  of a 3-way or mo
de10: 72 65 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20  re compound */. 
de20: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
de30: 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20  ->pLimit==0 );  
de40: 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77      /* Not allow
de50: 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65  ed on leftward e
de60: 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  lements */.     
de70: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
de80: 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20  ffset==0 );     
de90: 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  /* Not allowed o
dea0: 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65  n leftward eleme
deb0: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  nts */.        u
dec0: 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69  nionTab = dest.i
ded0: 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Parm;.      }els
dee0: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  e{.        /* We
def0: 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72   will need to cr
df00: 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d  eate our own tem
df10: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
df20: 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20  hold the.       
df30: 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65   ** intermediate
df40: 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20   results..      
df50: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
df60: 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  onTab = pParse->
df70: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
df80: 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
df90: 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
dfa0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
dfb0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
dfc0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
dfd0: 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
dfe0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
dff0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
e000: 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
e010: 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
e020: 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
e030: 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f       p->pRightmo
e040: 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  st->selFlags |= 
e050: 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
e060: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
e070: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
e080: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
e090: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
e0a0: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f   statements to o
e0b0: 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f  ur left.      */
e0c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
e0d0: 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
e0e0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
e0f0: 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
e100: 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f  &uniondest, prio
e110: 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a  rOp, unionTab);.
e120: 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
e130: 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
e140: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
e150: 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
e160: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
e170: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
e180: 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
e190: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
e1a0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
e1b0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
e1c0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
e1d0: 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
e1e0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
e1f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
e200: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43  f( p->op==TK_EXC
e210: 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  EPT ){.        o
e220: 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a  p = SRT_Except;.
e230: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e240: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
e250: 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
e260: 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54          op = SRT
e270: 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a  _Union;.      }.
e280: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
e290: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69  = 0;.      pLimi
e2a0: 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
e2b0: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
e2c0: 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65   0;.      pOffse
e2d0: 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
e2e0: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
e2f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f   = 0;.      unio
e300: 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70  ndest.eDest = op
e310: 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
e320: 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
e330: 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
e340: 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
e350: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
e360: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e  t(pParse, p, &un
e370: 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
e380: 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
e390: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
e3a0: 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65   /* Query flatte
e3b0: 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53  ning in sqlite3S
e3c0: 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65  elect() might re
e3d0: 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79  fill p->pOrderBy
e3e0: 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75  ..      ** Be su
e3f0: 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e  re to delete p->
e400: 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66  pOrderBy, theref
e410: 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20  ore, to avoid a 
e420: 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a  memory leak. */.
e430: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
e440: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
e450: 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
e460: 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
e470: 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
e480: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
e490: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  r;.      p->pOrd
e4a0: 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
e4b0: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  if( p->op==TK_UN
e4c0: 49 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  ION ) p->nSelect
e4d0: 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e  Row += pPrior->n
e4e0: 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
e4f0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
e500: 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
e510: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
e520: 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
e530: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
e540: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
e550: 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
e560: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
e570: 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   0;..      /* Co
e580: 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69  nvert the data i
e590: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
e5a0: 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65  table into whate
e5b0: 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a  ver form.      *
e5c0: 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20  * it is that we 
e5d0: 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a  currently need..
e5e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
e5f0: 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d  ssert( unionTab=
e600: 3d 64 65 73 74 2e 69 50 61 72 6d 20 7c 7c 20 64  =dest.iParm || d
e610: 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
e620: 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Op );.      if( 
e630: 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
e640: 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69  rOp ){.        i
e650: 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
e660: 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
e670: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
e680: 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ist );.        i
e690: 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
e6a0: 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
e6b0: 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
e6c0: 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  First = p;.     
e6d0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
e6e0: 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
e6f0: 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
e700: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rior;.          
e710: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
e720: 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
e730: 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
e740: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e750: 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
e760: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
e770: 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e  v);.        iCon
e780: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
e790: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
e7a0: 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
e7b0: 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
e7c0: 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
e7d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e7e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
e7f0: 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
e800: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
e810: 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
e820: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
e830: 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65  r(v);.        se
e840: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
e850: 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
e860: 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d  st, unionTab, p-
e870: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a  >pEList->nExpr,.
e880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e890: 20 20 20 20 20 20 20 20 30 2c 20 2d 31 2c 20 26          0, -1, &
e8a0: 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
e8b0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
e8c0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
e8d0: 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
e8e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e8f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e900: 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  _Next, unionTab,
e910: 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   iStart);.      
e920: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
e930: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
e940: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
e950: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e960: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69  v, OP_Close, uni
e970: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
e980: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
e990: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
e9a0: 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  t: assert( p->op
e9b0: 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
e9c0: 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61  ; {.      int ta
e9d0: 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20  b1, tab2;.      
e9e0: 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
e9f0: 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
ea00: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
ea10: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  pOffset;.      i
ea20: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
ea30: 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73  electDest inters
ea40: 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69  ectdest;.      i
ea50: 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a  nt r1;..      /*
ea60: 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
ea70: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
ea80: 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
ea90: 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
eaa0: 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  ** two temporary
eab0: 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20   tables.  Hence 
eac0: 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63  it has its own c
ead0: 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20  ase.  Begin.    
eae0: 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
eaf0: 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
eb00: 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
eb10: 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20    */.      tab1 
eb20: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
eb30: 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70  ;.      tab2 = p
eb40: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
eb50: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
eb60: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a  pOrderBy==0 );..
eb70: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
eb80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
eb90: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
eba0: 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  al, tab1, 0);.  
ebb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
ebc0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
ebd0: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
ebe0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
ebf0: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70   = addr;.      p
ec00: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65  ->pRightmost->se
ec10: 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
ec20: 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
ec30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
ec40: 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ist );..      /*
ec50: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
ec60: 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
ec70: 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
ec80: 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
ec90: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
eca0: 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
ecb0: 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
ecc0: 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29  SRT_Union, tab1)
ecd0: 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
ece0: 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
ecf0: 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
ed00: 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
ed10: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
ed20: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
ed30: 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
ed40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
ed50: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
ed60: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
ed70: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
ed80: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
ed90: 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f  rent SELECT into
eda0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
edb0: 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f   "tab2".      */
edc0: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
edd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ede0: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
edf0: 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ral, tab2, 0);. 
ee00: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
ee10: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
ee20: 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
ee30: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
ee40: 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
ee50: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
ee60: 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
ee70: 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
ee80: 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
ee90: 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
eea0: 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
eeb0: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
eec0: 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64        intersectd
eed0: 65 73 74 2e 69 50 61 72 6d 20 3d 20 74 61 62 32  est.iParm = tab2
eee0: 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
eef0: 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
ef00: 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
ef10: 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
ef20: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
ef30: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e  t(pParse, p, &in
ef40: 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
ef50: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
ef60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
ef70: 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
ef80: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
ef90: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
efa0: 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  or;.      if( p-
efb0: 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69  >nSelectRow>pPri
efc0: 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
efd0: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
efe0: 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
eff0: 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Row;.      sqlit
f000: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
f010: 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
f020: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
f030: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
f040: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
f050: 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  t;..      /* Gen
f060: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61  erate code to ta
f070: 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74  ke the intersect
f080: 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74  ion of the two t
f090: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a  emporary.      *
f0a0: 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
f0b0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
f0c0: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
f0d0: 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
f0e0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
f0f0: 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  {.        Select
f100: 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20   *pFirst = p;.  
f110: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
f120: 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
f130: 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
f140: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67  Prior;.        g
f150: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
f160: 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  es(pParse, 0, pF
f170: 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
f180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72       }.      iBr
f190: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
f1a0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
f1b0: 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
f1c0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
f1d0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70  l(v);.      comp
f1e0: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
f1f0: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
f200: 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
f210: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f220: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31   OP_Rewind, tab1
f230: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
f240: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
f250: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
f260: 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20  .      iStart = 
f270: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f280: 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20  2(v, OP_RowKey, 
f290: 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20  tab1, r1);.     
f2a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f2b0: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
f2c0: 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e  ound, tab2, iCon
f2d0: 74 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20  t, r1, 0);.     
f2e0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
f2f0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
f300: 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74  1);.      select
f310: 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
f320: 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
f330: 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  tab1, p->pEList-
f340: 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
f350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
f360: 20 2d 31 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e   -1, &dest, iCon
f370: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
f380: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
f390: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
f3a0: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
f3b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f3c0: 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69  OP_Next, tab1, i
f3d0: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71  Start);.      sq
f3e0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
f3f0: 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
f400: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f410: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f420: 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b  Close, tab2, 0);
f430: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f440: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
f450: 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a  lose, tab1, 0);.
f460: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f470: 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69   }.  }..  explai
f480: 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73  nComposite(pPars
f490: 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c  e, p->op, iSub1,
f4a0: 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54   iSub2, p->op!=T
f4b0: 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f  K_ALL);..  /* Co
f4c0: 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  mpute collating 
f4d0: 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20 62  sequences used b
f4e0: 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  y .  ** temporar
f4f0: 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20  y tables needed 
f500: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
f510: 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
f520: 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68  ..  ** Attach th
f530: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
f540: 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f  ure to all tempo
f550: 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a  rary tables..  *
f560: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74  *.  ** This sect
f570: 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68  ion is run by th
f580: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c  e right-most SEL
f590: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
f5a0: 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20  ly..  ** SELECT 
f5b0: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68  statements to th
f5c0: 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b  e left always sk
f5d0: 69 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54  ip this part.  T
f5e0: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20  he right-most.  
f5f0: 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20  ** SELECT might 
f600: 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70  also skip this p
f610: 61 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f  art if it has no
f620: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
f630: 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d   and.  ** no tem
f640: 70 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71  p tables are req
f650: 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  uired..  */.  if
f660: 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
f670: 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
f680: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20   ){.    int i;  
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6a0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
f6b0: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79  unter */.    Key
f6c0: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
f6d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
f6e0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
f6f0: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20   for the result 
f700: 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63  set */.    Selec
f710: 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  t *pLoop;       
f720: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
f730: 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
f740: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
f750: 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71  s */.    CollSeq
f760: 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20   **apColl;      
f770: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
f780: 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b  oping through pK
f790: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20  eyInfo->aColl[] 
f7a0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
f7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
f7d0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73  f columns in res
f7e0: 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20  ult set */..    
f7f0: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
f800: 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20  tmost==p );.    
f810: 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
f820: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65  ->nExpr;.    pKe
f830: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  yInfo = sqlite3D
f840: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a  bMallocZero(db,.
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f860: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
f870: 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 28 73  KeyInfo)+nCol*(s
f880: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20  izeof(CollSeq*) 
f890: 2b 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 21  + 1));.    if( !
f8a0: 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
f8b0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
f8c0: 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
f8d0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
f8e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65  ;.    }..    pKe
f8f0: 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43  yInfo->enc = ENC
f900: 28 64 62 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e  (db);.    pKeyIn
f910: 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31  fo->nField = (u1
f920: 36 29 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72  6)nCol;..    for
f930: 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65  (i=0, apColl=pKe
f940: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c  yInfo->aColl; i<
f950: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c  nCol; i++, apCol
f960: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43  l++){.      *apC
f970: 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  oll = multiSelec
f980: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
f990: 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66   p, i);.      if
f9a0: 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a  ( 0==*apColl ){.
f9b0: 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20          *apColl 
f9c0: 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
f9d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
f9e0: 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
f9f0: 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
fa00: 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  oop->pPrior){.  
fa10: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32      for(i=0; i<2
fa20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
fa30: 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70  int addr = pLoop
fa40: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
fa50: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ];.        if( a
fa60: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ddr<0 ){.       
fa70: 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20     /* If [0] is 
fa80: 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20  unused then [1] 
fa90: 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20  is also unused. 
faa0: 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20   So we can.     
fab0: 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
fac0: 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73  afely abort as s
fad0: 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74  oon as the first
fae0: 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20   unused slot is 
faf0: 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  found */.       
fb00: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
fb10: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
fb20: 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ]<0 );.         
fb30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
fb40: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
fb50: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
fb60: 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20   addr, nCol);.  
fb70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fb80: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64  eChangeP4(v, add
fb90: 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  r, (char*)pKeyIn
fba0: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
fbb0: 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
fbc0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20  addrOpenEphm[i] 
fbd0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
fbe0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
fbf0: 62 46 72 65 65 28 64 62 2c 20 70 4b 65 79 49 6e  bFree(db, pKeyIn
fc00: 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f  fo);.  }..multi_
fc10: 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44  select_end:.  pD
fc20: 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 64 65 73 74  est->iMem = dest
fc30: 2e 69 4d 65 6d 3b 0a 20 20 70 44 65 73 74 2d 3e  .iMem;.  pDest->
fc40: 6e 4d 65 6d 20 3d 20 64 65 73 74 2e 6e 4d 65 6d  nMem = dest.nMem
fc50: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
fc60: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c  tDelete(db, pDel
fc70: 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ete);.  return r
fc80: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
fc90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
fca0: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f  UND_SELECT */../
fcb0: 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74  *.** Code an out
fcc0: 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66  put subroutine f
fcd0: 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69  or a coroutine i
fce0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
fcf0: 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
fd00: 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tment..**.** The
fd10: 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70   data to be outp
fd20: 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ut is contained 
fd30: 69 6e 20 70 49 6e 2d 3e 69 4d 65 6d 2e 20 20 54  in pIn->iMem.  T
fd40: 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d  here are.** pIn-
fd50: 3e 6e 4d 65 6d 20 63 6f 6c 75 6d 6e 73 20 74 6f  >nMem columns to
fd60: 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65   be output.  pDe
fd70: 73 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20  st is where the 
fd80: 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a  output should.**
fd90: 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   be sent..**.** 
fda0: 72 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65  regReturn is the
fdb0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72   number of the r
fdc0: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
fdd0: 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a  the subroutine.*
fde0: 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  * return address
fdf0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72  ..**.** If regPr
fe00: 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20  ev>0 then it is 
fe10: 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
fe20: 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74  er in a vector t
fe30: 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74  hat.** records t
fe40: 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  he previous outp
fe50: 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76  ut.  mem[regPrev
fe60: 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74  ] is a flag that
fe70: 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20   is false.** if 
fe80: 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e  there has been n
fe90: 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  o previous outpu
fea0: 74 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30  t.  If regPrev>0
feb0: 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a   then code is.**
fec0: 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75   generated to su
fed0: 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65  ppress duplicate
fee0: 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20  s.  pKeyInfo is 
fef0: 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  used for compari
ff00: 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a  ng.** keys..**.*
ff10: 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66  * If the LIMIT f
ff20: 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69  ound in p->iLimi
ff30: 74 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75  t is reached, ju
ff40: 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
ff50: 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a  o.** iBreak..*/.
ff60: 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72  static int gener
ff70: 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
ff80: 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ine(.  Parse *pP
ff90: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
ffa0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
ffb0: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
ffc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
ffd0: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
ffe0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65  tement */.  Sele
fff0: 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20  ctDest *pIn,    
10000 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65      /* Coroutine
10010 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20   supplying data 
10020 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
10030 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20  *pDest,      /* 
10040 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68  Where to send th
10050 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
10060 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20  regReturn,      
10070 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
10080 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
10090 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  er */.  int regP
100a0 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  rev,            
100b0 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75  /* Previous resu
100c0 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f  lt register.  No
100d0 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30   uniqueness if 0
100e0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
100f0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a  KeyInfo,      /*
10100 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77   For comparing w
10110 69 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74  ith previous ent
10120 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79  ry */.  int p4ty
10130 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
10140 2f 2a 20 54 68 65 20 70 34 20 74 79 70 65 20 66  /* The p4 type f
10150 6f 72 20 70 4b 65 79 49 6e 66 6f 20 2a 2f 0a 20  or pKeyInfo */. 
10160 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20   int iBreak     
10170 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
10180 20 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20   here if we hit 
10190 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a  the LIMIT */.){.
101a0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
101b0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
101c0 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e   iContinue;.  in
101d0 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20  t addr;..  addr 
101e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
101f0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
10200 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
10210 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
10220 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65  v);..  /* Suppre
10230 73 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f  ss duplicates fo
10240 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  r UNION, EXCEPT,
10250 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a   and INTERSECT .
10260 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72    */.  if( regPr
10270 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31  ev ){.    int j1
10280 2c 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73  , j2;.    j1 = s
10290 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
102a0 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65  (v, OP_IfNot, re
102b0 67 50 72 65 76 29 3b 0a 20 20 20 20 6a 32 20 3d  gPrev);.    j2 =
102c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
102d0 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
102e0 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 72 65 67  , pIn->iMem, reg
102f0 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 4d 65  Prev+1, pIn->nMe
10300 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
10310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10320 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
10330 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 20 20 73  , p4type);.    s
10340 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10350 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b  (v, OP_Jump, j2+
10360 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32  2, iContinue, j2
10370 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +2);.    sqlite3
10380 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
10390 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  j1);.    sqlite3
103a0 45 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61  ExprCodeCopy(pPa
103b0 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  rse, pIn->iMem, 
103c0 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e  regPrev+1, pIn->
103d0 6e 4d 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  nMem);.    sqlit
103e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
103f0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
10400 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69  egPrev);.  }.  i
10410 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
10420 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
10430 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75  turn 0;..  /* Su
10440 70 70 72 65 73 73 20 74 68 65 20 74 68 65 20 66  ppress the the f
10450 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72  irst OFFSET entr
10460 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20  ies if there is 
10470 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
10480 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73  .  */.  codeOffs
10490 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e  et(v, p, iContin
104a0 75 65 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  ue);..  switch( 
104b0 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a  pDest->eDest ){.
104c0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
104d0 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
104e0 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
104f0 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
10500 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
10510 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
10520 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
10530 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
10540 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
10550 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d  ;.      int r2 =
10560 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
10570 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
10580 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65 73    testcase( pDes
10590 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 54 61  t->eDest==SRT_Ta
105a0 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ble );.      tes
105b0 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44  tcase( pDest->eD
105c0 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
105d0 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b );.      sqlit
105e0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
105f0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
10600 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e  In->iMem, pIn->n
10610 4d 65 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Mem, r1);.      
10620 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10630 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
10640 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20  , pDest->iParm, 
10650 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
10660 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
10670 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74  OP_Insert, pDest
10680 2d 3e 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29  ->iParm, r1, r2)
10690 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
106a0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
106b0 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
106c0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
106d0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
106e0 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  e, r2);.      sq
106f0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
10700 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
10710 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10720 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
10730 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
10740 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
10750 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
10760 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
10770 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
10780 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
10790 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
107a0 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
107b0 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
107c0 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
107d0 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
107e0 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
107f0 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
10800 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
10810 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
10820 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 61 73  int r1;.      as
10830 73 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d  sert( pIn->nMem=
10840 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  =1 );.      p->a
10850 66 66 69 6e 69 74 79 20 3d 20 0a 20 20 20 20 20  ffinity = .     
10860 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61      sqlite3Compa
10870 72 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45  reAffinity(p->pE
10880 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
10890 2c 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74  , pDest->affinit
108a0 79 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  y);.      r1 = s
108b0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
108c0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
108d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
108e0 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
108f0 72 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31  rd, pIn->iMem, 1
10900 2c 20 72 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69  , r1, &p->affini
10910 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ty, 1);.      sq
10920 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
10930 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
10940 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  rse, pIn->iMem, 
10950 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
10960 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10970 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65  P_IdxInsert, pDe
10980 73 74 2d 3e 69 50 61 72 6d 2c 20 72 31 29 3b 0a  st->iParm, r1);.
10990 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
109a0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
109b0 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
109c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
109d0 20 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63   0  /* Never occ
109e0 75 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20  urs on an ORDER 
109f0 42 59 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  BY query */.    
10a00 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78  /* If any row ex
10a10 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ist in the resul
10a20 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68  t set, record th
10a30 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72  at fact and abor
10a40 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
10a50 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b  se SRT_Exists: {
10a60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10a70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
10a80 6e 74 65 67 65 72 2c 20 31 2c 20 70 44 65 73 74  nteger, 1, pDest
10a90 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  ->iParm);.      
10aa0 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
10ab0 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
10ac0 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
10ad0 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
10ae0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
10af0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
10b00 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
10b10 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
10b20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
10b30 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
10b40 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
10b50 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
10b60 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
10b70 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
10b80 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
10b90 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
10ba0 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
10bb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10bc0 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20  In->nMem==1 );. 
10bd0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
10be0 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
10bf0 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73   pIn->iMem, pDes
10c00 74 2d 3e 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  t->iParm, 1);.  
10c10 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
10c20 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
10c30 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
10c40 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
10c50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
10c60 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
10c70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
10c80 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a  QUERY */..    /*
10c90 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
10ca0 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
10cb0 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
10cc0 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  rs.    ** starti
10cd0 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69 4d 65  ng at pDest->iMe
10ce0 6d 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d  m.  Then the co-
10cf0 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a  routine yields..
10d00 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
10d10 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  SRT_Coroutine: {
10d20 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74  .      if( pDest
10d30 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20  ->iMem==0 ){.   
10d40 20 20 20 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d       pDest->iMem
10d50 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
10d60 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  pRange(pParse, p
10d70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20  In->nMem);.     
10d80 20 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d     pDest->nMem =
10d90 20 70 49 6e 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20   pIn->nMem;.    
10da0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
10db0 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
10dc0 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c  arse, pIn->iMem,
10dd0 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 70 44   pDest->iMem, pD
10de0 65 73 74 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  est->nMem);.    
10df0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10e00 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
10e10 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a   pDest->iParm);.
10e20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10e30 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f   }..    /* If no
10e40 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c  ne of the above,
10e50 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
10e60 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73   destination mus
10e70 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f  t be.    ** SRT_
10e80 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f  Output.  This ro
10e90 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
10ea0 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f  alled with any o
10eb0 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74  ther.    ** dest
10ec0 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68  ination other th
10ed0 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64  an the ones hand
10ee0 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54  led above or SRT
10ef0 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a  _Output..    **.
10f00 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f      ** For SRT_O
10f10 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61  utput, results a
10f20 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  re stored in a s
10f30 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
10f40 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54  ters.  .    ** T
10f50 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c  hen the OP_Resul
10f60 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75  tRow opcode is u
10f70 73 65 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c  sed to cause sql
10f80 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20  ite3_step() to. 
10f90 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65     ** return the
10fa0 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73   next row of res
10fb0 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ult..    */.    
10fc0 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
10fd0 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e   assert( pDest->
10fe0 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
10ff0 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t );.      sqlit
11000 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11010 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49  OP_ResultRow, pI
11020 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d  n->iMem, pIn->nM
11030 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  em);.      sqlit
11040 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
11050 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
11060 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e  , pIn->iMem, pIn
11070 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 62  ->nMem);.      b
11080 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
11090 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
110a0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
110b0 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
110c0 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a  s reached..  */.
110d0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
110e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
110f0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
11100 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  fZero, p->iLimit
11110 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20  , iBreak, -1);. 
11120 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
11130 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  e the subroutine
11140 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73   return.  */.  s
11150 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
11160 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69  eLabel(v, iConti
11170 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nue);.  sqlite3V
11180 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
11190 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72  Return, regRetur
111a0 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64  n);..  return ad
111b0 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74  dr;.}../*.** Alt
111c0 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e  ernative compoun
111d0 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65  d select code ge
111e0 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65  nerator for case
111f0 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  s when there.** 
11200 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
11210 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  lause..**.** We 
11220 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f  assume a query o
11230 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
11240 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
11250 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65   <selectA>  <ope
11260 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42  rator>  <selectB
11270 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64  >  ORDER BY <ord
11280 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20  erbylist>.**.** 
11290 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e  <operator> is on
112a0 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  e of UNION ALL, 
112b0 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
112c0 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68  r INTERSECT.  Th
112d0 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20  e idea.** is to 
112e0 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63  code both <selec
112f0 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42  tA> and <selectB
11300 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52  > with the ORDER
11310 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a   BY clause as.**
11320 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54   co-routines.  T
11330 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72  hen run the co-r
11340 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c  outines in paral
11350 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68  lel and merge th
11360 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
11370 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49  o the output.  I
11380 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68  n addition to th
11390 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
113a0 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41   (called selectA
113b0 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29   and.** selectB)
113c0 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62   there are 7 sub
113d0 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20  routines:.**.** 
113e0 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65     outA:    Move
113f0 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
11400 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75  he selectA corou
11410 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
11420 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
11430 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
11440 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  und query..**.**
11450 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76      outB:    Mov
11460 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
11470 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f  the selectB coro
11480 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
11490 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
114a0 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
114b0 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e  ound query.  (On
114c0 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  ly generated for
114d0 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20   UNION and.**   
114e0 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
114f0 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64  ALL.  EXCEPT and
11500 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65   INSERTSECT neve
11510 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74  r output a row t
11520 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
11530 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20     appears only 
11540 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20  in B.).**.**    
11550 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AltB:    Called 
11560 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
11570 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
11580 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e  outines and A<B.
11590 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20  .**.**    AeqB: 
115a0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
115b0 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
115c0 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
115d0 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a  s and A==B..**.*
115e0 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61  *    AgtB:    Ca
115f0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
11600 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
11610 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
11620 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45   A>B..**.**    E
11630 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofA:    Called w
11640 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
11650 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
11660 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66  tA..**.**    Eof
11670 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
11680 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  n data is exhaus
11690 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42  ted from selectB
116a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
116b0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
116c0 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75  e latter five su
116d0 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64  broutines depend
116e0 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f   on which .** <o
116f0 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64  perator> is used
11700 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  :.**.**.**      
11710 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
11720 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20           UNION  
11730 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54            EXCEPT
11740 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53            INTERS
11750 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ECT.**          
11760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
11770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11780 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
11790 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
117a0 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20  ---.**   AltB:  
117b0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
117c0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
117d0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
117e0 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a          nextA.**
117f0 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75  .**   AeqB:   ou
11800 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
11810 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20    nextA         
11820 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
11830 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a    outA, nextA.**
11840 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75  .**   AgtB:   ou
11850 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f  tB, nextB      o
11860 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
11870 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20      nextB       
11880 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a       nextB.**.**
11890 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c     EofA:   outB,
118a0 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
118b0 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
118c0 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20   halt           
118d0 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45    halt.**.**   E
118e0 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  ofB:   outA, nex
118f0 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  tA      outA, ne
11900 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20  xtA       outA, 
11910 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61  nextA         ha
11920 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  lt.**.** In the 
11930 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20  AltB, AeqB, and 
11940 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73  AgtB subroutines
11950 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f  , an EOF on A fo
11960 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a  llowing nextA.**
11970 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64   causes an immed
11980 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
11990 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20  A and an EOF on 
119a0 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  B following next
119b0 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69  B causes.** an i
119c0 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
119d0 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45   EofB.  Within E
119e0 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e  ofA and EofB, an
119f0 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f  d EOF on entry o
11a00 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  r.** following n
11a10 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75  extX causes a ju
11a20 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
11a30 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63   the select proc
11a40 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75  essing..**.** Du
11a50 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
11a60 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58  in the UNION, EX
11a70 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
11a80 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e  ECT cases is han
11a90 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  dled.** within t
11aa0 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  he output subrou
11ab0 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72  tine.  The regPr
11ac0 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20  ev register set 
11ad0 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f  holds the previo
11ae0 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76  usly.** output v
11af0 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69  alue.  A compari
11b00 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69  son is made agai
11b10 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61  nst this value a
11b20 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  nd the output.**
11b30 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74   is skipped if t
11b40 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20  he next results 
11b50 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d  would be the sam
11b60 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75  e as the previou
11b70 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  s..**.** The imp
11b80 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e  lementation plan
11b90 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74   is to implement
11ba0 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69   the two corouti
11bb0 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a  nes and seven.**
11bc0 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72   subroutines fir
11bd0 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65  st, then put the
11be0 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61   control logic a
11bf0 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c  t the bottom.  L
11c00 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
11c10 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e           goto In
11c20 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63  it.**     coA: c
11c30 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66  oroutine for lef
11c40 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20  t query (A).**  
11c50 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e     coB: coroutin
11c60 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72  e for right quer
11c70 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41  y (B).**    outA
11c80 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
11c90 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42   of A.**    outB
11ca0 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
11cb0 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64   of B (UNION and
11cc0 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29   UNION ALL only)
11cd0 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e  .**    EofA: ...
11ce0 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e  .**    EofB: ...
11cf0 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e  .**    AltB: ...
11d00 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e  .**    AeqB: ...
11d10 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e  .**    AgtB: ...
11d20 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69  .**    Init: ini
11d30 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e  tialize coroutin
11d40 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20  e registers.**  
11d50 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
11d60 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  A.**          if
11d70 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66   eof(A) goto Eof
11d80 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69  A.**          yi
11d90 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20  eld coB.**      
11da0 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f      if eof(B) go
11db0 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d  to EofB.**    Cm
11dc0 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42  pr: Compare A, B
11dd0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d  .**          Jum
11de0 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  p AltB, AeqB, Ag
11df0 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e  tB.**     End: .
11e00 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c  ...**.** We call
11e10 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
11e20 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66  B, EofA, and Eof
11e30 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20  B "subroutines" 
11e40 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74  but they are not
11e50 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c  .** actually cal
11e60 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20  led using Gosub 
11e70 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  and they do not 
11e80 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e  Return.  EofA an
11e90 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75  d EofB loop.** u
11ea0 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73  ntil all data is
11eb0 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20   exhausted then 
11ec0 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64  jump to the "end
11ed0 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41  " labe.  AltB, A
11ee0 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42  eqB,.** and AgtB
11ef0 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20   jump to either 
11f00 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20  L2 or to one of 
11f10 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f  EofA or EofB..*/
11f20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11f30 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
11f40 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20  LECT.static int 
11f50 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
11f60 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
11f70 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
11f80 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
11f90 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
11fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11fb0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
11fc0 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
11fd0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
11fe0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
11ff0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
12000 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
12010 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
12020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12030 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
12040 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
12050 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
12060 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
12070 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
12080 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
12090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
120a0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
120b0 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
120c0 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
120d0 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e  A;     /* Destin
120e0 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74  ation for corout
120f0 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63  ine A */.  Selec
12100 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20  tDest destB;    
12110 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
12120 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20  for coroutine B 
12130 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72  */.  int regAddr
12140 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
12150 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
12160 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f  or select-A coro
12170 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
12180 65 67 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20  egEofA;         
12190 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64 69   /* Flag to indi
121a0 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65 63 74  cate when select
121b0 2d 41 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a  -A is complete *
121c0 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42  /.  int regAddrB
121d0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
121e0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
121f0 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  r select-B corou
12200 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
12210 67 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 20  gEofB;          
12220 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63  /* Flag to indic
12230 61 74 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d  ate when select-
12240 42 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f  B is complete */
12250 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63  .  int addrSelec
12260 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tA;      /* Addr
12270 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
12280 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
12290 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63  .  int addrSelec
122a0 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tB;      /* Addr
122b0 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
122c0 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-B coroutine */
122d0 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20  .  int regOutA; 
122e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
122f0 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
12300 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75   the output-A su
12310 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
12320 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20  t regOutB;      
12330 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
12340 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20  egister for the 
12350 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
12360 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
12370 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f  rOutA;         /
12380 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
12390 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75   output-A subrou
123a0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
123b0 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20  drOutB = 0;     
123c0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
123d0 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
123e0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
123f0 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20  ddrEofA;        
12400 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
12410 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61  he select-A-exha
12420 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
12430 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
12440 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  fB;         /* A
12450 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
12460 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64  lect-B-exhausted
12470 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
12480 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20   int addrAltB;  
12490 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
124a0 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62  s of the A<B sub
124b0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
124c0 20 61 64 64 72 41 65 71 42 3b 20 20 20 20 20 20   addrAeqB;      
124d0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
124e0 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75   the A==B subrou
124f0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
12500 64 72 41 67 74 42 3b 20 20 20 20 20 20 20 20 20  drAgtB;         
12510 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
12520 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65  e A>B subroutine
12530 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
12540 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  itA;        /* L
12550 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f  imit register fo
12560 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20  r select-A */.  
12570 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20  int regLimitB;  
12580 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
12590 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
125a0 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
125b0 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  gPrev;          
125c0 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65  /* A range of re
125d0 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20  gisters to hold 
125e0 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20  previous output 
125f0 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69  */.  int savedLi
12600 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61  mit;       /* Sa
12610 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  ved value of p->
12620 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  iLimit */.  int 
12630 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20  savedOffset;    
12640 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
12650 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a   of p->iOffset *
12660 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70  /.  int labelCmp
12670 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  r;        /* Lab
12680 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72 74  el for the start
12690 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c   of the merge al
126a0 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74  gorithm */.  int
126b0 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20   labelEnd;      
126c0 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
126d0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
126e0 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74  verall SELECT st
126f0 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20  mt */.  int j1; 
12700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12710 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f   Jump instructio
12720 6e 73 20 74 68 61 74 20 67 65 74 20 72 65 74 61  ns that get reta
12730 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74  rgetted */.  int
12740 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
12750 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f     /* One of TK_
12760 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54  ALL, TK_UNION, T
12770 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54  K_EXCEPT, TK_INT
12780 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49  ERSECT */.  KeyI
12790 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30  nfo *pKeyDup = 0
127a0 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20  ; /* Comparison 
127b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
127c0 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61  duplicate remova
127d0 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  l */.  KeyInfo *
127e0 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20  pKeyMerge;   /* 
127f0 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72  Comparison infor
12800 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69  mation for mergi
12810 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c  ng rows */.  sql
12820 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
12830 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
12840 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
12850 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
12860 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y;   /* The ORDE
12870 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
12880 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20   int nOrderBy;  
12890 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
128a0 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65   of terms in the
128b0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
128c0 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d   */.  int *aPerm
128d0 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  ute;        /* M
128e0 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45  apping from ORDE
128f0 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65  R BY terms to re
12900 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73  sult set columns
12910 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
12920 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
12930 20 20 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20    int iSub1;    
12940 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69          /* EQP i
12950 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71  d of left-hand q
12960 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53  uery */.  int iS
12970 75 62 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  ub2;            
12980 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67  /* EQP id of rig
12990 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ht-hand query */
129a0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
129b0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d  t( p->pOrderBy!=
129c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
129d0 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20  KeyDup==0 ); /* 
129e0 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e  "Managed" code n
129f0 65 65 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b  eeds this.  Tick
12a00 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64  et #3382. */.  d
12a10 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
12a20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
12a30 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
12a40 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  !=0 );       /* 
12a50 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e 20 74  Already thrown t
12a60 68 65 20 65 72 72 6f 72 20 69 66 20 56 44 42 45  he error if VDBE
12a70 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f   alloc failed */
12a80 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71  .  labelEnd = sq
12a90 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
12aa0 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d  el(v);.  labelCm
12ab0 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pr = sqlite3Vdbe
12ac0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a  MakeLabel(v);...
12ad0 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68    /* Patch up th
12ae0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
12af0 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d  e.  */.  op = p-
12b00 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20  >op;  .  pPrior 
12b10 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61  = p->pPrior;.  a
12b20 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
12b30 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
12b40 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
12b50 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74  rderBy;.  assert
12b60 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ( pOrderBy );.  
12b70 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  nOrderBy = pOrde
12b80 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f  rBy->nExpr;..  /
12b90 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20  * For operators 
12ba0 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e  other than UNION
12bb0 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20   ALL we have to 
12bc0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20  make sure that. 
12bd0 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   ** the ORDER BY
12be0 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65   clause covers e
12bf0 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65  very term of the
12c00 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64   result set.  Ad
12c10 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20  d.  ** terms to 
12c20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
12c30 75 73 65 20 61 73 20 6e 65 63 65 73 73 61 72 79  use as necessary
12c40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21  ..  */.  if( op!
12c50 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66  =TK_ALL ){.    f
12c60 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c  or(i=1; db->mall
12c70 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69  ocFailed==0 && i
12c80 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <=p->pEList->nEx
12c90 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
12ca0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
12cb0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
12cc0 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
12cd0 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a  m=pOrderBy->a; j
12ce0 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20  <nOrderBy; j++, 
12cf0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
12d00 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
12d10 3e 69 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20  >iCol>0 );.     
12d20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43     if( pItem->iC
12d30 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20  ol==i ) break;. 
12d40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12d50 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a   j==nOrderBy ){.
12d60 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
12d70 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
12d80 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
12d90 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
12da0 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
12db0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
12dc0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
12dd0 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
12de0 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
12df0 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a  ->u.iValue = i;.
12e00 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
12e10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
12e20 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
12e30 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29   pOrderBy, pNew)
12e40 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
12e50 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b  By->a[nOrderBy++
12e60 5d 2e 69 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b  ].iCol = (u16)i;
12e70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12e80 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
12e90 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
12ea0 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20  permutation and 
12eb0 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69 73 20  keyinfo that is 
12ec0 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74  used with.  ** t
12ed0 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 75  he permutation u
12ee0 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
12ef0 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20 20 2a   if the next.  *
12f00 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 73  * row of results
12f10 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65   comes from sele
12f20 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42 2e 20  ctA or selectB. 
12f30 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c 69 63   Also add explic
12f40 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  it.  ** collatio
12f50 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  ns to the ORDER 
12f60 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  BY clause terms 
12f70 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
12f80 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 2a 2a   subqueries.  **
12f90 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 61 6e   to the right an
12fa0 64 20 74 68 65 20 6c 65 66 74 20 61 72 65 20 65  d the left are e
12fb0 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79 20 75  valuated, they u
12fc0 73 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20  se the correct. 
12fd0 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20   ** collation.. 
12fe0 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65 20 3d   */.  aPermute =
12ff0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
13000 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 69  Raw(db, sizeof(i
13010 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20  nt)*nOrderBy);. 
13020 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b   if( aPermute ){
13030 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
13040 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
13050 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  ;.    for(i=0, p
13060 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Item=pOrderBy->a
13070 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
13080 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
13090 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
130a0 2d 3e 69 43 6f 6c 3e 30 20 20 26 26 20 70 49 74  ->iCol>0  && pIt
130b0 65 6d 2d 3e 69 43 6f 6c 3c 3d 70 2d 3e 70 45 4c  em->iCol<=p->pEL
130c0 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
130d0 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20      aPermute[i] 
130e0 3d 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 20 2d 20  = pItem->iCol - 
130f0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  1;.    }.    pKe
13100 79 4d 65 72 67 65 20 3d 0a 20 20 20 20 20 20 73  yMerge =.      s
13110 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
13120 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4b  w(db, sizeof(*pK
13130 65 79 4d 65 72 67 65 29 2b 6e 4f 72 64 65 72 42  eyMerge)+nOrderB
13140 79 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  y*(sizeof(CollSe
13150 71 2a 29 2b 31 29 29 3b 0a 20 20 20 20 69 66 28  q*)+1));.    if(
13160 20 70 4b 65 79 4d 65 72 67 65 20 29 7b 0a 20 20   pKeyMerge ){.  
13170 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61      pKeyMerge->a
13180 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
13190 29 26 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f  )&pKeyMerge->aCo
131a0 6c 6c 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20  ll[nOrderBy];.  
131b0 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 6e      pKeyMerge->n
131c0 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 4f 72  Field = (u16)nOr
131d0 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 4b 65  derBy;.      pKe
131e0 79 4d 65 72 67 65 2d 3e 65 6e 63 20 3d 20 45 4e  yMerge->enc = EN
131f0 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72  C(db);.      for
13200 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
13210 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
13220 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
13230 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 54          Expr *pT
13240 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  erm = pOrderBy->
13250 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
13260 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66      if( pTerm->f
13270 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
13280 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  late ){.        
13290 20 20 70 43 6f 6c 6c 20 3d 20 70 54 65 72 6d 2d    pColl = pTerm-
132a0 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  >pColl;.        
132b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
132c0 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65   pColl = multiSe
132d0 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
132e0 73 65 2c 20 70 2c 20 61 50 65 72 6d 75 74 65 5b  se, p, aPermute[
132f0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  i]);.          p
13300 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Term->flags |= E
13310 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  P_ExpCollate;.  
13320 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70          pTerm->p
13330 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  Coll = pColl;.  
13340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13350 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c  pKeyMerge->aColl
13360 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  [i] = pColl;.   
13370 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e       pKeyMerge->
13380 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
13390 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
133a0 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20  ortOrder;.      
133b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
133c0 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d  .    pKeyMerge =
133d0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
133e0 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45 52  attach the ORDER
133f0 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68   BY clause to th
13400 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  e query..  */.  
13410 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
13420 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72  rderBy;.  pPrior
13430 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
13440 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
13450 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64  pParse->db, pOrd
13460 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  erBy, 0);..  /* 
13470 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65  Allocate a range
13480 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65   of temporary re
13490 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20  gisters and the 
134a0 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20  KeyInfo needed. 
134b0 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69   ** for the logi
134c0 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64  c that removes d
134d0 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20  uplicate result 
134e0 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20  rows when the.  
134f0 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55  ** operator is U
13500 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
13510 20 49 4e 54 45 52 53 45 43 54 20 28 62 75 74 20   INTERSECT (but 
13520 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a  not UNION ALL)..
13530 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
13540 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67  K_ALL ){.    reg
13550 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Prev = 0;.  }els
13560 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72  e{.    int nExpr
13570 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
13580 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
13590 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72   nOrderBy>=nExpr
135a0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
135b0 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50  iled );.    regP
135c0 72 65 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74  rev = sqlite3Get
135d0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
135e0 2c 20 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20 20  , nExpr+1);.    
135f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13600 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
13610 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   0, regPrev);.  
13620 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69    pKeyDup = sqli
13630 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
13640 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
13650 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b        sizeof(*pK
13660 65 79 44 75 70 29 20 2b 20 6e 45 78 70 72 2a 28  eyDup) + nExpr*(
13670 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
13680 2b 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  +1) );.    if( p
13690 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20  KeyDup ){.      
136a0 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72  pKeyDup->aSortOr
136b0 64 65 72 20 3d 20 28 75 38 2a 29 26 70 4b 65 79  der = (u8*)&pKey
136c0 44 75 70 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72  Dup->aColl[nExpr
136d0 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70  ];.      pKeyDup
136e0 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  ->nField = (u16)
136f0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4b 65  nExpr;.      pKe
13700 79 44 75 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  yDup->enc = ENC(
13710 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  db);.      for(i
13720 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  =0; i<nExpr; i++
13730 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  ){.        pKeyD
13740 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d  up->aColl[i] = m
13750 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
13760 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
13770 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
13780 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
13790 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
137a0 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65   }.  }. .  /* Se
137b0 70 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20  parate the left 
137c0 61 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75  and the right qu
137d0 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f  ery from one ano
137e0 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  ther.  */.  p->p
137f0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 73 71 6c  Prior = 0;.  sql
13800 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
13810 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
13820 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  p, p->pOrderBy, 
13830 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20  "ORDER");.  if( 
13840 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d  pPrior->pPrior==
13850 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
13860 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
13870 70 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69  pBy(pParse, pPri
13880 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  or, pPrior->pOrd
13890 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
138a0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
138b0 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69  e the limit regi
138c0 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75  sters */.  compu
138d0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
138e0 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65  (pParse, p, labe
138f0 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  lEnd);.  if( p->
13900 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b  iLimit && op==TK
13910 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c  _ALL ){.    regL
13920 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65  imitA = ++pParse
13930 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c  ->nMem;.    regL
13940 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  imitB = ++pParse
13950 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
13960 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13970 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66   OP_Copy, p->iOf
13980 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65  fset ? p->iOffse
13990 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c  t+1 : p->iLimit,
139a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
139b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139c0 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20     regLimitA);. 
139d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
139e0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
139f0 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c   regLimitA, regL
13a00 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b  imitB);.  }else{
13a10 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d  .    regLimitA =
13a20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a   regLimitB = 0;.
13a30 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
13a40 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
13a50 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69  Limit);.  p->pLi
13a60 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  mit = 0;.  sqlit
13a70 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
13a80 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20   p->pOffset);.  
13a90 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
13aa0 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b  .  regAddrA = ++
13ab0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
13ac0 72 65 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72  regEofA = ++pPar
13ad0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41  se->nMem;.  regA
13ae0 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrB = ++pParse-
13af0 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42  >nMem;.  regEofB
13b00 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
13b10 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b  m;.  regOutA = +
13b20 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
13b30 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61   regOutB = ++pPa
13b40 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
13b50 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
13b60 69 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43  it(&destA, SRT_C
13b70 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
13b80 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  rA);.  sqlite3Se
13b90 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
13ba0 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  stB, SRT_Corouti
13bb0 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a  ne, regAddrB);..
13bc0 20 20 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20 74    /* Jump past t
13bd0 68 65 20 76 61 72 69 6f 75 73 20 73 75 62 72 6f  he various subro
13be0 75 74 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75  utines and corou
13bf0 74 69 6e 65 73 20 74 6f 20 74 68 65 20 6d 61 69  tines to the mai
13c00 6e 0a 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f  n.  ** merge loo
13c10 70 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71  p.  */.  j1 = sq
13c20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
13c30 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61  v, OP_Goto);.  a
13c40 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c  ddrSelectA = sql
13c50 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
13c60 64 64 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47  ddr(v);...  /* G
13c70 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
13c80 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
13c90 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
13ca0 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ment to the.  **
13cb0 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d   left of the com
13cc0 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d  pound operator -
13cd0 20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e   the "A" select.
13ce0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
13cf0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67  Comment((v, "Beg
13d00 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  in coroutine for
13d10 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b   left SELECT"));
13d20 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69  .  pPrior->iLimi
13d30 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20  t = regLimitA;. 
13d40 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
13d50 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
13d60 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
13d70 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
13d80 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
13d90 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c  , &destA);.  sql
13da0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13db0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
13dc0 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c   regEofA);.  sql
13dd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
13de0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
13df0 64 64 72 41 29 3b 0a 20 20 56 64 62 65 4e 6f 6f  ddrA);.  VdbeNoo
13e00 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e  pComment((v, "En
13e10 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  d coroutine for 
13e20 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  left SELECT"));.
13e30 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
13e40 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
13e50 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
13e60 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a  T statement on .
13e70 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d    ** the right -
13e80 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a   the "B" select.
13e90 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63    */.  addrSelec
13ea0 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
13eb0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
13ec0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
13ed0 74 28 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72  t((v, "Begin cor
13ee0 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
13ef0 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61   SELECT"));.  sa
13f00 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  vedLimit = p->iL
13f10 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66  imit;.  savedOff
13f20 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  set = p->iOffset
13f30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
13f40 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e  regLimitB;.  p->
13f50 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20  iOffset = 0;  . 
13f60 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
13f70 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
13f80 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
13f90 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
13fa0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
13fb0 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  stB);.  p->iLimi
13fc0 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a  t = savedLimit;.
13fd0 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73    p->iOffset = s
13fe0 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71  avedOffset;.  sq
13ff0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14000 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
14010 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71  , regEofB);.  sq
14020 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
14030 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
14040 41 64 64 72 42 29 3b 0a 20 20 56 64 62 65 4e 6f  AddrB);.  VdbeNo
14050 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  opComment((v, "E
14060 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  nd coroutine for
14070 20 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29   right SELECT"))
14080 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
14090 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
140a0 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
140b0 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
140c0 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e A.  ** select 
140d0 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
140e0 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
140f0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
14100 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
14110 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
14120 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22  t routine for A"
14130 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d  ));.  addrOutA =
14140 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
14150 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
14160 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14170 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44     p, &destA, pD
14180 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20  est, regOutA,.  
14190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
141a0 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
141b0 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
141c0 4f 46 46 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  OFF, labelEnd);.
141d0 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65    .  /* Generate
141e0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
141f0 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
14200 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
14210 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e B.  ** select 
14220 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
14230 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
14240 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
14250 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
14260 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
14270 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65  NION ){.    Vdbe
14280 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
14290 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
142a0 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64  for B"));.    ad
142b0 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74  drOutB = generat
142c0 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
142d0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
142e0 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
142f0 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67  estB, pDest, reg
14300 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20  OutB,.          
14310 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
14320 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49  pKeyDup, P4_KEYI
14330 4e 46 4f 5f 53 54 41 54 49 43 2c 20 6c 61 62 65  NFO_STATIC, labe
14340 6c 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lEnd);.  }..  /*
14350 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
14360 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
14370 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
14380 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a  rom select A.  *
14390 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
143a0 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
143b0 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e   select B remain
143c0 73 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  s..  */.  VdbeNo
143d0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  opComment((v, "e
143e0 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22  of-A subroutine"
143f0 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  ));.  if( op==TK
14400 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54  _EXCEPT || op==T
14410 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
14420 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71     addrEofA = sq
14430 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14440 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
14450 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c 73  abelEnd);.  }els
14460 65 7b 20 20 0a 20 20 20 20 61 64 64 72 45 6f 66  e{  .    addrEof
14470 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  A = sqlite3VdbeA
14480 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
14490 72 65 67 45 6f 66 42 2c 20 6c 61 62 65 6c 45 6e  regEofB, labelEn
144a0 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
144b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
144c0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
144d0 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 73  addrOutB);.    s
144e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
144f0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
14500 67 41 64 64 72 42 29 3b 0a 20 20 20 20 73 71 6c  gAddrB);.    sql
14510 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14520 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
14530 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e  drEofA);.    p->
14540 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50  nSelectRow += pP
14550 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
14560 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
14570 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
14580 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68  e to run when th
14590 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73  e results from s
145a0 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65  elect B.  ** are
145b0 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f   exhausted and o
145c0 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65  nly data in sele
145d0 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20  ct A remains..  
145e0 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
145f0 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
14600 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72   addrEofB = addr
14610 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d  EofA;.    if( p-
14620 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50  >nSelectRow > pP
14630 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
14640 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
14650 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   = pPrior->nSele
14660 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20  ctRow;.  }else{ 
14670 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f   .    VdbeNoopCo
14680 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42  mment((v, "eof-B
14690 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
146a0 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73      addrEofB = s
146b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
146c0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
146d0 66 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  fA, labelEnd);. 
146e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
146f0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
14700 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
14710 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  utA);.    sqlite
14720 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
14730 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
14740 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
14750 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14760 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66  Goto, 0, addrEof
14770 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  B);.  }..  /* Ge
14780 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
14790 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
147a0 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A<B.  */.  Vdb
147b0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
147c0 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74   "A-lt-B subrout
147d0 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c  ine"));.  addrAl
147e0 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
147f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
14800 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
14810 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  rOutA);.  sqlite
14820 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
14830 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
14840 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
14850 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
14860 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45  , regEofA, addrE
14870 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofA);.  sqlite3V
14880 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14890 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d  Goto, 0, labelCm
148a0 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  pr);..  /* Gener
148b0 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
148c0 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
148d0 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ==B.  */.  if( o
148e0 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
148f0 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
14900 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66  AltB;.  }else if
14910 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ( op==TK_INTERSE
14920 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65  CT ){.    addrAe
14930 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20  qB = addrAltB;. 
14940 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20     addrAltB++;. 
14950 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65   }else{.    Vdbe
14960 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
14970 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69  "A-eq-B subrouti
14980 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41  ne"));.    addrA
14990 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65  eqB =.    sqlite
149a0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
149b0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
149c0 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
149d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
149e0 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64  If, regEofA, add
149f0 72 45 6f 66 41 29 3b 0a 20 20 20 20 73 71 6c 69  rEofA);.    sqli
14a00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14a10 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
14a20 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  elCmpr);.  }..  
14a30 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
14a40 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
14a50 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a  ase of A>B.  */.
14a60 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
14a70 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75  t((v, "A-gt-B su
14a80 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
14a90 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65  ddrAgtB = sqlite
14aa0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
14ab0 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  (v);.  if( op==T
14ac0 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
14ad0 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c  UNION ){.    sql
14ae0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14af0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
14b00 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
14b10 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
14b20 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
14b30 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  eld, regAddrB);.
14b40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14b50 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
14b60 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29  gEofB, addrEofB)
14b70 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
14b80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
14b90 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  , 0, labelCmpr);
14ba0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65  ..  /* This code
14bb0 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e   runs once to in
14bc0 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68  itialize everyth
14bd0 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ing..  */.  sqli
14be0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
14bf0 76 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65  v, j1);.  sqlite
14c00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14c10 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
14c20 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65  gEofA);.  sqlite
14c30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14c40 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
14c50 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65  gEofB);.  sqlite
14c60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14c70 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72  P_Gosub, regAddr
14c80 41 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b  A, addrSelectA);
14c90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14ca0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
14cb0 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72  , regAddrB, addr
14cc0 53 65 6c 65 63 74 42 29 3b 0a 20 20 73 71 6c 69  SelectB);.  sqli
14cd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14ce0 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c   OP_If, regEofA,
14cf0 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71   addrEofA);.  sq
14d00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14d10 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
14d20 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 0a 20  B, addrEofB);.. 
14d30 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68   /* Implement th
14d40 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f  e main merge loo
14d50 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
14d60 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
14d70 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
14d80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14d90 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74  Op4(v, OP_Permut
14da0 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20  ation, 0, 0, 0, 
14db0 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c  (char*)aPermute,
14dc0 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20   P4_INTARRAY);. 
14dd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14de0 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
14df0 2c 20 64 65 73 74 41 2e 69 4d 65 6d 2c 20 64 65  , destA.iMem, de
14e00 73 74 42 2e 69 4d 65 6d 2c 20 6e 4f 72 64 65 72  stB.iMem, nOrder
14e10 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
14e20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
14e30 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50  ar*)pKeyMerge, P
14e40 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
14e50 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  F);.  sqlite3Vdb
14e60 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
14e70 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64  mp, addrAltB, ad
14e80 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42  drAeqB, addrAgtB
14e90 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65  );..  /* Release
14ea0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
14eb0 74 65 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ters.  */.  if( 
14ec0 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 73  regPrev ){.    s
14ed0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
14ee0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
14ef0 65 67 50 72 65 76 2c 20 6e 4f 72 64 65 72 42 79  egPrev, nOrderBy
14f00 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  +1);.  }..  /* J
14f10 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73 20  ump to the this 
14f20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  point in order t
14f30 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
14f40 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71  query..  */.  sq
14f50 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
14f60 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e  Label(v, labelEn
14f70 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  d);..  /* Set th
14f80 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
14f90 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ut columns.  */.
14fa0 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
14fb0 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
14fc0 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46  {.    Select *pF
14fd0 69 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20  irst = pPrior;. 
14fe0 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
14ff0 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
15000 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
15010 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65  or;.    generate
15020 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
15030 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
15040 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  EList);.  }..  /
15050 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65  * Reassembly the
15060 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
15070 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
15080 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74  be freed correct
15090 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63  ly.  ** by the c
150a0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
150b0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
150c0 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
150d0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
150e0 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
150f0 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  }.  p->pPrior = 
15100 70 50 72 69 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20  pPrior;..  /*** 
15110 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62  TBD:  Insert sub
15120 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f  routine calls to
15130 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f   close cursors o
15140 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a  n incomplete.  *
15150 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a  *** subqueries *
15160 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f  ***/.  explainCo
15170 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20  mposite(pParse, 
15180 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53  p->op, iSub1, iS
15190 75 62 32 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  ub2, 0);.  retur
151a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
151b0 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
151c0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
151d0 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
151e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
151f0 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61  T_VIEW)./* Forwa
15200 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20  rd Declarations 
15210 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
15220 75 62 73 74 45 78 70 72 4c 69 73 74 28 73 71 6c  ubstExprList(sql
15230 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a  ite3*, ExprList*
15240 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a  , int, ExprList*
15250 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  );.static void s
15260 75 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69 74  ubstSelect(sqlit
15270 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69  e3*, Select *, i
15280 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b  nt, ExprList *);
15290 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72  ../*.** Scan thr
152a0 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73  ough the express
152b0 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c  ion pExpr.  Repl
152c0 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65  ace every refere
152d0 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75  nce to.** a colu
152e0 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62  mn in table numb
152f0 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61  er iTable with a
15300 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f   copy of the iCo
15310 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79  lumn-th.** entry
15320 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75   in pEList.  (Bu
15330 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63  t leave referenc
15340 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20  es to the ROWID 
15350 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61  column .** uncha
15360 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69  nged.).**.** Thi
15370 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72  s routine is par
15380 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e  t of the flatten
15390 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20  ing procedure.  
153a0 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68  A subquery.** wh
153b0 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  ose result set i
153c0 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c  s defined by pEL
153d0 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65  ist appears as e
153e0 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46  ntry in the.** F
153f0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
15400 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74  SELECT such that
15410 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   the VDBE cursor
15420 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61   assigned to tha
15430 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65  t.** FORM clause
15440 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65   entry is iTable
15450 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
15460 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61  make the necessa
15470 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ry .** changes t
15480 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20  o pExpr so that 
15490 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74  it refers direct
154a0 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65  ly to the source
154b0 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65   table.** of the
154c0 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72   subquery rather
154d0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
154e0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
154f0 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
15500 2a 73 75 62 73 74 45 78 70 72 28 0a 20 20 73 71  *substExpr(.  sq
15510 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
15520 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
15530 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69  oc errors to thi
15540 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  s connection */.
15550 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
15560 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e        /* Expr in
15570 20 77 68 69 63 68 20 73 75 62 73 74 69 74 75 74   which substitut
15580 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20  ion occurs */.  
15590 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
155a0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
155b0 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a  be substituted *
155c0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
155d0 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74  List    /* Subst
155e0 69 74 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e  itute expression
155f0 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45  s */.){.  if( pE
15600 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  xpr==0 ) return 
15610 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
15620 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
15630 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
15640 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66  iTable ){.    if
15650 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
15660 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  <0 ){.      pExp
15670 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b  r->op = TK_NULL;
15680 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15690 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
156a0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
156b0 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  st!=0 && pExpr->
156c0 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e  iColumn<pEList->
156d0 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
156e0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
156f0 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
15700 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
15710 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
15720 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
15730 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69  List->a[pExpr->i
15740 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30  Column].pExpr, 0
15750 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
15760 77 20 26 26 20 70 45 78 70 72 2d 3e 70 43 6f 6c  w && pExpr->pCol
15770 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  l ){.        pNe
15780 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72  w->pColl = pExpr
15790 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  ->pColl;.      }
157a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
157b0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
157c0 70 72 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  pr);.      pExpr
157d0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20   = pNew;.    }. 
157e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45 78 70   }else{.    pExp
157f0 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74  r->pLeft = subst
15800 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
15810 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70  pLeft, iTable, p
15820 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70  EList);.    pExp
15830 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73  r->pRight = subs
15840 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d  tExpr(db, pExpr-
15850 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c  >pRight, iTable,
15860 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66   pEList);.    if
15870 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
15880 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
15890 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
158a0 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
158b0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
158c0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
158d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
158e0 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
158f0 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(db, pExpr->x.p
15900 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
15910 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
15920 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
15930 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
15940 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20  ubstExprList(.  
15950 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
15960 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
15970 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72  alloc errors her
15980 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
15990 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c  *pList,     /* L
159a0 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20  ist to scan and 
159b0 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
159c0 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a   substitutes */.
159d0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
159e0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
159f0 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
15a00 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
15a10 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
15a20 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
15a30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
15a40 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
15a50 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
15a60 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
15a70 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c  pr; i++){.    pL
15a80 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  ist->a[i].pExpr 
15a90 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
15aa0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
15ab0 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
15ac0 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
15ad0 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
15ae0 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
15af0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  ,         /* Rep
15b00 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
15b10 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65  s here */.  Sele
15b20 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
15b30 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
15b40 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f  ment in which to
15b50 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69   make substituti
15b60 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ons */.  int iTa
15b70 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
15b80 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70   Table to be rep
15b90 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  laced */.  ExprL
15ba0 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20  ist *pEList     
15bb0 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61  /* Substitute va
15bc0 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63  lues */.){.  Src
15bd0 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74  List *pSrc;.  st
15be0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
15bf0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
15c00 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  i;.  if( !p ) re
15c10 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70  turn;.  substExp
15c20 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c  rList(db, p->pEL
15c30 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
15c40 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
15c50 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72  rList(db, p->pGr
15c60 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70  oupBy, iTable, p
15c70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
15c80 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
15c90 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c  OrderBy, iTable,
15ca0 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70   pEList);.  p->p
15cb0 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78  Having = substEx
15cc0 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  pr(db, p->pHavin
15cd0 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  g, iTable, pELis
15ce0 74 29 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20  t);.  p->pWhere 
15cf0 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
15d00 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c  p->pWhere, iTabl
15d10 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
15d20 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d  bstSelect(db, p-
15d30 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c  >pPrior, iTable,
15d40 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 72 63   pEList);.  pSrc
15d50 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
15d60 73 65 72 74 28 20 70 53 72 63 20 29 3b 20 20 2f  sert( pSrc );  /
15d70 2a 20 45 76 65 6e 20 66 6f 72 20 28 53 45 4c 45  * Even for (SELE
15d80 43 54 20 31 29 20 77 65 20 68 61 76 65 3a 20 70  CT 1) we have: p
15d90 53 72 63 21 3d 30 20 62 75 74 20 70 53 72 63 2d  Src!=0 but pSrc-
15da0 3e 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66  >nSrc==0 */.  if
15db0 28 20 41 4c 57 41 59 53 28 70 53 72 63 29 20 29  ( ALWAYS(pSrc) )
15dc0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63  {.    for(i=pSrc
15dd0 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53  ->nSrc, pItem=pS
15de0 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  rc->a; i>0; i--,
15df0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
15e00 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
15e10 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c   pItem->pSelect,
15e20 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
15e30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
15e40 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
15e50 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
15e60 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
15e70 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
15e80 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65  IEW) */..#if !de
15e90 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
15ea0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
15eb0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
15ec0 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
15ed0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
15ee0 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
15ef0 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f   subqueries in o
15f00 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a  rder to speed.**
15f10 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20   execution.  It 
15f20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
15f30 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
15f40 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
15f50 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a  ning.** occurs..
15f60 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
15f70 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
15f80 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
15f90 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
15fa0 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
15fb0 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
15fc0 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
15fd0 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
15fe0 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
15ff0 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
16000 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
16010 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
16020 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
16030 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
16040 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
16050 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
16060 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
16070 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
16080 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
16090 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
160a0 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
160b0 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
160c0 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
160d0 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
160e0 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
160f0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
16100 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
16110 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
16120 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
16130 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
16140 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
16150 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
16160 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
16170 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
16180 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
16190 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
161a0 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
161b0 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
161c0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
161d0 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
161e0 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
161f0 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
16200 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
16210 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69  this simpificati
16220 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
16230 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
16240 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
16250 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
16260 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
16270 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
16280 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
16290 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
162a0 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
162b0 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
162c0 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
162d0 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
162e0 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
162f0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
16300 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
16310 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
16320 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
16330 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
16340 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
16350 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
16360 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
16370 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
16380 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72  ate or the outer
16390 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
163a0 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  join..**.**   (3
163b0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
163c0 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
163d0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
163e0 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a  ft outer join.**
163f0 20 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61          (Origina
16400 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e  lly ticket #306.
16410 20 20 53 74 72 65 6e 67 74 68 65 6e 65 64 20 62    Strengthened b
16420 79 20 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a  y ticket #3300).
16430 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65  **.**   (4)  The
16440 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
16450 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
16460 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70    (**)  At one p
16470 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e  oint restriction
16480 73 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65  s (4) and (5) de
16490 66 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f  fined a subset o
164a0 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20  f DISTINCT.**   
164b0 20 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73       sub-queries
164c0 20 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75   that were exclu
164d0 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70  ded from this op
164e0 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74  timization. Rest
164f0 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20  riction .**     
16500 20 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65     (4) has since
16510 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74   been expanded t
16520 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49  o exclude all DI
16530 53 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65  STINCT subquerie
16540 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20  s..**.**   (6)  
16550 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
16560 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
16570 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
16580 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a  r query is not.*
16590 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
165a0 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20  T..**.**   (7)  
165b0 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  The subquery has
165c0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a   a FROM clause..
165d0 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65  **.**   (8)  The
165e0 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
165f0 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
16600 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
16610 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
16620 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20  *.**   (9)  The 
16630 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
16640 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
16650 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
16660 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  oes not use.**  
16670 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73        aggregates
16680 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54  ..**.**  (10)  T
16690 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
166a0 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
166b0 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
166c0 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a   query does not.
166d0 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c 49  **        use LI
166e0 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29  MIT..**.**  (11)
166f0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
16700 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
16710 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68  ry do not both h
16720 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  ave ORDER BY cla
16730 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  uses..**.**  (**
16740 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74  )  Not implement
16750 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e  ed.  Subsumed in
16760 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  to restriction (
16770 33 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75  3).  Was previou
16780 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20  sly.**        a 
16790 73 65 70 61 72 61 74 65 20 72 65 73 74 72 69 63  separate restric
167a0 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72  tion deriving fr
167b0 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a  om ticket #350..
167c0 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65  **.**  (13)  The
167d0 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75   subquery and ou
167e0 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
167f0 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e   both use LIMIT.
16800 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68  .**.**  (14)  Th
16810 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
16820 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a  not use OFFSET..
16830 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65  **.**  (15)  The
16840 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
16850 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f  not part of a co
16860 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72  mpound select or
16870 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
16880 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
16890 20 68 61 76 65 20 61 20 4c 49 4d 49 54 20 63 6c   have a LIMIT cl
168a0 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ause..**        
168b0 28 53 65 65 20 74 69 63 6b 65 74 20 23 32 33 33  (See ticket #233
168c0 39 20 61 6e 64 20 74 69 63 6b 65 74 20 5b 30 32  9 and ticket [02
168d0 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a  a8e81d44])..**.*
168e0 2a 20 20 28 31 36 29 20 20 54 68 65 20 6f 75 74  *  (16)  The out
168f0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
16900 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
16910 74 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  the subquery doe
16920 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74 20  s.**        not 
16930 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
16940 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32  .  (Ticket #2942
16950 29 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20  )  This used to 
16960 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20  not matter.**   
16970 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e       until we in
16980 74 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f  troduced the gro
16990 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63  up_concat() func
169a0 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28  tion.  .**.**  (
169b0 31 37 29 20 20 54 68 65 20 73 75 62 2d 71 75 65  17)  The sub-que
169c0 72 79 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70  ry is not a comp
169d0 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72 20  ound select, or 
169e0 69 74 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c  it is a UNION AL
169f0 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d  L .**        com
16a00 70 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d 61 64  pound clause mad
16a10 65 20 75 70 20 65 6e 74 69 72 65 6c 79 20 6f 66  e up entirely of
16a20 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71   non-aggregate q
16a30 75 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20  ueries, and .** 
16a40 20 20 20 20 20 20 20 74 68 65 20 70 61 72 65 6e         the paren
16a50 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  t query:.**.**  
16a60 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74          * is not
16a70 20 69 74 73 65 6c 66 20 70 61 72 74 20 6f 66 20   itself part of 
16a80 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
16a90 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  t,.**          *
16aa0 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
16ab0 67 61 74 65 20 6f 72 20 44 49 53 54 49 4e 43 54  gate or DISTINCT
16ac0 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20   query, and.**  
16ad0 20 20 20 20 20 20 20 20 2a 20 68 61 73 20 6e 6f          * has no
16ae0 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 6f 72   other tables or
16af0 20 73 75 62 2d 73 65 6c 65 63 74 73 20 69 6e 20   sub-selects in 
16b00 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
16b10 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  .**.**        Th
16b20 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62  e parent and sub
16b30 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61  -query may conta
16b40 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  in WHERE clauses
16b50 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20  . Subject to.** 
16b60 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31         rules (11
16b70 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29  ), (13) and (14)
16b80 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20  , they may also 
16b90 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
16ba0 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49  ,.**        LIMI
16bb0 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
16bc0 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38  uses..**.**  (18
16bd0 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
16be0 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
16bf0 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61  d select, then a
16c00 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  ll terms of the.
16c10 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20  **        ORDER 
16c20 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  by clause of the
16c30 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20   parent must be 
16c40 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65  simple reference
16c50 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20  s to .**        
16c60 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73  columns of the s
16c70 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  ub-query..**.** 
16c80 20 28 31 39 29 20 20 54 68 65 20 73 75 62 71 75   (19)  The subqu
16c90 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
16ca0 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
16cb0 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
16cc0 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76  ot.**        hav
16cd0 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
16ce0 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49  ..**.**  (20)  I
16cf0 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
16d00 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  is a compound se
16d10 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75  lect, then it mu
16d20 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  st not use.**   
16d30 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59       an ORDER BY
16d40 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74   clause.  Ticket
16d50 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c   #3773.  We coul
16d60 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e  d relax this con
16d70 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20  straint.**      
16d80 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61    somewhat by sa
16d90 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65  ying that the te
16da0 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
16db0 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a   BY clause must.
16dc0 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72  **        appear
16dd0 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72   as unmodified r
16de0 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e  esult columns in
16df0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
16e00 2e 20 20 42 75 74 0a 2a 2a 20 20 20 20 20 20 20  .  But.**       
16e10 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69   have other opti
16e20 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e  mizations in min
16e30 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  d to deal with t
16e40 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  hat case..**.** 
16e50 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  In this routine,
16e60 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74   the "p" paramet
16e70 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
16e80 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  to the outer que
16e90 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75  ry..** The subqu
16ea0 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e  ery is p->pSrc->
16eb0 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67  a[iFrom].  isAgg
16ec0 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
16ed0 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75  outer query.** u
16ee0 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61  ses aggregates a
16ef0 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nd subqueryIsAgg
16f00 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
16f10 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67  subquery uses ag
16f20 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
16f30 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
16f40 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20   not attempted, 
16f50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
16f60 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75  a no-op and retu
16f70 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61  rns 0..** If fla
16f80 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d  ttening is attem
16f90 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  pted this routin
16fa0 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a  e returns 1..**.
16fb0 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78  ** All of the ex
16fc0 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
16fd0 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20  s must occur on 
16fe0 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71  both the outer q
16ff0 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20  uery and.** the 
17000 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20  subquery before 
17010 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
17020 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
17030 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
17040 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
17050 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
17060 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
17070 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
17080 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
17090 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c  ent or outer SEL
170a0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
170b0 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
170c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
170d0 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d   in p->pSrc->a[]
170e0 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75   of the inner su
170f0 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  bquery */.  int 
17100 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20  isAgg,          
17110 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65   /* True if oute
17120 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67  r SELECT uses ag
17130 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
17140 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75  s */.  int subqu
17150 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54  eryIsAgg    /* T
17160 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
17170 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
17180 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
17190 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
171a0 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65  *zSavedAuthConte
171b0 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75  xt = pParse->zAu
171c0 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c  thContext;.  Sel
171d0 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20  ect *pParent;.  
171e0 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
171f0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
17200 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
17210 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ery" */.  Select
17220 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a   *pSub1;      /*
17230 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
17240 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74  rightmost select
17250 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f   in sub-query */
17260 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
17270 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
17280 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
17290 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
172a0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53    SrcList *pSubS
172b0 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
172c0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
172d0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78  subquery */.  Ex
172e0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20  prList *pList;  
172f0 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
17300 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72  set of the outer
17310 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
17320 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  iParent;        
17330 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  /* VDBE cursor n
17340 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75  umber of the pSu
17350 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d  b result set tem
17360 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  p table */.  int
17370 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
17380 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
17390 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
173a0 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
173b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
173c0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
173d0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
173e0 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20  tem *pSubitem;  
173f0 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
17400 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
17410 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
17420 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
17430 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
17440 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
17450 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
17460 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
17470 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
17480 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
17490 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20  ;  /* Unable to 
174a0 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64  flatten compound
174b0 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 66   queries */.  if
174c0 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
174d0 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65  LITE_QueryFlatte
174e0 6e 65 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ner ) return 0;.
174f0 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
17500 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
17510 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
17520 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
17530 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
17540 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
17550 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53  ;.  iParent = pS
17560 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ubitem->iCursor;
17570 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
17580 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
17590 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
175a0 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  ;.  if( isAgg &&
175b0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
175c0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
175d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
175e0 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a  striction (1)  *
175f0 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  /.  if( subquery
17600 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e  IsAgg && pSrc->n
17610 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30  Src>1 ) return 0
17620 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
17630 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a  striction (2)  *
17640 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  /.  pSubSrc = pS
17650 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
17660 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
17670 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72   /* Prior to ver
17680 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e  sion 3.1.2, when
17690 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
176a0 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70  T had to be simp
176b0 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20  le constants,.  
176c0 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79  ** not arbitrary
176d0 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77   expresssions, w
176e0 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
176f0 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
17700 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
17710 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
17720 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
17730 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
17740 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
17750 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
17760 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
17770 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
17780 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
17790 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
177a0 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
177b0 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
177c0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
177d0 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
177e0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
177f0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
17800 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
17810 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20  pSub->pOffset ) 
17820 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
17830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17840 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
17850 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
17860 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26  p->pRightmost &&
17870 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
17880 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
17890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
178c0 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f  triction (15) */
178d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53  .  }.  if( pSubS
178e0 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65  rc->nSrc==0 ) re
178f0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
17900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17910 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29   Restriction (7)
17920 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
17930 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
17940 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
17950 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
17960 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29   Restriction (5)
17970 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
17980 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63  >pLimit && (pSrc
17990 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67  ->nSrc>1 || isAg
179a0 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  g) ){.     retur
179b0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  n 0;         /* 
179c0 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29  Restrictions (8)
179d0 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  (9) */.  }.  if(
179e0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
179f0 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
17a00 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67  && subqueryIsAgg
17a10 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
17a20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
17a30 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a  striction (6)  *
17a40 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  /.  }.  if( p->p
17a50 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d  OrderBy && pSub-
17a60 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
17a70 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
17a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17aa0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
17ab0 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d  tion (11) */.  }
17ac0 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20  .  if( isAgg && 
17ad0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
17ae0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
17af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
17b00 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f  triction (16) */
17b10 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
17b20 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65  mit && p->pWhere
17b30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
17b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
17b50 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f  triction (19) */
17b60 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20  ..  /* OBSOLETE 
17b70 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20  COMMENT 1:.  ** 
17b80 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20  Restriction 3:  
17b90 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
17ba0 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20  is a join, make 
17bb0 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
17bc0 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75  y is .  ** not u
17bd0 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74  sed as the right
17be0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f   operand of an o
17bf0 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d  uter join.  Exam
17c00 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
17c10 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c  .  ** is not all
17c20 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owed:.  **.  ** 
17c30 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20          t1 LEFT 
17c40 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a  OUTER JOIN (t2 J
17c50 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a  OIN t3).  **.  *
17c60 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
17c70 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
17c80 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
17c90 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
17ca0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
17cb0 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20  ) JOIN t3.  **. 
17cc0 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74   ** which is not
17cd0 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65   at all the same
17ce0 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a   thing..  **.  *
17cf0 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45  * OBSOLETE COMME
17d00 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72  NT 2:.  ** Restr
17d10 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74  iction 12:  If t
17d20 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74  he subquery is t
17d30 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
17d40 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
17d50 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65  .  ** join, make
17d60 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
17d70 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20  ry has no WHERE 
17d80 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20  clause..  ** An 
17d90 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  examples of why 
17da0 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  this is not allo
17db0 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
17dc0 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
17dd0 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43  UTER JOIN (SELEC
17de0 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T * FROM t2 WHER
17df0 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20  E t2.x>0).  **. 
17e00 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
17e10 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
17e20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
17e30 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
17e40 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
17e50 74 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30  t2) WHERE t2.x>0
17e60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74  .  **.  ** But t
17e70 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77  he t2.x>0 test w
17e80 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20  ill always fail 
17e90 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66  on a NULL row of
17ea0 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20   t2, which.  ** 
17eb0 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76  effectively conv
17ec0 65 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a  erts the OUTER J
17ed0 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45  OIN into an INNE
17ee0 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a  R JOIN..  **.  *
17ef0 2a 20 54 48 49 53 20 4f 56 45 52 52 49 44 45 53  * THIS OVERRIDES
17f00 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
17f10 54 53 20 31 20 41 4e 44 20 32 20 41 42 4f 56 45  TS 1 AND 2 ABOVE
17f20 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 33  :.  ** Ticket #3
17f30 33 30 30 20 73 68 6f 77 73 20 74 68 61 74 20 66  300 shows that f
17f40 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 72 69  lattening the ri
17f50 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45  ght term of a LE
17f60 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20  FT JOIN.  ** is 
17f70 66 72 61 75 67 68 74 20 77 69 74 68 20 64 61 6e  fraught with dan
17f80 67 65 72 2e 20 20 42 65 73 74 20 74 6f 20 61 76  ger.  Best to av
17f90 6f 69 64 20 74 68 65 20 77 68 6f 6c 65 20 74 68  oid the whole th
17fa0 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 20 20 2a  ing.  If the.  *
17fb0 2a 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  * subquery is th
17fc0 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
17fd0 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  a LEFT JOIN, the
17fe0 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e  n do not flatten
17ff0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  ..  */.  if( (pS
18000 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
18010 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
18020 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
18030 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72  .  }..  /* Restr
18040 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20 74 68  iction 17: If th
18050 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
18060 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
18070 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20  , then it must. 
18080 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65   ** use only the
18090 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
180a0 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66  tor. And none of
180b0 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65   the simple sele
180c0 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20  ct queries.  ** 
180d0 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
180e0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
180f0 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
18100 62 65 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  be aggregate or 
18110 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75  distinct.  ** qu
18120 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  eries..  */.  if
18130 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29  ( pSub->pPrior )
18140 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  {.    if( pSub->
18150 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
18160 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
18170 52 65 73 74 72 69 63 74 69 6f 6e 20 32 30 20 2a  Restriction 20 *
18180 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  /.    }.    if( 
18190 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c  isAgg || (p->sel
181a0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
181b0 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d  nct)!=0 || pSrc-
181c0 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20  >nSrc!=1 ){.    
181d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
181e0 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d  }.    for(pSub1=
181f0 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75  pSub; pSub1; pSu
18200 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72  b1=pSub1->pPrior
18210 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
18220 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  e( (pSub1->selFl
18230 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
18240 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
18250 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
18260 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18270 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
18280 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
18290 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
182a0 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  ==SF_Aggregate )
182b0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 75  ;.      if( (pSu
182c0 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
182d0 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
182e0 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20 20  ggregate))!=0.  
182f0 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e       || (pSub1->
18300 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d  pPrior && pSub1-
18310 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20  >op!=TK_ALL) .  
18320 20 20 20 20 20 7c 7c 20 4e 45 56 45 52 28 70 53       || NEVER(pS
18330 75 62 31 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c  ub1->pSrc==0) ||
18340 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53   pSub1->pSrc->nS
18350 72 63 21 3d 31 0a 20 20 20 20 20 20 29 7b 0a 20  rc!=1.      ){. 
18360 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
18370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
18380 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
18390 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66  on 18. */.    if
183a0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
183b0 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
183c0 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
183d0 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i<p->pOrderBy->n
183e0 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
183f0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
18400 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 69 43 6f 6c  erBy->a[ii].iCol
18410 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
18420 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18430 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77  }..  /***** If w
18440 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
18450 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  nt, flattening i
18460 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a  s permitted. ***
18470 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72  **/..  /* Author
18480 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ize the subquery
18490 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41   */.  pParse->zA
184a0 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75  uthContext = pSu
184b0 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  bitem->zName;.  
184c0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
184d0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
184e0 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
184f0 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  ;.  pParse->zAut
18500 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65  hContext = zSave
18510 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20  dAuthContext;.. 
18520 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71   /* If the sub-q
18530 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
18540 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
18550 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65  ent, then (by re
18560 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20  strictions.  ** 
18570 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29  17 and 18 above)
18580 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e   it must be a UN
18590 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20  ION ALL and the 
185a0 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73  parent query mus
185b0 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68  t .  ** be of th
185c0 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a  e form:.  **.  *
185d0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78  *     SELECT <ex
185e0 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c  pr-list> FROM (<
185f0 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65  sub-query>) <whe
18600 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a  re-clause> .  **
18610 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62  .  ** followed b
18620 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20  y any ORDER BY, 
18630 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46  LIMIT and/or OFF
18640 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69  SET clauses. Thi
18650 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65  s block.  ** cre
18660 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20  ates N-1 copies 
18670 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  of the parent qu
18680 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ery without any 
18690 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20  ORDER BY, LIMIT 
186a0 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20  or .  ** OFFSET 
186b0 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e  clauses and join
186c0 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65  s them to the le
186d0 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20  ft-hand-side of 
186e0 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  the original.  *
186f0 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c  * using UNION AL
18700 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20  L operators. In 
18710 74 68 69 73 20 63 61 73 65 20 4e 20 69 73 20 74  this case N is t
18720 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d  he number of sim
18730 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  ple.  ** select 
18740 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68  statements in th
18750 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71  e compound sub-q
18760 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  uery..  **.  ** 
18770 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  Example:.  **.  
18780 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b  **     SELECT a+
18790 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20  1 FROM (.  **   
187a0 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52       SELECT x FR
187b0 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20  OM tab.  **     
187c0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
187d0 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
187e0 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20  y FROM tab.  ** 
187f0 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
18800 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
18810 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f  ECT abs(z*2) FRO
18820 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20  M tab2.  **     
18830 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44  ) WHERE a!=5 ORD
18840 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a  ER BY 1.  **.  *
18850 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  * Transformed in
18860 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
18870 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f    SELECT x+1 FRO
18880 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b 31 21  M tab WHERE x+1!
18890 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
188a0 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
188b0 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74  ELECT y+1 FROM t
188c0 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a  ab WHERE y+1!=5.
188d0 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41    **     UNION A
188e0 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  LL.  **     SELE
188f0 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52  CT abs(z*2)+1 FR
18900 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20 61 62  OM tab2 WHERE ab
18910 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a  s(z*2)+1!=5.  **
18920 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a       ORDER BY 1.
18930 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c    **.  ** We cal
18940 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70  l this the "comp
18950 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
18960 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a  attening"..  */.
18970 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d    for(pSub=pSub-
18980 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70  >pPrior; pSub; p
18990 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
189a0 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
189b0 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  New;.    ExprLis
189c0 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
189d0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45  >pOrderBy;.    E
189e0 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d  xpr *pLimit = p-
189f0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65 6c  >pLimit;.    Sel
18a00 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d  ect *pPrior = p-
18a10 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e  >pPrior;.    p->
18a20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
18a30 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20    p->pSrc = 0;. 
18a40 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
18a50 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20  ;.    p->pLimit 
18a60 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  = 0;.    pNew = 
18a70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
18a80 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  (db, p, 0);.    
18a90 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
18aa0 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  it;.    p->pOrde
18ab0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
18ac0 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53      p->pSrc = pS
18ad0 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20  rc;.    p->op = 
18ae0 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70 2d 3e 70  TK_ALL;.    p->p
18af0 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20  Rightmost = 0;. 
18b00 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
18b10 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70  {.      pNew = p
18b20 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65  Prior;.    }else
18b30 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50  {.      pNew->pP
18b40 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
18b50 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
18b60 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d  tmost = 0;.    }
18b70 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
18b80 20 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 64   pNew;.    if( d
18b90 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18ba0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
18bb0 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74  .  /* Begin flat
18bc0 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d  tening the iFrom
18bd0 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65  -th entry of the
18be0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20   FROM clause .  
18bf0 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ** in the outer 
18c00 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53  query..  */.  pS
18c10 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75  ub = pSub1 = pSu
18c20 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  bitem->pSelect;.
18c30 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65  .  /* Delete the
18c40 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
18c50 20 73 74 72 75 63 74 75 72 65 20 61 73 73 6f 63   structure assoc
18c60 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
18c70 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a   ** subquery.  *
18c80 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  /.  sqlite3DbFre
18c90 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
18ca0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71  zDatabase);.  sq
18cb0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
18cc0 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pSubitem->zName)
18cd0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
18ce0 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
18cf0 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69  zAlias);.  pSubi
18d00 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
18d10 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
18d20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75  zName = 0;.  pSu
18d30 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  bitem->zAlias = 
18d40 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70  0;.  pSubitem->p
18d50 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f  Select = 0;..  /
18d60 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67  * Defer deleting
18d70 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
18d80 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
18d90 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  h the.  ** subqu
18da0 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67  ery until code g
18db0 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a  eneration is.  *
18dc0 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63  * complete, sinc
18dd0 65 20 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c  e there may stil
18de0 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70 54 61  l exist Expr.pTa
18df0 62 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20  b entries that. 
18e00 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65   ** refer to the
18e10 20 73 75 62 71 75 65 72 79 20 65 76 65 6e 20 61   subquery even a
18e20 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e  fter flattening.
18e30 20 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a    Ticket #3346..
18e40 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74    **.  ** pSubit
18e50 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61  em->pTab is alwa
18e60 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74  ys non-NULL by t
18e70 65 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  est restrictions
18e80 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65   and tests above
18e90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57  ..  */.  if( ALW
18ea0 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54  AYS(pSubitem->pT
18eb0 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61  ab!=0) ){.    Ta
18ec0 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d  ble *pTabToDel =
18ed0 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b   pSubitem->pTab;
18ee0 0a 20 20 20 20 69 66 28 20 70 54 61 62 54 6f 44  .    if( pTabToD
18ef0 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20  el->nRef==1 ){. 
18f00 20 20 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70       Parse *pTop
18f10 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
18f20 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
18f30 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rse);.      pTab
18f40 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62  ToDel->pNextZomb
18f50 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  ie = pToplevel->
18f60 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20  pZombieTab;.    
18f70 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f    pToplevel->pZo
18f80 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f  mbieTab = pTabTo
18f90 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Del;.    }else{.
18fa0 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d        pTabToDel-
18fb0 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20  >nRef--;.    }. 
18fc0 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61     pSubitem->pTa
18fd0 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b = 0;.  }..  /*
18fe0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c   The following l
18ff0 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f  oop runs once fo
19000 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61  r each term in a
19010 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65   compound-subque
19020 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69  ry.  ** flatteni
19030 6e 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64  ng (as described
19040 20 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20   above).  If we 
19050 61 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66  are doing a diff
19060 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20  erent kind.  ** 
19070 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20  of flattening - 
19080 61 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68  a flattening oth
19090 65 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75  er than a compou
190a0 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
190b0 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68  tening -.  ** th
190c0 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c  en this loop onl
190d0 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a  y runs once..  *
190e0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
190f0 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68   moves all of th
19100 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20  e FROM elements 
19110 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
19120 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68  into the.  ** th
19130 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
19140 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
19150 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  .  Before doing 
19160 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20  this, remember. 
19170 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e   ** the cursor n
19180 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72  umber for the or
19190 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65  iginal outer que
191a0 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20  ry FROM element 
191b0 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e  in.  ** iParent.
191c0 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75    The iParent cu
191d0 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20  rsor will never 
191e0 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71  be used.  Subseq
191f0 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77  uent code.  ** w
19200 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73  ill scan express
19210 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ions looking for
19220 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e   iParent referen
19230 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a  ces and replace.
19240 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72    ** those refer
19250 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65  ences with expre
19260 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f  ssions that reso
19270 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75  lve to the subqu
19280 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c  ery FROM.  ** el
19290 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f  ements we are no
192a0 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20  w copying in..  
192b0 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74  */.  for(pParent
192c0 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61  =p; pParent; pPa
192d0 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50  rent=pParent->pP
192e0 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d  rior, pSub=pSub-
192f0 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e  >pPrior){.    in
19300 74 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75  t nSubSrc;.    u
19310 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  8 jointype = 0;.
19320 20 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53      pSubSrc = pS
19330 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  ub->pSrc;     /*
19340 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
19350 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  subquery */.    
19360 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72  nSubSrc = pSubSr
19370 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d  c->nSrc;  /* Num
19380 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
19390 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c  subquery FROM cl
193a0 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63  ause */.    pSrc
193b0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63   = pParent->pSrc
193c0 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
193d0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
193e0 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20  r query */..    
193f0 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20  if( pSrc ){.    
19400 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
19410 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73  t==p );  /* Firs
19420 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74  t time through t
19430 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  he loop */.     
19440 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62   jointype = pSub
19450 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  item->jointype;.
19460 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19470 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
19480 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61  !=p );  /* 2nd a
19490 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 74 69  nd subsequent ti
194a0 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  mes through the 
194b0 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53  loop */.      pS
194c0 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53  rc = pParent->pS
194d0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
194e0 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c  istAppend(db, 0,
194f0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
19500 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( pSrc==0 ){.   
19510 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
19520 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
19530 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
19540 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
19550 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
19560 72 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65  ry uses a single
19570 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f   slot of the FRO
19580 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
19590 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65  outer.    ** que
195a0 72 79 2e 20 20 49 66 20 74 68 65 20 73 75 62 71  ry.  If the subq
195b0 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68  uery has more th
195c0 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69  an one element i
195d0 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73  n its FROM claus
195e0 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65  e,.    ** then e
195f0 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  xpand the outer 
19600 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70  query to make sp
19610 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f  ace for it to ho
19620 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a  ld all elements.
19630 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75      ** of the su
19640 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20  bquery..    **. 
19650 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20     ** Example:. 
19660 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
19670 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61  SELECT * FROM ta
19680 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52  bA, (SELECT * FR
19690 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20  OM sub1, sub2), 
196a0 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  tabB;.    **.   
196b0 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75   ** The outer qu
196c0 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20  ery has 3 slots 
196d0 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75  in its FROM clau
196e0 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66  se.  One slot of
196f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
19700 72 20 71 75 65 72 79 20 28 74 68 65 20 6d 69 64  r query (the mid
19710 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65  dle slot) is use
19720 64 20 62 79 20 74 68 65 20 73 75 62 71 75 65 72  d by the subquer
19730 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20  y.  The next.   
19740 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64   ** block of cod
19750 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68  e will expand th
19760 65 20 6f 75 74 20 71 75 65 72 79 20 74 6f 20 34  e out query to 4
19770 20 73 6c 6f 74 73 2e 20 20 54 68 65 20 6d 69 64   slots.  The mid
19780 64 6c 65 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20  dle.    ** slot 
19790 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74  is expanded to t
197a0 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65  wo slots in orde
197b0 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20  r to make space 
197c0 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  for the.    ** t
197d0 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  wo elements in t
197e0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
197f0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
19800 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
19810 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  SubSrc>1 ){.    
19820 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20    pParent->pSrc 
19830 3d 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  = pSrc = sqlite3
19840 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
19850 62 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63  b, pSrc, nSubSrc
19860 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20  -1,iFrom+1);.   
19870 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
19880 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
19890 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
198a0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
198b0 54 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f  Transfer the FRO
198c0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66  M clause terms f
198d0 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79  rom the subquery
198e0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a   into the.    **
198f0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
19900 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
19910 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
19920 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
19930 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
19940 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
19950 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20  ].pUsing);.     
19960 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
19970 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69  ] = pSubSrc->a[i
19980 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ];.      memset(
19990 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20  &pSubSrc->a[i], 
199a0 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72  0, sizeof(pSubSr
199b0 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d  c->a[i]));.    }
199c0 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72  .    pSrc->a[iFr
199d0 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a  om].jointype = j
199e0 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20  ointype;.  .    
199f0 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62  /* Now begin sub
19a00 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65  stituting subque
19a10 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78  ry result set ex
19a20 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20  pressions for . 
19a30 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73     ** references
19a40 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20   to the iParent 
19a50 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
19a60 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20  ry..    ** .    
19a70 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20  ** Example:.    
19a80 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45  **.    **   SELE
19a90 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f  CT a+5, b*10 FRO
19aa0 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53  M (SELECT x*3 AS
19ab0 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52   a, y+10 AS b FR
19ac0 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62  OM t1) WHERE a>b
19ad0 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20  ;.    **   \    
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19af0 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20   \_____________ 
19b00 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  subquery _______
19b10 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a  ___/          /.
19b20 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f      **    \_____
19b30 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
19b40 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f   outer query ___
19b50 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
19b60 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20  ___________/.   
19b70 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f   **.    ** We lo
19b80 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72  ok at every expr
19b90 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75  ession in the ou
19ba0 74 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76  ter query and ev
19bb0 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
19bc0 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73  .    ** "a" we s
19bd0 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20  ubstitute "x*3" 
19be0 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
19bf0 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75  we see "b" we su
19c00 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e  bstitute "y+10".
19c10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73  .    */.    pLis
19c20 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c  t = pParent->pEL
19c30 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ist;.    for(i=0
19c40 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
19c50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
19c60 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  ( pList->a[i].zN
19c70 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
19c80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
19c90 70 61 6e 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  pan = pList->a[i
19ca0 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20  ].zSpan;.       
19cb0 20 69 66 28 20 41 4c 57 41 59 53 28 7a 53 70 61   if( ALWAYS(zSpa
19cc0 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  n) ){.          
19cd0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
19ce0 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
19cf0 44 75 70 28 64 62 2c 20 7a 53 70 61 6e 29 3b 0a  Dup(db, zSpan);.
19d00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19d10 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73  }.    }.    subs
19d20 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50  tExprList(db, pP
19d30 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c 20 69  arent->pEList, i
19d40 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
19d50 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 69  List);.    if( i
19d60 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20 73 75  sAgg ){.      su
19d70 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
19d80 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42  pParent->pGroupB
19d90 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
19da0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
19db0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
19dc0 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  g = substExpr(db
19dd0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  , pParent->pHavi
19de0 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  ng, iParent, pSu
19df0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
19e00 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  }.    if( pSub->
19e10 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
19e20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
19e30 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  t->pOrderBy==0 )
19e40 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
19e50 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62  >pOrderBy = pSub
19e60 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
19e70 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79    pSub->pOrderBy
19e80 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
19e90 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  if( pParent->pOr
19ea0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73  derBy ){.      s
19eb0 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
19ec0 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
19ed0 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
19ee0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
19ef0 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  }.    if( pSub->
19f00 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20  pWhere ){.      
19f10 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
19f20 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
19f30 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  ->pWhere, 0);.  
19f40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
19f50 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 7d  Where = 0;.    }
19f60 0a 20 20 20 20 69 66 28 20 73 75 62 71 75 65 72  .    if( subquer
19f70 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20  yIsAgg ){.      
19f80 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
19f90 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20  >pHaving==0 );. 
19fa0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
19fb0 61 76 69 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d  aving = pParent-
19fc0 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70  >pWhere;.      p
19fd0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
19fe0 20 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70   pWhere;.      p
19ff0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20  Parent->pHaving 
1a000 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1a010 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1a020 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
1a030 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
1a040 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1a050 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
1a060 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  d(db, pParent->p
1a070 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20 20  Having, .       
1a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a090 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1a0a0 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
1a0b0 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 29  ub->pHaving, 0))
1a0c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1a0d0 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42  pParent->pGroupB
1a0e0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  y==0 );.      pP
1a0f0 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20  arent->pGroupBy 
1a100 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1a110 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  tDup(db, pSub->p
1a120 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20  GroupBy, 0);.   
1a130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
1a140 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
1a150 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50  substExpr(db, pP
1a160 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 69  arent->pWhere, i
1a170 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1a180 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61  List);.      pPa
1a190 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73  rent->pWhere = s
1a1a0 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
1a1b0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  , pParent->pWher
1a1c0 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 20 20  e, pWhere);.    
1a1d0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  }.  .    /* The 
1a1e0 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20  flattened query 
1a1f0 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65  is distinct if e
1a200 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20  ither the inner 
1a210 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  or the.    ** ou
1a220 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73  ter query is dis
1a230 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20  tinct. .    */. 
1a240 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46     pParent->selF
1a250 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65  lags |= pSub->se
1a260 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
1a270 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a  inct;.  .    /*.
1a280 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e      ** SELECT ..
1a290 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e  . FROM (SELECT .
1a2a0 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45  .. LIMIT a OFFSE
1a2b0 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46  T b) LIMIT x OFF
1a2c0 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20  SET y;.    **.  
1a2d0 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70    ** One is temp
1a2e0 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64  ted to try to ad
1a2f0 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d  d a and b to com
1a300 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e  bine the limits.
1a310 20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a    But this.    *
1a320 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  * does not work 
1a330 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20  if either limit 
1a340 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20  is negative..   
1a350 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
1a360 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
1a370 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69    pParent->pLimi
1a380 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  t = pSub->pLimit
1a390 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c  ;.      pSub->pL
1a3a0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  imit = 0;.    }.
1a3b0 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c    }..  /* Finial
1a3c0 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20  ly, delete what 
1a3d0 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73  is left of the s
1a3e0 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75  ubquery and retu
1a3f0 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e  rn.  ** success.
1a400 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
1a410 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
1a420 70 53 75 62 31 29 3b 0a 0a 20 20 72 65 74 75 72  pSub1);..  retur
1a430 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
1a440 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1a450 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1a460 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1a470 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
1a480 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
1a490 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
1a4a0 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61  ment passed as a
1a4b0 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65  n argument to se
1a4c0 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20  e if it.** is a 
1a4d0 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
1a4e0 75 65 72 79 2e 20 52 65 74 75 72 6e 20 57 48 45  uery. Return WHE
1a4f0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f  RE_ORDERBY_MIN o
1a500 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  r WHERE_ORDERBY_
1a510 4d 41 58 20 69 66 20 0a 2a 2a 20 69 74 20 69 73  MAX if .** it is
1a520 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65  , or 0 otherwise
1a530 2e 20 41 74 20 70 72 65 73 65 6e 74 2c 20 61 20  . At present, a 
1a540 71 75 65 72 79 20 69 73 20 63 6f 6e 73 69 64 65  query is conside
1a550 72 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 6d  red to be.** a m
1a560 69 6e 28 29 2f 6d 61 78 28 29 20 71 75 65 72 79  in()/max() query
1a570 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20   if:.**.**   1. 
1a580 54 68 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c  There is a singl
1a590 65 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20  e object in the 
1a5a0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
1a5b0 2a 2a 20 20 20 32 2e 20 54 68 65 72 65 20 69 73  **   2. There is
1a5c0 20 61 20 73 69 6e 67 6c 65 20 65 78 70 72 65 73   a single expres
1a5d0 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75  sion in the resu
1a5e0 6c 74 20 73 65 74 2c 20 61 6e 64 20 69 74 20 69  lt set, and it i
1a5f0 73 0a 2a 2a 20 20 20 20 20 20 65 69 74 68 65 72  s.**      either
1a600 20 6d 69 6e 28 78 29 20 6f 72 20 6d 61 78 28 78   min(x) or max(x
1a610 29 2c 20 77 68 65 72 65 20 78 20 69 73 20 61 20  ), where x is a 
1a620 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65  column reference
1a630 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d  ..*/.static u8 m
1a640 69 6e 4d 61 78 51 75 65 72 79 28 53 65 6c 65 63  inMaxQuery(Selec
1a650 74 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70  t *p){.  Expr *p
1a660 45 78 70 72 3b 0a 20 20 45 78 70 72 4c 69 73 74  Expr;.  ExprList
1a670 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45   *pEList = p->pE
1a680 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 4c  List;..  if( pEL
1a690 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
1a6a0 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44  return WHERE_ORD
1a6b0 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70  ERBY_NORMAL;.  p
1a6c0 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Expr = pEList->a
1a6d0 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [0].pExpr;.  if(
1a6e0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
1a6f0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65  GG_FUNCTION ) re
1a700 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45  turn 0;.  if( NE
1a710 56 45 52 28 45 78 70 72 48 61 73 50 72 6f 70 65  VER(ExprHasPrope
1a720 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1a730 73 53 65 6c 65 63 74 29 29 20 29 20 72 65 74 75  sSelect)) ) retu
1a740 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d  rn 0;.  pEList =
1a750 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
1a760 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
1a770 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   || pEList->nExp
1a780 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
1a790 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61  .  if( pEList->a
1a7a0 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54  [0].pExpr->op!=T
1a7b0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 20 72  K_AGG_COLUMN ) r
1a7c0 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45  eturn WHERE_ORDE
1a7d0 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 61 73  RBY_NORMAL;.  as
1a7e0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1a7f0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1a800 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1a810 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1a820 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
1a830 65 6e 2c 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a  en,"min")==0 ){.
1a840 20 20 20 20 72 65 74 75 72 6e 20 57 48 45 52 45      return WHERE
1a850 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20  _ORDERBY_MIN;.  
1a860 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
1a870 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e  3StrICmp(pExpr->
1a880 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 78 22 29 3d  u.zToken,"max")=
1a890 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1a8a0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
1a8b0 41 58 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  AX;.  }.  return
1a8c0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
1a8d0 4f 52 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ORMAL;.}../*.** 
1a8e0 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  The select state
1a8f0 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74  ment passed as t
1a900 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1a910 74 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  t is an aggregat
1a920 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20  e query..** The 
1a930 73 65 63 6f 6e 64 20 61 72 67 6d 65 6e 74 20 69  second argment i
1a940 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  s the associated
1a950 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20   aggregate-info 
1a960 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a  object. This .**
1a970 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20   function tests 
1a980 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73  if the SELECT is
1a990 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
1a9a0 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75  .**   SELECT cou
1a9b0 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e  nt(*) FROM <tbl>
1a9c0 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62  .**.** where tab
1a9d0 6c 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65  le is a database
1a9e0 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75   table, not a su
1a9f0 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77  b-select or view
1aa00 2e 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a  . If the query.*
1aa10 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69  * does match thi
1aa20 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20  s pattern, then 
1aa30 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1aa40 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65   Table object re
1aa50 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74  presenting.** <t
1aa60 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  bl> is returned.
1aa70 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73   Otherwise, 0 is
1aa80 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
1aa90 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69  atic Table *isSi
1aaa0 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74  mpleCount(Select
1aab0 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41   *p, AggInfo *pA
1aac0 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65  ggInfo){.  Table
1aad0 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a   *pTab;.  Expr *
1aae0 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74  pExpr;..  assert
1aaf0 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  ( !p->pGroupBy )
1ab00 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65  ;..  if( p->pWhe
1ab10 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d  re || p->pEList-
1ab20 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c  >nExpr!=1 .   ||
1ab30 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d   p->pSrc->nSrc!=
1ab40 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  1 || p->pSrc->a[
1ab50 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a  0].pSelect.  ){.
1ab60 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1ab70 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53  }.  pTab = p->pS
1ab80 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
1ab90 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   pExpr = p->pELi
1aba0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
1abb0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26    assert( pTab &
1abc0 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  & !pTab->pSelect
1abd0 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20   && pExpr );..  
1abe0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
1abf0 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
1ac00 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
1ac10 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
1ac20 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1ac30 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46  f( (pAggInfo->aF
1ac40 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 6c  unc[0].pFunc->fl
1ac50 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f  ags&SQLITE_FUNC_
1ac60 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75  COUNT)==0 ) retu
1ac70 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
1ac80 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74  r->flags&EP_Dist
1ac90 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  inct ) return 0;
1aca0 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  ..  return pTab;
1acb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
1acc0 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65   source-list ite
1acd0 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  m passed as an a
1ace0 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d  rgument was augm
1acf0 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a  ented with an.**
1ad00 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
1ad10 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20  se, then try to 
1ad20 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69  locate the speci
1ad30 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74  fied index. If t
1ad40 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68  here.** was such
1ad50 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68   a clause and th
1ad60 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61  e named index ca
1ad70 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72  nnot be found, r
1ad80 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
1ad90 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65  _ERROR and leave
1ada0 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
1adb0 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rse. Otherwise, 
1adc0 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72  populate .** pFr
1add0 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72  om->pIndex and r
1ade0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
1adf0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
1ae00 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50  ndexedByLookup(P
1ae10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
1ae20 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1ae30 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28  m *pFrom){.  if(
1ae40 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20   pFrom->pTab && 
1ae50 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b  pFrom->zIndex ){
1ae60 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
1ae70 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
1ae80 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78      char *zIndex
1ae90 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78   = pFrom->zIndex
1aea0 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
1aeb0 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
1aec0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20  pTab->pIndex; . 
1aed0 20 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73         pIdx && s
1aee0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
1aef0 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65  dx->zName, zInde
1af00 78 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64  x); .        pId
1af10 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20  x=pIdx->pNext.  
1af20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49    );.    if( !pI
1af30 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  dx ){.      sqli
1af40 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1af50 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
1af60 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c  ex: %s", zIndex,
1af70 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
1af80 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
1af90 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
1afa0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1afb0 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e     }.    pFrom->
1afc0 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  pIndex = pIdx;. 
1afd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1afe0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1aff0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1b000 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  a Walker callbac
1b010 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67  k for "expanding
1b020 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  " a SELECT state
1b030 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64  ment..** "Expand
1b040 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f  ing" means to do
1b050 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
1b060 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61  **.**    (1)  Ma
1b070 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72  ke sure VDBE cur
1b080 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
1b090 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
1b0a0 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20  o every.**      
1b0b0 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68     element of th
1b0c0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
1b0d0 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c  *.**    (2)  Fil
1b0e0 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  l in the pTabLis
1b0f0 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  t->a[].pTab fiel
1b100 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ds in the SrcLis
1b110 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
1b120 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20     defines FROM 
1b130 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69  clause.  When vi
1b140 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68  ews appear in th
1b150 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a  e FROM clause,.*
1b160 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70  *         fill p
1b170 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65  TabList->a[].pSe
1b180 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79  lect with a copy
1b190 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
1b1a0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
1b1b0 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65      that impleme
1b1c0 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41  nts the view.  A
1b1d0 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
1b1e0 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45   the view's SELE
1b1f0 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74  CT.**         st
1b200 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  atement so that 
1b210 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f  we can freely mo
1b220 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74  dify or delete t
1b230 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  hat statement.**
1b240 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74           without
1b250 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20   worrying about 
1b260 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70  messing up the p
1b270 72 65 73 69 73 74 65 6e 74 20 72 65 70 72 65 73  resistent repres
1b280 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  entation.**     
1b290 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e      of the view.
1b2a0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41  .**.**    (3)  A
1b2b0 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  dd terms to the 
1b2c0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
1b2d0 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e  accomodate the N
1b2e0 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a  ATURAL keyword.*
1b2f0 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69  *         on joi
1b300 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e  ns and the ON an
1b310 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  d USING clause o
1b320 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20  f joins..**.**  
1b330 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20    (4)  Scan the 
1b340 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
1b350 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
1b360 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69  t (pEList) looki
1b370 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f  ng.**         fo
1b380 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
1b390 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20  he "*" operator 
1b3a0 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f  or the TABLE.* o
1b3b0 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20  perator..**     
1b3c0 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78      If found, ex
1b3d0 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f  pand each "*" to
1b3e0 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
1b3f0 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a   in every table.
1b400 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54  **         and T
1b410 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65  ABLE.* to be eve
1b420 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42  ry column in TAB
1b430 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  LE..**.*/.static
1b440 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e   int selectExpan
1b450 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  der(Walker *pWal
1b460 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
1b470 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1b480 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
1b490 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  se;.  int i, j, 
1b4a0 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  k;.  SrcList *pT
1b4b0 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69  abList;.  ExprLi
1b4c0 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74  st *pEList;.  st
1b4d0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1b4e0 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69  m *pFrom;.  sqli
1b4f0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1b500 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d  ->db;..  if( db-
1b510 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29  >mallocFailed  )
1b520 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
1b530 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66  _Abort;.  }.  if
1b540 28 20 4e 45 56 45 52 28 70 2d 3e 70 53 72 63 3d  ( NEVER(p->pSrc=
1b550 3d 30 29 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c  =0) || (p->selFl
1b560 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65  ags & SF_Expande
1b570 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  d)!=0 ){.    ret
1b580 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
1b590 20 7d 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73   }.  p->selFlags
1b5a0 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b   |= SF_Expanded;
1b5b0 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
1b5c0 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
1b5d0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  = p->pEList;..  
1b5e0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72  /* Make sure cur
1b5f0 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
1b600 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
1b610 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  o all entries in
1b620 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
1b630 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c  lause of the SEL
1b640 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
1b650 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63   */.  sqlite3Src
1b660 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
1b670 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
1b680 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  st);..  /* Look 
1b690 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e  up every table n
1b6a0 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
1b6b0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
1b6c0 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20  elect.  If.  ** 
1b6d0 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
1b6e0 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61  FROM clause is a
1b6f0 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61   subquery instea
1b700 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  d of a table or 
1b710 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  view,.  ** then 
1b720 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65  create a transie
1b730 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
1b740 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  re to describe t
1b750 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a  he subquery..  *
1b760 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72  /.  for(i=0, pFr
1b770 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
1b780 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
1b790 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
1b7a0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
1b7b0 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  ;.    if( pFrom-
1b7c0 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20  >pTab!=0 ){.    
1b7d0 20 20 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d    /* This statem
1b7e0 65 6e 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  ent has already 
1b7f0 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20  been prepared.  
1b800 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
1b810 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20  .      ** to go 
1b820 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  further. */.    
1b830 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29    assert( i==0 )
1b840 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
1b850 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a  RC_Prune;.    }.
1b860 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a      if( pFrom->z
1b870 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Name==0 ){.#ifnd
1b880 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1b890 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53 65  UBQUERY.      Se
1b8a0 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
1b8b0 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
1b8c0 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
1b8d0 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
1b8e0 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
1b8f0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1b900 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20  ( pSel!=0 );.   
1b910 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
1b920 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
1b930 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
1b940 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53  lect(pWalker, pS
1b950 65 6c 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  el);.      pFrom
1b960 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
1b970 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
1b980 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
1b990 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66  able));.      if
1b9a0 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
1b9b0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
1b9c0 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d      pTab->nRef =
1b9d0 20 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   1;.      pTab->
1b9e0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
1b9f0 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69  Printf(db, "sqli
1ba00 74 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22  te_subquery_%p_"
1ba10 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a  , (void*)pTab);.
1ba20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
1ba30 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65  l->pPrior ){ pSe
1ba40 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
1ba50 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74  ; }.      select
1ba60 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
1ba70 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
1ba80 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
1ba90 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
1baa0 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ol);.      pTab-
1bab0 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
1bac0 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74     pTab->nRowEst
1bad0 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 20 20   = 1000000;.    
1bae0 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
1baf0 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c   |= TF_Ephemeral
1bb00 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
1bb10 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
1bb20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f  ordinary table o
1bb30 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74  r view name in t
1bb40 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
1bb50 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1bb60 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
1bb70 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
1bb80 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20  Tab = pTab = .  
1bb90 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63        sqlite3Loc
1bba0 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
1bbb0 30 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70  0,pFrom->zName,p
1bbc0 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  From->zDatabase)
1bbd0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
1bbe0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
1bbf0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54  _Abort;.      pT
1bc00 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20  ab->nRef++;.#if 
1bc10 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1bc20 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
1bc30 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f  efined (SQLITE_O
1bc40 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1bc50 29 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ).      if( pTab
1bc60 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56  ->pSelect || IsV
1bc70 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
1bc80 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65          /* We re
1bc90 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20  ach here if the 
1bca0 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61  named table is a
1bcb0 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a   really a view *
1bcc0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  /.        if( sq
1bcd0 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
1bce0 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
1bcf0 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57  pTab) ) return W
1bd00 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
1bd10 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
1bd20 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20  >pSelect==0 );. 
1bd30 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53         pFrom->pS
1bd40 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
1bd50 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61  electDup(db, pTa
1bd60 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  b->pSelect, 0);.
1bd70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
1bd80 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
1bd90 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  r, pFrom->pSelec
1bda0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
1bdb0 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
1bdc0 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65   Locate the inde
1bdd0 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49  x named by the I
1bde0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
1bdf0 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20  , if any. */.   
1be00 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65   if( sqlite3Inde
1be10 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72  xedByLookup(pPar
1be20 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20  se, pFrom) ){.  
1be30 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
1be40 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  bort;.    }.  }.
1be50 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41  .  /* Process NA
1be60 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20  TURAL keywords, 
1be70 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  and ON and USING
1be80 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e   clauses of join
1be90 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  s..  */.  if( db
1bea0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
1beb0 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  | sqliteProcessJ
1bec0 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29  oin(pParse, p) )
1bed0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
1bee0 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f  _Abort;.  }..  /
1bef0 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20  * For every "*" 
1bf00 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74  that occurs in t
1bf10 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
1bf20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
1bf30 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c   of.  ** all col
1bf40 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
1bf50 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65  es.  And for eve
1bf60 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72  ry TABLE.* inser
1bf70 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  t the names.  **
1bf80 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
1bf90 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70  in TABLE.  The p
1bfa0 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61  arser inserted a
1bfb0 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73   special express
1bfc0 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68  ion.  ** with th
1bfd0 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f  e TK_ALL operato
1bfe0 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
1bff0 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
1c000 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e  the column list.
1c010 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
1c020 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61  ing code just ha
1c030 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  s to locate the 
1c040 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f  TK_ALL expressio
1c050 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20  ns and expand.  
1c060 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74  ** each one to t
1c070 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63  he list of all c
1c080 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
1c090 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
1c0a0 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a  The first loop j
1c0b0 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ust checks to se
1c0c0 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
1c0d0 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73  ny "*" operators
1c0e0 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20  .  ** that need 
1c0f0 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a  expanding..  */.
1c100 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
1c110 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
1c120 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d  {.    Expr *pE =
1c130 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45   pEList->a[k].pE
1c140 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  xpr;.    if( pE-
1c150 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
1c160 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  eak;.    assert(
1c170 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
1c180 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30  || pE->pRight!=0
1c190 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1c1a0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
1c1b0 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20  | (pE->pLeft!=0 
1c1c0 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70  && pE->pLeft->op
1c1d0 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20  ==TK_ID) );.    
1c1e0 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
1c1f0 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  OT && pE->pRight
1c200 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62  ->op==TK_ALL ) b
1c210 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
1c220 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
1c230 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
1c240 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20   If we get here 
1c250 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73  it means the res
1c260 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  ult set contains
1c270 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22   one or more "*"
1c280 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
1c290 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
1c2a0 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f  e expanded.  Loo
1c2b0 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
1c2c0 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
1c2d0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
1c2e0 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68  et and expand th
1c2f0 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  em one by one.. 
1c300 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74     */.    struct
1c310 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1c320 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  a = pEList->a;. 
1c330 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
1c340 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66  w = 0;.    int f
1c350 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64  lags = pParse->d
1c360 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e  b->flags;.    in
1c370 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66  t longNames = (f
1c380 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
1c390 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20  llColNames)!=0. 
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3b0 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26       && (flags &
1c3c0 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
1c3d0 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20  Names)==0;..    
1c3e0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
1c3f0 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
1c400 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
1c410 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[k].pExpr;.   
1c420 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
1c430 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
1c440 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20  >pRight!=0 );.  
1c450 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
1c460 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f  TK_ALL && (pE->o
1c470 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
1c480 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f  >pRight->op!=TK_
1c490 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ALL) ){.        
1c4a0 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c  /* This particul
1c4b0 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f  ar expression do
1c4c0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
1c4d0 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20  e expanded..    
1c4e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
1c4f0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
1c500 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
1c510 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70  se, pNew, a[k].p
1c520 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
1c530 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
1c540 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
1c550 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d  w->nExpr-1].zNam
1c560 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a  e = a[k].zName;.
1c570 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
1c580 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
1c590 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53  .zSpan = a[k].zS
1c5a0 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61  pan;.          a
1c5b0 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  [k].zName = 0;. 
1c5c0 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53           a[k].zS
1c5d0 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  pan = 0;.       
1c5e0 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e   }.        a[k].
1c5f0 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20  pExpr = 0;.     
1c600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c610 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69  /* This expressi
1c620 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61  on is a "*" or a
1c630 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e   "TABLE.*" and n
1c640 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20  eeds to be.     
1c650 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20     ** expanded. 
1c660 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  */.        int t
1c670 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20  ableSeen = 0;   
1c680 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77     /* Set to 1 w
1c690 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65  hen TABLE matche
1c6a0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  s */.        cha
1c6b0 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20  r *zTName;      
1c6c0 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
1c6d0 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
1c6e0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
1c6f0 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a  ->op==TK_DOT ){.
1c700 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1c710 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29  ( pE->pLeft!=0 )
1c720 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1c730 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1c740 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20  erty(pE->pLeft, 
1c750 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1c760 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
1c770 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e   = pE->pLeft->u.
1c780 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
1c790 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1c7a0 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   zTName = 0;.   
1c7b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
1c7c0 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
1c7d0 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
1c7e0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
1c7f0 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
1c800 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
1c810 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
1c820 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
1c830 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f  *zTabName = pFro
1c840 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  m->zAlias;.     
1c850 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
1c860 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1c870 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70      zTabName = p
1c880 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
1c890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c8a0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1c8b0 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
1c8c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
1c8d0 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53  Name && sqlite3S
1c8e0 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a  trICmp(zTName, z
1c8f0 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  TabName)!=0 ){. 
1c900 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
1c910 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
1c920 0a 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65  .          table
1c930 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Seen = 1;.      
1c940 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
1c950 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
1c960 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
1c970 72 20 2a 70 45 78 70 72 2c 20 2a 70 52 69 67 68  r *pExpr, *pRigh
1c980 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  t;.            c
1c990 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61  har *zName = pTa
1c9a0 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
1c9b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
1c9c0 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f  ar *zColname;  /
1c9d0 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63  * The computed c
1c9e0 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
1c9f0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1ca00 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61  zToFree;   /* Ma
1ca10 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68  lloced string th
1ca20 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  at needs to be f
1ca30 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  reed */.        
1ca40 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61      Token sColna
1ca50 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64  me;  /* Computed
1ca60 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20   column name as 
1ca70 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20  a token */..    
1ca80 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20          /* If a 
1ca90 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64  column is marked
1caa0 20 61 73 20 27 68 69 64 64 65 6e 27 20 28 63 75   as 'hidden' (cu
1cab0 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73  rrently only pos
1cac0 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  sible.          
1cad0 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c    ** for virtual
1cae0 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74   tables), do not
1caf0 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74   include it in t
1cb00 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20  he expanded.    
1cb10 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c          ** resul
1cb20 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20  t-set list..    
1cb30 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1cb40 20 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64         if( IsHid
1cb50 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d  denColumn(&pTab-
1cb60 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20  >aCol[j]) ){.   
1cb70 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1cb80 74 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  t(IsVirtual(pTab
1cb90 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
1cba0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1cbb0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1cbc0 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
1cbd0 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  & zTName==0 ){. 
1cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1cbf0 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70   (pFrom->jointyp
1cc00 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
1cc10 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
1cc20 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f     && tableAndCo
1cc30 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69  lumnIndex(pTabLi
1cc40 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c  st, i, zName, 0,
1cc50 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   0).            
1cc60 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
1cc70 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
1cc80 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
1cc90 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
1cca0 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
1ccb0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
1ccc0 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  ble to the right
1ccd0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
1cce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccf0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1cd00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cd10 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1cd20 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
1cd30 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e  From->pUsing, zN
1cd40 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
1cd50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1cd60 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
1cd70 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
1cd80 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
1cd90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cda0 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
1cdb0 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
1cdc0 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
1cdd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cde0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1cdf0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1ce00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ce10 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
1ce20 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
1ce30 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  _ID, zName);.   
1ce40 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
1ce50 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  e = zName;.     
1ce60 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
1ce70 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
1ce80 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  if( longNames ||
1ce90 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
1cea0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
1ceb0 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a     Expr *pLeft;.
1cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
1ced0 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
1cee0 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61  r(db, TK_ID, zTa
1cef0 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
1cf00 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
1cf10 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1cf20 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
1cf30 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  , pRight, 0);.  
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1cf50 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20  longNames ){.   
1cf60 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
1cf70 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  lname = sqlite3M
1cf80 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
1cf90 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e  s", zTabName, zN
1cfa0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
1cfb0 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
1cfc0 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
1cfd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cfe0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1cff0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1d000 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
1d010 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d020 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
1d030 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
1d040 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
1d050 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1d060 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d      sColname.z =
1d070 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20   zColname;.     
1d080 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e         sColname.
1d090 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
1d0a0 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20  n30(zColname);. 
1d0b0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1d0c0 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
1d0d0 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  e(pParse, pNew, 
1d0e0 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20  &sColname, 0);. 
1d0f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1d100 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f  e3DbFree(db, zTo
1d110 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Free);.         
1d120 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1d130 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53       if( !tableS
1d140 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  een ){.         
1d150 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20   if( zTName ){. 
1d160 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1d170 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1d180 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
1d190 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b  e: %s", zTName);
1d1a0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1d1b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1d1c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1d1d0 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73  arse, "no tables
1d1e0 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20   specified");.  
1d1f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d200 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1d210 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
1d220 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
1d230 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
1d240 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  pEList = pNew;. 
1d250 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
1d260 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70  X_COLUMN.  if( p
1d270 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70  ->pEList && p->p
1d280 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d  EList->nExpr>db-
1d290 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
1d2a0 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a  IMIT_COLUMN] ){.
1d2b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1d2c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
1d2d0 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   many columns in
1d2e0 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20   result set");. 
1d2f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
1d300 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
1d310 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  .}../*.** No-op 
1d320 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20  routine for the 
1d330 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65  parse-tree walke
1d340 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
1d350 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
1d360 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  e Walker.xExprCa
1d370 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72  llback then expr
1d380 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20  ession trees.** 
1d390 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f  are walked witho
1d3a0 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62  ut any actions b
1d3b0 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61  eing taken at ea
1d3c0 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d  ch node.  Presum
1d3d0 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68  ably,.** when th
1d3e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
1d3f0 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45  ed for Walker.xE
1d400 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
1d410 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c   .** Walker.xSel
1d420 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73  ectCallback is s
1d430 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69  et to do somethi
1d440 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76  ng useful for ev
1d450 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79  ery .** subquery
1d460 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74   in the parser t
1d470 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
1d480 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28  nt exprWalkNoop(
1d490 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c  Walker *NotUsed,
1d4a0 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29   Expr *NotUsed2)
1d4b0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1d4c0 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
1d4d0 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
1d4e0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
1d4f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1d500 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22  outine "expands"
1d510 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
1d520 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ent and all of i
1d530 74 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  ts subqueries..*
1d540 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * For additional
1d550 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
1d560 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f  what it means to
1d570 20 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45   "expand" a SELE
1d580 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c  CT.** statement,
1d590 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   see the comment
1d5a0 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78   on the selectEx
1d5b0 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c  pand worker call
1d5c0 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a  back above..**.*
1d5d0 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45  * Expanding a SE
1d5e0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
1d5f0 73 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70  s the first step
1d600 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61   in processing a
1d610 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
1d620 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43  ment.  The SELEC
1d630 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74  T statement must
1d640 20 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66   be expanded bef
1d650 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f  ore.** name reso
1d660 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72  lution is perfor
1d670 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  med..**.** If an
1d680 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
1d690 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  g, an error mess
1d6a0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
1d6b0 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54  nto pParse..** T
1d6c0 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
1d6d0 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74  ion can detect t
1d6e0 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f  he problem by lo
1d6f0 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d  oking at pParse-
1d700 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20  >nErr.** and/or 
1d710 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
1d720 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61  ocFailed..*/.sta
1d730 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
1d740 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72  SelectExpand(Par
1d750 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
1d760 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
1d770 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53  Walker w;.  w.xS
1d780 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
1d790 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a  selectExpander;.
1d7a0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
1d7b0 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70  k = exprWalkNoop
1d7c0 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
1d7d0 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
1d7e0 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
1d7f0 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66  Select);.}...#if
1d800 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d810 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
1d820 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72  This is a Walker
1d830 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
1d840 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68   callback for th
1d850 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  e sqlite3SelectT
1d860 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74  ypeInfo().** int
1d870 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  erface..**.** Fo
1d880 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75  r each FROM-clau
1d890 73 65 20 73 75 62 71 75 65 72 79 2c 20 61 64 64  se subquery, add
1d8a0 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e   Column.zType an
1d8b0 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a  d Column.zColl.*
1d8c0 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  * information to
1d8d0 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
1d8e0 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73  ture that repres
1d8f0 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20  ents the result 
1d900 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73  set.** of that s
1d910 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  ubquery..**.** T
1d920 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
1d930 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e  re that represen
1d940 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ts the result se
1d950 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65  t was constructe
1d960 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78  d.** by selectEx
1d970 70 61 6e 64 65 72 28 29 20 62 75 74 20 74 68 65  pander() but the
1d980 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74   type and collat
1d990 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ion information 
1d9a0 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61  was omitted.** a
1d9b0 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63  t that point bec
1d9c0 61 75 73 65 20 69 64 65 6e 74 69 66 69 65 72 73  ause identifiers
1d9d0 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65   had not yet bee
1d9e0 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69  n resolved.  Thi
1d9f0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
1da00 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65  called after ide
1da10 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69  ntifier resoluti
1da20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1da30 74 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75  t selectAddSubqu
1da40 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b  eryTypeInfo(Walk
1da50 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
1da60 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
1da70 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20   *pParse;.  int 
1da80 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  i;.  SrcList *pT
1da90 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  abList;.  struct
1daa0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1dab0 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  From;..  assert(
1dac0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
1dad0 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20  F_Resolved );.  
1dae0 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
1daf0 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66   & SF_HasTypeInf
1db00 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  o)==0 ){.    p->
1db10 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48  selFlags |= SF_H
1db20 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 20 20  asTypeInfo;.    
1db30 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
1db40 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 70 54  ->pParse;.    pT
1db50 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
1db60 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  ;.    for(i=0, p
1db70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
1db80 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
1db90 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
1dba0 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
1dbb0 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
1dbc0 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c  ab;.      if( AL
1dbd0 57 41 59 53 28 70 54 61 62 21 3d 30 29 20 26 26  WAYS(pTab!=0) &&
1dbe0 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
1dbf0 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
1dc00 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
1dc10 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
1dc20 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1dc30 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
1dc40 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
1dc50 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
1dc60 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 61  elect;.        a
1dc70 73 73 65 72 74 28 20 70 53 65 6c 20 29 3b 0a 20  ssert( pSel );. 
1dc80 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
1dc90 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  el->pPrior ) pSe
1dca0 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
1dcb0 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74  ;.        select
1dcc0 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
1dcd0 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
1dce0 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54  , pTab->nCol, pT
1dcf0 61 62 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c 29 3b  ab->aCol, pSel);
1dd00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1dd10 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
1dd20 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 23 65 6e 64  Continue;.}.#end
1dd30 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
1dd40 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74  routine adds dat
1dd50 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74  atype and collat
1dd60 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66  ing sequence inf
1dd70 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74  ormation to.** t
1dd80 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
1dd90 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d  res of all FROM-
1dda0 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
1ddb0 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54  s in a.** SELECT
1ddc0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
1ddd0 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69  * Use this routi
1dde0 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65  ne after name re
1ddf0 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
1de00 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
1de10 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66  SelectAddTypeInf
1de20 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
1de30 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
1de40 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1de50 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1de60 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
1de70 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
1de80 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75  = selectAddSubqu
1de90 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77  eryTypeInfo;.  w
1dea0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
1deb0 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20   exprWalkNoop;. 
1dec0 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
1ded0 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
1dee0 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
1def0 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ect);.#endif.}..
1df00 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1df10 69 6e 65 20 73 65 74 73 20 6f 66 20 61 20 53 45  ine sets of a SE
1df20 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66  LECT statement f
1df30 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  or processing.  
1df40 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  The.** following
1df50 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64   is accomplished
1df60 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56  :.**.**     *  V
1df70 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65  DBE Cursor numbe
1df80 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  rs are assigned 
1df90 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  to all FROM-clau
1dfa0 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20  se terms..**    
1dfb0 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61   *  Ephemeral Ta
1dfc0 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ble objects are 
1dfd0 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20  created for all 
1dfe0 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
1dff0 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a  ueries..**     *
1e000 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63    ON and USING c
1e010 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74  lauses are shift
1e020 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74  ed into WHERE st
1e030 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20  atements.**     
1e040 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22  *  Wildcards "*"
1e050 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69   and "TABLE.*" i
1e060 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72  n result sets ar
1e070 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20  e expanded..**  
1e080 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72     *  Identifier
1e090 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s in expression 
1e0a0 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74  are matched to t
1e0b0 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ables..**.** Thi
1e0c0 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72  s routine acts r
1e0d0 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c  ecursively on al
1e0e0 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74  l subqueries wit
1e0f0 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a  hin the SELECT..
1e100 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1e110 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72  electPrep(.  Par
1e120 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1e130 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
1e140 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
1e150 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1e160 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
1e170 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
1e180 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
1e190 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75  NameContext *pOu
1e1a0 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63  terNC  /* Name c
1e1b0 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61  ontext for conta
1e1c0 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  iner */.){.  sql
1e1d0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
1e1e0 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65  NEVER(p==0) ) re
1e1f0 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61  turn;.  db = pPa
1e200 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
1e210 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1e220 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65  HasTypeInfo ) re
1e230 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53  turn;.  sqlite3S
1e240 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61 72  electExpand(pPar
1e250 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50  se, p);.  if( pP
1e260 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
1e270 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1e280 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
1e290 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e  e3ResolveSelectN
1e2a0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ames(pParse, p, 
1e2b0 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28  pOuterNC);.  if(
1e2c0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
1e2d0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1e2e0 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  d ) return;.  sq
1e2f0 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
1e300 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  peInfo(pParse, p
1e310 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65  );.}../*.** Rese
1e320 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  t the aggregate 
1e330 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a  accumulator..**.
1e340 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65  ** The aggregate
1e350 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20   accumulator is 
1e360 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20  a set of memory 
1e370 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a  cells that hold.
1e380 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
1e390 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61  results while ca
1e3a0 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67  lculating an agg
1e3b0 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a  regate.  This.**
1e3c0 20 72 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79 20   routine simply 
1e3d0 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20  stores NULLs in 
1e3e0 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d  all of those mem
1e3f0 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74  ory cells..*/.st
1e400 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41  atic void resetA
1e410 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
1e420 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
1e430 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
1e440 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1e450 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
1e460 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
1e470 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a  fo_func *pFunc;.
1e480 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
1e490 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e  nFunc+pAggInfo->
1e4a0 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20  nColumn==0 ){.  
1e4b0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1e4c0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
1e4d0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  nfo->nColumn; i+
1e4e0 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
1e4f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e500 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66  Null, 0, pAggInf
1e510 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29  o->aCol[i].iMem)
1e520 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e  ;.  }.  for(pFun
1e530 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  c=pAggInfo->aFun
1e540 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  c, i=0; i<pAggIn
1e550 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
1e560 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71  pFunc++){.    sq
1e570 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1e580 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
1e590 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20  Func->iMem);.   
1e5a0 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73   if( pFunc->iDis
1e5b0 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
1e5c0 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75    Expr *pE = pFu
1e5d0 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nc->pExpr;.     
1e5e0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1e5f0 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
1e600 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
1e610 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70       if( pE->x.p
1e620 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78  List==0 || pE->x
1e630 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  .pList->nExpr!=1
1e640 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1e650 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1e660 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67  se, "DISTINCT ag
1e670 67 72 65 67 61 74 65 73 20 6d 75 73 74 20 68 61  gregates must ha
1e680 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22  ve exactly one "
1e690 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 72 67  .           "arg
1e6a0 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20  ument");.       
1e6b0 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
1e6c0 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  t = -1;.      }e
1e6d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79  lse{.        Key
1e6e0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
1e6f0 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
1e700 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d  List(pParse, pE-
1e710 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  >x.pList);.     
1e720 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e730 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
1e740 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d  phemeral, pFunc-
1e750 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30  >iDistinct, 0, 0
1e760 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e770 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
1e780 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
1e790 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
1e7a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e7b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
1e7c0 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69  oke the OP_AggFi
1e7d0 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f  nalize opcode fo
1e7e0 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74  r every aggregat
1e7f0 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  e function.** in
1e800 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72   the AggInfo str
1e810 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
1e820 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41  c void finalizeA
1e830 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73  ggFunctions(Pars
1e840 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
1e850 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
1e860 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1e870 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
1e880 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
1e890 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
1e8a0 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
1e8b0 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
1e8c0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
1e8d0 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
1e8e0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
1e8f0 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
1e900 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
1e910 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1e920 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
1e930 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
1e940 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e950 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69  dOp4(v, OP_AggFi
1e960 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70  nal, pF->iMem, p
1e970 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
1e980 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20  xpr : 0, 0,.    
1e990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9a0 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75    (void*)pF->pFu
1e9b0 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
1e9c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70  .  }.}../*.** Up
1e9d0 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c  date the accumul
1e9e0 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ator memory cell
1e9f0 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  s for an aggrega
1ea00 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74  te based on.** t
1ea10 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
1ea20 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73  r position..*/.s
1ea30 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74  tatic void updat
1ea40 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  eAccumulator(Par
1ea50 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
1ea60 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
1ea70 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1ea80 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1ea90 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
1eaa0 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
1eab0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
1eac0 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67  col *pC;..  pAgg
1ead0 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
1eae0 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 1;.  sqlite3E
1eaf0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
1eb00 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  arse);.  for(i=0
1eb10 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
1eb20 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
1eb30 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
1eb40 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72  ++){.    int nAr
1eb50 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e  g;.    int addrN
1eb60 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ext = 0;.    int
1eb70 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70   regAgg;.    Exp
1eb80 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
1eb90 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  F->pExpr->x.pLis
1eba0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  t;.    assert( !
1ebb0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1ebc0 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  pF->pExpr, EP_xI
1ebd0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
1ebe0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
1ebf0 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d     nArg = pList-
1ec00 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65  >nExpr;.      re
1ec10 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65  gAgg = sqlite3Ge
1ec20 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
1ec30 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  e, nArg);.      
1ec40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
1ec50 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
1ec60 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20 31  pList, regAgg, 1
1ec70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1ec80 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20      nArg = 0;.  
1ec90 20 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a      regAgg = 0;.
1eca0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
1ecb0 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
1ecc0 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74  {.      addrNext
1ecd0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1ece0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1ecf0 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
1ed00 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44  1 );.      codeD
1ed10 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
1ed20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61  pF->iDistinct, a
1ed30 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41  ddrNext, 1, regA
1ed40 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gg);.    }.    i
1ed50 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 6c  f( pF->pFunc->fl
1ed60 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
1ed70 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20  C_NEEDCOLL ){.  
1ed80 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
1ed90 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  ll = 0;.      st
1eda0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1edb0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
1edc0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73   int j;.      as
1edd0 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
1ede0 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69  ;  /* pList!=0 i
1edf0 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20  f pF->pFunc has 
1ee00 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20  NEEDCOLL */.    
1ee10 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
1ee20 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c  =pList->a; !pCol
1ee30 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b  l && j<nArg; j++
1ee40 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1ee50 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1ee60 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1ee70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
1ee80 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
1ee90 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
1eea0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
1eeb0 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
1eec0 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
1eed0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1eee0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
1eef0 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c  ollSeq, 0, 0, 0,
1ef00 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
1ef10 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
1ef20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
1ef30 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
1ef40 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67  ggStep, 0, regAg
1ef50 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20  g, pF->iMem,.   
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef70 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46     (void*)pF->pF
1ef80 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
1ef90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1efa0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
1efb0 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69  )nArg);.    sqli
1efc0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
1efd0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
1efe0 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29  e, regAgg, nArg)
1eff0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
1f000 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
1f010 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
1f020 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  rg);.    if( add
1f030 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73  rNext ){.      s
1f040 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1f050 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65  eLabel(v, addrNe
1f060 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xt);.      sqlit
1f070 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
1f080 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
1f090 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65    }..  /* Before
1f0a0 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20   populating the 
1f0b0 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
1f0c0 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65  sters, clear the
1f0d0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20   column cache.. 
1f0e0 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
1f0f0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71  f any of the req
1f100 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c  uired column val
1f110 75 65 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  ues are already 
1f120 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e  present .  ** in
1f130 20 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69   registers, sqli
1f140 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61  te3ExprCode() ma
1f150 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74  y use OP_SCopy t
1f160 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65  o copy the value
1f170 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65  .  ** to pC->iMe
1f180 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20 74 69  m. But by the ti
1f190 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  me the value is 
1f1a0 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e  used, the origin
1f1b0 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a  al register.  **
1f1c0 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
1f1d0 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e  sed, invalidatin
1f1e0 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  g the underlying
1f1f0 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20   buffer holding 
1f200 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72  the.  ** text or
1f210 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65   blob value. See
1f220 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64   ticket [883034d
1f230 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  cb5]..  **.  ** 
1f240 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e  Another solution
1f250 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61   would be to cha
1f260 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79  nge the OP_SCopy
1f270 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61   used to copy ca
1f280 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73  ched.  ** values
1f290 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a   to an OP_Copy..
1f2a0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78    */.  sqlite3Ex
1f2b0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
1f2c0 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  rse);.  for(i=0,
1f2d0 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43   pC=pAggInfo->aC
1f2e0 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  ol; i<pAggInfo->
1f2f0 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b  nAccumulator; i+
1f300 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71  +, pC++){.    sq
1f310 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1f320 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c  arse, pC->pExpr,
1f330 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a   pC->iMem);.  }.
1f340 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
1f350 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71  ctMode = 0;.  sq
1f360 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
1f370 65 61 72 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a  ear(pParse);.}..
1f380 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1f390 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45  ode for the SELE
1f3a0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76  CT statement giv
1f3b0 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67 75  en in the p argu
1f3c0 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  ment.  .**.** Th
1f3d0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
1f3e0 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72  stributed in var
1f3f0 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64  ious ways depend
1f400 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f  ing on the.** co
1f410 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 53 65  ntents of the Se
1f420 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
1f430 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  re pointed to by
1f440 20 61 72 67 75 6d 65 6e 74 20 70 44 65 73 74 0a   argument pDest.
1f450 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ** as follows:.*
1f460 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73 74 2d 3e  *.**     pDest->
1f470 65 44 65 73 74 20 20 20 20 52 65 73 75 6c 74 0a  eDest    Result.
1f480 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  **     ---------
1f490 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
1f4a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f4b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f4c0 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4f 75  --.**     SRT_Ou
1f4d0 74 70 75 74 20 20 20 20 20 20 47 65 6e 65 72 61  tput      Genera
1f4e0 74 65 20 61 20 72 6f 77 20 6f 66 20 6f 75 74 70  te a row of outp
1f4f0 75 74 20 28 75 73 69 6e 67 20 74 68 65 20 4f 50  ut (using the OP
1f500 5f 52 65 73 75 6c 74 52 6f 77 0a 2a 2a 20 20 20  _ResultRow.**   
1f510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f520 20 20 6f 70 63 6f 64 65 29 20 66 6f 72 20 65 61    opcode) for ea
1f530 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20 72 65  ch row in the re
1f540 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  sult set..**.** 
1f550 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20      SRT_Mem     
1f560 20 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69      Only valid i
1f570 66 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  f the result is 
1f580 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e  a single column.
1f590 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1f5a0 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 74 68          Store th
1f5b0 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f  e first column o
1f5c0 66 20 74 68 65 20 66 69 72 73 74 20 72 65 73 75  f the first resu
1f5d0 6c 74 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  lt row.**       
1f5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
1f5f0 20 72 65 67 69 73 74 65 72 20 70 44 65 73 74 2d   register pDest-
1f600 3e 69 50 61 72 6d 20 74 68 65 6e 20 61 62 61 6e  >iParm then aban
1f610 64 6f 6e 20 74 68 65 20 72 65 73 74 0a 2a 2a 20  don the rest.** 
1f620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f630 20 20 20 20 6f 66 20 74 68 65 20 71 75 65 72 79      of the query
1f640 2e 20 20 54 68 69 73 20 64 65 73 74 69 6e 61 74  .  This destinat
1f650 69 6f 6e 20 69 6d 70 6c 69 65 73 20 22 4c 49 4d  ion implies "LIM
1f660 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  IT 1"..**.**    
1f670 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20 20   SRT_Set        
1f680 20 54 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74   The result must
1f690 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   be a single col
1f6a0 75 6d 6e 2e 20 20 53 74 6f 72 65 20 65 61 63 68  umn.  Store each
1f6b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1f6c0 20 20 20 20 20 20 20 20 72 6f 77 20 6f 66 20 72          row of r
1f6d0 65 73 75 6c 74 20 61 73 20 74 68 65 20 6b 65 79  esult as the key
1f6e0 20 69 6e 20 74 61 62 6c 65 20 70 44 65 73 74 2d   in table pDest-
1f6f0 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20 20 20 20 20  >iParm. .**     
1f700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f710 41 70 70 6c 79 20 74 68 65 20 61 66 66 69 6e 69  Apply the affini
1f720 74 79 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69  ty pDest->affini
1f730 74 79 20 62 65 66 6f 72 65 20 73 74 6f 72 69 6e  ty before storin
1f740 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  g.**            
1f750 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 73           results
1f760 2e 20 20 55 73 65 64 20 74 6f 20 69 6d 70 6c 65  .  Used to imple
1f770 6d 65 6e 74 20 22 49 4e 20 28 53 45 4c 45 43 54  ment "IN (SELECT
1f780 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20   ...)"..**.**   
1f790 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20    SRT_Union     
1f7a0 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
1f7b0 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65  as a key in a te
1f7c0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
1f7d0 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  est->iParm..**.*
1f7e0 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74  *     SRT_Except
1f7f0 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73        Remove res
1f800 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65  ults from the te
1f810 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
1f820 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  est->iParm..**.*
1f830 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20  *     SRT_Table 
1f840 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
1f850 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  lts in temporary
1f860 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50   table pDest->iP
1f870 61 72 6d 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  arm..**         
1f880 20 20 20 20 20 20 20 20 20 20 20 20 54 68 69 73              This
1f890 20 69 73 20 6c 69 6b 65 20 53 52 54 5f 45 70 68   is like SRT_Eph
1f8a0 65 6d 54 61 62 20 65 78 63 65 70 74 20 74 68 61  emTab except tha
1f8b0 74 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20  t the table.**  
1f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8d0 20 20 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f     is assumed to
1f8e0 20 61 6c 72 65 61 64 79 20 62 65 20 6f 70 65 6e   already be open
1f8f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1f900 45 70 68 65 6d 54 61 62 20 20 20 20 43 72 65 61  EphemTab    Crea
1f910 74 65 20 61 6e 20 74 65 6d 70 6f 72 61 72 79 20  te an temporary 
1f920 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61  table pDest->iPa
1f930 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20  rm and store.** 
1f940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f950 20 20 20 20 74 68 65 20 72 65 73 75 6c 74 20 74      the result t
1f960 68 65 72 65 2e 20 54 68 65 20 63 75 72 73 6f 72  here. The cursor
1f970 20 69 73 20 6c 65 66 74 20 6f 70 65 6e 20 61 66   is left open af
1f980 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ter.**          
1f990 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1f9a0 6e 69 6e 67 2e 20 20 54 68 69 73 20 69 73 20 6c  ning.  This is l
1f9b0 69 6b 65 20 53 52 54 5f 54 61 62 6c 65 20 65 78  ike SRT_Table ex
1f9c0 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 20 20 20  cept that.**    
1f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9e0 20 74 68 69 73 20 64 65 73 74 69 6e 61 74 69 6f   this destinatio
1f9f0 6e 20 75 73 65 73 20 4f 50 5f 4f 70 65 6e 45 70  n uses OP_OpenEp
1fa00 68 65 6d 65 72 61 6c 20 74 6f 20 63 72 65 61 74  hemeral to creat
1fa10 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
1fa20 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61 62           the tab
1fa30 6c 65 20 66 69 72 73 74 2e 0a 2a 2a 0a 2a 2a 20  le first..**.** 
1fa40 20 20 20 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e      SRT_Coroutin
1fa50 65 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 63  e   Generate a c
1fa60 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 72  o-routine that r
1fa70 65 74 75 72 6e 73 20 61 20 6e 65 77 20 72 6f 77  eturns a new row
1fa80 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   of.**          
1fa90 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
1faa0 74 73 20 65 61 63 68 20 74 69 6d 65 20 69 74 20  ts each time it 
1fab0 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20 54 68 65  is invoked.  The
1fac0 20 65 6e 74 72 79 20 70 6f 69 6e 74 0a 2a 2a 20   entry point.** 
1fad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fae0 20 20 20 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f      of the co-ro
1faf0 75 74 69 6e 65 20 69 73 20 73 74 6f 72 65 64 20  utine is stored 
1fb00 69 6e 20 72 65 67 69 73 74 65 72 20 70 44 65 73  in register pDes
1fb10 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  t->iParm..**.** 
1fb20 20 20 20 20 53 52 54 5f 45 78 69 73 74 73 20 20      SRT_Exists  
1fb30 20 20 20 20 53 74 6f 72 65 20 61 20 31 20 69 6e      Store a 1 in
1fb40 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65   memory cell pDe
1fb50 73 74 2d 3e 69 50 61 72 6d 20 69 66 20 74 68 65  st->iParm if the
1fb60 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20   result.**      
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1fb80 65 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2e  et is not empty.
1fb90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 44  .**.**     SRT_D
1fba0 69 73 63 61 72 64 20 20 20 20 20 54 68 72 6f 77  iscard     Throw
1fbb0 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 77 61   the results awa
1fbc0 79 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  y.  This is used
1fbd0 20 62 79 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20   by SELECT.**   
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbf0 20 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74    statements wit
1fc00 68 69 6e 20 74 72 69 67 67 65 72 73 20 77 68 6f  hin triggers who
1fc10 73 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20  se only purpose 
1fc20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  is.**           
1fc30 20 20 20 20 20 20 20 20 20 20 74 68 65 20 73 69            the si
1fc40 64 65 2d 65 66 66 65 63 74 73 20 6f 66 20 66 75  de-effects of fu
1fc50 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  nctions..**.** T
1fc60 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1fc70 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
1fc80 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
1fc90 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20  y errors are.** 
1fca0 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
1fcb0 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
1fcc0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
1fcd0 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61  s left in.** pPa
1fce0 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
1fcf0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1fd00 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74   does NOT free t
1fd10 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
1fd20 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20  ure passed in.  
1fd30 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66  The.** calling f
1fd40 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  unction needs to
1fd50 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74   do that..*/.int
1fd60 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a   sqlite3Select(.
1fd70 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1fd80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1fd90 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
1fda0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1fdb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1fdc0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1fdd0 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
1fde0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
1fdf0 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57  *pDest      /* W
1fe00 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
1fe10 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  he query results
1fe20 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
1fe30 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
1fe40 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
1fe50 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
1fe60 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20  *pWInfo;     /* 
1fe70 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69  Return from sqli
1fe80 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
1fe90 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1feb0 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
1fec0 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ne under constru
1fed0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
1fee0 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20  sAgg;           
1fef0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65    /* True for se
1ff00 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20  lect lists like 
1ff10 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20  "count(*)" */.  
1ff20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
1ff30 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
1ff40 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74  f columns to ext
1ff50 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69  ract. */.  SrcLi
1ff60 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
1ff70 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
1ff80 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72  les to select fr
1ff90 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  om */.  Expr *pW
1ffa0 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f  here;          /
1ffb0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1ffc0 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
1ffd0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1ffe0 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20  pOrderBy;    /* 
1fff0 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
20000 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
20010 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
20020 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a  *pGroupBy;    /*
20030 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   The GROUP BY cl
20040 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
20050 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48  LL */.  Expr *pH
20060 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f  aving;         /
20070 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61  * The HAVING cla
20080 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
20090 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73  L */.  int isDis
200a0 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
200b0 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
200c0 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
200d0 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
200e0 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20  t distinct;     
200f0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
20100 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
20110 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69  tinct set */.  i
20120 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20  nt rc = 1;      
20130 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
20140 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68  o return from th
20150 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
20160 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64   int addrSortInd
20170 65 78 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65  ex;     /* Addre
20180 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e  ss of an OP_Open
20190 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
201a0 63 74 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e  ction */.  AggIn
201b0 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20  fo sAggInfo;    
201c0 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
201d0 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61   used by aggrega
201e0 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  te queries */.  
201f0 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20  int iEnd;       
20200 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
20210 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20  s of the end of 
20220 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73  the query */.  s
20230 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
20240 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
20250 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
20260 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
20270 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
20280 0a 20 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53  .  int iRestoreS
20290 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65  electId = pParse
202a0 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70  ->iSelectId;.  p
202b0 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
202c0 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74   = pParse->iNext
202d0 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64  SelectId++;.#end
202e0 69 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  if..  db = pPars
202f0 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d  e->db;.  if( p==
20300 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
20310 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
20320 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74  >nErr ){.    ret
20330 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
20340 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
20350 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
20360 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
20370 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
20380 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f  memset(&sAggInfo
20390 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67  , 0, sizeof(sAgg
203a0 49 6e 66 6f 29 29 3b 0a 0a 20 20 69 66 28 20 49  Info));..  if( I
203b0 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
203c0 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73  pDest) ){.    as
203d0 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73  sert(pDest->eDes
203e0 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c  t==SRT_Exists ||
203f0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
20400 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20  RT_Union || .   
20410 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
20420 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74  Dest==SRT_Except
20430 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
20440 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 29 3b 0a  ==SRT_Discard);.
20450 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20      /* If ORDER 
20460 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66  BY makes no diff
20470 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75  erence in the ou
20480 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65  tput then neithe
20490 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49  r does.    ** DI
204a0 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e  STINCT so it can
204b0 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e   be removed too.
204c0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
204d0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
204e0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
204f0 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
20500 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46  = 0;.    p->selF
20510 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
20520 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  inct;.  }.  sqli
20530 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
20540 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 70  arse, p, 0);.  p
20550 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
20560 64 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73  derBy;.  pTabLis
20570 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  t = p->pSrc;.  p
20580 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
20590 74 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  t;.  if( pParse-
205a0 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
205b0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
205c0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
205d0 3b 0a 20 20 7d 0a 20 20 69 73 41 67 67 20 3d 20  ;.  }.  isAgg = 
205e0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
205f0 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b  F_Aggregate)!=0;
20600 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73  .  assert( pELis
20610 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65  t!=0 );..  /* Be
20620 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63  gin generating c
20630 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ode..  */.  v = 
20640 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
20650 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
20660 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
20670 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  _end;..  /* If w
20680 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79  riting to memory
20690 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61   or generating a
206a0 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61   set.  ** only a
206b0 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d   single column m
206c0 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  ay be output..  
206d0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
206e0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
206f0 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75    if( checkForMu
20700 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45  ltiColumnSelectE
20710 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65  rror(pParse, pDe
20720 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  st, pEList->nExp
20730 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  r) ){.    goto s
20740 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23  elect_end;.  }.#
20750 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
20760 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c  rate code for al
20770 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e  l sub-queries in
20780 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
20790 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  .  */.#if !defin
207a0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
207b0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
207c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
207d0 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30  _VIEW).  for(i=0
207e0 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20  ; !p->pPrior && 
207f0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
20800 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
20810 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
20820 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
20830 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65  st->a[i];.    Se
20840 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
20850 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
20860 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  = pItem->pSelect
20870 3b 0a 20 20 20 20 69 6e 74 20 69 73 41 67 67 53  ;.    int isAggS
20880 75 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 75  ub;..    if( pSu
20890 62 3d 3d 30 20 7c 7c 20 70 49 74 65 6d 2d 3e 69  b==0 || pItem->i
208a0 73 50 6f 70 75 6c 61 74 65 64 20 29 20 63 6f 6e  sPopulated ) con
208b0 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 49  tinue;..    /* I
208c0 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e  ncrement Parse.n
208d0 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68 65  Height by the he
208e0 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67  ight of the larg
208f0 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  est expression. 
20900 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72     ** tree refer
20910 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74  ed to by this, t
20920 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74  he parent select
20930 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65  . The child sele
20940 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f  ct.    ** may co
20950 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  ntain expression
20960 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73   trees of at mos
20970 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45  t.    ** (SQLITE
20980 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d  _MAX_EXPR_DEPTH-
20990 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68  Parse.nHeight) h
209a0 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20 61  eight. This is a
209b0 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65   bit.    ** more
209c0 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68   conservative th
209d0 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75  an necessary, bu
209e0 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74 68  t much easier th
209f0 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20  an enforcing.   
20a00 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d   ** an exact lim
20a10 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  it..    */.    p
20a20 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b  Parse->nHeight +
20a30 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
20a40 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20  xprHeight(p);.. 
20a50 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
20a60 65 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ee if the subque
20a70 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62  ry can be absorb
20a80 65 64 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ed into the pare
20a90 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 73 41 67 67  nt. */.    isAgg
20aa0 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c  Sub = (pSub->sel
20ab0 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
20ac0 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20 69 66  gate)!=0;.    if
20ad0 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  ( flattenSubquer
20ae0 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20  y(pParse, p, i, 
20af0 69 73 41 67 67 2c 20 69 73 41 67 67 53 75 62 29  isAgg, isAggSub)
20b00 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
20b10 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20  AggSub ){.      
20b20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20    isAgg = 1;.   
20b30 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
20b40 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65   |= SF_Aggregate
20b50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20b60 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  i = -1;.    }els
20b70 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
20b80 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
20b90 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54  dest, SRT_EphemT
20ba0 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  ab, pItem->iCurs
20bb0 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  or);.      asser
20bc0 74 28 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75  t( pItem->isPopu
20bd0 6c 61 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  lated==0 );.    
20be0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
20bf0 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65  ger(pItem->iSele
20c00 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73 65  ctId, (u8)pParse
20c10 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
20c20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
20c30 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
20c40 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ub, &dest);.    
20c50 20 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c    pItem->isPopul
20c60 61 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ated = 1;.      
20c70 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f  pItem->pTab->nRo
20c80 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  wEst = (unsigned
20c90 29 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f  )pSub->nSelectRo
20ca0 77 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  w;.    }.    if(
20cb0 20 2f 2a 70 50 61 72 73 65 2d 3e 6e 45 72 72 20   /*pParse->nErr 
20cc0 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ||*/ db->mallocF
20cd0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 67  ailed ){.      g
20ce0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
20cf0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
20d00 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c  ->nHeight -= sql
20d10 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
20d20 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 54 61  ight(p);.    pTa
20d30 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
20d40 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61  .    if( !Ignora
20d50 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
20d60 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65  ) ){.      pOrde
20d70 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
20d80 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  y;.    }.  }.  p
20d90 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
20da0 74 3b 0a 23 65 6e 64 69 66 0a 20 20 70 57 68 65  t;.#endif.  pWhe
20db0 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
20dc0 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
20dd0 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76  pGroupBy;.  pHav
20de0 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67  ing = p->pHaving
20df0 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d  ;.  isDistinct =
20e00 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
20e10 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b  SF_Distinct)!=0;
20e20 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20e30 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
20e40 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68  ELECT.  /* If th
20e50 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71  ere is are a seq
20e60 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73  uence of queries
20e70 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72  , do the earlier
20e80 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a   ones first..  *
20e90 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
20ea0 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r ){.    if( p->
20eb0 70 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b  pRightmost==0 ){
20ec0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
20ed0 4c 6f 6f 70 2c 20 2a 70 52 69 67 68 74 20 3d 20  Loop, *pRight = 
20ee0 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74  0;.      int cnt
20ef0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
20f00 6d 78 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  mxSelect;.      
20f10 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f  for(pLoop=p; pLo
20f20 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
20f30 3e 70 50 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b  >pPrior, cnt++){
20f40 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
20f50 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a  pRightmost = p;.
20f60 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70          pLoop->p
20f70 4e 65 78 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  Next = pRight;. 
20f80 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20         pRight = 
20f90 70 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20  pLoop;.      }. 
20fa0 20 20 20 20 20 6d 78 53 65 6c 65 63 74 20 3d 20       mxSelect = 
20fb0 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
20fc0 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
20fd0 5f 53 45 4c 45 43 54 5d 3b 0a 20 20 20 20 20 20  _SELECT];.      
20fe0 69 66 28 20 6d 78 53 65 6c 65 63 74 20 26 26 20  if( mxSelect && 
20ff0 63 6e 74 3e 6d 78 53 65 6c 65 63 74 20 29 7b 0a  cnt>mxSelect ){.
21000 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
21010 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
21020 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20  "too many terms 
21030 69 6e 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  in compound SELE
21040 43 54 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  CT");.        go
21050 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
21060 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
21070 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63   rc = multiSelec
21080 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  t(pParse, p, pDe
21090 73 74 29 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e  st);.    explain
210a0 53 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73  SetInteger(pPars
210b0 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52  e->iSelectId, iR
210c0 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b  estoreSelectId);
210d0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
210e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
210f0 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65   If possible, re
21100 77 72 69 74 65 20 74 68 65 20 71 75 65 72 79 20  write the query 
21110 74 6f 20 75 73 65 20 47 52 4f 55 50 20 42 59 20  to use GROUP BY 
21120 69 6e 73 74 65 61 64 20 6f 66 20 44 49 53 54 49  instead of DISTI
21130 4e 43 54 2e 0a 20 20 2a 2a 20 47 52 4f 55 50 20  NCT..  ** GROUP 
21140 42 59 20 6d 69 67 68 74 20 75 73 65 20 61 6e 20  BY might use an 
21150 69 6e 64 65 78 2c 20 44 49 53 54 49 4e 43 54 20  index, DISTINCT 
21160 6e 65 76 65 72 20 64 6f 65 73 2e 0a 20 20 2a 2f  never does..  */
21170 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47  .  assert( p->pG
21180 72 6f 75 70 42 79 3d 3d 30 20 7c 7c 20 28 70 2d  roupBy==0 || (p-
21190 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
211a0 67 67 72 65 67 61 74 65 29 21 3d 30 20 29 3b 0a  ggregate)!=0 );.
211b0 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
211c0 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
211d0 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
211e0 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b  ==SF_Distinct ){
211f0 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79  .    p->pGroupBy
21200 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
21210 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
21220 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 70 47 72  ist, 0);.    pGr
21230 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
21240 70 42 79 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46  pBy;.    p->selF
21250 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
21260 69 6e 63 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  inct;.  }..  /* 
21270 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68  If there is both
21280 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20   a GROUP BY and 
21290 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
212a0 73 65 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a  se and they are.
212b0 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20    ** identical, 
212c0 74 68 65 6e 20 64 69 73 61 62 6c 65 20 74 68 65  then disable the
212d0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
212e0 20 73 69 6e 63 65 20 74 68 65 20 47 52 4f 55 50   since the GROUP
212f0 20 42 59 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 61   BY.  ** will ca
21300 75 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20  use elements to 
21310 63 6f 6d 65 20 6f 75 74 20 69 6e 20 74 68 65 20  come out in the 
21320 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20 20  correct order.  
21330 54 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 6e 20  This is.  ** an 
21340 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74  optimization - t
21350 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
21360 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20  r should result 
21370 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 2a 2a  regardless..  **
21380 20 55 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f   Use the SQLITE_
21390 47 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61  GroupByOrder fla
213a0 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45  g with SQLITE_TE
213b0 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52  STCTRL_OPTIMIZER
213c0 0a 20 20 2a 2a 20 74 6f 20 64 69 73 61 62 6c 65  .  ** to disable
213d0 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
213e0 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70  on for testing p
213f0 75 72 70 6f 73 65 73 2e 0a 20 20 2a 2f 0a 20 20  urposes..  */.  
21400 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
21410 69 73 74 43 6f 6d 70 61 72 65 28 70 2d 3e 70 47  istCompare(p->pG
21420 72 6f 75 70 42 79 2c 20 70 4f 72 64 65 72 42 79  roupBy, pOrderBy
21430 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
21440 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
21450 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
21460 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 72  r)==0 ){.    pOr
21470 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a  derBy = 0;.  }..
21480 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
21490 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
214a0 75 73 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73  use, then this s
214b0 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65  orting.  ** inde
214c0 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62  x might end up b
214d0 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74  eing unused if t
214e0 68 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a  he data can be .
214f0 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69    ** extracted i
21500 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64  n pre-sorted ord
21510 65 72 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  er.  If that is 
21520 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
21530 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45  he.  ** OP_OpenE
21540 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
21550 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61  tion will be cha
21560 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f  nged to an OP_No
21570 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20  op once.  ** we 
21580 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20  figure out that 
21590 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
215a0 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e  x is not needed.
215b0 20 20 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e    The addrSortIn
215c0 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  dex.  ** variabl
215d0 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63  e is used to fac
215e0 69 6c 69 74 61 74 65 20 74 68 61 74 20 63 68 61  ilitate that cha
215f0 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nge..  */.  if( 
21600 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
21610 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
21620 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  o;.    pKeyInfo 
21630 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
21640 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
21650 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72  rderBy);.    pOr
21660 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20  derBy->iECursor 
21670 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
21680 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  ;.    p->addrOpe
21690 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53  nEphm[2] = addrS
216a0 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20  ortIndex =.     
216b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
216c0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
216d0 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20  emeral,.        
216e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216f0 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43     pOrderBy->iEC
21700 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d  ursor, pOrderBy-
21710 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20  >nExpr+2, 0,.   
21720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21730 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
21740 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
21750 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
21760 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 53  }else{.    addrS
21770 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20  ortIndex = -1;. 
21780 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
21790 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
217a0 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
217b0 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
217c0 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
217d0 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
217e0 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
217f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
21800 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21810 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
21820 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 70 45 4c  Dest->iParm, pEL
21830 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d  ist->nExpr);.  }
21840 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c  ..  /* Set the l
21850 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  imiter..  */.  i
21860 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
21870 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
21880 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
21890 20 28 64 6f 75 62 6c 65 29 4c 41 52 47 45 53 54   (double)LARGEST
218a0 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74  _INT64;.  comput
218b0 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
218c0 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29  pParse, p, iEnd)
218d0 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76  ;..  /* Open a v
218e0 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20  irtual index to 
218f0 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74  use for the dist
21900 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  inct set..  */. 
21910 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
21920 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
21930 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
21940 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 61 73 73  KeyInfo;.    ass
21950 65 72 74 28 20 69 73 41 67 67 20 7c 7c 20 70 47  ert( isAgg || pG
21960 72 6f 75 70 42 79 20 29 3b 0a 20 20 20 20 64 69  roupBy );.    di
21970 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
21980 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65  >nTab++;.    pKe
21990 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
219a0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
219b0 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  se, p->pEList);.
219c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
219d0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
219e0 45 70 68 65 6d 65 72 61 6c 2c 20 64 69 73 74 69  Ephemeral, disti
219f0 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
21a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a10 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
21a20 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
21a30 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 73 71 6c  ANDOFF);.    sql
21a40 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
21a50 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  (v, BTREE_UNORDE
21a60 52 45 44 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RED);.  }else{. 
21a70 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31     distinct = -1
21a80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67 67 72  ;.  }..  /* Aggr
21a90 65 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67  egate and non-ag
21aa0 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
21ab0 61 72 65 20 68 61 6e 64 6c 65 64 20 64 69 66 66  are handled diff
21ac0 65 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69 66 28  erently */.  if(
21ad0 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75   !isAgg && pGrou
21ae0 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBy==0 ){.    /*
21af0 20 54 68 69 73 20 63 61 73 65 20 69 73 20 66 6f   This case is fo
21b00 72 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  r non-aggregate 
21b10 71 75 65 72 69 65 73 0a 20 20 20 20 2a 2a 20 42  queries.    ** B
21b20 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  egin the databas
21b30 65 20 73 63 61 6e 0a 20 20 20 20 2a 2f 0a 20 20  e scan.    */.  
21b40 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
21b50 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
21b60 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
21b70 57 68 65 72 65 2c 20 26 70 4f 72 64 65 72 42 79  Where, &pOrderBy
21b80 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 57  , 0);.    if( pW
21b90 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
21ba0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69  elect_end;.    i
21bb0 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  f( pWInfo->nRowO
21bc0 75 74 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ut < p->nSelectR
21bd0 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow ) p->nSelectR
21be0 6f 77 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  ow = pWInfo->nRo
21bf0 77 4f 75 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  wOut;..    /* If
21c00 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
21c10 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20  hat was created 
21c20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70  by a prior OP_Op
21c30 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20  enEphemeral .   
21c40 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
21c50 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69  ended up not bei
21c60 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  ng needed, then 
21c70 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  change the OP_Op
21c80 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20  enEphemeral.    
21c90 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f  ** into an OP_No
21ca0 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  op..    */.    i
21cb0 66 28 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  f( addrSortIndex
21cc0 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d  >=0 && pOrderBy=
21cd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
21ce0 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
21cf0 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49  oop(v, addrSortI
21d00 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20 20 20 20  ndex, 1);.      
21d10 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
21d20 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a  2] = -1;.    }..
21d30 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73      /* Use the s
21d40 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
21d50 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  op.    */.    as
21d60 73 65 72 74 28 21 69 73 44 69 73 74 69 6e 63 74  sert(!isDistinct
21d70 29 3b 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  );.    selectInn
21d80 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
21d90 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  , pEList, 0, 0, 
21da0 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 70 44  pOrderBy, -1, pD
21db0 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
21dc0 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d           pWInfo-
21dd0 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e  >iContinue, pWIn
21de0 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
21df0 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74    /* End the dat
21e00 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  abase scan loop.
21e10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
21e20 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
21e30 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fo);.  }else{.  
21e40 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
21e50 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
21e60 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
21e70 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  s */.    NameCon
21e80 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20  text sNC;    /* 
21e90 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
21ea0 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72   processing aggr
21eb0 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  egate informatio
21ec0 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d  n */.    int iAM
21ed0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
21ee0 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
21ef0 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75  s for storing cu
21f00 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a  rrent GROUP BY *
21f10 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b  /.    int iBMem;
21f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
21f30 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
21f40 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55  or previous GROU
21f50 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
21f60 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20  iUseFlag;       
21f70 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68  /* Mem address h
21f80 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69  olding flag indi
21f90 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c  cating that at l
21fa0 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  east.           
21fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
21fc0 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69  one row of the i
21fd0 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72  nput to the aggr
21fe0 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a  egator has been.
21ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22000 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
22010 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ssed */.    int 
22020 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20  iAbortFlag;     
22030 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77  /* Mem address w
22040 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72  hich causes quer
22050 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74  y abort if posit
22060 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67  ive */.    int g
22070 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f  roupBySort;    /
22080 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d  * Rows come from
22090 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50   source in GROUP
220a0 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20   BY order */.   
220b0 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20   int addrEnd;   
220c0 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70       /* End of p
220d0 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68  rocessing for th
220e0 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20  is SELECT */..  
220f0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20    /* Remove any 
22100 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20  and all aliases 
22110 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75  between the resu
22120 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20  lt set and the. 
22130 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63     ** GROUP BY c
22140 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  lause..    */.  
22150 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
22160 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20  {.      int k;  
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22180 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
22190 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73  unter */.      s
221a0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
221b0 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20  tem *pItem;  /* 
221c0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
221d0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
221e0 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20   list */..      
221f0 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d  for(k=p->pEList-
22200 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d  >nExpr, pItem=p-
22210 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b  >pEList->a; k>0;
22220 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   k--, pItem++){.
22230 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
22240 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
22250 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70   }.      for(k=p
22260 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20  GroupBy->nExpr, 
22270 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e  pItem=pGroupBy->
22280 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74  a; k>0; k--, pIt
22290 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
222a0 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30  Item->iAlias = 0
222b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
222c0 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
222d0 77 3e 28 64 6f 75 62 6c 65 29 31 30 30 20 29 20  w>(double)100 ) 
222e0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
222f0 28 64 6f 75 62 6c 65 29 31 30 30 3b 0a 20 20 20  (double)100;.   
22300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
22310 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 28 64  >nSelectRow = (d
22320 6f 75 62 6c 65 29 31 3b 0a 20 20 20 20 7d 0a 0a  ouble)1;.    }..
22330 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20   .    /* Create 
22340 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  a label to jump 
22350 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  to when we want 
22360 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65  to abort the que
22370 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e  ry */.    addrEn
22380 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
22390 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
223a0 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f    /* Convert TK_
223b0 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74  COLUMN nodes int
223c0 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  o TK_AGG_COLUMN 
223d0 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73  and make entries
223e0 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49   in.    ** sAggI
223f0 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41  nfo for all TK_A
22400 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
22410 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
22420 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53   of the.    ** S
22430 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
22440 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
22450 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
22460 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
22470 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
22480 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
22490 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
224a0 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f      sNC.pAggInfo
224b0 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20   = &sAggInfo;.  
224c0 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
224d0 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
224e0 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
224f0 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20  >nExpr+1 : 0;.  
22500 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75    sAggInfo.pGrou
22510 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
22520 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
22530 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
22540 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  NC, pEList);.   
22550 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
22560 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
22570 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
22580 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
22590 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
225a0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
225b0 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29  s(&sNC, pHaving)
225c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67  ;.    }.    sAgg
225d0 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f  Info.nAccumulato
225e0 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  r = sAggInfo.nCo
225f0 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  lumn;.    for(i=
22600 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46  0; i<sAggInfo.nF
22610 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  unc; i++){.     
22620 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
22630 73 50 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e  sProperty(sAggIn
22640 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
22650 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
22660 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
22670 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
22680 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e  ist(&sNC, sAggIn
22690 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
226a0 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
226b0 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
226c0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
226d0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
226e0 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e      /* Processin
226f0 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73  g for aggregates
22700 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69   with GROUP BY i
22710 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74  s very different
22720 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68   and.    ** much
22730 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68   more complex th
22740 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77 69  an aggregates wi
22750 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59  thout a GROUP BY
22760 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
22770 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
22780 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
22790 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67  Info;  /* Keying
227a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
227b0 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c   the group by cl
227c0 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
227d0 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20  t j1;           
227e0 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70    /* A-vs-B comp
227f0 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a  arision jump */.
22800 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75        int addrOu
22810 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61  tputRow;  /* Sta
22820 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65  rt of subroutine
22830 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
22840 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20  result row */.  
22850 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75      int regOutpu
22860 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72  tRow;   /* Retur
22870 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
22880 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75  er for output su
22890 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  broutine */.    
228a0 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f    int addrSetAbo
228b0 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65  rt;   /* Set the
228c0 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20   abort flag and 
228d0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20  return */.      
228e0 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  int addrTopOfLoo
228f0 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68  p;  /* Top of th
22900 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  e input loop */.
22910 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f        int addrSo
22920 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65  rtingIdx; /* The
22930 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
22940 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e  l for the sortin
22950 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  g index */.     
22960 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20   int addrReset; 
22970 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69       /* Subrouti
22980 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67  ne for resetting
22990 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
229a0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
229b0 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  gReset;       /*
229c0 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
229d0 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65 73  register for res
229e0 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  et subroutine */
229f0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
22a00 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42  ere is a GROUP B
22a10 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68  Y clause we migh
22a20 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67  t need a sorting
22a30 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20   index to.      
22a40 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e  ** implement it.
22a50 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20    Allocate that 
22a60 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f  sorting index no
22a70 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20  w.  If it turns 
22a80 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  out.      ** tha
22a90 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  t we do not need
22aa0 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74   it after all, t
22ab0 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  he OpenEphemeral
22ac0 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20   instruction.   
22ad0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f     ** will be co
22ae0 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e  nverted into a N
22af0 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a  oop.  .      */.
22b00 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
22b10 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72  ortingIdx = pPar
22b20 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
22b30 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
22b40 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
22b50 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
22b60 79 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f  y);.      addrSo
22b70 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74  rtingIdx = sqlit
22b80 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
22b90 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
22ba0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  , .          sAg
22bb0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
22bc0 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74  , sAggInfo.nSort
22bd0 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20  ingColumn, .    
22be0 20 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29        0, (char*)
22bf0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
22c00 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a  INFO_HANDOFF);..
22c10 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
22c20 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  ize memory locat
22c30 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f  ions used by GRO
22c40 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20  UP BY aggregate 
22c50 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20  processing.     
22c60 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c   */.      iUseFl
22c70 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
22c80 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72  Mem;.      iAbor
22c90 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  tFlag = ++pParse
22ca0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
22cb0 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70  gOutputRow = ++p
22cc0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
22cd0 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
22ce0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
22cf0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
22d00 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70    regReset = ++p
22d10 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
22d20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73     addrReset = s
22d30 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
22d40 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41  bel(v);.      iA
22d50 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
22d60 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
22d70 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
22d80 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
22d90 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61       iBMem = pPa
22da0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
22db0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
22dc0 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
22dd0 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
22de0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22df0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
22e00 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
22e10 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
22e20 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20  v, "clear abort 
22e30 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
22e40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22e50 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
22e60 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  0, iUseFlag);.  
22e70 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
22e80 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63  (v, "indicate ac
22e90 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22  cumulator empty"
22ea0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65  ));..      /* Be
22eb0 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20  gin a loop that 
22ec0 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c  will extract all
22ed0 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20   source rows in 
22ee0 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a  GROUP BY order..
22ef0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69        ** This mi
22f00 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20  ght involve two 
22f10 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77  separate loops w
22f20 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69  ith an OP_Sort i
22f30 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20  n between, or.  
22f40 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
22f50 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70  be a single loop
22f60 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e   that uses an in
22f70 64 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69  dex to extract i
22f80 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20  nformation.     
22f90 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74   ** in the right
22fa0 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20   order to begin 
22fb0 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  with..      */. 
22fc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22fd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
22fe0 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64  ub, regReset, ad
22ff0 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
23000 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
23010 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
23020 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
23030 65 72 65 2c 20 26 70 47 72 6f 75 70 42 79 2c 20  ere, &pGroupBy, 
23040 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  0);.      if( pW
23050 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
23060 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
23070 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30   if( pGroupBy==0
23080 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
23090 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20  he optimizer is 
230a0 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20  able to deliver 
230b0 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79  rows in group by
230c0 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20   order so.      
230d0 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68    ** we do not h
230e0 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68  ave to sort.  Th
230f0 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
23100 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  al table will be
23110 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63  .        ** canc
23120 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61  elled later beca
23130 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  use we still nee
23140 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65  d to use the pKe
23150 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f  yInfo.        */
23160 0a 20 20 20 20 20 20 20 20 70 47 72 6f 75 70 42  .        pGroupB
23170 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
23180 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
23190 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sort = 0;.      
231a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
231b0 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e  * Rows are comin
231c0 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72  g out in undeter
231d0 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65  mined order.  We
231e0 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20   have to push.  
231f0 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f        ** each ro
23200 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67  w into a sorting
23210 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74   index, terminat
23220 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  e the first loop
23230 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
23240 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20  n loop over the 
23250 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e  sorting index in
23260 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
23270 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20  e output.       
23280 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72   ** in sorted or
23290 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  der.        */. 
232a0 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42 61         int regBa
232b0 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se;.        int 
232c0 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20  regRecord;.     
232d0 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
232e0 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42       int nGroupB
232f0 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c  y;..        expl
23300 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
23310 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
23320 20 20 69 73 44 69 73 74 69 6e 63 74 20 26 26 20    isDistinct && 
23330 21 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46  !(p->selFlags&SF
23340 5f 44 69 73 74 69 6e 63 74 29 3f 22 44 49 53 54  _Distinct)?"DIST
23350 49 4e 43 54 22 3a 22 47 52 4f 55 50 20 42 59 22  INCT":"GROUP BY"
23360 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75  );..        grou
23370 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20  pBySort = 1;.   
23380 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20       nGroupBy = 
23390 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
233a0 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  .        nCol = 
233b0 6e 47 72 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20  nGroupBy + 1;.  
233c0 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
233d0 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f  By+1;.        fo
233e0 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
233f0 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
23400 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
23410 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e  AggInfo.aCol[i].
23420 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
23430 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23440 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nCol++;.        
23450 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
23460 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
23470 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
23480 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
23490 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
234a0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
234b0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
234c0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
234d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
234e0 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
234f0 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67  e, pGroupBy, reg
23500 42 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Base, 0);.      
23510 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23520 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e  Op2(v, OP_Sequen
23530 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  ce, sAggInfo.sor
23540 74 69 6e 67 49 64 78 2c 72 65 67 42 61 73 65 2b  tingIdx,regBase+
23550 6e 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20  nGroupBy);.     
23560 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b     j = nGroupBy+
23570 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  1;.        for(i
23580 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
23590 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
235a0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
235b0 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
235c0 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f   = &sAggInfo.aCo
235d0 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[i];.          
235e0 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
235f0 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
23600 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
23610 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a   = j + regBase;.
23620 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
23630 72 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  r2;..           
23640 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
23650 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
23660 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
23670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23680 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
23690 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e  b, pCol->iColumn
236a0 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20  , pCol->iTable, 
236b0 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
236c0 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20   if( r1!=r2 ){. 
236d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
236e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
236f0 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20  , OP_SCopy, r2, 
23700 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
23710 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a   }.            j
23720 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
23730 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23740 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
23750 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
23760 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
23770 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23780 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
23790 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  ord, regBase, nC
237a0 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ol, regRecord);.
237b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
237c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
237d0 49 64 78 49 6e 73 65 72 74 2c 20 73 41 67 67 49  IdxInsert, sAggI
237e0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
237f0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
23800 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
23810 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
23820 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
23830 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
23840 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
23850 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
23860 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
23870 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
23880 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
23890 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
238a0 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73 41 67  (v, OP_Sort, sAg
238b0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
238c0 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
238d0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
238e0 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f  (v, "GROUP BY so
238f0 72 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73  rt"));.        s
23900 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69  AggInfo.useSorti
23910 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20  ngIdx = 1;.     
23920 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
23930 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
23940 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
23950 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
23960 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
23970 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72  Y terms and stor
23980 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e  e in b0, b1, b2.
23990 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20  ...      ** (b0 
239a0 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  is memory locati
239b0 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69  on iBMem+0, b1 i
239c0 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73  s iBMem+1, and s
239d0 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a  o forth).      *
239e0 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74  * Then compare t
239f0 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
23a00 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73   BY terms agains
23a10 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  t the GROUP BY t
23a20 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72  erms.      ** fr
23a30 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  om the previous 
23a40 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74  row currently st
23a50 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20  ored in a0, a1, 
23a60 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  a2....      */. 
23a70 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f       addrTopOfLo
23a80 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
23a90 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
23aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23ab0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
23ac0 73 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  se);.      for(j
23ad0 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; j<pGroupBy->
23ae0 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
23af0 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
23b00 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
23b10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23b20 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
23b30 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
23b40 6e 67 49 64 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b  ngIdx, j, iBMem+
23b50 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  j);.        }els
23b60 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  e{.          sAg
23b70 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65  gInfo.directMode
23b80 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
23b90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
23ba0 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
23bb0 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42  ->a[j].pExpr, iB
23bc0 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
23bd0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
23be0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23bf0 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
23c00 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70   iAMem, iBMem, p
23c10 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a  GroupBy->nExpr,.
23c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c30 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
23c40 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
23c50 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31  YINFO);.      j1
23c60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
23c70 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
23c80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23c90 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
23ca0 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29  , j1+1, 0, j1+1)
23cb0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
23cc0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72  rate code that r
23cd0 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  uns whenever the
23ce0 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65   GROUP BY change
23cf0 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e  s..      ** Chan
23d00 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50  ges in the GROUP
23d10 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64   BY are detected
23d20 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
23d30 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62   code.      ** b
23d40 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20  lock.  If there 
23d50 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c  were no changes,
23d60 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73   this block is s
23d70 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  kipped..      **
23d80 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63  .      ** This c
23d90 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65  ode copies curre
23da0 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d  nt group by term
23db0 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e  s in b0,b1,b2,..
23dc0 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20  ..      ** over 
23dd0 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74  to a0,a1,a2.  It
23de0 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20   then calls the 
23df0 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
23e00 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72  e.      ** and r
23e10 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67  esets the aggreg
23e20 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
23e30 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65  registers in pre
23e40 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  paration.      *
23e50 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47  * for the next G
23e60 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20  ROUP BY batch.. 
23e70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
23e80 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
23e90 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c  e(pParse, iBMem,
23ea0 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iAMem, pGroupBy
23eb0 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
23ec0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23ed0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
23ee0 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
23ef0 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
23f00 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
23f10 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72  v, "output one r
23f20 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ow"));.      sql
23f30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
23f40 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f  , OP_IfPos, iAbo
23f50 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29  rtFlag, addrEnd)
23f60 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
23f70 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61  ent((v, "check a
23f80 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
23f90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23fa0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
23fb0 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
23fc0 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56  rReset);.      V
23fd0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
23fe0 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f  reset accumulato
23ff0 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
24000 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65  Update the aggre
24010 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
24020 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  s based on the c
24030 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20  ontent of.      
24040 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ** the current r
24050 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ow.      */.    
24060 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
24070 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
24080 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
24090 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
240a0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
240b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
240c0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
240d0 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   1, iUseFlag);. 
240e0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
240f0 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64  ((v, "indicate d
24100 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74  ata in accumulat
24110 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
24120 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   End of the loop
24130 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
24140 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
24150 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
24160 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
24170 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e 66  OP_Next, sAggInf
24180 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
24190 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20  drTopOfLoop);.  
241a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
241b0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
241c0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
241d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
241e0 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
241f0 64 64 72 53 6f 72 74 69 6e 67 49 64 78 2c 20 31  ddrSortingIdx, 1
24200 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
24210 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
24220 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73  final row of res
24230 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ult.      */.   
24240 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
24250 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
24260 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20  , regOutputRow, 
24270 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
24280 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
24290 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69  t((v, "output fi
242a0 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20  nal row"));..   
242b0 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20     /* Jump over 
242c0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a  the subroutines.
242d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
242e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
242f0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
24300 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20  addrEnd);..     
24310 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
24320 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
24330 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20  utputs a single 
24340 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
24350 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20  t.      ** set. 
24360 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   This subroutine
24370 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20   first looks at 
24380 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49  the iUseFlag.  I
24390 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20  f iUseFlag.     
243a0 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e   ** is less than
243b0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
243c0 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  o, the subroutin
243d0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  e is a no-op.  I
243e0 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70  f.      ** the p
243f0 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20  rocessing calls 
24400 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f  for the query to
24410 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62   abort, this sub
24420 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
24430 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
24440 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72  iAbortFlag memor
24450 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72  y location befor
24460 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20  e returning in. 
24470 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f       ** order to
24480 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c   signal the call
24490 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20  er to abort..   
244a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
244b0 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74  SetAbort = sqlit
244c0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
244d0 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
244e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
244f0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
24500 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
24510 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
24520 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c  v, "set abort fl
24530 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
24540 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
24550 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
24560 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
24570 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
24580 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
24590 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
245a0 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
245b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
245c0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
245d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
245e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp2(v, OP_IfPo
245f0 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64  s, iUseFlag, add
24600 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20  rOutputRow+2);. 
24610 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
24620 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65  ((v, "Groupby re
24630 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65  sult generator e
24640 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20  ntry point"));. 
24650 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24660 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
24670 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
24680 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69  w);.      finali
24690 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
246a0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
246b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
246c0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
246d0 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
246e0 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51  rOutputRow+1, SQ
246f0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
24700 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
24710 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
24720 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c  p, p->pEList, 0,
24730 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20   0, pOrderBy,.  
24740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24750 20 20 20 20 64 69 73 74 69 6e 63 74 2c 20 70 44      distinct, pD
24760 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
24770 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f             addrO
24780 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72  utputRow+1, addr
24790 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20  SetAbort);.     
247a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
247b0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
247c0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
247d0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
247e0 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70  t((v, "end group
247f0 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
24800 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
24810 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
24820 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
24830 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75  l reset the grou
24840 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72  p-by accumulator
24850 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
24860 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
24870 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52  veLabel(v, addrR
24880 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73  eset);.      res
24890 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
248a0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
248b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
248c0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
248d0 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74  Return, regReset
248e0 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f  );.     .    } /
248f0 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79  * endif pGroupBy
24900 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65 67 61  .  Begin aggrega
24910 74 65 20 71 75 65 72 69 65 73 20 77 69 74 68 6f  te queries witho
24920 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a  ut GROUP BY: */.
24930 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20      else {.     
24940 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20   ExprList *pDel 
24950 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
24960 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f  ITE_OMIT_BTREECO
24970 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20  UNT.      Table 
24980 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  *pTab;.      if(
24990 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c   (pTab = isSimpl
249a0 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49  eCount(p, &sAggI
249b0 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  nfo))!=0 ){.    
249c0 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70      /* If isSimp
249d0 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e  leCount() return
249e0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
249f0 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
24a00 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  , then.        *
24a10 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * the SQL statem
24a20 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ent is of the fo
24a30 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  rm:.        **. 
24a40 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
24a50 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
24a60 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a   <tbl>.        *
24a70 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65  *.        ** whe
24a80 72 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  re the Table str
24a90 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20  ucture returned 
24aa0 72 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65  represents table
24ab0 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20   <tbl>..        
24ac0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
24ad0 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  is statement is 
24ae0 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69  so common that i
24af0 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73  t is optimized s
24b00 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20  pecially. The.  
24b10 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e        ** OP_Coun
24b20 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  t instruction is
24b30 20 65 78 65 63 75 74 65 64 20 65 69 74 68 65 72   executed either
24b40 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74   on the intkey t
24b50 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20  able that.      
24b60 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
24b70 65 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65  e data for table
24b80 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65   <tbl> or on one
24b90 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e   of its indexes.
24ba0 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   It.        ** i
24bb0 73 20 62 65 74 74 65 72 20 74 6f 20 65 78 65 63  s better to exec
24bc0 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e  ute the op on an
24bd0 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78   index, as index
24be0 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20  es are almost.  
24bf0 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
24c00 73 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65  spread across le
24c10 73 73 20 70 61 67 65 73 20 74 68 61 6e 20 74 68  ss pages than th
24c20 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  eir correspondin
24c30 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  g tables..      
24c40 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e    */.        con
24c50 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  st int iDb = sql
24c60 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
24c70 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
24c80 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
24c90 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
24ca0 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iCsr = pParse->n
24cb0 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75  Tab++;     /* Cu
24cc0 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74  rsor to scan b-t
24cd0 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49  ree */.        I
24ce0 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
24cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d00 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
24d10 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
24d20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
24d30 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20  yInfo = 0;      
24d40 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69           /* Keyi
24d50 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20  nfo for scanned 
24d60 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
24d70 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20   Index *pBest = 
24d80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
24d90 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e        /* Best in
24da0 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72  dex found so far
24db0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
24dc0 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e  iRoot = pTab->tn
24dd0 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
24de0 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
24df0 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20   scanned b-tree 
24e00 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69  */..        sqli
24e10 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
24e20 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
24e30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
24e40 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
24e50 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
24e60 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
24e70 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  me);..        /*
24e80 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
24e90 69 6e 64 65 78 20 74 68 61 74 20 68 61 73 20 74  index that has t
24ea0 68 65 20 6c 65 61 73 74 20 61 6d 6f 75 6e 74 20  he least amount 
24eb0 6f 66 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 0a 20  of columns. If. 
24ec0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 72 65 20         ** there 
24ed0 69 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78  is such an index
24ee0 2c 20 61 6e 64 20 69 74 20 68 61 73 20 6c 65 73  , and it has les
24ef0 73 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 20 74  s columns than t
24f00 68 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20  he table.       
24f10 20 2a 2a 20 64 6f 65 73 2c 20 74 68 65 6e 20 77   ** does, then w
24f20 65 20 63 61 6e 20 61 73 73 75 6d 65 20 74 68 61  e can assume tha
24f30 74 20 69 74 20 63 6f 6e 73 75 6d 65 73 20 6c 65  t it consumes le
24f40 73 73 20 73 70 61 63 65 20 6f 6e 20 64 69 73 6b  ss space on disk
24f50 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
24f60 77 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20 62  will therefore b
24f70 65 20 63 68 65 61 70 65 72 20 74 6f 20 73 63 61  e cheaper to sca
24f80 6e 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  n to determine t
24f90 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e  he query result.
24fa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74  .        ** In t
24fb0 68 69 73 20 63 61 73 65 20 73 65 74 20 69 52 6f  his case set iRo
24fc0 6f 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70  ot to the root p
24fd0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
24fe0 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65 0a 20  e index b-tree. 
24ff0 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 4b         ** and pK
25000 65 79 49 6e 66 6f 20 74 6f 20 74 68 65 20 4b 65  eyInfo to the Ke
25010 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
25020 72 65 71 75 69 72 65 64 20 74 6f 20 6e 61 76 69  required to navi
25030 67 61 74 65 20 74 68 65 0a 20 20 20 20 20 20 20  gate the.       
25040 20 2a 2a 20 69 6e 64 65 78 2e 0a 20 20 20 20 20   ** index..     
25050 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
25060 20 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 65   In practice the
25070 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
25080 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  re will not be u
25090 73 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20  sed. It is only 
250a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73  .        ** pass
250b0 65 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70  ed to keep OP_Op
250c0 65 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20  enRead happy..  
250d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
250e0 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
250f0 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
25100 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
25110 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
25120 70 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 6e  pBest || pIdx->n
25130 43 6f 6c 75 6d 6e 3c 70 42 65 73 74 2d 3e 6e 43  Column<pBest->nC
25140 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
25150 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64       pBest = pId
25160 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  x;.          }. 
25170 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25180 20 69 66 28 20 70 42 65 73 74 20 26 26 20 70 42   if( pBest && pB
25190 65 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 54 61  est->nColumn<pTa
251a0 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
251b0 20 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65       iRoot = pBe
251c0 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  st->tnum;.      
251d0 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
251e0 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
251f0 66 6f 28 70 50 61 72 73 65 2c 20 70 42 65 73 74  fo(pParse, pBest
25200 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
25210 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20        /* Open a 
25220 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
25230 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50  , execute the OP
25240 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68  _Count, close th
25250 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20  e cursor. */.   
25260 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25270 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
25280 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f  nRead, iCsr, iRo
25290 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  ot, iDb);.      
252a0 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
252b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
252c0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
252d0 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70  v, -1, (char *)p
252e0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
252f0 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
25300 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25310 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25320 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69  2(v, OP_Count, i
25330 43 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  Csr, sAggInfo.aF
25340 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20  unc[0].iMem);.  
25350 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25360 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
25370 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20  ose, iCsr);.    
25380 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
25390 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54  * SQLITE_OMIT_BT
253a0 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20  REECOUNT */.    
253b0 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43    {.        /* C
253c0 68 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72  heck if the quer
253d0 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74  y is of one of t
253e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
253f0 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ms:.        **. 
25400 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
25410 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e  CT min(x) FROM .
25420 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ...        **   
25430 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52  SELECT max(x) FR
25440 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a  OM ....        *
25450 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20  *.        ** If 
25460 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20  it is, then ask 
25470 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72  the code in wher
25480 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74  e.c to attempt t
25490 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20  o sort results. 
254a0 20 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20         ** as if 
254b0 74 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52  there was an "OR
254c0 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52  DER ON x" or "OR
254d0 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63  DER ON x DESC" c
254e0 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20  lause. .        
254f0 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73  ** If where.c is
25500 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65   able to produce
25510 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20   results sorted 
25520 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74  in this order, t
25530 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hen.        ** a
25540 64 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20  dd vdbe code to 
25550 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
25560 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70   processing loop
25570 20 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20   after the .    
25580 20 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65      ** first ite
25590 72 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68  ration (since th
255a0 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
255b0 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73  n of the loop is
255c0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61   .        ** gua
255d0 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61  ranteed to opera
255e0 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69  te on the row wi
255f0 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f  th the minimum o
25600 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20  r maximum .     
25610 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78     ** value of x
25620 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72  , the only row r
25630 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20  equired)..      
25640 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
25650 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d  A special flag m
25660 75 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f  ust be passed to
25670 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
25680 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79  in() to slightly
25690 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69  .        ** modi
256a0 66 79 20 62 65 68 61 76 69 6f 75 72 20 61 73 20  fy behaviour as 
256b0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20  follows:.       
256c0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
256d0 20 2b 20 49 66 20 74 68 65 20 71 75 65 72 79 20   + If the query 
256e0 69 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e  is a "SELECT min
256f0 28 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c  (x)", then the l
25700 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20  oop coded by.   
25710 20 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72       **     wher
25720 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69  e.c should not i
25730 74 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20  terate over any 
25740 76 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55  values with a NU
25750 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  LL value.       
25760 20 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20   **     for x.. 
25770 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
25780 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74    **   + The opt
25790 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77  imizer code in w
257a0 68 65 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e  here.c (the thin
257b0 67 20 74 68 61 74 20 64 65 63 69 64 65 73 20 77  g that decides w
257c0 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  hich.        ** 
257d0 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64      index or ind
257e0 69 63 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f  ices to use) sho
257f0 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66 66  uld place a diff
25800 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f  erent priority o
25810 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  n .        **   
25820 20 20 73 61 74 69 73 66 79 69 6e 67 20 74 68 65    satisfying the
25830 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75   'ORDER BY' clau
25840 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20  se than it does 
25850 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a  in other cases..
25860 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52          **     R
25870 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64  efer to code and
25880 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65   comments in whe
25890 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73  re.c for details
258a0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
258b0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
258c0 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20  MinMax = 0;.    
258d0 20 20 20 20 75 38 20 66 6c 61 67 20 3d 20 6d 69      u8 flag = mi
258e0 6e 4d 61 78 51 75 65 72 79 28 70 29 3b 0a 20 20  nMaxQuery(p);.  
258f0 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 20 29        if( flag )
25900 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
25910 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
25920 65 72 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e  erty(p->pEList->
25930 61 5b 30 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78  a[0].pExpr, EP_x
25940 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
25950 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d         pMinMax =
25960 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
25970 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  Dup(db, p->pELis
25980 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 78  t->a[0].pExpr->x
25990 2e 70 4c 69 73 74 2c 30 29 3b 0a 20 20 20 20 20  .pList,0);.     
259a0 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e       pDel = pMin
259b0 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Max;.          i
259c0 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21 64  f( pMinMax && !d
259d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
259e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
259f0 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72  MinMax->a[0].sor
25a00 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57  tOrder = flag!=W
25a10 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
25a20 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20   ?1:0;.         
25a30 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
25a40 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f  .pExpr->op = TK_
25a50 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
25a60 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
25a70 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
25a80 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74 68   case runs if th
25a90 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20  e aggregate has 
25aa0 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
25ab0 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  se.  The.       
25ac0 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69   ** processing i
25ad0 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73  s much simpler s
25ae0 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e  ince there is on
25af0 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a  ly a single row.
25b00 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75          ** of ou
25b10 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tput..        */
25b20 0a 20 20 20 20 20 20 20 20 72 65 73 65 74 41 63  .        resetAc
25b30 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
25b40 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
25b50 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
25b60 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
25b70 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
25b80 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4d 69 6e  t, pWhere, &pMin
25b90 4d 61 78 2c 20 66 6c 61 67 29 3b 0a 20 20 20 20  Max, flag);.    
25ba0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
25bb0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
25bc0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
25bd0 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a  lete(db, pDel);.
25be0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
25bf0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
25c00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64     }.        upd
25c10 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
25c20 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
25c30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
25c40 70 4d 69 6e 4d 61 78 20 26 26 20 66 6c 61 67 20  pMinMax && flag 
25c50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
25c60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
25c70 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 57  , OP_Goto, 0, pW
25c80 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 20  Info->iBreak);. 
25c90 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
25ca0 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62  ment((v, "%s() b
25cb0 79 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20  y index",.      
25cc0 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d            (flag=
25cd0 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
25ce0 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29  IN?"min":"max"))
25cf0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
25d00 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
25d10 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
25d20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
25d30 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
25d40 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
25d50 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 4f       }..      pO
25d60 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
25d70 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
25d80 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
25d90 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53  ving, addrEnd, S
25da0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
25db0 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
25dc0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
25dd0 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30   p, p->pEList, 0
25de0 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20  , 0, 0, -1, .   
25df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e00 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e     pDest, addrEn
25e10 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  d, addrEnd);.   
25e20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
25e30 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  stDelete(db, pDe
25e40 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
25e50 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
25e60 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64  Label(v, addrEnd
25e70 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65  );.    .  } /* e
25e80 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71  ndif aggregate q
25e90 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20 64  uery */..  if( d
25ea0 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
25eb0 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
25ec0 6c 65 28 70 50 61 72 73 65 2c 20 22 44 49 53 54  le(pParse, "DIST
25ed0 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  INCT");.  }..  /
25ee0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
25ef0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
25f00 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74  , then we need t
25f10 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c  o sort the resul
25f20 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64  ts.  ** and send
25f30 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c   them to the cal
25f40 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65  lback one by one
25f50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
25f60 64 65 72 42 79 20 29 7b 0a 20 20 20 20 65 78 70  derBy ){.    exp
25f70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
25f80 61 72 73 65 2c 20 22 4f 52 44 45 52 20 42 59 22  arse, "ORDER BY"
25f90 29 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53  );.    generateS
25fa0 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20  ortTail(pParse, 
25fb0 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  p, v, pEList->nE
25fc0 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  xpr, pDest);.  }
25fd0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
25fe0 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75   to skip this qu
25ff0 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ery.  */.  sqlit
26000 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
26010 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20  el(v, iEnd);..  
26020 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61  /* The SELECT wa
26030 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
26040 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20  oded.   Set the 
26050 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30  return code to 0
26060 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
26070 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a  e no errors..  *
26080 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f  /.  rc = 0;..  /
26090 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20  * Control jumps 
260a0 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72  to here if an er
260b0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
260c0 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f  ed above, or upo
260d0 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75  n.  ** successfu
260e0 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  l coding of the 
260f0 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c  SELECT..  */.sel
26100 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78 70 6c 61  ect_end:.  expla
26110 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50 61  inSetInteger(pPa
26120 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
26130 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64  iRestoreSelectId
26140 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66  );..  /* Identif
26150 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  y column names i
26160 66 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  f results of the
26170 20 53 45 4c 45 43 54 20 61 72 65 20 74 6f 20 62   SELECT are to b
26180 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20  e output..  */. 
26190 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
261a0 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65 44 65  OK && pDest->eDe
261b0 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
261c0 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  {.    generateCo
261d0 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
261e0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
261f0 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  st);.  }..  sqli
26200 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41  te3DbFree(db, sA
26210 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20  ggInfo.aCol);.  
26220 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
26230 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
26240 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
26250 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
26260 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
26270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
262a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
262b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
262c0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
262d0 20 63 6f 64 65 20 69 73 20 75 73 65 64 20 66 6f   code is used fo
262e0 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
262f0 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 54  bugging only.  T
26300 68 65 20 63 6f 64 65 0a 2a 2a 20 74 68 61 74 20  he code.** that 
26310 66 6f 6c 6c 6f 77 73 20 64 6f 65 73 20 6e 6f 74  follows does not
26320 20 61 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61   appear in norma
26330 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20  l builds..**.** 
26340 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
26350 72 65 20 75 73 65 64 20 74 6f 20 70 72 69 6e 74  re used to print
26360 20 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   out the content
26370 20 6f 66 20 61 6c 6c 20 6f 72 20 70 61 72 74 20   of all or part 
26380 6f 66 20 61 20 0a 2a 2a 20 70 61 72 73 65 20 73  of a .** parse s
26390 74 72 75 63 74 75 72 65 73 20 73 75 63 68 20 61  tructures such a
263a0 73 20 53 65 6c 65 63 74 20 6f 72 20 45 78 70 72  s Select or Expr
263b0 2e 20 20 53 75 63 68 20 70 72 69 6e 74 6f 75 74  .  Such printout
263c0 73 20 61 72 65 20 75 73 65 66 75 6c 0a 2a 2a 20  s are useful.** 
263d0 66 6f 72 20 68 65 6c 70 69 6e 67 20 74 6f 20 75  for helping to u
263e0 6e 64 65 72 73 74 61 6e 64 20 77 68 61 74 20 69  nderstand what i
263f0 73 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 73 69  s happening insi
26400 64 65 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  de the code gene
26410 72 61 74 6f 72 0a 2a 2a 20 64 75 72 69 6e 67 20  rator.** during 
26420 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  the execution of
26430 20 63 6f 6d 70 6c 65 78 20 53 45 4c 45 43 54 20   complex SELECT 
26440 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
26450 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 20  * These routine 
26460 61 72 65 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61  are not called a
26470 6e 79 77 68 65 72 65 20 66 72 6f 6d 20 77 69 74  nywhere from wit
26480 68 69 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a  hin the normal.*
26490 2a 20 63 6f 64 65 20 62 61 73 65 2e 20 20 54 68  * code base.  Th
264a0 65 6e 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20  en are intended 
264b0 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f  to be called fro
264c0 6d 20 77 69 74 68 69 6e 20 74 68 65 20 64 65 62  m within the deb
264d0 75 67 67 65 72 0a 2a 2a 20 6f 72 20 66 72 6f 6d  ugger.** or from
264e0 20 74 65 6d 70 6f 72 61 72 79 20 22 70 72 69 6e   temporary "prin
264f0 74 66 22 20 73 74 61 74 65 6d 65 6e 74 73 20 69  tf" statements i
26500 6e 73 65 72 74 65 64 20 66 6f 72 20 64 65 62 75  nserted for debu
26510 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  gging..*/.void s
26520 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
26530 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
26540 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
26550 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  (p, EP_IntValue)
26560 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   && p->u.zToken 
26570 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
26580 62 75 67 50 72 69 6e 74 66 28 22 28 25 73 22 2c  bugPrintf("(%s",
26590 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20   p->u.zToken);. 
265a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
265b0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
265c0 28 25 64 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20 20  (%d", p->op);.  
265d0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74  }.  if( p->pLeft
265e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
265f0 65 62 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b  ebugPrintf(" ");
26600 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
26610 74 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b  tExpr(p->pLeft);
26620 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 52  .  }.  if( p->pR
26630 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ight ){.    sqli
26640 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
26650 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
26660 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 52 69  PrintExpr(p->pRi
26670 67 68 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ght);.  }.  sqli
26680 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
26690 29 22 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  )");.}.void sqli
266a0 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74  te3PrintExprList
266b0 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74  (ExprList *pList
266c0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
266d0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
266e0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
266f0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
26700 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  r(pList->a[i].pE
26710 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 69 3c  xpr);.    if( i<
26720 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29  pList->nExpr-1 )
26730 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
26740 65 62 75 67 50 72 69 6e 74 66 28 22 2c 20 22 29  ebugPrintf(", ")
26750 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f  ;.    }.  }.}.vo
26760 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53  id sqlite3PrintS
26770 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c  elect(Select *p,
26780 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20   int indent){.  
26790 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
267a0 74 66 28 22 25 2a 73 53 45 4c 45 43 54 28 25 70  tf("%*sSELECT(%p
267b0 29 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 2c  ) ", indent, "",
267c0 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 72   p);.  sqlite3Pr
267d0 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  intExprList(p->p
267e0 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  EList);.  sqlite
267f0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
26800 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72  ");.  if( p->pSr
26810 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  c ){.    char *z
26820 50 72 65 66 69 78 3b 0a 20 20 20 20 69 6e 74 20  Prefix;.    int 
26830 69 3b 0a 20 20 20 20 7a 50 72 65 66 69 78 20 3d  i;.    zPrefix =
26840 20 22 46 52 4f 4d 22 3b 0a 20 20 20 20 66 6f 72   "FROM";.    for
26850 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d  (i=0; i<p->pSrc-
26860 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
26870 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
26880 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
26890 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a  &p->pSrc->a[i];.
268a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
268b0 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 22 2c  ugPrintf("%*s ",
268c0 20 69 6e 64 65 6e 74 2b 36 2c 20 7a 50 72 65 66   indent+6, zPref
268d0 69 78 29 3b 0a 20 20 20 20 20 20 7a 50 72 65 66  ix);.      zPref
268e0 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 69  ix = "";.      i
268f0 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
26900 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
26910 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
26920 22 28 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  "(\n");.        
26930 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65  sqlite3PrintSele
26940 63 74 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  ct(pItem->pSelec
26950 74 2c 20 69 6e 64 65 6e 74 2b 31 30 29 3b 0a 20  t, indent+10);. 
26960 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
26970 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 29 22  bugPrintf("%*s)"
26980 2c 20 69 6e 64 65 6e 74 2b 38 2c 20 22 22 29 3b  , indent+8, "");
26990 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
269a0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b   pItem->zName ){
269b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
269c0 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 73 22  DebugPrintf("%s"
269d0 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
269e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
269f0 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29  f( pItem->pTab )
26a00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
26a10 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 74  3DebugPrintf("(t
26a20 61 62 6c 65 3a 20 25 73 29 22 2c 20 70 49 74 65  able: %s)", pIte
26a30 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  m->pTab->zName);
26a40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
26a50 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  f( pItem->zAlias
26a60 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
26a70 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
26a80 20 41 53 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e   AS %s", pItem->
26a90 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d  zAlias);.      }
26aa0 0a 20 20 20 20 20 20 69 66 28 20 69 3c 70 2d 3e  .      if( i<p->
26ab0 70 53 72 63 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a  pSrc->nSrc-1 ){.
26ac0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
26ad0 65 62 75 67 50 72 69 6e 74 66 28 22 2c 22 29 3b  ebugPrintf(",");
26ae0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
26af0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
26b00 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20  f("\n");.    }. 
26b10 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65   }.  if( p->pWhe
26b20 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  re ){.    sqlite
26b30 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
26b40 73 20 57 48 45 52 45 20 22 2c 20 69 6e 64 65 6e  s WHERE ", inden
26b50 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69  t, "");.    sqli
26b60 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e  te3PrintExpr(p->
26b70 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c  pWhere);.    sql
26b80 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
26b90 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  "\n");.  }.  if(
26ba0 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a   p->pGroupBy ){.
26bb0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
26bc0 50 72 69 6e 74 66 28 22 25 2a 73 20 47 52 4f 55  Printf("%*s GROU
26bd0 50 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20  P BY ", indent, 
26be0 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "");.    sqlite3
26bf0 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d  PrintExprList(p-
26c00 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
26c10 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26c20 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  tf("\n");.  }.  
26c30 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29  if( p->pHaving )
26c40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
26c50 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 48 41  ugPrintf("%*s HA
26c60 56 49 4e 47 20 22 2c 20 69 6e 64 65 6e 74 2c 20  VING ", indent, 
26c70 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "");.    sqlite3
26c80 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 48 61  PrintExpr(p->pHa
26c90 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  ving);.    sqlit
26ca0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
26cb0 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n");.  }.  if( p
26cc0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
26cd0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
26ce0 69 6e 74 66 28 22 25 2a 73 20 4f 52 44 45 52 20  intf("%*s ORDER 
26cf0 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  BY ", indent, ""
26d00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
26d10 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  intExprList(p->p
26d20 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71  OrderBy);.    sq
26d30 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
26d40 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a  ("\n");.  }.}./*
26d50 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75   End of the stru
26d60 63 74 75 72 65 20 64 65 62 75 67 20 70 72 69 6e  cture debug prin
26d70 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a  ting code.******
26d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26dc0 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20  *******/.#endif 
26dd0 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
26de0 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
26df0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
26e00 20 2a 2f 0a                                       */.