/ Hex Artifact Content
Login

Artifact a84089eb0147bdc16f487cf6f2670432eb673c2b:


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 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d     pSelect->iLim
3ba0: 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  it = 0;.  }.}../
3bb0: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f  *.** Add code to
3bc0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f   implement the O
3bd0: 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20  FFSET.*/.static 
3be0: 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28  void codeOffset(
3bf0: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
3c00: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
3c10: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
3c20: 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  VM */.  Select *
3c30: 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p,        /* The
3c40: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3c50: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
3c60: 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
3c70: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
3c80: 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75  e to skip the cu
3c90: 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a  rrent record */.
3ca0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66  ){.  if( p->iOff
3cb0: 73 65 74 20 26 26 20 69 43 6f 6e 74 69 6e 75 65  set && iContinue
3cc0: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  !=0 ){.    int a
3cd0: 64 64 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ddr;.    sqlite3
3ce0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3cf0: 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66 66  _AddImm, p->iOff
3d00: 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64  set, -1);.    ad
3d10: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
3d20: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
3d30: 65 67 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b  eg, p->iOffset);
3d40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3d50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
3d60: 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29  o, 0, iContinue)
3d70: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
3d80: 74 28 28 76 2c 20 22 73 6b 69 70 20 4f 46 46 53  t((v, "skip OFFS
3d90: 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20  ET records"));. 
3da0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
3db0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
3dc0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
3dd0: 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  d code that will
3de0: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   check to make s
3df0: 75 72 65 20 74 68 65 20 4e 20 72 65 67 69 73 74  ure the N regist
3e00: 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
3e10: 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64  iMem.** form a d
3e20: 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20  istinct entry.  
3e30: 69 54 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e  iTab is a sortin
3e40: 67 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  g index that hol
3e50: 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  ds previously.**
3e60: 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f   seen combinatio
3e70: 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75  ns of the N valu
3e80: 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  es.  A new entry
3e90: 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62   is made in iTab
3ea0: 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72 65  .** if the curre
3eb0: 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20  nt N values are 
3ec0: 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d  new..**.** A jum
3ed0: 70 20 74 6f 20 61 64 64 72 52 65 70 65 61 74 20  p to addrRepeat 
3ee0: 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20  is made and the 
3ef0: 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20 70  N+1 values are p
3f00: 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  opped from the.*
3f10: 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 74  * stack if the t
3f20: 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72  op N elements ar
3f30: 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a  e not distinct..
3f40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3f50: 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50  odeDistinct(.  P
3f60: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3f70: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
3f80: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
3f90: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
3fa0: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
3fb0: 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e   /* A sorting in
3fc0: 64 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74  dex used to test
3fd0: 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73   for distinctnes
3fe0: 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52  s */.  int addrR
3ff0: 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d  epeat,    /* Jum
4000: 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74  p to here if not
4010: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69   distinct */.  i
4020: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
4030: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
4040: 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  lements */.  int
4050: 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20   iMem           
4060: 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74  /* First element
4070: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
4080: 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76  ;.  int r1;..  v
4090: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
40a0: 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33  ;.  r1 = sqlite3
40b0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
40c0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
40d0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
40e0: 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64  _Found, iTab, ad
40f0: 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20  drRepeat, iMem, 
4100: 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  N);.  sqlite3Vdb
4110: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
4120: 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20  keRecord, iMem, 
4130: 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  N, r1);.  sqlite
4140: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4150: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61  P_IdxInsert, iTa
4160: 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  b, r1);.  sqlite
4170: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
4180: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a  pParse, r1);.}..
4190: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
41a0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
41b0: 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69 73  when a SELECT is
41c0: 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 73   used within a s
41d0: 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  ubexpression.** 
41e0: 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e  (example:  "a IN
41f0: 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
4200: 74 61 62 6c 65 29 22 29 20 62 75 74 20 69 74 20  table)") but it 
4210: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31 20  has more than 1 
4220: 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e  result.** column
4230: 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20 69 6e  .  We do this in
4240: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65   a subroutine be
4250: 63 61 75 73 65 20 74 68 65 20 65 72 72 6f 72 20  cause the error 
4260: 6f 63 63 75 72 73 20 69 6e 20 6d 75 6c 74 69 70  occurs in multip
4270: 6c 65 0a 2a 2a 20 70 6c 61 63 65 73 2e 0a 2a 2f  le.** places..*/
4280: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
4290: 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
42a0: 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61  electError(.  Pa
42b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
42c0: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
42d0: 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ext. */.  Select
42e0: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f  Dest *pDest,   /
42f0: 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66  * Destination of
4300: 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20   SELECT results 
4310: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20  */.  int nExpr  
4320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4330: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
4340: 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
4350: 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20  y SELECT */.){. 
4360: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
4370: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28  st->eDest;.  if(
4380: 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44 65   nExpr>1 && (eDe
4390: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
43a0: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29  Dest==SRT_Set) )
43b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
43c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
43d0: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73  nly a single res
43e0: 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  ult allowed for 
43f0: 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45  ".       "a SELE
4400: 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20  CT that is part 
4410: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
4420: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ");.    return 1
4430: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
4440: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
4450: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4460: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
4470: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e   code for the in
4480: 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65  side of the inne
4490: 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53  r loop.** of a S
44a0: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ELECT..**.** If 
44b0: 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75  srcTab and nColu
44c0: 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72 6f  mn are both zero
44d0: 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73  , then the pELis
44e0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
44f0: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
4500: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
4510: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
4520: 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d   row.  If nColum
4530: 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61  n>0.** then data
4540: 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20   is pulled from 
4550: 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73  srcTab and pELis
4560: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74  t is used only t
4570: 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61 74  o get the.** dat
4580: 61 74 79 70 65 73 20 66 6f 72 20 65 61 63 68 20  atypes for each 
4590: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69  column..*/.stati
45a0: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e  c void selectInn
45b0: 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20  erLoop(.  Parse 
45c0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
45d0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
45e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
45f0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
4600: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
4610: 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74  lete select stat
4620: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
4630: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
4640: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
4650: 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
4660: 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64   being extracted
4670: 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62   */.  int srcTab
4680: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
4690: 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20   Pull data from 
46a0: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
46b0: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
46c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
46d0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
46e0: 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
46f0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
4700: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
4710: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f   If not NULL, so
4720: 72 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67  rt results using
4730: 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69   this key */.  i
4740: 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20  nt distinct,    
4750: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30         /* If >=0
4760: 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75  , make sure resu
4770: 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e 63 74  lts are distinct
4780: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
4790: 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a   *pDest,      /*
47a0: 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20   How to dispose 
47b0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a  of the results *
47c0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
47d0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  e,          /* J
47e0: 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74  ump here to cont
47f0: 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 72  inue with next r
4800: 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  ow */.  int iBre
4810: 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ak              
4820: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
4830: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
4840: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29   inner loop */.)
4850: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4860: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
4870: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44  nt i;.  int hasD
4880: 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
4890: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
48a0: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
48b0: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
48c0: 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20  int regResult;  
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
48e0: 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  tart of memory h
48f0: 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65  olding result se
4900: 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  t */.  int eDest
4910: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
4920: 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73     /* How to dis
4930: 70 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20  pose of results 
4940: 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d  */.  int iParm =
4950: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 20 20   pDest->iParm;  
4960: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
4970: 6e 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d  nt to disposal m
4980: 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ethod */.  int n
4990: 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20  ResultCol;      
49a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
49b0: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
49c0: 6e 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ns */..  assert(
49d0: 20 76 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45   v );.  if( NEVE
49e0: 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
49f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  ;.  assert( pELi
4a00: 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44 69  st!=0 );.  hasDi
4a10: 73 74 69 6e 63 74 20 3d 20 64 69 73 74 69 6e 63  stinct = distinc
4a20: 74 3e 3d 30 3b 0a 20 20 69 66 28 20 70 4f 72 64  t>=0;.  if( pOrd
4a30: 65 72 42 79 3d 3d 30 20 26 26 20 21 68 61 73 44  erBy==0 && !hasD
4a40: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 63  istinct ){.    c
4a50: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
4a60: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a  iContinue);.  }.
4a70: 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72  .  /* Pull the r
4a80: 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73  equested columns
4a90: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43 6f  ..  */.  if( nCo
4aa0: 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 6e 52  lumn>0 ){.    nR
4ab0: 65 73 75 6c 74 43 6f 6c 20 3d 20 6e 43 6f 6c 75  esultCol = nColu
4ac0: 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  mn;.  }else{.   
4ad0: 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 45   nResultCol = pE
4ae0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  List->nExpr;.  }
4af0: 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 4d  .  if( pDest->iM
4b00: 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 65  em==0 ){.    pDe
4b10: 73 74 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73  st->iMem = pPars
4b20: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
4b30: 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 6e 52 65  Dest->nMem = nRe
4b40: 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 70 50 61  sultCol;.    pPa
4b50: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
4b60: 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65  sultCol;.  }else
4b70: 7b 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  { .    assert( p
4b80: 44 65 73 74 2d 3e 6e 4d 65 6d 3d 3d 6e 52 65 73  Dest->nMem==nRes
4b90: 75 6c 74 43 6f 6c 20 29 3b 0a 20 20 7d 0a 20 20  ultCol );.  }.  
4ba0: 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65 73  regResult = pDes
4bb0: 74 2d 3e 69 4d 65 6d 3b 0a 20 20 69 66 28 20 6e  t->iMem;.  if( n
4bc0: 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20  Column>0 ){.    
4bd0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
4be0: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
4bf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4c00: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
4c10: 73 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65  srcTab, i, regRe
4c20: 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20  sult+i);.    }. 
4c30: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
4c40: 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a  !=SRT_Exists ){.
4c50: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
4c60: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20  stination is an 
4c70: 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72  EXISTS(...) expr
4c80: 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75  ession, the actu
4c90: 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  al.    ** values
4ca0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
4cb0: 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20   SELECT are not 
4cc0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
4cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4ce0: 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
4cf0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  e);.    sqlite3E
4d00: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
4d10: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
4d20: 72 65 67 52 65 73 75 6c 74 2c 20 65 44 65 73 74  regResult, eDest
4d30: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 29 3b 0a 20  ==SRT_Output);. 
4d40: 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 6e   }.  nColumn = n
4d50: 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 2f 2a  ResultCol;..  /*
4d60: 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   If the DISTINCT
4d70: 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65   keyword was pre
4d80: 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45  sent on the SELE
4d90: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  CT statement.  *
4da0: 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68  * and this row h
4db0: 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66  as been seen bef
4dc0: 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ore, then do not
4dd0: 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20   make this row. 
4de0: 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
4df0: 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69  result..  */.  i
4e00: 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29  f( hasDistinct )
4e10: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
4e20: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  List!=0 );.    a
4e30: 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e  ssert( pEList->n
4e40: 45 78 70 72 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b  Expr==nColumn );
4e50: 0a 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63  .    codeDistinc
4e60: 74 28 70 50 61 72 73 65 2c 20 64 69 73 74 69 6e  t(pParse, distin
4e70: 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e  ct, iContinue, n
4e80: 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 65 73 75 6c  Column, regResul
4e90: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64  t);.    if( pOrd
4ea0: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
4eb0: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
4ec0: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
4ed0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 63    }.  }..  if( c
4ee0: 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
4ef0: 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50  mnSelectError(pP
4f00: 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c  arse, pDest, pEL
4f10: 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
4f20: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
4f30: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
4f40: 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
4f50: 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61  s mode, write ea
4f60: 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20  ch query result 
4f70: 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  to the key of th
4f80: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
4f90: 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ** table iParm..
4fa0: 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
4fb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
4fc0: 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63  UND_SELECT.    c
4fd0: 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b  ase SRT_Union: {
4fe0: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
4ff0: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
5000: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
5010: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
5020: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5030: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
5040: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5050: 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  n, r1);.      sq
5060: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5070: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
5080: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
5090: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
50a0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
50b0: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
50c0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
50d0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
50e0: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
50f0: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
5100: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
5110: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
5120: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
5130: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
5140: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
5150: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
5160: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
5170: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
5180: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
5190: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
51a0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
51b0: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67  lete, iParm, reg
51c0: 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29  Result, nColumn)
51d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
51e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
51f0: 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
5200: 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
5210: 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
5220: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5230: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
5240: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
5250: 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  b: {.      int r
5260: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
5270: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
5280: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
5290: 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
52a0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
52b0: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  e( eDest==SRT_Ep
52c0: 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20  hemTab );.      
52d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
52e0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
52f0: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
5300: 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20  Column, r1);.   
5310: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
5320: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
5330: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
5340: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72  , pOrderBy, p, r
5350: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
5360: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20  .        int r2 
5370: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
5380: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
5390: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
53a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
53b0: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32  Rowid, iParm, r2
53c0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
53d0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
53e0: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
53f0: 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
5400: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
5410: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
5420: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
5430: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
5440: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5450: 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r2);.      }.   
5460: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
5470: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
5480: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
5490: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
54a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
54b0: 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
54c0: 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
54d0: 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
54e0: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
54f0: 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a  ..)" construct,.
5500: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
5510: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69  e should be a si
5520: 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65  ngle item on the
5530: 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74   stack.  Write t
5540: 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20  his.    ** item 
5550: 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62  into the set tab
5560: 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61  le with bogus da
5570: 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ta..    */.    c
5580: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
5590: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
55a0: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
55b0: 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73   p->affinity = s
55c0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
55d0: 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b  inity(pEList->a[
55e0: 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d  0].pExpr, pDest-
55f0: 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20  >affinity);.    
5600: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
5610: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
5620: 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75  first glance you
5630: 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20   would think we 
5640: 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f  could optimize o
5650: 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ut the.        *
5660: 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68  * ORDER BY in th
5670: 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68  is case since th
5680: 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69  e order of entri
5690: 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20  es in the set.  
56a0: 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f        ** does no
56b0: 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74  t matter.  But t
56c0: 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20  here might be a 
56d0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e  LIMIT clause, in
56e0: 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a   which.        *
56f0: 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72  * case the order
5700: 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a   does matter */.
5710: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
5720: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
5730: 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52  OrderBy, p, regR
5740: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65  esult);.      }e
5750: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
5760: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
5770: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
5780: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5790: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
57a0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
57b0: 52 65 73 75 6c 74 2c 20 31 2c 20 72 31 2c 20 26  Result, 1, r1, &
57c0: 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  p->affinity, 1);
57d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
57e0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
57f0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
5800: 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20  regResult, 1);. 
5810: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5820: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
5830: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
5840: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
5850: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
5860: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
5870: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5880: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
5890: 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65   /* If any row e
58a0: 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75  xist in the resu
58b0: 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74  lt set, record t
58c0: 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f  hat fact and abo
58d0: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rt..    */.    c
58e0: 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20  ase SRT_Exists: 
58f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5900: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5910: 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72  Integer, 1, iPar
5920: 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  m);.      /* The
5930: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
5940: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
5950: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
5960: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5970: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
5980: 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
5990: 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
59a0: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
59b0: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
59c0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
59d0: 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
59e0: 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
59f0: 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
5a00: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
5a10: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
5a20: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
5a30: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
5a40: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
5a50: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
5a60: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  By ){.        pu
5a70: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
5a80: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
5a90: 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  , regResult);.  
5aa0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5ab0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
5ac0: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
5ad0: 65 67 52 65 73 75 6c 74 2c 20 69 50 61 72 6d 2c  egResult, iParm,
5ae0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20   1);.        /* 
5af0: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
5b00: 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f   will jump out o
5b10: 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  f the loop for u
5b20: 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  s */.      }.   
5b30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5b40: 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
5b50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
5b60: 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f  BQUERY */..    /
5b70: 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74 61 20  * Send the data 
5b80: 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
5b90: 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61  function or to a
5ba0: 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e   subroutine.  In
5bb0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 73 65   the.    ** case
5bc0: 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
5bd0: 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
5be0: 20 69 74 73 65 6c 66 20 69 73 20 72 65 73 70 6f   itself is respo
5bf0: 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a  nsible for.    *
5c00: 2a 20 70 6f 70 70 69 6e 67 20 74 68 65 20 64 61  * popping the da
5c10: 74 61 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ta from the stac
5c20: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  k..    */.    ca
5c30: 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  se SRT_Coroutine
5c40: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f  :.    case SRT_O
5c50: 75 74 70 75 74 3a 20 7b 0a 20 20 20 20 20 20 74  utput: {.      t
5c60: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
5c70: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
5c80: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
5c90: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
5ca0: 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ut );.      if( 
5cb0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
5cc0: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
5cd0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
5ce0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
5cf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5d00: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
5d10: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
5d20: 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20  Column, r1);.   
5d30: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
5d40: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
5d50: 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20 20  erBy, p, r1);.  
5d60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
5d70: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
5d80: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d  se, r1);.      }
5d90: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d  else if( eDest==
5da0: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b  SRT_Coroutine ){
5db0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5dc0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
5dd0: 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
5de0: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Parm);.      }el
5df0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
5e00: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5e10: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72   OP_ResultRow, r
5e20: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5e30: 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
5e40: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
5e50: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
5e60: 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43  e, regResult, nC
5e70: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  olumn);.      }.
5e80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5e90: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
5ea0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
5eb0: 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73  GGER).    /* Dis
5ec0: 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  card the results
5ed0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
5ee0: 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
5ef0: 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20  ments inside.   
5f00: 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20   ** the body of 
5f10: 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20  a TRIGGER.  The 
5f20: 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20  purpose of such 
5f30: 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61  selects is to ca
5f40: 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64  ll.    ** user-d
5f50: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
5f60: 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20   that have side 
5f70: 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20  effects.  We do 
5f80: 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  not care.    ** 
5f90: 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c  about the actual
5fa0: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
5fb0: 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  select..    */. 
5fc0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
5fd0: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
5fe0: 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29  t==SRT_Discard )
5ff0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6000: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
6010: 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
6020: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
6030: 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
6040: 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a  s reached..  */.
6050: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
6060: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
6070: 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 20 20 2f  OrderBy==0 );  /
6080: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
6090: 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 63   ORDER BY, the c
60a0: 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 20  all to.         
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60c0: 20 20 20 2a 2a 20 70 75 73 68 4f 6e 74 6f 53 6f     ** pushOntoSo
60d0: 72 74 65 72 28 29 20 77 6f 75 6c 64 20 68 61 76  rter() would hav
60e0: 65 20 63 6c 65 61 72 65 64 20 70 2d 3e 69 4c 69  e cleared p->iLi
60f0: 6d 69 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  mit */.    sqlit
6100: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6110: 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
6120: 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31  imit, iBreak, -1
6130: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6140: 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73  Given an express
6150: 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61  ion list, genera
6160: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  te a KeyInfo str
6170: 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f  ucture that reco
6180: 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61  rds.** the colla
6190: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
61a0: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
61b0: 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  n in that expres
61c0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
61d0: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
61e0: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
61f0: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
6200: 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  se then the resu
6210: 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f  lting.** KeyInfo
6220: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70   structure is ap
6230: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
6240: 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72  itializing a vir
6250: 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a  tual index to.**
6260: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20   implement that 
6270: 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20  clause.  If the 
6280: 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20  ExprList is the 
6290: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
62a0: 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74  SELECT.** then t
62b0: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
62c0: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
62d0: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
62e0: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a  zing a virtual.*
62f0: 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65  * index to imple
6300: 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20  ment a DISTINCT 
6310: 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  test..**.** Spac
6320: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65  e to hold the Ke
6330: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
6340: 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20 6d  is obtain from m
6350: 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c  alloc.  The call
6360: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
6370: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
6380: 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74  or seeing that t
6390: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
63a0: 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
63b0: 72 65 65 64 2e 20 20 41 64 64 20 74 68 65 20 4b  reed.  Add the K
63c0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
63d0: 20 74 6f 20 74 68 65 20 50 34 20 66 69 65 6c 64   to the P4 field
63e0: 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 75 73   of an opcode us
63f0: 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49 4e 46  ing.** P4_KEYINF
6400: 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74 68 65  O_HANDOFF is the
6410: 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20 64 65   usual way of de
6420: 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73 2e  aling with this.
6430: 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e  .*/.static KeyIn
6440: 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  fo *keyInfoFromE
6450: 78 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a 70  xprList(Parse *p
6460: 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20  Parse, ExprList 
6470: 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69 74  *pList){.  sqlit
6480: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
6490: 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72  >db;.  int nExpr
64a0: 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e  ;.  KeyInfo *pIn
64b0: 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  fo;.  struct Exp
64c0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
64d0: 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e  m;.  int i;..  n
64e0: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  Expr = pList->nE
64f0: 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73  xpr;.  pInfo = s
6500: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
6510: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
6520: 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28 73  Info) + nExpr*(s
6530: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
6540: 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 66  1) );.  if( pInf
6550: 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  o ){.    pInfo->
6560: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
6570: 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  *)&pInfo->aColl[
6580: 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e 66  nExpr];.    pInf
6590: 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36  o->nField = (u16
65a0: 29 6e 45 78 70 72 3b 0a 20 20 20 20 70 49 6e 66  )nExpr;.    pInf
65b0: 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  o->enc = ENC(db)
65c0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 64 62 20  ;.    pInfo->db 
65d0: 3d 20 64 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  = db;.    for(i=
65e0: 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
65f0: 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c  a; i<nExpr; i++,
6600: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
6610: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
6620: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
6630: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
6640: 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
6650: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  >pExpr);.      i
6660: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
6670: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d       pColl = db-
6680: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
6690: 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d    }.      pInfo-
66a0: 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c  >aColl[i] = pCol
66b0: 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  l;.      pInfo->
66c0: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
66d0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
66e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
66f0: 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a  turn pInfo;.}...
6700: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
6710: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
6720: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
6730: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
6740: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
6750: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
6760: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
6770: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
6780: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
6790: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
67a0: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
67b0: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
67c0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
67d0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
67e0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
67f0: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
6800: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
6810: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
6820: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72  eSortTail(.  Par
6830: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
6840: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
6850: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
6860: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
6870: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
6880: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20   */.  Vdbe *v,  
6890: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
68a0: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
68b0: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  is VDBE */.  int
68c0: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f   nColumn,      /
68d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
68e0: 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  mns of data */. 
68f0: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
6900: 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  st /* Write the 
6910: 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68  sorted results h
6920: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
6930: 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69  addrBreak = sqli
6940: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
6950: 28 76 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70  (v);     /* Jump
6960: 20 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f   here to exit lo
6970: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
6980: 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
6990: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
69a0: 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  v);  /* Jump her
69b0: 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65  e for next cycle
69c0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a   */.  int addr;.
69d0: 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e    int iTab;.  in
69e0: 74 20 70 73 65 75 64 6f 54 61 62 20 3d 20 30 3b  t pseudoTab = 0;
69f0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
6a00: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
6a10: 72 42 79 3b 0a 0a 20 20 69 6e 74 20 65 44 65 73  rBy;..  int eDes
6a20: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
6a30: 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  ;.  int iParm = 
6a40: 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 0a 0a 20  pDest->iParm;.. 
6a50: 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69   int regRow;.  i
6a60: 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20 20  nt regRowid;..  
6a70: 69 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79 2d  iTab = pOrderBy-
6a80: 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 72 65 67  >iECursor;.  reg
6a90: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Row = sqlite3Get
6aa0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
6ab0: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
6ac0: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
6ad0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
6ae0: 20 29 7b 0a 20 20 20 20 70 73 65 75 64 6f 54 61   ){.    pseudoTa
6af0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
6b00: 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ++;.    sqlite3V
6b10: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6b20: 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 73 65 75  OpenPseudo, pseu
6b30: 64 6f 54 61 62 2c 20 72 65 67 52 6f 77 2c 20 6e  doTab, regRow, n
6b40: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 72 65 67  Column);.    reg
6b50: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 7d 65 6c  Rowid = 0;.  }el
6b60: 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64  se{.    regRowid
6b70: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
6b80: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
6b90: 7d 0a 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73  }.  addr = 1 + s
6ba0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6bb0: 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61  (v, OP_Sort, iTa
6bc0: 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  b, addrBreak);. 
6bd0: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
6be0: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
6bf0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
6c00: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
6c10: 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65 72 42  n, iTab, pOrderB
6c20: 79 2d 3e 6e 45 78 70 72 20 2b 20 31 2c 20 72 65  y->nExpr + 1, re
6c30: 67 52 6f 77 29 3b 0a 20 20 73 77 69 74 63 68 28  gRow);.  switch(
6c40: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61   eDest ){.    ca
6c50: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
6c60: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
6c70: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  Tab: {.      tes
6c80: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
6c90: 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  T_Table );.     
6ca0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
6cb0: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
6cc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6cd0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6ce0: 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c  NewRowid, iParm,
6cf0: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
6d00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6d10: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
6d20: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c  , iParm, regRow,
6d30: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
6d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6d50: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
6d60: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62  APPEND);.      b
6d70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
6d80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6d90: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
6da0: 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
6db0: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
6dc0: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
6dd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
6de0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
6df0: 64 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65  d, regRow, 1, re
6e00: 67 52 6f 77 69 64 2c 20 26 70 2d 3e 61 66 66 69  gRowid, &p->affi
6e10: 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
6e20: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
6e30: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
6e40: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31  Parse, regRow, 1
6e50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6e60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6e70: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
6e80: 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  m, regRowid);.  
6e90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6ea0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
6eb0: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
6ec0: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
6ed0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
6ee0: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
6ef0: 65 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d  e, regRow, iParm
6f00: 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
6f10: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
6f20: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
6f30: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
6f40: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
6f50: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
6f60: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
6f70: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 61 73   int i;.      as
6f80: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
6f90: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
6fa0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
6fb0: 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63 61  ); .      testca
6fc0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  se( eDest==SRT_O
6fd0: 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 74  utput );.      t
6fe0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
6ff0: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
7000: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
7010: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
7020: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7030: 20 72 65 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e   regRow!=pDest->
7040: 69 4d 65 6d 2b 69 20 29 3b 0a 20 20 20 20 20 20  iMem+i );.      
7050: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7060: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
7070: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 69 2c 20  , pseudoTab, i, 
7080: 70 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 29 3b 0a  pDest->iMem+i);.
7090: 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30          if( i==0
70a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
70b0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
70c0: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41  5(v, OPFLAG_CLEA
70d0: 52 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20  RCACHE);.       
70e0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
70f0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
7100: 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
7110: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7120: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
7130: 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d  Row, pDest->iMem
7140: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
7150: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
7160: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
7170: 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  ge(pParse, pDest
7180: 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29  ->iMem, nColumn)
7190: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
71a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
71b0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
71c0: 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50 61  ield, pDest->iPa
71d0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
71e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
71f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
7200: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
7210: 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73  se, regRow);.  s
7220: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
7230: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
7240: 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 4c 49  Rowid);..  /* LI
7250: 4d 49 54 20 68 61 73 20 62 65 65 6e 20 69 6d 70  MIT has been imp
7260: 6c 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20  lemented by the 
7270: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29  pushOntoSorter()
7280: 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20   routine..  */. 
7290: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 4c 69 6d   assert( p->iLim
72a0: 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54  it==0 );..  /* T
72b0: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65  he bottom of the
72c0: 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
72d0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
72e0: 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74  abel(v, addrCont
72f0: 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  inue);.  sqlite3
7300: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7310: 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
7320: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
7330: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
7340: 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69   addrBreak);.  i
7350: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
7360: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
7370: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
7380: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7390: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
73a0: 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29  e, pseudoTab, 0)
73b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
73c0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
73d0: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  to a string cont
73e0: 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c  aining the 'decl
73f0: 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66  aration type' of
7400: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
7410: 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74  on pExpr. The st
7420: 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61  ring may be trea
7430: 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79  ted as static by
7440: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
7450: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
7460: 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65  on type is the e
7470: 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65  xact datatype de
7480: 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74  finition extract
7490: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f  ed from the.** o
74a0: 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54  riginal CREATE T
74b0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
74c0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
74d0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68   is a column. Th
74e0: 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e  e.** declaration
74f0: 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49   type for a ROWI
7500: 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47  D field is INTEG
7510: 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e  ER. Exactly when
7520: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   an expression.*
7530: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
7540: 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  a column can be 
7550: 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70  complex in the p
7560: 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75  resence of subqu
7570: 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65  eries. The.** re
7580: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
7590: 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  ion in all of th
75a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45  e following SELE
75b0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73  CT statements is
75c0: 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20   .** considered 
75d0: 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73  a column by this
75e0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
75f0: 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52     SELECT col FR
7600: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
7610: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
7620: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
7630: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
7640: 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  l FROM tbl);.** 
7650: 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f    SELECT abc FRO
7660: 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53  M (SELECT col AS
7670: 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   abc FROM tbl);.
7680: 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  ** .** The decla
7690: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
76a0: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  any expression o
76b0: 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75  ther than a colu
76c0: 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  mn is NULL..*/.s
76d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
76e0: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20 20   *columnType(.  
76f0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
7700: 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  , .  Expr *pExpr
7710: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
7720: 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20 63  *pzOriginDb,.  c
7730: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
7740: 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73 74  iginTab,.  const
7750: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e   char **pzOrigin
7760: 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  Col.){.  char co
7770: 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  nst *zType = 0;.
7780: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
7790: 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20 63  riginDb = 0;.  c
77a0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
77b0: 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61  inTab = 0;.  cha
77c0: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e  r const *zOrigin
77d0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  Col = 0;.  int j
77e0: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45  ;.  if( NEVER(pE
77f0: 78 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e  xpr==0) || pNC->
7800: 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65  pSrcList==0 ) re
7810: 74 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74 63  turn 0;..  switc
7820: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
7830: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
7840: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
7850: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
7860: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
7870: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
7880: 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  n. Locate the ta
7890: 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ble the column i
78a0: 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a  s being.      **
78b0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
78c0: 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70  in NameContext.p
78d0: 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61  SrcList. This ta
78e0: 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a  ble may be real.
78f0: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
7900: 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62  e table or a sub
7910: 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  query..      */.
7920: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
7930: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
7940: 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63    /* Table struc
7950: 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65  ture column is e
7960: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
7970: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
7980: 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  S = 0;          
7990: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65     /* Select the
79a0: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
79b0: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
79c0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
79d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f  xpr->iColumn;  /
79e0: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
79f0: 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20  n in pTab */.   
7a00: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
7a10: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
7a20: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
7a30: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
7a40: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
7a50: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e  .      while( pN
7a60: 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20  C && !pTab ){.  
7a70: 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
7a80: 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  TabList = pNC->p
7a90: 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  SrcList;.       
7aa0: 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c   for(j=0;j<pTabL
7ab0: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
7ac0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
7ad0: 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62  sor!=pExpr->iTab
7ae0: 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20  le;j++);.       
7af0: 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d   if( j<pTabList-
7b00: 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20  >nSrc ){.       
7b10: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
7b20: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
7b30: 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54           pS = pT
7b40: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65  abList->a[j].pSe
7b50: 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  lect;.        }e
7b60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
7b70: 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b  NC = pNC->pNext;
7b80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7b90: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54   }..      if( pT
7ba0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
7bb0: 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c   /* At one time,
7bc0: 20 63 6f 64 65 20 73 75 63 68 20 61 73 20 22 53   code such as "S
7bd0: 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74  ELECT new.x" wit
7be0: 68 69 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f  hin a trigger wo
7bf0: 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  uld.        ** c
7c00: 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74  ause this condit
7c10: 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e  ion to run.  Sin
7c20: 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65  ce then, we have
7c30: 20 72 65 73 74 72 75 63 74 75 72 65 64 20 68 6f   restructured ho
7c40: 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69  w.        ** tri
7c50: 67 67 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e  gger code is gen
7c60: 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68  erated and so th
7c70: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  is condition is 
7c80: 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20  no longer .     
7c90: 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20     ** possible. 
7ca0: 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20  However, it can 
7cb0: 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f  still be true fo
7cc0: 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b  r statements lik
7cd0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
7ce0: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20   following:.    
7cf0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
7d00: 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
7d10: 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29   t1(col INTEGER)
7d20: 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  ;.        **   S
7d30: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74 31  ELECT (SELECT t1
7d40: 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20  .col) FROM FROM 
7d50: 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  t1;.        **. 
7d60: 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63         ** when c
7d70: 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63  olumnType() is c
7d80: 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70  alled on the exp
7d90: 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22  ression "t1.col"
7da0: 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20   in the .       
7db0: 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20   ** sub-select. 
7dc0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 65  In this case, se
7dd0: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  t the column typ
7de0: 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a  e to NULL, even.
7df0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67          ** thoug
7e00: 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c  h it should real
7e10: 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e  ly be "INTEGER".
7e20: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
7e30: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
7e40: 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73  ot a problem, as
7e50: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
7e60: 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20   of "t1.col" is 
7e70: 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  never.        **
7e80: 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75   used. When colu
7e90: 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c  mnType() is call
7ea0: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ed on the expres
7eb0: 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  sion .        **
7ec0: 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c   "(SELECT t1.col
7ed0: 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20  )", the correct 
7ee0: 74 79 70 65 20 69 73 20 72 65 74 75 72 6e 65 64  type is returned
7ef0: 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c   (see the TK_SEL
7f00: 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ECT.        ** b
7f10: 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f  ranch below.  */
7f20: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
7f30: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
7f40: 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20 70  ssert( pTab && p
7f50: 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62  Expr->pTab==pTab
7f60: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
7f70: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
7f80: 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63  he "table" is ac
7f90: 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c  tually a sub-sel
7fa0: 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e  ect or a view in
7fb0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
7fc0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
7fd0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
7fe0: 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ent. Return the 
7ff0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
8000: 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20   and origin.    
8010: 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20      ** data for 
8020: 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63  the result-set c
8030: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62  olumn of the sub
8040: 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20  -select..       
8050: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
8060: 69 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59  iCol>=0 && ALWAY
8070: 53 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73  S(iCol<pS->pELis
8080: 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
8090: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f         /* If iCo
80a0: 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  l is less than z
80b0: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ero, then the ex
80c0: 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74  pression request
80d0: 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
80e0: 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  ** rowid of the 
80f0: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
8100: 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73  ew. This express
8110: 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65  ion is legal (se
8120: 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
8130: 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e  test case misc2.
8140: 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73  2.2) - it always
8150: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
8160: 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  LL..          */
8170: 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43  .          NameC
8180: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
8190: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
81a0: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43  pS->pEList->a[iC
81b0: 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ol].pExpr;.     
81c0: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
81d0: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
81e0: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78          sNC.pNex
81f0: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20  t = pNC;.       
8200: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
8210: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
8220: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63         zType = c
8230: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
8240: 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26  p, &zOriginDb, &
8250: 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72  zOriginTab, &zOr
8260: 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20  iginCol); .     
8270: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
8280: 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61 62   if( ALWAYS(pTab
8290: 2d 3e 70 53 63 68 65 6d 61 29 20 29 7b 0a 20 20  ->pSchema) ){.  
82a0: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20        /* A real 
82b0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
82c0: 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a   assert( !pS );.
82d0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
82e0: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
82f0: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
8300: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
8310: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
8320: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
8330: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ) );.        if(
8340: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
8350: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
8360: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
8370: 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22    zOriginCol = "
8380: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20  rowid";.        
8390: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
83a0: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
83b0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
83c0: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
83d0: 69 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43  inCol = pTab->aC
83e0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
83f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8400: 20 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 70    zOriginTab = p
8410: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
8420: 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61      if( pNC->pPa
8430: 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rse ){.         
8440: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
8450: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
8460: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  pNC->pParse->db,
8470: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
8480: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
8490: 69 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72  inDb = pNC->pPar
84a0: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
84b0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
84c0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
84d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
84e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
84f0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
8500: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
8510: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
8520: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62  ression is a sub
8530: 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20  -select. Return 
8540: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
8550: 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  type and.      *
8560: 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f  * origin info fo
8570: 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c  r the single col
8580: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
8590: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
85a0: 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ECT.      ** sta
85b0: 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  tement..      */
85c0: 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  .      NameConte
85d0: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65  xt sNC;.      Se
85e0: 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72  lect *pS = pExpr
85f0: 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
8600: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
8610: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
8620: 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
8630: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
8640: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
8650: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
8660: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
8670: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
8680: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
8690: 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73  .      sNC.pPars
86a0: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
86b0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63  .      zType = c
86c0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
86d0: 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26  p, &zOriginDb, &
86e0: 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72  zOriginTab, &zOr
86f0: 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20  iginCol); .     
8700: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
8710: 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 69 66  ndif.  }.  .  if
8720: 28 20 70 7a 4f 72 69 67 69 6e 44 62 20 29 7b 0a  ( pzOriginDb ){.
8730: 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72      assert( pzOr
8740: 69 67 69 6e 54 61 62 20 26 26 20 70 7a 4f 72 69  iginTab && pzOri
8750: 67 69 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70  ginCol );.    *p
8760: 7a 4f 72 69 67 69 6e 44 62 20 3d 20 7a 4f 72 69  zOriginDb = zOri
8770: 67 69 6e 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  ginDb;.    *pzOr
8780: 69 67 69 6e 54 61 62 20 3d 20 7a 4f 72 69 67 69  iginTab = zOrigi
8790: 6e 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  nTab;.    *pzOri
87a0: 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69 67 69 6e  ginCol = zOrigin
87b0: 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Col;.  }.  retur
87c0: 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zType;.}../*.*
87d0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
87e0: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
87f0: 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63 6c  he VDBE the decl
8800: 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66  aration types of
8810: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
8820: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
8830: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
8840: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
8850: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
8860: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
8870: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
8880: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
8890: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  t,  /* List of t
88a0: 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  ables */.  ExprL
88b0: 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
88c0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
88d0: 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  fining the resul
88e0: 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e  t set */.){.#ifn
88f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8900: 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20  DECLTYPE.  Vdbe 
8910: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
8920: 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e  be;.  int i;.  N
8930: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
8940: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
8950: 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43   pTabList;.  sNC
8960: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
8970: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
8980: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
8990: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
89a0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
89b0: 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Expr;.    const 
89c0: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66  char *zType;.#if
89d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
89e0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
89f0: 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  A.    const char
8a00: 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20   *zOrigDb = 0;. 
8a10: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
8a20: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20  OrigTab = 0;.   
8a30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
8a40: 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a  igCol = 0;.    z
8a50: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
8a60: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
8a70: 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20  gDb, &zOrigTab, 
8a80: 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20  &zOrigCol);..   
8a90: 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73   /* The vdbe mus
8aa0: 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63  t make its own c
8ab0: 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
8ac0: 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72  n-type and other
8ad0: 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20   .    ** column 
8ae0: 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73  specific strings
8af0: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63  , in case the sc
8b00: 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65  hema is reset be
8b10: 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  fore this.    **
8b20: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
8b30: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   is deleted..   
8b40: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
8b50: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8b60: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41   i, COLNAME_DATA
8b70: 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53  BASE, zOrigDb, S
8b80: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
8b90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8ba0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8bb0: 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c  , COLNAME_TABLE,
8bc0: 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54   zOrigTab, SQLIT
8bd0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
8be0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8bf0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8c00: 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f  LNAME_COLUMN, zO
8c10: 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  rigCol, SQLITE_T
8c20: 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65  RANSIENT);.#else
8c30: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
8c40: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
8c50: 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69   0, 0, 0);.#endi
8c60: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  f.    sqlite3Vdb
8c70: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8c80: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59  , COLNAME_DECLTY
8c90: 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54  PE, zType, SQLIT
8ca0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
8cb0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8cc0: 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
8cd0: 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   */.}../*.** Gen
8ce0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
8cf0: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
8d00: 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  BE the names of 
8d10: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
8d20: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54  e result set.  T
8d30: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
8d40: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69  is used to provi
8d50: 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b  de the.** azCol[
8d60: 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  ] values in the 
8d70: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  callback..*/.sta
8d80: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
8d90: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20  eColumnNames(.  
8da0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8db0: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
8dc0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
8dd0: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
8de0: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
8df0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
8e00: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
8e10: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
8e20: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
8e30: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
8e40: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
8e50: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
8e60: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8e70: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
8e80: 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74  fullNames, short
8e90: 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20  Names;..#ifndef 
8ea0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
8eb0: 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  AIN.  /* If this
8ec0: 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20   is an EXPLAIN, 
8ed0: 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a  skip this step *
8ee0: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
8ef0: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72  explain ){.    r
8f00: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
8f10: 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  f..  if( pParse-
8f20: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20  >colNamesSet || 
8f30: 4e 45 56 45 52 28 76 3d 3d 30 29 20 7c 7c 20 64  NEVER(v==0) || d
8f40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8f50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72  ) return;.  pPar
8f60: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
8f70: 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73  = 1;.  fullNames
8f80: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
8f90: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
8fa0: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74  mes)!=0;.  short
8fb0: 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  Names = (db->fla
8fc0: 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
8fd0: 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  tColNames)!=0;. 
8fe0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
8ff0: 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74  umCols(v, pEList
9000: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28  ->nExpr);.  for(
9010: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
9020: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
9030: 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d  Expr *p;.    p =
9040: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
9050: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  xpr;.    if( NEV
9060: 45 52 28 70 3d 3d 30 29 20 29 20 63 6f 6e 74 69  ER(p==0) ) conti
9070: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c  nue;.    if( pEL
9080: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
9090: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
90a0: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
90b0: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
90c0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
90d0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
90e0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
90f0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
9100: 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  NT);.    }else i
9110: 66 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( (p->op==TK_CO
9120: 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  LUMN || p->op==T
9130: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26  K_AGG_COLUMN) &&
9140: 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20   pTabList ){.   
9150: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
9160: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
9170: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  ;.      int iCol
9180: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
9190: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c       for(j=0; AL
91a0: 57 41 59 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d  WAYS(j<pTabList-
91b0: 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20  >nSrc); j++){.  
91c0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69        if( pTabLi
91d0: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
91e0: 3d 3d 70 2d 3e 69 54 61 62 6c 65 20 29 20 62 72  ==p->iTable ) br
91f0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
9200: 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61     assert( j<pTa
9210: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
9220: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
9230: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
9240: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
9250: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
9260: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73  >iPKey;.      as
9270: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
9280: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
9290: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
92a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
92b0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  <0 ){.        zC
92c0: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
92d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
92e0: 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     zCol = pTab->
92f0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
9300: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9310: 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20  if( !shortNames 
9320: 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b  && !fullNames ){
9330: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9340: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
9350: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
9360: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
9370: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
9380: 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  db, pEList->a[i]
9390: 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f  .zSpan), SQLITE_
93a0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
93b0: 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61  }else if( fullNa
93c0: 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63  mes ){.        c
93d0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
93e0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
93f0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
9400: 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  b, "%s.%s", pTab
9410: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a  ->zName, zCol);.
9420: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9430: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
9440: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
9450: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
9460: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
9470: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
9480: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
9490: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
94a0: 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53  ME_NAME, zCol, S
94b0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
94c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
94d0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
94e0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
94f0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
9500: 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  AME, .          
9510: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
9520: 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  db, pEList->a[i]
9530: 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f  .zSpan), SQLITE_
9540: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a  DYNAMIC);.    }.
9550: 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f    }.  generateCo
9560: 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
9570: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
9580: 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  st);.}..#ifndef 
9590: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
95a0: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
95b0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
95c0: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
95d0: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
95e0: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
95f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
9600: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
9610: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
9620: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
9630: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
9640: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
9650: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
9660: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9670: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
9680: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
9690: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
96a0: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
96b0: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
96c0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
96d0: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
96e0: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
96f0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
9700: 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn z;.}.#endif 
9710: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
9720: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
9730: 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  /../*.** Given a
9740: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
9750: 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72 65  ist (which is re
9760: 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66  ally the list of
9770: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
9780: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65  that form the re
9790: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
97a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20  LECT statement) 
97b0: 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69  compute appropri
97c0: 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61  ate.** column na
97d0: 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20  mes for a table 
97e0: 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20  that would hold 
97f0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
9800: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  ist..**.** All c
9810: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c  olumn names will
9820: 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a   be unique..**.*
9830: 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  * Only the colum
9840: 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70  n names are comp
9850: 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54  uted.  Column.zT
9860: 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c  ype, Column.zCol
9870: 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  l,.** and other 
9880: 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e  fields of Column
9890: 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
98a0: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
98b0: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
98c0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
98d0: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
98e0: 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e  curs,.** store N
98f0: 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e  ULL in *paCol an
9900: 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e  d 0 in *pnCol an
9910: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
9920: 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63  NOMEM..*/.static
9930: 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75 6d   int selectColum
9940: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a  nsFromExprList(.
9950: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
9970: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9980: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
9990: 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70  st,       /* Exp
99a0: 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63  r list from whic
99b0: 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75  h to derive colu
99c0: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e  mn names */.  in
99d0: 74 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20  t *pnCol,       
99e0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
99f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
9a00: 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43  umns here */.  C
9a10: 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20  olumn **paCol   
9a20: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
9a30: 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c  the new column l
9a40: 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ist here */.){. 
9a50: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9a60: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
9a70: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
9a80: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ion */.  int i, 
9a90: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
9aa0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
9ab0: 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63  nters */.  int c
9ac0: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
9ad0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
9ae0: 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68  added to make th
9af0: 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f  e name unique */
9b00: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c  .  Column *aCol,
9b10: 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f   *pCol;        /
9b20: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
9b30: 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  er result column
9b40: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  s */.  int nCol;
9b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9b70: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
9b80: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45  esult set */.  E
9b90: 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  xpr *p;         
9ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
9bb0: 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20 73  pression for a s
9bc0: 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c  ingle result col
9bd0: 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  umn */.  char *z
9be0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
9bf0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
9c00: 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  ame */.  int nNa
9c10: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
9c20: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
9c30: 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20  name in zName[] 
9c40: 2a 2f 0a 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e  */..  *pnCol = n
9c50: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
9c60: 78 70 72 3b 0a 20 20 61 43 6f 6c 20 3d 20 2a 70  xpr;.  aCol = *p
9c70: 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62  aCol = sqlite3Db
9c80: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
9c90: 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e  izeof(aCol[0])*n
9ca0: 43 6f 6c 29 3b 0a 20 20 69 66 28 20 61 43 6f 6c  Col);.  if( aCol
9cb0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
9cc0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 66 6f 72  ITE_NOMEM;.  for
9cd0: 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b  (i=0, pCol=aCol;
9ce0: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43   i<nCol; i++, pC
9cf0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65  ol++){.    /* Ge
9d00: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  t an appropriate
9d10: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f   name for the co
9d20: 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lumn.    */.    
9d30: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
9d40: 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  .pExpr;.    asse
9d50: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30  rt( p->pRight==0
9d60: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
9d70: 72 74 79 28 70 2d 3e 70 52 69 67 68 74 2c 20 45  rty(p->pRight, E
9d80: 50 5f 49 6e 74 56 61 6c 75 65 29 0a 20 20 20 20  P_IntValue).    
9d90: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
9da0: 3e 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65  >pRight->u.zToke
9db0: 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68  n==0 || p->pRigh
9dc0: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d  t->u.zToken[0]!=
9dd0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e  0 );.    if( (zN
9de0: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
9df0: 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  i].zName)!=0 ){.
9e00: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
9e10: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
9e20: 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70  an "AS <name>" p
9e30: 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65  hrase, use <name
9e40: 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  > as the name */
9e50: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
9e60: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
9e70: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b, zName);.    }
9e80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
9e90: 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20   *pColExpr = p; 
9ea0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
9eb0: 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 72  on that is the r
9ec0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  esult column nam
9ed0: 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65  e */.      Table
9ee0: 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
9ef0: 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61  /* Table associa
9f00: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 65 78  ted with this ex
9f10: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
9f20: 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70    while( pColExp
9f30: 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 20  r->op==TK_DOT ) 
9f40: 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45  pColExpr = pColE
9f50: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
9f60: 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d     if( pColExpr-
9f70: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
9f80: 26 20 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70  & ALWAYS(pColExp
9f90: 72 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  r->pTab!=0) ){. 
9fa0: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f         /* For co
9fb0: 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f  lumns use the co
9fc0: 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a  lumn name name *
9fd0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  /.        int iC
9fe0: 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69  ol = pColExpr->i
9ff0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
a000: 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d  pTab = pColExpr-
a010: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69  >pTab;.        i
a020: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
a030: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
a040: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a050: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
a060: 62 2c 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20  b, "%s",.       
a070: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d            iCol>=
a080: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
a090: 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f  Col].zName : "ro
a0a0: 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  wid");.      }el
a0b0: 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d  se if( pColExpr-
a0c0: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
a0d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
a0e0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a0f0: 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  ColExpr, EP_IntV
a100: 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
a110: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
a120: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
a130: 2c 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54  , pColExpr->u.zT
a140: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
a150: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55  se{.        /* U
a160: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  se the original 
a170: 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75  text of the colu
a180: 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73  mn expression as
a190: 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   its name */.   
a1a0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
a1b0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
a1c0: 22 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  "%s", pEList->a[
a1d0: 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20  i].zSpan);.     
a1e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
a1f0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
a200: 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
a210: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
a220: 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
a230: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
a240: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f  Make sure the co
a250: 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69  lumn name is uni
a260: 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d  que.  If the nam
a270: 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c  e is not unique,
a280: 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61  .    ** append a
a290: 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20   integer to the 
a2a0: 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20  name so that it 
a2b0: 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a  becomes unique..
a2c0: 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65      */.    nName
a2d0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
a2e0: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66  30(zName);.    f
a2f0: 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b  or(j=cnt=0; j<i;
a300: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
a310: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
a320: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a  aCol[j].zName, z
a330: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
a340: 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61      char *zNewNa
a350: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  me;.        zNam
a360: 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20  e[nName] = 0;.  
a370: 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d        zNewName =
a380: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
a390: 64 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61  db, "%s:%d", zNa
a3a0: 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20  me, ++cnt);.    
a3b0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
a3c0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
a3d0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e        zName = zN
a3e0: 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  ewName;.        
a3f0: 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  j = -1;.        
a400: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62  if( zName==0 ) b
a410: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
a420: 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e    }.    pCol->zN
a430: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d  ame = zName;.  }
a440: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
a450: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66  cFailed ){.    f
a460: 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b  or(j=0; j<i; j++
a470: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a480: 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b  DbFree(db, aCol[
a490: 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  j].zName);.    }
a4a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
a4b0: 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20  ee(db, aCol);.  
a4c0: 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20    *paCol = 0;.  
a4d0: 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20    *pnCol = 0;.  
a4e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a4f0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74  NOMEM;.  }.  ret
a500: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
a510: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65  ../*.** Add type
a520: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69   and collation i
a530: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20  nformation to a 
a540: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65  column list base
a550: 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54  d on.** a SELECT
a560: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a   statement..** .
a570: 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  ** The column li
a580: 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61  st presumably ca
a590: 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f  me from selectCo
a5a0: 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70  lumnNamesFromExp
a5b0: 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20  rList()..** The 
a5c0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20  column list has 
a5d0: 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20  only names, not 
a5e0: 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69  types or collati
a5f0: 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ons.  This.** ro
a600: 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75  utine goes throu
a610: 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65 20  gh and adds the 
a620: 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74  types and collat
a630: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ions..**.** This
a640: 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65   routine require
a650: 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74  s that all ident
a660: 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53 45  ifiers in the SE
a670: 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  LECT.** statemen
a680: 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a  t be resolved..*
a690: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
a6a0: 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
a6b0: 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20  eAndCollation(. 
a6c0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
a6d0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
a6e0: 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20  g contexts */.  
a6f0: 69 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20  int nCol,       
a700: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a710: 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  of columns */.  
a720: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 20 20  Column *aCol,   
a730: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
a740: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 53 65   columns */.  Se
a750: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
a760: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73      /* SELECT us
a770: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
a780: 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74  types and collat
a790: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ions */.){.  sql
a7a0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
a7b0: 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e  e->db;.  NameCon
a7c0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75  text sNC;.  Colu
a7d0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c  mn *pCol;.  Coll
a7e0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
a7f0: 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a  t i;.  Expr *p;.
a800: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
a810: 74 5f 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73  t_item *a;..  as
a820: 73 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30  sert( pSelect!=0
a830: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
a840: 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
a850: 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21   & SF_Resolved)!
a860: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
a870: 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70  nCol==pSelect->p
a880: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20  EList->nExpr || 
a890: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a8a0: 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   );.  if( db->ma
a8b0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
a8c0: 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  urn;.  memset(&s
a8d0: 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
a8e0: 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  C));.  sNC.pSrcL
a8f0: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
a900: 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65  Src;.  a = pSele
a910: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  ct->pEList->a;. 
a920: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61   for(i=0, pCol=a
a930: 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  Col; i<nCol; i++
a940: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70  , pCol++){.    p
a950: 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
a960: 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d     pCol->zType =
a970: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
a980: 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28  (db, columnType(
a990: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
a9a0: 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66  ));.    pCol->af
a9b0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
a9c0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b  ExprAffinity(p);
a9d0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61  .    if( pCol->a
a9e0: 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f  ffinity==0 ) pCo
a9f0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
aa00: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
aa10: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
aa20: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
aa30: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  arse, p);.    if
aa40: 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
aa50: 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73   pCol->zColl = s
aa60: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
aa70: 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  b, pColl->zName)
aa80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
aa90: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c  *.** Given a SEL
aaa0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67  ECT statement, g
aab0: 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20  enerate a Table 
aac0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
aad0: 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20  escribes.** the 
aae0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
aaf0: 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61  at SELECT..*/.Ta
ab00: 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75  ble *sqlite3Resu
ab10: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61  ltSetOfSelect(Pa
ab20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
ab30: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
ab40: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
ab50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
ab60: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
ab70: 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73  savedFlags;..  s
ab80: 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e  avedFlags = db->
ab90: 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  flags;.  db->fla
aba0: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75  gs &= ~SQLITE_Fu
abb0: 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62  llColNames;.  db
abc0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
abd0: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b  E_ShortColNames;
abe0: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
abf0: 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65  Prep(pParse, pSe
ac00: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
ac10: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
ac20: 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65  eturn 0;.  while
ac30: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
ac40: 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53  r ) pSelect = pS
ac50: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  elect->pPrior;. 
ac60: 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76   db->flags = sav
ac70: 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20  edFlags;.  pTab 
ac80: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
ac90: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
aca0: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
acb0: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
acc0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
acd0: 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52 65  /* The sqlite3Re
ace0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
acf0: 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e  ) is only used n
ad00: 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20   contexts where 
ad10: 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69  lookaside.  ** i
ad20: 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
ad30: 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b  assert( db->look
ad40: 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d  aside.bEnabled==
ad50: 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65  0 );.  pTab->nRe
ad60: 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a  f = 1;.  pTab->z
ad70: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62  Name = 0;.  pTab
ad80: 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30 30 30  ->nRowEst = 1000
ad90: 30 30 30 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c  000;.  selectCol
ada0: 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
adb0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
adc0: 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
add0: 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
ade0: 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64  ol);.  selectAdd
adf0: 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
ae00: 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  lation(pParse, p
ae10: 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d  Tab->nCol, pTab-
ae20: 3e 61 43 6f 6c 2c 20 70 53 65 6c 65 63 74 29 3b  >aCol, pSelect);
ae30: 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d  .  pTab->iPKey =
ae40: 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   -1;.  if( db->m
ae50: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
ae60: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
ae70: 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b  Table(db, pTab);
ae80: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
ae90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62   }.  return pTab
aea0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
aeb0: 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69   VDBE for the gi
aec0: 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65  ven parser conte
aed0: 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  xt.  Create a ne
aee0: 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
aef0: 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  ry..** If an err
af00: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
af10: 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65  n NULL and leave
af20: 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50   a message in pP
af30: 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73  arse..*/.Vdbe *s
af40: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61  qlite3GetVdbe(Pa
af50: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
af60: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
af70: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76  ->pVdbe;.  if( v
af80: 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70  ==0 ){.    v = p
af90: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73  Parse->pVdbe = s
afa0: 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65  qlite3VdbeCreate
afb0: 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 23 69  (pParse->db);.#i
afc0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
afd0: 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28 20  T_TRACE.    if( 
afe0: 76 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  v ){.      sqlit
aff0: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
b000: 4f 50 5f 54 72 61 63 65 29 3b 0a 20 20 20 20 7d  OP_Trace);.    }
b010: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65  .#endif.  }.  re
b020: 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn v;.}.../*.*
b030: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c  * Compute the iL
b040: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
b050: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53   fields of the S
b060: 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74  ELECT based on t
b070: 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64  he.** pLimit and
b080: 20 70 4f 66 66 73 65 74 20 65 78 70 72 65 73 73   pOffset express
b090: 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e  ions.  pLimit an
b0a0: 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74  d pOffset hold t
b0b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  he expressions.*
b0c0: 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  * that appear in
b0d0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
b0e0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65  L statement afte
b0f0: 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  r the LIMIT and 
b100: 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72  OFFSET.** keywor
b110: 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20  ds.  Or NULL if 
b120: 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61  those keywords a
b130: 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d  re omitted. iLim
b140: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a  it and iOffset .
b150: 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67  ** are the integ
b160: 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  er memory regist
b170: 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63  er numbers for c
b180: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20  ounters used to 
b190: 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20  compute .** the 
b1a0: 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
b1b0: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
b1c0: 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f  o limit and/or o
b1d0: 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20  ffset, then .** 
b1e0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
b1f0: 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e  et are negative.
b200: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
b210: 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20  ine changes the 
b220: 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74  values of iLimit
b230: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c   and iOffset onl
b240: 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20  y if.** a limit 
b250: 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66  or offset is def
b260: 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61  ined by pLimit a
b270: 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69  nd pOffset.  iLi
b280: 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73  mit and.** iOffs
b290: 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  et should have b
b2a0: 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70  een preset to ap
b2b0: 70 72 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c  propriate defaul
b2c0: 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75  t values.** (usu
b2d0: 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77  ally but not alw
b2e0: 61 79 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f  ays -1) prior to
b2f0: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
b300: 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69  utine..** Only i
b310: 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70  f pLimit!=0 or p
b320: 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65  Offset!=0 do the
b330: 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73   limit registers
b340: 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65   get.** redefine
b350: 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c  d.  The UNION AL
b360: 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20  L operator uses 
b370: 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f  this property to
b380: 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65   force.** the re
b390: 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  use of the same 
b3a0: 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
b3b0: 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73   registers acros
b3c0: 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45  s multiple.** SE
b3d0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
b3e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b3f0: 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
b400: 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61  sters(Parse *pPa
b410: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
b420: 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56  int iBreak){.  V
b430: 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e  dbe *v = 0;.  in
b440: 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  t iLimit = 0;.  
b450: 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69  int iOffset;.  i
b460: 6e 74 20 61 64 64 72 31 2c 20 6e 3b 0a 20 20 69  nt addr1, n;.  i
b470: 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72  f( p->iLimit ) r
b480: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20  eturn;..  /* .  
b490: 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c  ** "LIMIT -1" al
b4a0: 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72  ways shows all r
b4b0: 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73  ows.  There is s
b4c0: 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76  ome.  ** contrav
b4d0: 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20  ersy about what 
b4e0: 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
b4f0: 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a  vior should be..
b500: 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74    ** The current
b510: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
b520: 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49  interprets "LIMI
b530: 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a  T 0" to mean.  *
b540: 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a  * no rows..  */.
b550: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
b560: 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
b570: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
b580: 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  ffset==0 || p->p
b590: 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 66  Limit!=0 );.  if
b5a0: 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ( p->pLimit ){. 
b5b0: 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69     p->iLimit = i
b5c0: 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65  Limit = ++pParse
b5d0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20  ->nMem;.    v = 
b5e0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
b5f0: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
b600: 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
b610: 74 75 72 6e 3b 20 20 2f 2a 20 56 44 42 45 20 73  turn;  /* VDBE s
b620: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
b630: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
b640: 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  d */.    if( sql
b650: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
b660: 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29  r(p->pLimit, &n)
b670: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b680: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b690: 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c  P_Integer, n, iL
b6a0: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62  imit);.      Vdb
b6b0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
b6c0: 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
b6d0: 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
b6e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b6f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b700: 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61  P_Goto, 0, iBrea
b710: 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  k);.      }else{
b720: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
b730: 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 28 64 6f  nSelectRow > (do
b740: 75 62 6c 65 29 6e 20 29 20 70 2d 3e 6e 53 65 6c  uble)n ) p->nSel
b750: 65 63 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65  ectRow = (double
b760: 29 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )n;.      }.    
b770: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
b780: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
b790: 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20  rse, p->pLimit, 
b7a0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73  iLimit);.      s
b7b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
b7c0: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
b7d0: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
b7e0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
b7f0: 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22   "LIMIT counter"
b800: 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
b810: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b820: 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74  P_IfZero, iLimit
b830: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d  , iBreak);.    }
b840: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66  .    if( p->pOff
b850: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  set ){.      p->
b860: 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65  iOffset = iOffse
b870: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
b880: 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  em;.      pParse
b890: 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41  ->nMem++;   /* A
b8a0: 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61  llocate an extra
b8b0: 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69   register for li
b8c0: 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20  mit+offset */.  
b8d0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
b8e0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
b8f0: 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29  Offset, iOffset)
b900: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b910: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
b920: 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73  MustBeInt, iOffs
b930: 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  et);.      VdbeC
b940: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53  omment((v, "OFFS
b950: 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  ET counter"));. 
b960: 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
b970: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
b980: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66  , OP_IfPos, iOff
b990: 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  set);.      sqli
b9a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b9b0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
b9c0: 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  iOffset);.      
b9d0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
b9e0: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
b9f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ba00: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64  AddOp3(v, OP_Add
ba10: 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65  , iLimit, iOffse
ba20: 74 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20  t, iOffset+1);. 
ba30: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
ba40: 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53  ((v, "LIMIT+OFFS
ba50: 45 54 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64  ET"));.      add
ba60: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
ba70: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50  AddOp1(v, OP_IfP
ba80: 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  os, iLimit);.   
ba90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
baa0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
bab0: 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b  er, -1, iOffset+
bac0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
bad0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
bae0: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20   addr1);.    }. 
baf0: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
bb00: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
bb10: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
bb20: 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f  Return the appro
bb30: 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67  priate collating
bb40: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
bb50: 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
bb60: 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   of.** the resul
bb70: 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f  t set for the co
bb80: 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74  mpound-select st
bb90: 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65  atement "p".  Re
bba0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20  turn NULL if.** 
bbb0: 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e  the column has n
bbc0: 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  o default collat
bbd0: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
bbe0: 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e  .** The collatin
bbf0: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
bc00: 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
bc10: 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ct is taken from
bc20: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73   the.** left-mos
bc30: 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65  t term of the se
bc40: 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20  lect that has a 
bc50: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
bc60: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f  ce..*/.static Co
bc70: 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65  llSeq *multiSele
bc80: 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  ctCollSeq(Parse 
bc90: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
bca0: 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  *p, int iCol){. 
bcb0: 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a   CollSeq *pRet;.
bcc0: 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
bcd0: 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75  ){.    pRet = mu
bce0: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
bcf0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69  (pParse, p->pPri
bd00: 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c  or, iCol);.  }el
bd10: 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30  se{.    pRet = 0
bd20: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
bd30: 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 69 66 28  iCol>=0 );.  if(
bd40: 20 70 52 65 74 3d 3d 30 20 26 26 20 69 43 6f 6c   pRet==0 && iCol
bd50: 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  <p->pEList->nExp
bd60: 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  r ){.    pRet = 
bd70: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
bd80: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  eq(pParse, p->pE
bd90: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45  List->a[iCol].pE
bda0: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  xpr);.  }.  retu
bdb0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69  rn pRet;.}.#endi
bdc0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
bdd0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
bde0: 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20   */../* Forward 
bdf0: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
be00: 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
be10: 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
be20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
be30: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
be40: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
be50: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
be60: 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
be70: 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
be80: 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
be90: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
bea0: 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
beb0: 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
bec0: 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 23  esults */.);...#
bed0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
bee0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
bef0: 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CT./*.** This ro
bf00: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
bf10: 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d  to process a com
bf20: 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d  pound query form
bf30: 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20   from.** two or 
bf40: 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75  more separate qu
bf50: 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f  eries using UNIO
bf60: 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58  N, UNION ALL, EX
bf70: 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45  CEPT, or.** INTE
bf80: 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20  RSECT.**.** "p" 
bf90: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69  points to the ri
bfa0: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20  ght-most of the 
bfb0: 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68  two queries.  th
bfc0: 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a  e query on the.*
bfd0: 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72  * left is p->pPr
bfe0: 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71  ior.  The left q
bff0: 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20  uery could also 
c000: 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  be a compound qu
c010: 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20  ery.** in which 
c020: 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e  case this routin
c030: 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
c040: 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a   recursively. .*
c050: 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
c060: 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75   of the total qu
c070: 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72  ery are to be wr
c080: 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73  itten into a des
c090: 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  tination.** of t
c0a0: 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70  ype eDest with p
c0b0: 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a  arameter iParm..
c0c0: 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a  **.** Example 1:
c0d0: 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72    Consider a thr
c0e0: 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20  ee-way compound 
c0f0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
c100: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
c110: 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  a FROM t1 UNION 
c120: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
c130: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20   UNION SELECT c 
c140: 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68  FROM t3.**.** Th
c150: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  is statement is 
c160: 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c  parsed up as fol
c170: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
c180: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
c190: 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  .**      |.**   
c1a0: 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45     `----->  SELE
c1b0: 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20  CT b FROM t2.** 
c1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
c1d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
c1e0: 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c     `------>  SEL
c1f0: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a  ECT a FROM t1.**
c200: 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69  .** The arrows i
c210: 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62  n the diagram ab
c220: 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68  ove represent th
c230: 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20  e Select.pPrior 
c240: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69  pointer..** So i
c250: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
c260: 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20  s called with p 
c270: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20  equal to the t3 
c280: 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70  query, then.** p
c290: 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68  Prior will be th
c2a0: 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e  e t2 query.  p->
c2b0: 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e  op will be TK_UN
c2c0: 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65  ION in this case
c2d0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74  ..**.** Notice t
c2e0: 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74  hat because of t
c2f0: 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61  he way SQLite pa
c300: 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45  rses compound SE
c310: 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e  LECTs, the.** in
c320: 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73  dividual selects
c330: 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72   always group fr
c340: 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
c350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c360: 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50  multiSelect(.  P
c370: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
c380: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
c390: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
c3a0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
c3b0: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
c3c0: 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
c3d0: 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
c3e0: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
c3f0: 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
c400: 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
c410: 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
c420: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c430: 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73  OK;   /* Success
c440: 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62   code from a sub
c450: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c  routine */.  Sel
c460: 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
c470: 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
c480: 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
c490: 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
c4a0: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
c4b0: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
c4c0: 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
c4d0: 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63   VDBE */.  Selec
c4e0: 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20  tDest dest;     
c4f0: 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20   /* Alternative 
c500: 64 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  data destination
c510: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44   */.  Select *pD
c520: 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43  elete = 0;  /* C
c530: 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73  hain of simple s
c540: 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65  elects to delete
c550: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
c560: 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  b;          /* D
c570: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
c580: 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65  on */..  /* Make
c590: 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
c5a0: 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49  o ORDER BY or LI
c5b0: 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72  MIT clause on pr
c5c0: 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e  ior SELECTs.  On
c5d0: 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74  ly.  ** the last
c5e0: 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45   (right-most) SE
c5f0: 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69  LECT in the seri
c600: 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f  es may have an O
c610: 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
c620: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
c630: 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20   p && p->pPrior 
c640: 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66  );  /* Calling f
c650: 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65  unction guarante
c660: 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a  es this much */.
c670: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
c680: 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d  b;.  pPrior = p-
c690: 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72  >pPrior;.  asser
c6a0: 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68  t( pPrior->pRigh
c6b0: 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20 29 3b  tmost!=pPrior );
c6c0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
c6d0: 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70  r->pRightmost==p
c6e0: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29 3b 0a  ->pRightmost );.
c6f0: 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b    dest = *pDest;
c700: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
c710: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
c720: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
c730: 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20  Parse,"ORDER BY 
c740: 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
c750: 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
c760: 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
c770: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
c780: 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
c790: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
c7a0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
c7b0: 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c    if( pPrior->pL
c7c0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
c7d0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
c7e0: 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65  se,"LIMIT clause
c7f0: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
c800: 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
c810: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
c820: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
c830: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
c840: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
c850: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d  _end;.  }..  v =
c860: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
c870: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
c880: 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54  t( v!=0 );  /* T
c890: 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  he VDBE already 
c8a0: 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69  created by calli
c8b0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  ng function */..
c8c0: 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
c8d0: 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70  destination temp
c8e0: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e  orary table if n
c8f0: 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20  ecessary.  */.  
c900: 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
c910: 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
c920: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
c930: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c  EList );.    sql
c940: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
c950: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
c960: 61 6c 2c 20 64 65 73 74 2e 69 50 61 72 6d 2c 20  al, dest.iParm, 
c970: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
c980: 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73  );.    dest.eDes
c990: 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20  t = SRT_Table;. 
c9a0: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
c9b0: 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69  re all SELECTs i
c9c0: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
c9d0: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
c9e0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
c9f0: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72  .  ** in their r
ca00: 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f  esult sets..  */
ca10: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
ca20: 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e  List && pPrior->
ca30: 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20  pEList );.  if( 
ca40: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
ca50: 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  !=pPrior->pEList
ca60: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ->nExpr ){.    s
ca70: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
ca80: 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20  Parse, "SELECTs 
ca90: 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  to the left and 
caa0: 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20  right of %s".   
cab0: 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65     " do not have
cac0: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
cad0: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
cae0: 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  ns", selectOpNam
caf0: 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
cb00: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
cb10: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
cb20: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
cb30: 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61  ound SELECTs tha
cb40: 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  t have an ORDER 
cb50: 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68 61  BY clause are ha
cb60: 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79  ndled separately
cb70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
cb80: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
cb90: 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65  return multiSele
cba0: 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73 65  ctOrderBy(pParse
cbb0: 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  , p, pDest);.  }
cbc0: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
cbd0: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66  code for the lef
cbe0: 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45  t and right SELE
cbf0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  CT statements.. 
cc00: 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d   */.  switch( p-
cc10: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
cc20: 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  TK_ALL: {.      
cc30: 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20  int addr = 0;.  
cc40: 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a      int nLimit;.
cc50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
cc60: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b  Prior->pLimit );
cc70: 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
cc80: 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
cc90: 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
cca0: 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  >pOffset = p->pO
ccb0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 72 63 20  ffset;.      rc 
ccc0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
ccd0: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
cce0: 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d  &dest);.      p-
ccf0: 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
cd00: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
cd10: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  0;.      if( rc 
cd20: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
cd30: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
cd40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cd50: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
cd60: 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
cd70: 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b   pPrior->iLimit;
cd80: 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
cd90: 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66  t = pPrior->iOff
cda0: 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  set;.      if( p
cdb0: 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
cdc0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
cdd0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
cde0: 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
cdf0: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 56  imit);.        V
ce00: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
ce10: 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49  Jump ahead if LI
ce20: 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a  MIT reached"));.
ce30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
ce40: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
ce50: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
ce60: 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
ce70: 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
ce80: 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  K );.      pDele
ce90: 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
cea0: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
ceb0: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
cec0: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d  p->nSelectRow +=
ced0: 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
cee0: 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Row;.      if( p
cef0: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20  Prior->pLimit.  
cf00: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
cf10: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 50 72  xprIsInteger(pPr
cf20: 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c  ior->pLimit, &nL
cf30: 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26 26 20  imit).       && 
cf40: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20  p->nSelectRow > 
cf50: 28 64 6f 75 62 6c 65 29 6e 4c 69 6d 69 74 20 0a  (double)nLimit .
cf60: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
cf70: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
cf80: 20 28 64 6f 75 62 6c 65 29 6e 4c 69 6d 69 74 3b   (double)nLimit;
cf90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
cfa0: 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20  f( addr ){.     
cfb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
cfc0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
cfd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
cfe0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
cff0: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a  case TK_EXCEPT:.
d000: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
d010: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75  N: {.      int u
d020: 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43  nionTab;    /* C
d030: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
d040: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
d050: 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ble holding resu
d060: 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f  lt */.      u8 o
d070: 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  p = 0;       /* 
d080: 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20  One of the SRT_ 
d090: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70  operations to ap
d0a0: 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20  ply to self */. 
d0b0: 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70       int priorOp
d0c0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54  ;     /* The SRT
d0d0: 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61  _ operation to a
d0e0: 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65  pply to prior se
d0f0: 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45  lects */.      E
d100: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
d110: 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20  ffset; /* Saved 
d120: 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69  values of p->nLi
d130: 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73  mit and p->nOffs
d140: 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  et */.      int 
d150: 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65  addr;.      Sele
d160: 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74  ctDest uniondest
d170: 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ;..      testcas
d180: 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43  e( p->op==TK_EXC
d190: 45 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  EPT );.      tes
d1a0: 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
d1b0: 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  _UNION );.      
d1c0: 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e  priorOp = SRT_Un
d1d0: 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64  ion;.      if( d
d1e0: 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72  est.eDest==prior
d1f0: 4f 70 20 26 26 20 41 4c 57 41 59 53 28 21 70 2d  Op && ALWAYS(!p-
d200: 3e 70 4c 69 6d 69 74 20 26 26 21 70 2d 3e 70 4f  >pLimit &&!p->pO
d210: 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 20 20  ffset) ){.      
d220: 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73    /* We can reus
d230: 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  e a temporary ta
d240: 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ble generated by
d250: 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72   a SELECT to our
d260: 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68  .        ** righ
d270: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
d280: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
d290: 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 20 29  >pRightmost!=p )
d2a0: 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20 68  ;  /* Can only h
d2b0: 61 70 70 65 6e 20 66 6f 72 20 6c 65 66 74 77 61  appen for leftwa
d2c0: 72 64 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20  rd elements.    
d2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 20 2a 2a 20 6f 66 20 61 20 33 2d 77 61 79 20 6f   ** of a 3-way o
d300: 72 20 6d 6f 72 65 20 63 6f 6d 70 6f 75 6e 64 20  r more compound 
d310: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
d320: 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20  t( p->pLimit==0 
d330: 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61  );      /* Not a
d340: 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61  llowed on leftwa
d350: 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  rd elements */. 
d360: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
d370: 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20  ->pOffset==0 ); 
d380: 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77      /* Not allow
d390: 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65  ed on leftward e
d3a0: 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  lements */.     
d3b0: 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65     unionTab = de
d3c0: 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20 20  st.iParm;.      
d3d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
d3e0: 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  * We will need t
d3f0: 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e  o create our own
d400: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
d410: 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20   to hold the.   
d420: 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64       ** intermed
d430: 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20  iate results..  
d440: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
d450: 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72   unionTab = pPar
d460: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
d470: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
d480: 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
d490: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
d4a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d4b0: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
d4c0: 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  al, unionTab, 0)
d4d0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
d4e0: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
d4f0: 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
d500: 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
d510: 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
d520: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67  .        p->pRig
d530: 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73  htmost->selFlags
d540: 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
d550: 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73  eral;.        as
d560: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
d570: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
d580: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
d590: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
d5a0: 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20  to our left.    
d5b0: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
d5c0: 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64  t( !pPrior->pOrd
d5d0: 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71  erBy );.      sq
d5e0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
d5f0: 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20  nit(&uniondest, 
d600: 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61  priorOp, unionTa
d610: 62 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  b);.      rc = s
d620: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
d630: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e  rse, pPrior, &un
d640: 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
d650: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
d660: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
d670: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
d680: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
d690: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
d6a0: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
d6b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
d6c0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
d6d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
d6e0: 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20   SRT_Except;.   
d6f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d700: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d    assert( p->op=
d710: 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
d720: 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e       op = SRT_Un
d730: 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ion;.      }.   
d740: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
d750: 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
d760: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
d770: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
d780: 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
d790: 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
d7a0: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
d7b0: 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65  0;.      unionde
d7c0: 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20  st.eDest = op;. 
d7d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d7e0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
d7f0: 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  p, &uniondest);.
d800: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
d810: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
d820: 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20  .      /* Query 
d830: 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71  flattening in sq
d840: 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69  lite3Select() mi
d850: 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f  ght refill p->pO
d860: 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a  rderBy..      **
d870: 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65   Be sure to dele
d880: 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  te p->pOrderBy, 
d890: 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76  therefore, to av
d8a0: 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61  oid a memory lea
d8b0: 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  k. */.      sqli
d8c0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
d8d0: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
d8e0: 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74  y);.      pDelet
d8f0: 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
d900: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
d910: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70   pPrior;.      p
d920: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
d930: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
d940: 3d 54 4b 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e  =TK_UNION ) p->n
d950: 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72  SelectRow += pPr
d960: 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
d970: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
d980: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
d990: 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
d9a0: 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
d9b0: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
d9c0: 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
d9d0: 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
d9e0: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66   0;.      p->iOf
d9f0: 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  fset = 0;..     
da00: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
da10: 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
da20: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
da30: 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
da40: 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68       ** it is th
da50: 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20  at we currently 
da60: 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
da70: 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69       assert( uni
da80: 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 50 61 72  onTab==dest.iPar
da90: 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21  m || dest.eDest!
daa0: 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20  =priorOp );.    
dab0: 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
dac0: 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20  !=priorOp ){.   
dad0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
dae0: 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
daf0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
db00: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
db10: 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
db20: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
db30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c  ){.          Sel
db40: 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b  ect *pFirst = p;
db50: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
db60: 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
db70: 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
db80: 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
db90: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
dba0: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
dbb0: 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  , 0, pFirst->pEL
dbc0: 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ist);.        }.
dbd0: 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d          iBreak =
dbe0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
dbf0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
dc00: 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
dc10: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
dc20: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  );.        compu
dc30: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
dc40: 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
dc50: 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
dc60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
dc70: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69  , OP_Rewind, uni
dc80: 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a  onTab, iBreak);.
dc90: 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
dca0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
dcb0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
dcc0: 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
dcd0: 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
dce0: 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54  ->pEList, unionT
dcf0: 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ab, p->pEList->n
dd00: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
dd20: 20 2d 31 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e   -1, &dest, iCon
dd30: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
dd40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
dd50: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
dd60: 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Cont);.        s
dd70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
dd80: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
dd90: 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a  onTab, iStart);.
dda0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ddb0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
ddc0: 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
ddd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dde0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
ddf0: 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
de00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
de10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
de20: 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
de30: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   p->op==TK_INTER
de40: 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20  SECT ); {.      
de50: 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a  int tab1, tab2;.
de60: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
de70: 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
de80: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69  .      Expr *pLi
de90: 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20  mit, *pOffset;. 
dea0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
deb0: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
dec0: 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20  intersectdest;. 
ded0: 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20       int r1;..  
dee0: 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54      /* INTERSECT
def0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
df00: 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69  om the others si
df10: 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a  nce it requires.
df20: 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d        ** two tem
df30: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
df40: 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73  Hence it has its
df50: 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69   own case.  Begi
df60: 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c  n.      ** by al
df70: 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62  locating the tab
df80: 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  les we will need
df90: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
dfa0: 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e   tab1 = pParse->
dfb0: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61  nTab++;.      ta
dfc0: 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b2 = pParse->nTa
dfd0: 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  b++;.      asser
dfe0: 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
dff0: 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72  0 );..      addr
e000: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
e010: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
e020: 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20  phemeral, tab1, 
e030: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
e040: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
e050: 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
e060: 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
e070: 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
e080: 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f       p->pRightmo
e090: 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  st->selFlags |= 
e0a0: 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
e0b0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e0c0: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20  p->pEList );..  
e0d0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
e0e0: 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c  SELECTs to our l
e0f0: 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  eft into tempora
e100: 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e  ry table "tab1".
e110: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e120: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
e130: 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74  tInit(&intersect
e140: 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c  dest, SRT_Union,
e150: 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 72 63   tab1);.      rc
e160: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
e170: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
e180: 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29   &intersectdest)
e190: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
e1a0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
e1b0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
e1c0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
e1d0: 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
e1e0: 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20  ent SELECT into 
e1f0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
e200: 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a  "tab2".      */.
e210: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
e220: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e230: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
e240: 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  al, tab2, 0);.  
e250: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
e260: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
e270: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
e280: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
e290: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70   = addr;.      p
e2a0: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
e2b0: 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e      pLimit = p->
e2c0: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
e2d0: 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
e2e0: 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e     pOffset = p->
e2f0: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
e300: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
e310: 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65       intersectde
e320: 73 74 2e 69 50 61 72 6d 20 3d 20 74 61 62 32 3b  st.iParm = tab2;
e330: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
e340: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
e350: 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64  , p, &intersectd
e360: 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
e370: 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
e380: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65  _OK );.      pDe
e390: 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
e3a0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
e3b0: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
e3c0: 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74    if( p->nSelect
e3d0: 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  Row>pPrior->nSel
e3e0: 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c  ectRow ) p->nSel
e3f0: 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d  ectRow = pPrior-
e400: 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
e410: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
e420: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
e430: 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  it);.      p->pL
e440: 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
e450: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
e460: 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20  = pOffset;..    
e470: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
e480: 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69  de to take the i
e490: 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74  ntersection of t
e4a0: 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  he two temporary
e4b0: 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73  .      ** tables
e4c0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
e4d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
e4e0: 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  st );.      if( 
e4f0: 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
e500: 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
e510: 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74    Select *pFirst
e520: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68   = p;.        wh
e530: 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72  ile( pFirst->pPr
e540: 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70  ior ) pFirst = p
e550: 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  First->pPrior;. 
e560: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
e570: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
e580: 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45  e, 0, pFirst->pE
e590: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
e5a0: 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
e5b0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
e5c0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
e5d0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
e5e0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
e5f0: 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74      computeLimit
e600: 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
e610: 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , p, iBreak);.  
e620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e630: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
e640: 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b  nd, tab1, iBreak
e650: 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
e660: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
e670: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
e680: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
e690: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e6a0: 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31  RowKey, tab1, r1
e6b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e6c0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
e6d0: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
e6e0: 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30  b2, iCont, r1, 0
e6f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e700: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
e710: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
e720: 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
e730: 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
e740: 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d  pEList, tab1, p-
e750: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a  >pEList->nExpr,.
e760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e770: 20 20 20 20 20 20 30 2c 20 2d 31 2c 20 26 64 65        0, -1, &de
e780: 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
e790: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
e7a0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
e7b0: 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
e7c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e7d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
e7e0: 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a   tab1, iStart);.
e7f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e800: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
e810: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
e820: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e830: 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
e840: 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ab2, 0);.      s
e850: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e860: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
e870: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  b1, 0);.      br
e880: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
e890: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
e8a0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
e8b0: 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74   used by .  ** t
e8c0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20  emporary tables 
e8d0: 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d  needed to implem
e8e0: 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  ent the compound
e8f0: 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74   select..  ** At
e900: 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f  tach the KeyInfo
e910: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c   structure to al
e920: 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  l temporary tabl
e930: 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
e940: 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75  is section is ru
e950: 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d  n by the right-m
e960: 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
e970: 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20  ment only..  ** 
e980: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
e990: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c  s to the left al
e9a0: 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70  ways skip this p
e9b0: 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d  art.  The right-
e9c0: 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54  most.  ** SELECT
e9d0: 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70   might also skip
e9e0: 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74   this part if it
e9f0: 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59   has no ORDER BY
ea00: 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a   clause and.  **
ea10: 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20   no temp tables 
ea20: 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20  are required..  
ea30: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
ea40: 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45 70  lags & SF_UsesEp
ea50: 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69  hemeral ){.    i
ea60: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ea80: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
ea90: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
eaa0: 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yInfo;          
eab0: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
eac0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
ead0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
eae0: 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b    Select *pLoop;
eaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb00: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
eb10: 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74  hrough SELECT st
eb20: 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  atements */.    
eb30: 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c  CollSeq **apColl
eb40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
eb50: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
eb60: 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ough pKeyInfo->a
eb70: 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e  Coll[] */.    in
eb80: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
eb90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
eba0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
ebb0: 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a   in result set *
ebc0: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
ebd0: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20  ->pRightmost==p 
ebe0: 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d  );.    nCol = p-
ebf0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
ec00: 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
ec10: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
ec20: 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20  ro(db,.         
ec30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
ec40: 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b  zeof(*pKeyInfo)+
ec50: 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  nCol*(sizeof(Col
ec60: 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20  lSeq*) + 1));.  
ec70: 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20    if( !pKeyInfo 
ec80: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
ec90: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
eca0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
ecb0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a  ect_end;.    }..
ecc0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e      pKeyInfo->en
ecd0: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
ece0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
ecf0: 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 0a  d = (u16)nCol;..
ed00: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43      for(i=0, apC
ed10: 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  oll=pKeyInfo->aC
ed20: 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  oll; i<nCol; i++
ed30: 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20  , apColl++){.   
ed40: 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c     *apColl = mul
ed50: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
ed60: 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
ed70: 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43       if( 0==*apC
ed80: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  oll ){.        *
ed90: 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66  apColl = db->pDf
eda0: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
edb0: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
edc0: 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
edd0: 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
ede0: 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
edf0: 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
ee00: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
ee10: 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
ee20: 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
ee30: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
ee40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
ee50: 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
ee60: 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
ee70: 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
ee80: 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
ee90: 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
eea0: 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
eeb0: 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
eec0: 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
eed0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
eee0: 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
eef0: 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
ef00: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ef10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ef20: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
ef30: 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
ef40: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
ef50: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
ef60: 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
ef70: 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
ef80: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
ef90: 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
efa0: 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[i] = -1;.   
efb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
efc0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
efd0: 20 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a   pKeyInfo);.  }.
efe0: 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e  .multi_select_en
eff0: 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d  d:.  pDest->iMem
f000: 20 3d 20 64 65 73 74 2e 69 4d 65 6d 3b 0a 20 20   = dest.iMem;.  
f010: 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 64 65  pDest->nMem = de
f020: 73 74 2e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  st.nMem;.  sqlit
f030: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
f040: 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72  b, pDelete);.  r
f050: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
f060: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
f070: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
f080: 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  T */../*.** Code
f090: 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f   an output subro
f0a0: 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f  utine for a coro
f0b0: 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61  utine implementa
f0c0: 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c  tion of a.** SEL
f0d0: 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a  ECT statment..**
f0e0: 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20  .** The data to 
f0f0: 62 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e  be output is con
f100: 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69  tained in pIn->i
f110: 4d 65 6d 2e 20 20 54 68 65 72 65 20 61 72 65 0a  Mem.  There are.
f120: 2a 2a 20 70 49 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c  ** pIn->nMem col
f130: 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75  umns to be outpu
f140: 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65  t.  pDest is whe
f150: 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68  re the output sh
f160: 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e  ould.** be sent.
f170: 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e  .**.** regReturn
f180: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
f190: 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68  f the register h
f1a0: 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f  olding the subro
f1b0: 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20  utine.** return 
f1c0: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  address..**.** I
f1d0: 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
f1e0: 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74   it is the first
f1f0: 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76   register in a v
f200: 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65  ector that.** re
f210: 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f  cords the previo
f220: 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b  us output.  mem[
f230: 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c  regPrev] is a fl
f240: 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65  ag that is false
f250: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73  .** if there has
f260: 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75   been no previou
f270: 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65  s output.  If re
f280: 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64  gPrev>0 then cod
f290: 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65  e is.** generate
f2a0: 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75  d to suppress du
f2b0: 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49  plicates.  pKeyI
f2c0: 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20  nfo is used for 
f2d0: 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79  comparing.** key
f2e0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
f2f0: 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70  LIMIT found in p
f300: 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63  ->iLimit is reac
f310: 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69  hed, jump immedi
f320: 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65  ately to.** iBre
f330: 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ak..*/.static in
f340: 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  t generateOutput
f350: 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61  Subroutine(.  Pa
f360: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
f370: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
f380: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
f390: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
f3a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
f3b0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
f3c0: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
f3d0: 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  In,        /* Co
f3e0: 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e  routine supplyin
f3f0: 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65  g data */.  Sele
f400: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
f410: 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
f420: 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f  send the data */
f430: 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e  .  int regReturn
f440: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
f450: 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
f460: 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
f470: 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20  nt regPrev,     
f480: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
f490: 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  us result regist
f4a0: 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65  er.  No uniquene
f4b0: 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79  ss if 0 */.  Key
f4c0: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
f4d0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70       /* For comp
f4e0: 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69  aring with previ
f4f0: 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  ous entry */.  i
f500: 6e 74 20 70 34 74 79 70 65 2c 20 20 20 20 20 20  nt p4type,      
f510: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 34         /* The p4
f520: 20 74 79 70 65 20 66 6f 72 20 70 4b 65 79 49 6e   type for pKeyIn
f530: 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  fo */.  int iBre
f540: 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ak              
f550: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
f560: 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54  we hit the LIMIT
f570: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
f580: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
f590: 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  ;.  int iContinu
f5a0: 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a  e;.  int addr;..
f5b0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
f5c0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
f5d0: 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20  v);.  iContinue 
f5e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
f5f0: 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
f600: 20 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   Suppress duplic
f610: 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20  ates for UNION, 
f620: 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
f630: 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66  RSECT .  */.  if
f640: 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20  ( regPrev ){.   
f650: 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20   int j1, j2;.   
f660: 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
f670: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
f680: 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  Not, regPrev);. 
f690: 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56     j2 = sqlite3V
f6a0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
f6b0: 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 4d  Compare, pIn->iM
f6c0: 65 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70  em, regPrev+1, p
f6d0: 49 6e 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20 20  In->nMem,.      
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6f0: 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
f700: 4b 65 79 49 6e 66 6f 2c 20 70 34 74 79 70 65 29  KeyInfo, p4type)
f710: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f720: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
f730: 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69  mp, j2+2, iConti
f740: 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20  nue, j2+2);.    
f750: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
f760: 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
f770: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
f780: 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  opy(pParse, pIn-
f790: 3e 69 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31  >iMem, regPrev+1
f7a0: 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  , pIn->nMem);.  
f7b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f7c0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
f7d0: 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a  r, 1, regPrev);.
f7e0: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
f7f0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
f800: 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  ed ) return 0;..
f810: 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68    /* Suppress th
f820: 65 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53  e the first OFFS
f830: 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68  ET entries if th
f840: 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54  ere is an OFFSET
f850: 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63   clause.  */.  c
f860: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
f870: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73  iContinue);..  s
f880: 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44  witch( pDest->eD
f890: 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74  est ){.    /* St
f8a0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61  ore the result a
f8b0: 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75  s data using a u
f8c0: 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a  nique key..    *
f8d0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  /.    case SRT_T
f8e0: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
f8f0: 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
f900: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
f910: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
f920: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
f930: 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47  nt r2 = sqlite3G
f940: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
f950: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f960: 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  e( pDest->eDest=
f970: 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20  =SRT_Table );.  
f980: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44      testcase( pD
f990: 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
f9a0: 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20  EphemTab );.    
f9b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f9c0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
f9d0: 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c  cord, pIn->iMem,
f9e0: 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 20 72 31 29 3b   pIn->nMem, r1);
f9f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fa00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
fa10: 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e  ewRowid, pDest->
fa20: 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  iParm, r2);.    
fa30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fa40: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
fa50: 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20  , pDest->iParm, 
fa60: 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  r1, r2);.      s
fa70: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
fa80: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
fa90: 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  END);.      sqli
faa0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
fab0: 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
fac0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
fad0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
fae0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
faf0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
fb00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fb10: 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
fb20: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
fb30: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
fb40: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
fb50: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
fb60: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
fb70: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
fb80: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
fb90: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
fba0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
fbb0: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
fbc0: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
fbd0: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
fbe0: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
fbf0: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
fc00: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
fc10: 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20  ->nMem==1 );.   
fc20: 20 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d     p->affinity =
fc30: 20 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74   .         sqlit
fc40: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
fc50: 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  y(p->pEList->a[0
fc60: 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e  ].pExpr, pDest->
fc70: 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20  affinity);.     
fc80: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
fc90: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
fca0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fcb0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
fcc0: 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
fcd0: 69 4d 65 6d 2c 20 31 2c 20 72 31 2c 20 26 70 2d  iMem, 1, r1, &p-
fce0: 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  >affinity, 1);. 
fcf0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fd00: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
fd10: 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
fd20: 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20  >iMem, 1);.     
fd30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fd40: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
fd50: 72 74 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  rt, pDest->iParm
fd60: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
fd70: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
fd80: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
fd90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fda0: 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65   }..#if 0  /* Ne
fdb0: 76 65 72 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e  ver occurs on an
fdc0: 20 4f 52 44 45 52 20 42 59 20 71 75 65 72 79 20   ORDER BY query 
fdd0: 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79  */.    /* If any
fde0: 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68   row exist in th
fdf0: 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65  e result set, re
fe00: 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61  cord that fact a
fe10: 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f  nd abort..    */
fe20: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
fe30: 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71  ists: {.      sq
fe40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
fe50: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
fe60: 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b  , pDest->iParm);
fe70: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
fe80: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
fe90: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
fea0: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
feb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
fec0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
fed0: 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
fee0: 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
fef0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
ff00: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
ff10: 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
ff20: 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
ff30: 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
ff40: 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
ff50: 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
ff60: 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
ff70: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
ff80: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
ff90: 73 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d  sert( pIn->nMem=
ffa0: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
ffb0: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
ffc0: 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65  pParse, pIn->iMe
ffd0: 6d 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c  m, pDest->iParm,
ffe0: 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68   1);.      /* Th
fff0: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
10000 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20  ill jump out of 
10010 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
10020 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
10030 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
10040 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10050 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
10060 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  .    /* The resu
10070 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  lts are stored i
10080 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  n a sequence of 
10090 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a  registers.    **
100a0 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 44 65   starting at pDe
100b0 73 74 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 6e 20  st->iMem.  Then 
100c0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79  the co-routine y
100d0 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ields..    */.  
100e0 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
100f0 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66  tine: {.      if
10100 28 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30  ( pDest->iMem==0
10110 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73   ){.        pDes
10120 74 2d 3e 69 4d 65 6d 20 3d 20 73 71 6c 69 74 65  t->iMem = sqlite
10130 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
10140 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29  arse, pIn->nMem)
10150 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  ;.        pDest-
10160 3e 6e 4d 65 6d 20 3d 20 70 49 6e 2d 3e 6e 4d 65  >nMem = pIn->nMe
10170 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
10180 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10190 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
101a0 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69  ->iMem, pDest->i
101b0 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 6e 4d 65 6d  Mem, pDest->nMem
101c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
101d0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
101e0 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
101f0 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65  Parm);.      bre
10200 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
10210 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
10220 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65   above, then the
10230 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74   result destinat
10240 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20  ion must be.    
10250 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20  ** SRT_Output.  
10260 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10270 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  never called wit
10280 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20  h any other.    
10290 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f  ** destination o
102a0 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ther than the on
102b0 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65  es handled above
102c0 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a   or SRT_Output..
102d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
102e0 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65  r SRT_Output, re
102f0 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
10300 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f   in a sequence o
10310 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20  f registers.  . 
10320 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f     ** Then the O
10330 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f  P_ResultRow opco
10340 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 61  de is used to ca
10350 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  use sqlite3_step
10360 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74  () to.    ** ret
10370 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77  urn the next row
10380 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20   of result..    
10390 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
103a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
103b0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
103c0 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
103d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
103e0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
103f0 52 6f 77 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  Row, pIn->iMem, 
10400 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  pIn->nMem);.    
10410 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
10420 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
10430 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d  (pParse, pIn->iM
10440 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a  em, pIn->nMem);.
10450 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10460 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d   }.  }..  /* Jum
10470 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
10480 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20  the loop if the 
10490 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64  LIMIT is reached
104a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
104b0 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  iLimit ){.    sq
104c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
104d0 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
104e0 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c  >iLimit, iBreak,
104f0 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   -1);.  }..  /* 
10500 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75 62  Generate the sub
10510 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20  routine return. 
10520 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
10530 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
10540 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73   iContinue);.  s
10550 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
10560 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
10570 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65  egReturn);..  re
10580 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
10590 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20  .** Alternative 
105a0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
105b0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66  code generator f
105c0 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74 68  or cases when th
105d0 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44  ere.** is an ORD
105e0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a  ER BY clause..**
105f0 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20  .** We assume a 
10600 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c  query of the fol
10610 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a  lowing form:.**.
10620 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41  **      <selectA
10630 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c  >  <operator>  <
10640 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20  selectB>  ORDER 
10650 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e  BY <orderbylist>
10660 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72  .**.** <operator
10670 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f  > is one of UNIO
10680 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58  N ALL, UNION, EX
10690 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45  CEPT, or INTERSE
106a0 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a  CT.  The idea.**
106b0 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68   is to code both
106c0 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c   <selectA> and <
106d0 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68  selectB> with th
106e0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
106f0 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69  e as.** co-routi
10700 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74  nes.  Then run t
10710 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69  he co-routines i
10720 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d  n parallel and m
10730 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74 73  erge the results
10740 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  .** into the out
10750 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f  put.  In additio
10760 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72  n to the two cor
10770 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20  outines (called 
10780 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73  selectA and.** s
10790 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61 72  electB) there ar
107a0 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a  e 7 subroutines:
107b0 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20  .**.**    outA: 
107c0 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70     Move the outp
107d0 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ut of the select
107e0 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f  A coroutine into
107f0 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20   the output.**  
10800 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
10810 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
10820 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  ..**.**    outB:
10830 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
10840 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
10850 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tB coroutine int
10860 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
10870 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
10880 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
10890 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61  y.  (Only genera
108a0 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e  ted for UNION an
108b0 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
108c0 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43   UNION ALL.  EXC
108d0 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45  EPT and INSERTSE
108e0 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20  CT never output 
108f0 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20  a row that.**   
10900 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61 72            appear
10910 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a  s only in B.).**
10920 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20  .**    AltB:    
10930 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
10940 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
10950 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
10960 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A<B..**.**   
10970 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64   AeqB:    Called
10980 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
10990 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
109a0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d  routines and A==
109b0 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42  B..**.**    AgtB
109c0 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
109d0 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
109e0 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
109f0 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a  nes and A>B..**.
10a00 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43  **    EofA:    C
10a10 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20  alled when data 
10a20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f  is exhausted fro
10a30 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a  m selectA..**.**
10a40 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c      EofB:    Cal
10a50 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
10a60 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
10a70 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54  selectB..**.** T
10a80 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
10a90 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20  n of the latter 
10aa0 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73  five subroutines
10ab0 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68   depend on which
10ac0 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20   .** <operator> 
10ad0 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a  is used:.**.**.*
10ae0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e  *             UN
10af0 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20  ION ALL         
10b00 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20  UNION           
10b10 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20 20   EXCEPT         
10b20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20   INTERSECT.**   
10b30 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
10b40 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
10b50 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
10b60 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
10b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
10b80 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  AltB:   outA, ne
10b90 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  xtA      outA, n
10ba0 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c  extA       outA,
10bb0 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e   nextA         n
10bc0 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71  extA.**.**   Aeq
10bd0 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
10be0 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
10bf0 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 41             nextA
10c00 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e           outA, n
10c10 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74  extA.**.**   Agt
10c20 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42  B:   outB, nextB
10c30 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74        outB, next
10c40 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42  B          nextB
10c50 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
10c60 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20  B.**.**   EofA: 
10c70 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
10c80 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
10c90 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20 20          halt    
10ca0 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a           halt.**
10cb0 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75  .**   EofB:   ou
10cc0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f  tA, nextA      o
10cd0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
10ce0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
10cf0 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20       halt.**.** 
10d00 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71  In the AltB, Aeq
10d10 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62 72  B, and AgtB subr
10d20 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20  outines, an EOF 
10d30 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  on A following n
10d40 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61  extA.** causes a
10d50 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70  n immediate jump
10d60 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20   to EofA and an 
10d70 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69  EOF on B followi
10d80 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a  ng nextB causes.
10d90 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  ** an immediate 
10da0 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57  jump to EofB.  W
10db0 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45  ithin EofA and E
10dc0 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20  ofB, and EOF on 
10dd0 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c  entry or.** foll
10de0 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73  owing nextX caus
10df0 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65  es a jump to the
10e00 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65   end of the sele
10e10 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  ct processing..*
10e20 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72  *.** Duplicate r
10e30 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e  emoval in the UN
10e40 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64  ION, EXCEPT, and
10e50 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65 73   INTERSECT cases
10e60 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77   is handled.** w
10e70 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ithin the output
10e80 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68   subroutine.  Th
10e90 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73 74  e regPrev regist
10ea0 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65  er set holds the
10eb0 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f   previously.** o
10ec0 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20  utput value.  A 
10ed0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61  comparison is ma
10ee0 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20  de against this 
10ef0 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75  value and the ou
10f00 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70  tput.** is skipp
10f10 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20 72  ed if the next r
10f20 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20  esults would be 
10f30 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
10f40 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20  previous..**.** 
10f50 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
10f60 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d  on plan is to im
10f70 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20  plement the two 
10f80 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73  coroutines and s
10f90 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69  even.** subrouti
10fa0 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20  nes first, then 
10fb0 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20  put the control 
10fc0 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f 74  logic at the bot
10fd0 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  tom.  Like this:
10fe0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
10ff0 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20  goto Init.**    
11000 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20   coA: coroutine 
11010 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20 28  for left query (
11020 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63  A).**     coB: c
11030 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67  oroutine for rig
11040 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20  ht query (B).** 
11050 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20     outA: output 
11060 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20  one row of A.** 
11070 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20     outB: output 
11080 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e  one row of B (UN
11090 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c  ION and UNION AL
110a0 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f  L only).**    Eo
110b0 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f  fA: ....**    Eo
110c0 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c  fB: ....**    Al
110d0 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65  tB: ....**    Ae
110e0 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67  qB: ....**    Ag
110f0 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e  tB: ....**    In
11100 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63  it: initialize c
11110 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65  oroutine registe
11120 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79  rs.**          y
11130 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20  ield coA.**     
11140 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20 67       if eof(A) g
11150 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20  oto EofA.**     
11160 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a       yield coB.*
11170 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f  *          if eo
11180 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a  f(B) goto EofB.*
11190 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61  *    Cmpr: Compa
111a0 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20  re A, B.**      
111b0 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41      Jump AltB, A
111c0 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20  eqB, AgtB.**    
111d0 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20   End: ....**.** 
111e0 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65  We call AltB, Ae
111f0 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20  qB, AgtB, EofA, 
11200 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75  and EofB "subrou
11210 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79 20  tines" but they 
11220 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61  are not.** actua
11230 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67  lly called using
11240 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20   Gosub and they 
11250 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20  do not Return.  
11260 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f  EofA and EofB lo
11270 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20  op.** until all 
11280 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
11290 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74  d then jump to t
112a0 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20  he "end" labe.  
112b0 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61  AltB, AeqB,.** a
112c0 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20  nd AgtB jump to 
112d0 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20  either L2 or to 
112e0 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45  one of EofA or E
112f0 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ofB..*/.#ifndef 
11300 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
11310 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74  OUND_SELECT.stat
11320 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
11330 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72  ctOrderBy(.  Par
11340 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
11350 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
11360 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
11370 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
11380 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
11390 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
113a0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
113b0 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
113c0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
113d0 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
113e0 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
113f0 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
11400 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
11410 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ters */.  Select
11420 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
11430 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
11440 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
11450 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
11460 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
11470 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
11480 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
11490 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  BE */.  SelectDe
114a0 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a  st destA;     /*
114b0 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
114c0 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a   coroutine A */.
114d0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
114e0 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69  tB;     /* Desti
114f0 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75  nation for corou
11500 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20  tine B */.  int 
11510 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20 20  regAddrA;       
11520 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
11530 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
11540 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -A coroutine */.
11550 20 20 69 6e 74 20 72 65 67 45 6f 66 41 3b 20 20    int regEofA;  
11560 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
11570 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e  to indicate when
11580 20 73 65 6c 65 63 74 2d 41 20 69 73 20 63 6f 6d   select-A is com
11590 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 72  plete */.  int r
115a0 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20  egAddrB;        
115b0 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
115c0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
115d0 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
115e0 20 69 6e 74 20 72 65 67 45 6f 66 42 3b 20 20 20   int regEofB;   
115f0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74         /* Flag t
11600 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20  o indicate when 
11610 73 65 6c 65 63 74 2d 42 20 69 73 20 63 6f 6d 70  select-B is comp
11620 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  lete */.  int ad
11630 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20  drSelectA;      
11640 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
11650 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  e select-A corou
11660 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
11670 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20  drSelectB;      
11680 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
11690 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  e select-B corou
116a0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
116b0 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20  gOutA;          
116c0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
116d0 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70  ter for the outp
116e0 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
116f0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42  */.  int regOutB
11700 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
11710 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
11720 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20  or the output-B 
11730 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
11740 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20  int addrOutA;   
11750 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
11760 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41   of the output-A
11770 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
11780 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20   int addrOutB = 
11790 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  0;     /* Addres
117a0 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d  s of the output-
117b0 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
117c0 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20    int addrEofA; 
117d0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
117e0 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
117f0 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62  -A-exhausted sub
11800 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
11810 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20   addrEofB;      
11820 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
11830 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78   the select-B-ex
11840 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
11850 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
11860 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AltB;         /*
11870 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
11880 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A<B subroutine *
11890 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42  /.  int addrAeqB
118a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
118b0 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42  ress of the A==B
118c0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
118d0 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20   int addrAgtB;  
118e0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
118f0 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62  s of the A>B sub
11900 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
11910 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20   regLimitA;     
11920 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
11930 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
11940 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  A */.  int regLi
11950 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitB;        /* 
11960 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
11970 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
11980 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
11990 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67         /* A rang
119a0 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  e of registers t
119b0 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20  o hold previous 
119c0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
119d0 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20  savedLimit;     
119e0 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
119f0 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f   of p->iLimit */
11a00 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73  .  int savedOffs
11a10 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65  et;      /* Save
11a20 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f  d value of p->iO
11a30 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  ffset */.  int l
11a40 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20  abelCmpr;       
11a50 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
11a60 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d  e start of the m
11a70 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a  erge algorithm *
11a80 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64  /.  int labelEnd
11a90 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  ;         /* Lab
11aa0 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f  el for the end o
11ab0 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45  f the overall SE
11ac0 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69  LECT stmt */.  i
11ad0 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20  nt j1;          
11ae0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73       /* Jump ins
11af0 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67  tructions that g
11b00 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a  et retargetted *
11b10 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
11b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
11b30 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55   of TK_ALL, TK_U
11b40 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c  NION, TK_EXCEPT,
11b50 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f   TK_INTERSECT */
11b60 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
11b70 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70  Dup = 0; /* Comp
11b80 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  arison informati
11b90 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  on for duplicate
11ba0 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65   removal */.  Ke
11bb0 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65  yInfo *pKeyMerge
11bc0 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f  ;   /* Compariso
11bd0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
11be0 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a  r merging rows *
11bf0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
11c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
11c10 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
11c20 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
11c30 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54  pOrderBy;   /* T
11c40 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
11c50 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64  se */.  int nOrd
11c60 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  erBy;         /*
11c70 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
11c80 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
11c90 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
11ca0 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20   *aPermute;     
11cb0 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72     /* Mapping fr
11cc0 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  om ORDER BY term
11cd0 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20  s to result set 
11ce0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73  columns */..  as
11cf0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
11d00 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y!=0 );.  assert
11d10 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20  ( pKeyDup==0 ); 
11d20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64  /* "Managed" cod
11d30 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54  e needs this.  T
11d40 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a  icket #3382. */.
11d50 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
11d60 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  b;.  v = pParse-
11d70 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
11d80 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ( v!=0 );       
11d90 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77  /* Already throw
11da0 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66 20 56  n the error if V
11db0 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64  DBE alloc failed
11dc0 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d   */.  labelEnd =
11dd0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
11de0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65  Label(v);.  labe
11df0 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56  lCmpr = sqlite3V
11e00 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
11e10 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70  ...  /* Patch up
11e20 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
11e30 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ause.  */.  op =
11e40 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69   p->op;  .  pPri
11e50 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
11e60 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
11e70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
11e80 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
11e90 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73  >pOrderBy;.  ass
11ea0 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b  ert( pOrderBy );
11eb0 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f  .  nOrderBy = pO
11ec0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a  rderBy->nExpr;..
11ed0 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f    /* For operato
11ee0 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e  rs other than UN
11ef0 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20  ION ALL we have 
11f00 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
11f10 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52  t.  ** the ORDER
11f20 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72   BY clause cover
11f30 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20  s every term of 
11f40 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
11f50 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20   Add.  ** terms 
11f60 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
11f70 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73  clause as necess
11f80 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ary..  */.  if( 
11f90 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op!=TK_ALL ){.  
11fa0 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d    for(i=1; db->m
11fb0 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26  allocFailed==0 &
11fc0 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  & i<=p->pEList->
11fd0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
11fe0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
11ff0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
12000 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
12010 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Item=pOrderBy->a
12020 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b  ; j<nOrderBy; j+
12030 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
12040 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
12050 65 6d 2d 3e 69 43 6f 6c 3e 30 20 29 3b 0a 20 20  em->iCol>0 );.  
12060 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
12070 3e 69 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b  >iCol==i ) break
12080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12090 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20  if( j==nOrderBy 
120a0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
120b0 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
120c0 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  xpr(db, TK_INTEG
120d0 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ER, 0);.        
120e0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
120f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
12100 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  M;.        pNew-
12110 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
12120 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
12130 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
12140 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  i;.        pOrde
12150 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
12160 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
12170 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e  se, pOrderBy, pN
12180 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  ew);.        pOr
12190 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42  derBy->a[nOrderB
121a0 79 2b 2b 5d 2e 69 43 6f 6c 20 3d 20 28 75 31 36  y++].iCol = (u16
121b0 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )i;.      }.    
121c0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  }.  }..  /* Comp
121d0 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ute the comparis
121e0 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61  on permutation a
121f0 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20  nd keyinfo that 
12200 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a  is used with.  *
12210 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f  * the permutatio
12220 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  n used to determ
12230 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a  ine if the next.
12240 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75    ** row of resu
12250 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73  lts comes from s
12260 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74  electA or select
12270 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70  B.  Also add exp
12280 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  licit.  ** colla
12290 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44  tions to the ORD
122a0 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
122b0 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20  ms so that when 
122c0 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20  the subqueries. 
122d0 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74   ** to the right
122e0 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72   and the left ar
122f0 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65  e evaluated, the
12300 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63  y use the correc
12310 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e  t.  ** collation
12320 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74  ..  */.  aPermut
12330 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
12340 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
12350 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29  f(int)*nOrderBy)
12360 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65  ;.  if( aPermute
12370 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
12380 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
12390 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  tem;.    for(i=0
123a0 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79  , pItem=pOrderBy
123b0 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  ->a; i<nOrderBy;
123c0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
123d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
123e0 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20 20 26 26 20  tem->iCol>0  && 
123f0 70 49 74 65 6d 2d 3e 69 43 6f 6c 3c 3d 70 2d 3e  pItem->iCol<=p->
12400 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
12410 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b  .      aPermute[
12420 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 69 43 6f 6c  i] = pItem->iCol
12430 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 1;.    }.    
12440 70 4b 65 79 4d 65 72 67 65 20 3d 0a 20 20 20 20  pKeyMerge =.    
12450 20 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f    sqlite3DbMallo
12460 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
12470 2a 70 4b 65 79 4d 65 72 67 65 29 2b 6e 4f 72 64  *pKeyMerge)+nOrd
12480 65 72 42 79 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  erBy*(sizeof(Col
12490 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20 20 20  lSeq*)+1));.    
124a0 69 66 28 20 70 4b 65 79 4d 65 72 67 65 20 29 7b  if( pKeyMerge ){
124b0 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65  .      pKeyMerge
124c0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
124d0 75 38 2a 29 26 70 4b 65 79 4d 65 72 67 65 2d 3e  u8*)&pKeyMerge->
124e0 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 5d 3b  aColl[nOrderBy];
124f0 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65  .      pKeyMerge
12500 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  ->nField = (u16)
12510 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  nOrderBy;.      
12520 70 4b 65 79 4d 65 72 67 65 2d 3e 65 6e 63 20 3d  pKeyMerge->enc =
12530 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20   ENC(db);.      
12540 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
12550 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
12560 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
12570 6c 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  l;.        Expr 
12580 2a 70 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42  *pTerm = pOrderB
12590 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
125a0 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
125b0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
125c0 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
125d0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 54 65       pColl = pTe
125e0 72 6d 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  rm->pColl;.     
125f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12600 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74      pColl = mult
12610 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
12620 50 61 72 73 65 2c 20 70 2c 20 61 50 65 72 6d 75  Parse, p, aPermu
12630 74 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  te[i]);.        
12640 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c    pTerm->flags |
12650 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b  = EP_ExpCollate;
12660 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d  .          pTerm
12670 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b  ->pColl = pColl;
12680 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12690 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43     pKeyMerge->aC
126a0 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  oll[i] = pColl;.
126b0 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67          pKeyMerg
126c0 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  e->aSortOrder[i]
126d0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
126e0 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ].sortOrder;.   
126f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
12700 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67  se{.    pKeyMerg
12710 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
12720 20 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52   Reattach the OR
12730 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f  DER BY clause to
12740 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
12750 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
12760 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72   pOrderBy;.  pPr
12770 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  ior->pOrderBy = 
12780 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
12790 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
127a0 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20  OrderBy, 0);..  
127b0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61  /* Allocate a ra
127c0 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79  nge of temporary
127d0 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
127e0 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65  he KeyInfo neede
127f0 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c  d.  ** for the l
12800 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65  ogic that remove
12810 73 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75  s duplicate resu
12820 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65  lt rows when the
12830 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69  .  ** operator i
12840 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  s UNION, EXCEPT,
12850 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62   or INTERSECT (b
12860 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c  ut not UNION ALL
12870 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  )..  */.  if( op
12880 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
12890 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d  regPrev = 0;.  }
128a0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45  else{.    int nE
128b0 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
128c0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >nExpr;.    asse
128d0 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45  rt( nOrderBy>=nE
128e0 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  xpr || db->mallo
128f0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
12900 65 67 50 72 65 76 20 3d 20 73 71 6c 69 74 65 33  egPrev = sqlite3
12910 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
12920 72 73 65 2c 20 6e 45 78 70 72 2b 31 29 3b 0a 20  rse, nExpr+1);. 
12930 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12940 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
12950 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b  er, 0, regPrev);
12960 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73  .    pKeyDup = s
12970 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
12980 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20  ro(db,.         
12990 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
129a0 2a 70 4b 65 79 44 75 70 29 20 2b 20 6e 45 78 70  *pKeyDup) + nExp
129b0 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  r*(sizeof(CollSe
129c0 71 2a 29 2b 31 29 20 29 3b 0a 20 20 20 20 69 66  q*)+1) );.    if
129d0 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20  ( pKeyDup ){.   
129e0 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72     pKeyDup->aSor
129f0 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
12a00 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 6e 45  KeyDup->aColl[nE
12a10 78 70 72 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79  xpr];.      pKey
12a20 44 75 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75  Dup->nField = (u
12a30 31 36 29 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  16)nExpr;.      
12a40 70 4b 65 79 44 75 70 2d 3e 65 6e 63 20 3d 20 45  pKeyDup->enc = E
12a50 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66 6f  NC(db);.      fo
12a60 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
12a70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b  i++){.        pK
12a80 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  eyDup->aColl[i] 
12a90 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
12aa0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
12ab0 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  i);.        pKey
12ac0 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Dup->aSortOrder[
12ad0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
12ae0 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a      }.  }. .  /*
12af0 20 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65   Separate the le
12b00 66 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74  ft and the right
12b10 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20   query from one 
12b20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70  another.  */.  p
12b30 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
12b40 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f  pPrior->pRightmo
12b50 73 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  st = 0;.  sqlite
12b60 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f  3ResolveOrderGro
12b70 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  upBy(pParse, p, 
12b80 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  p->pOrderBy, "OR
12b90 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72  DER");.  if( pPr
12ba0 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ior->pPrior==0 )
12bb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
12bc0 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
12bd0 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
12be0 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
12bf0 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d  y, "ORDER");.  }
12c00 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
12c10 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
12c20 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c  rs */.  computeL
12c30 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
12c40 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e  arse, p, labelEn
12c50 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  d);.  if( p->iLi
12c60 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c  mit && op==TK_AL
12c70 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69  L ){.    regLimi
12c80 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
12c90 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69  Mem;.    regLimi
12ca0 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tB = ++pParse->n
12cb0 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
12cc0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12cd0 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65  _Copy, p->iOffse
12ce0 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31  t ? p->iOffset+1
12cf0 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20   : p->iLimit,.  
12d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20  regLimitA);.    
12d30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12d40 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65  2(v, OP_Copy, re
12d50 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69  gLimitA, regLimi
12d60 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tB);.  }else{.  
12d70 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65    regLimitA = re
12d80 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d  gLimitB = 0;.  }
12d90 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
12da0 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
12db0 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  it);.  p->pLimit
12dc0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 0;.  sqlite3E
12dd0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
12de0 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e  >pOffset);.  p->
12df0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20  pOffset = 0;..  
12e00 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61  regAddrA = ++pPa
12e10 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
12e20 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  EofA = ++pParse-
12e30 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72  >nMem;.  regAddr
12e40 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
12e50 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20 3d 20  em;.  regEofB = 
12e60 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
12e70 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50    regOutA = ++pP
12e80 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
12e90 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  gOutB = ++pParse
12ea0 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
12eb0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
12ec0 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f  &destA, SRT_Coro
12ed0 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29  utine, regAddrA)
12ee0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
12ef0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 42  tDestInit(&destB
12f00 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
12f10 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f   regAddrB);..  /
12f20 2a 20 4a 75 6d 70 20 70 61 73 74 20 74 68 65 20  * Jump past the 
12f30 76 61 72 69 6f 75 73 20 73 75 62 72 6f 75 74 69  various subrouti
12f40 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75 74 69 6e  nes and coroutin
12f50 65 73 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a 20  es to the main. 
12f60 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20   ** merge loop. 
12f70 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74   */.  j1 = sqlit
12f80 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
12f90 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64 64 72  OP_Goto);.  addr
12fa0 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65  SelectA = sqlite
12fb0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
12fc0 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65 6e 65  (v);...  /* Gene
12fd0 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65  rate a coroutine
12fe0 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
12ff0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
13000 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65  t to the.  ** le
13010 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ft of the compou
13020 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68  nd operator - th
13030 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20  e "A" select..  
13040 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
13050 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20  ment((v, "Begin 
13060 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65  coroutine for le
13070 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ft SELECT"));.  
13080 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d  pPrior->iLimit =
13090 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 73 71   regLimitA;.  sq
130a0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
130b0 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
130c0 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
130d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
130e0 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f  nteger, 1, regEo
130f0 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fA);.  sqlite3Vd
13100 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
13110 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b  ield, regAddrA);
13120 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
13130 6e 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f  nt((v, "End coro
13140 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 53  utine for left S
13150 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20  ELECT"));..  /* 
13160 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
13170 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
13180 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
13190 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74  ement on .  ** t
131a0 68 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22  he right - the "
131b0 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20  B" select.  */. 
131c0 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73   addrSelectB = s
131d0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
131e0 74 41 64 64 72 28 76 29 3b 0a 20 20 56 64 62 65  tAddr(v);.  Vdbe
131f0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
13200 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65  "Begin coroutine
13210 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45 43   for right SELEC
13220 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d  T"));.  savedLim
13230 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
13240 20 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20    savedOffset = 
13250 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d  p->iOffset;.  p-
13260 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
13270 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65  itB;.  p->iOffse
13280 74 20 3d 20 30 3b 20 20 0a 20 20 73 71 6c 69 74  t = 0;  .  sqlit
13290 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
132a0 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70   p, &destB);.  p
132b0 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64  ->iLimit = saved
132c0 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66  Limit;.  p->iOff
132d0 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65  set = savedOffse
132e0 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  t;.  sqlite3Vdbe
132f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
13300 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 42  eger, 1, regEofB
13310 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13320 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
13330 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20  ld, regAddrB);. 
13340 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
13350 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74  ((v, "End corout
13360 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53 45  ine for right SE
13370 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47  LECT"));..  /* G
13380 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
13390 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
133a0 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  s the current ro
133b0 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20  w of the A.  ** 
133c0 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65  select as the ne
133d0 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66  xt output row of
133e0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
133f0 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62  lect..  */.  Vdb
13400 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
13410 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65   "Output routine
13420 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64   for A"));.  add
13430 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65  rOutA = generate
13440 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
13450 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
13460 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65            p, &de
13470 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f  stA, pDest, regO
13480 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20  utA,.           
13490 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70        regPrev, p
134a0 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e  KeyDup, P4_KEYIN
134b0 46 4f 5f 48 41 4e 44 4f 46 46 2c 20 6c 61 62 65  FO_HANDOFF, labe
134c0 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47  lEnd);.  .  /* G
134d0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
134e0 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
134f0 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  s the current ro
13500 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20  w of the B.  ** 
13510 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65  select as the ne
13520 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66  xt output row of
13530 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
13540 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lect..  */.  if(
13550 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
13560 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
13570 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
13580 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72  nt((v, "Output r
13590 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b  outine for B"));
135a0 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20  .    addrOutB = 
135b0 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
135c0 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
135d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
135e0 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65    p, &destB, pDe
135f0 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20  st, regOutB,.   
13600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
13610 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
13620 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49  P4_KEYINFO_STATI
13630 43 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  C, labelEnd);.  
13640 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
13650 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f   a subroutine to
13660 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65   run when the re
13670 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63  sults from selec
13680 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68  t A.  ** are exh
13690 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20  austed and only 
136a0 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42  data in select B
136b0 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20   remains..  */. 
136c0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
136d0 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72  ((v, "eof-A subr
136e0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 69 66 28  outine"));.  if(
136f0 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c   op==TK_EXCEPT |
13700 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  | op==TK_INTERSE
13710 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f  CT ){.    addrEo
13720 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fA = sqlite3Vdbe
13730 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
13740 6f 2c 20 30 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  o, 0, labelEnd);
13750 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20  .  }else{  .    
13760 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74  addrEofA = sqlit
13770 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13780 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20  OP_If, regEofB, 
13790 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73  labelEnd);.    s
137a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
137b0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
137c0 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
137d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
137e0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
137f0 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  eld, regAddrB);.
13800 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13810 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
13820 2c 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  , 0, addrEofA);.
13830 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
13840 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  w += pPrior->nSe
13850 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20  lectRow;.  }..  
13860 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
13870 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
13880 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
13890 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20   from select B. 
138a0 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
138b0 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
138c0 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61  in select A rema
138d0 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
138e0 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
138f0 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42   ){.    addrEofB
13900 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20   = addrEofA;.   
13910 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
13920 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow > pPrior->nSe
13930 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65  lectRow ) p->nSe
13940 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72  lectRow = pPrior
13950 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
13960 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62  }else{  .    Vdb
13970 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
13980 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69   "eof-B subrouti
13990 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45  ne"));.    addrE
139a0 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofB = sqlite3Vdb
139b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
139c0 2c 20 72 65 67 45 6f 66 41 2c 20 6c 61 62 65 6c  , regEofA, label
139d0 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  End);.    sqlite
139e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
139f0 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
13a00 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20  , addrOutA);.   
13a10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13a20 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
13a30 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73  regAddrA);.    s
13a40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13a50 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
13a60 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a  addrEofB);.  }..
13a70 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
13a80 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
13a90 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a   case of A<B.  *
13aa0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
13ab0 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20  ent((v, "A-lt-B 
13ac0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
13ad0 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69   addrAltB = sqli
13ae0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13af0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
13b00 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
13b10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13b20 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
13b30 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
13b40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13b50 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41  , OP_If, regEofA
13b60 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73  , addrEofA);.  s
13b70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13b80 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
13b90 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
13ba0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
13bb0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
13bc0 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a  se of A==B.  */.
13bd0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
13be0 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
13bf0 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d   = addrAltB;.  }
13c00 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
13c10 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
13c20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
13c30 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c  AltB;.    addrAl
13c40 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tB++;.  }else{. 
13c50 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
13c60 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73  nt((v, "A-eq-B s
13c70 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
13c80 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20    addrAeqB =.   
13c90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13ca0 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
13cb0 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73  regAddrA);.    s
13cc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13cd0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
13ce0 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20  fA, addrEofA);. 
13cf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13d00 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
13d10 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a   0, labelCmpr);.
13d20 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
13d30 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
13d40 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e  e the case of A>
13d50 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
13d60 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
13d70 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  gt-B subroutine"
13d80 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d  ));.  addrAgtB =
13d90 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
13da0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66  entAddr(v);.  if
13db0 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
13dc0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
13dd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13de0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
13df0 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72  b, regOutB, addr
13e00 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  OutB);.  }.  sql
13e10 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
13e20 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
13e30 64 64 72 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrB);.  sqlite3
13e40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13e50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64  _If, regEofB, ad
13e60 64 72 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74  drEofB);.  sqlit
13e70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13e80 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
13e90 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68  lCmpr);..  /* Th
13ea0 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63  is code runs onc
13eb0 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
13ec0 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f  everything..  */
13ed0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
13ee0 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
13ef0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13f00 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
13f10 2c 20 30 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20  , 0, regEofA);. 
13f20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13f30 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
13f40 2c 20 30 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20  , 0, regEofB);. 
13f50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13f60 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
13f70 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 53 65  regAddrA, addrSe
13f80 6c 65 63 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  lectA);.  sqlite
13f90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13fa0 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72  P_Gosub, regAddr
13fb0 42 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b  B, addrSelectB);
13fc0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13fd0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
13fe0 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41  egEofA, addrEofA
13ff0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14000 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
14010 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f   regEofB, addrEo
14020 66 42 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65  fB);..  /* Imple
14030 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65  ment the main me
14040 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  rge loop.  */.  
14050 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
14060 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
14070 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cmpr);.  sqlite3
14080 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
14090 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c  _Permutation, 0,
140a0 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50   0, 0, (char*)aP
140b0 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52  ermute, P4_INTAR
140c0 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  RAY);.  sqlite3V
140d0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
140e0 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69  Compare, destA.i
140f0 4d 65 6d 2c 20 64 65 73 74 42 2e 69 4d 65 6d 2c  Mem, destB.iMem,
14100 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   nOrderBy,.     
14110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14120 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d      (char*)pKeyM
14130 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  erge, P4_KEYINFO
14140 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c  _HANDOFF);.  sql
14150 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
14160 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41  , OP_Jump, addrA
14170 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61  ltB, addrAeqB, a
14180 64 64 72 41 67 74 42 29 3b 0a 0a 20 20 2f 2a 20  ddrAgtB);..  /* 
14190 52 65 6c 65 61 73 65 20 74 65 6d 70 6f 72 61 72  Release temporar
141a0 79 20 72 65 67 69 73 74 65 72 73 0a 20 20 2a 2f  y registers.  */
141b0 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29  .  if( regPrev )
141c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  {.    sqlite3Rel
141d0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
141e0 61 72 73 65 2c 20 72 65 67 50 72 65 76 2c 20 6e  arse, regPrev, n
141f0 4f 72 64 65 72 42 79 2b 31 29 3b 0a 20 20 7d 0a  OrderBy+1);.  }.
14200 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
14210 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  e this point in 
14220 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61  order to termina
14230 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  te the query..  
14240 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
14250 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
14260 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a  labelEnd);..  /*
14270 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
14280 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e  of output column
14290 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  s.  */.  if( pDe
142a0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
142b0 75 74 70 75 74 20 29 7b 0a 20 20 20 20 53 65 6c  utput ){.    Sel
142c0 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 50  ect *pFirst = pP
142d0 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65 28  rior;.    while(
142e0 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
142f0 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
14300 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 67  t->pPrior;.    g
14310 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
14320 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  es(pParse, 0, pF
14330 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
14340 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d   }..  /* Reassem
14350 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  bly the compound
14360 20 71 75 65 72 79 20 73 6f 20 74 68 61 74 20 69   query so that i
14370 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
14380 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62  correctly.  ** b
14390 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
143a0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20  nction */.  if( 
143b0 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
143c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
143d0 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69  lete(db, p->pPri
143e0 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50  or);.  }.  p->pP
143f0 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 0a  rior = pPrior;..
14400 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73    /*** TBD:  Ins
14410 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63  ert subroutine c
14420 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75  alls to close cu
14430 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c  rsors on incompl
14440 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75  ete.  **** subqu
14450 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 72 65  eries ****/.  re
14460 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14470 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
14480 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
14490 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
144a0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
144b0 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f  OMIT_VIEW)./* Fo
144c0 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f  rward Declaratio
144d0 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ns */.static voi
144e0 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
144f0 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69  sqlite3*, ExprLi
14500 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  st*, int, ExprLi
14510 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  st*);.static voi
14520 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73 71  d substSelect(sq
14530 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a  lite3*, Select *
14540 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20  , int, ExprList 
14550 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  *);../*.** Scan 
14560 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
14570 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
14580 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
14590 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
145a0 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
145b0 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
145c0 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
145d0 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e  iColumn-th.** en
145e0 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
145f0 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72  (But leave refer
14600 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57  ences to the ROW
14610 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e  ID column .** un
14620 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20  changed.).**.** 
14630 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
14640 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74  part of the flat
14650 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65  tening procedure
14660 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a  .  A subquery.**
14670 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65   whose result se
14680 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
14690 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61  pEList appears a
146a0 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  s entry in the.*
146b0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
146c0 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74   a SELECT such t
146d0 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72  hat the VDBE cur
146e0 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
146f0 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61  that.** FORM cla
14700 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61  use entry is iTa
14710 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ble.  This routi
14720 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65  ne make the nece
14730 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65  ssary .** change
14740 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68  s to pExpr so th
14750 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72  at it refers dir
14760 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75  ectly to the sou
14770 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20  rce table.** of 
14780 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74  the subquery rat
14790 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  her the result s
147a0 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  et of the subque
147b0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78  ry..*/.static Ex
147c0 70 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20  pr *substExpr(. 
147d0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
147e0 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
147f0 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20  alloc errors to 
14800 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
14810 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
14820 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  ,        /* Expr
14830 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69   in which substi
14840 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f  tution occurs */
14850 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
14860 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
14870 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
14880 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
14890 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75  *pEList    /* Su
148a0 62 73 74 69 74 75 74 65 20 65 78 70 72 65 73 73  bstitute express
148b0 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ions */.){.  if(
148c0 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
148d0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
148e0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
148f0 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
14900 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  e==iTable ){.   
14910 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
14920 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  umn<0 ){.      p
14930 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55  Expr->op = TK_NU
14940 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
14950 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
14960 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14970 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70  EList!=0 && pExp
14980 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73  r->iColumn<pELis
14990 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
149a0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
149b0 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
149c0 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
149d0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
149e0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
149f0 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72   pEList->a[pExpr
14a00 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
14a10 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
14a20 70 4e 65 77 20 26 26 20 70 45 78 70 72 2d 3e 70  pNew && pExpr->p
14a30 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
14a40 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 45  pNew->pColl = pE
14a50 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20  xpr->pColl;.    
14a60 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
14a70 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
14a80 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70 45  pExpr);.      pE
14a90 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  xpr = pNew;.    
14aa0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
14ab0 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75  Expr->pLeft = su
14ac0 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78 70  bstExpr(db, pExp
14ad0 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  r->pLeft, iTable
14ae0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  , pEList);.    p
14af0 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73  Expr->pRight = s
14b00 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78  ubstExpr(db, pEx
14b10 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  pr->pRight, iTab
14b20 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
14b30 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
14b40 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
14b50 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
14b60 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64     substSelect(d
14b70 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  b, pExpr->x.pSel
14b80 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ect, iTable, pEL
14b90 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ist);.    }else{
14ba0 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
14bb0 4c 69 73 74 28 64 62 2c 20 70 45 78 70 72 2d 3e  List(db, pExpr->
14bc0 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  x.pList, iTable,
14bd0 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a   pEList);.    }.
14be0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78    }.  return pEx
14bf0 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  pr;.}.static voi
14c00 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
14c10 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
14c20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72          /* Repor
14c30 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  t malloc errors 
14c40 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  here */.  ExprLi
14c50 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
14c60 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20 61  * List to scan a
14c70 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d  nd in which to m
14c80 61 6b 65 20 73 75 62 73 74 69 74 75 74 65 73 20  ake substitutes 
14c90 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
14ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
14cb0 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74  le to be substit
14cc0 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uted */.  ExprLi
14cd0 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f  st *pEList     /
14ce0 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c  * Substitute val
14cf0 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ues */.){.  int 
14d00 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
14d10 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
14d20 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
14d30 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
14d40 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
14d50 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  pr = substExpr(d
14d60 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  b, pList->a[i].p
14d70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  Expr, iTable, pE
14d80 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
14d90 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
14da0 6c 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20  lect(.  sqlite3 
14db0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
14dc0 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
14dd0 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53  rors here */.  S
14de0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
14df0 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
14e00 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68  atement in which
14e10 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
14e20 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  utions */.  int 
14e30 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
14e40 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
14e50 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78  replaced */.  Ex
14e60 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
14e70 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
14e80 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
14e90 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
14ea0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
14eb0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
14ec0 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29  nt i;.  if( !p )
14ed0 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74   return;.  subst
14ee0 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e  ExprList(db, p->
14ef0 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20  pEList, iTable, 
14f00 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
14f10 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e  ExprList(db, p->
14f20 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65  pGroupBy, iTable
14f30 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
14f40 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
14f50 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62  ->pOrderBy, iTab
14f60 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70  le, pEList);.  p
14f70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73  ->pHaving = subs
14f80 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48 61  tExpr(db, p->pHa
14f90 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70 45  ving, iTable, pE
14fa0 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 57 68 65  List);.  p->pWhe
14fb0 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  re = substExpr(d
14fc0 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 54  b, p->pWhere, iT
14fd0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
14fe0 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
14ff0 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61 62   p->pPrior, iTab
15000 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70  le, pEList);.  p
15010 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
15020 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b   assert( pSrc );
15030 20 20 2f 2a 20 45 76 65 6e 20 66 6f 72 20 28 53    /* Even for (S
15040 45 4c 45 43 54 20 31 29 20 77 65 20 68 61 76 65  ELECT 1) we have
15050 3a 20 70 53 72 63 21 3d 30 20 62 75 74 20 70 53  : pSrc!=0 but pS
15060 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20  rc->nSrc==0 */. 
15070 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63   if( ALWAYS(pSrc
15080 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70  ) ){.    for(i=p
15090 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d  Src->nSrc, pItem
150a0 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69  =pSrc->a; i>0; i
150b0 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
150c0 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
150d0 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  db, pItem->pSele
150e0 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ct, iTable, pELi
150f0 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  st);.    }.  }.}
15100 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
15110 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
15120 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
15130 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
15140 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20  T_VIEW) */..#if 
15150 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
15160 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
15170 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
15180 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a  E_OMIT_VIEW)./*.
15190 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
151a0 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74  attempts to flat
151b0 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 69  ten subqueries i
151c0 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65 65 64  n order to speed
151d0 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  .** execution.  
151e0 49 74 20 72 65 74 75 72 6e 73 20 31 20 69 66 20  It returns 1 if 
151f0 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73  it makes changes
15200 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61   and 0 if no fla
15210 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72  ttening.** occur
15220 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65  s..**.** To unde
15230 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65  rstand the conce
15240 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  pt of flattening
15250 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66  , consider the f
15260 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72  ollowing.** quer
15270 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  y:.**.**     SEL
15280 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45  ECT a FROM (SELE
15290 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
152a0 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29   t1 WHERE z<100)
152b0 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a   WHERE a>5.**.**
152c0 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79   The default way
152d0 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   of implementing
152e0 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74   this query is t
152f0 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a  o execute the.**
15300 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20   subquery first 
15310 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
15320 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f  sults in a tempo
15330 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  rary table, then
15340 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65  .** run the oute
15350 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20  r query on that 
15360 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
15370 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20    This requires 
15380 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76  two.** passes ov
15390 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75  er the data.  Fu
153a0 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75  rthermore, becau
153b0 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  se the temporary
153c0 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f   table.** has no
153d0 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48   indices, the WH
153e0 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  ERE clause on th
153f0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61  e outer query ca
15400 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d  nnot be.** optim
15410 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ized..**.** This
15420 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
15430 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65  s to rewrite que
15440 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65  ries such as the
15450 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61   above into.** a
15460 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c   single flat sel
15470 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ect, like this:.
15480 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
15490 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
154a0 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e  1 WHERE z<100 AN
154b0 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  D a>5.**.** The 
154c0 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66  code generated f
154d0 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66 69 63  or this simpific
154e0 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20  ation gives the 
154f0 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62  same result.** b
15500 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73  ut only has to s
15510 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63  can the data onc
15520 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20  e.  And because 
15530 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a  indices might .*
15540 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74  * exist on the t
15550 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c  able t1, a compl
15560 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20  ete scan of the 
15570 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a  data might be.**
15580 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20   avoided..**.** 
15590 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e  Flattening is on
155a0 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20  ly attempted if 
155b0 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
155c0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
155d0 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20  *.**   (1)  The 
155e0 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
155f0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
15600 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67  not both use agg
15610 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
15620 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65   (2)  The subque
15630 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
15640 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75  regate or the ou
15650 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
15660 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
15670 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65   (3)  The subque
15680 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69  ry is not the ri
15690 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
156a0 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e   left outer join
156b0 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72 69 67  .**        (Orig
156c0 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20 23 33  inally ticket #3
156d0 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65 6e 65  06.  Strengthene
156e0 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 33 30  d by ticket #330
156f0 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20  0).**.**   (4)  
15700 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
15710 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a  not DISTINCT..**
15720 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e  .**  (**)  At on
15730 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74  e point restrict
15740 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29  ions (4) and (5)
15750 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73 65   defined a subse
15760 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a  t of DISTINCT.**
15770 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72          sub-quer
15780 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65 78  ies that were ex
15790 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73  cluded from this
157a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52   optimization. R
157b0 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20  estriction .**  
157c0 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73 69        (4) has si
157d0 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65  nce been expande
157e0 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c  d to exclude all
157f0 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75 65   DISTINCT subque
15800 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36  ries..**.**   (6
15810 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
15820 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
15830 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
15840 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
15850 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54  t.**        DIST
15860 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37  INCT..**.**   (7
15870 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
15880 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73  has a FROM claus
15890 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20  e..**.**   (8)  
158a0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
158b0 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
158c0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
158d0 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
158e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54  ..**.**   (9)  T
158f0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
15900 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
15910 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
15920 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
15930 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
15940 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29  tes..**.**  (10)
15950 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
15960 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
15970 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
15980 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
15990 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65  ot.**        use
159a0 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28   LIMIT..**.**  (
159b0 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  11)  The subquer
159c0 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
159d0 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
159e0 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20  h have ORDER BY 
159f0 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  clauses..**.**  
15a00 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d  (**)  Not implem
15a10 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64  ented.  Subsumed
15a20 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f   into restrictio
15a30 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76  n (3).  Was prev
15a40 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20  iously.**       
15a50 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74   a separate rest
15a60 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67  riction deriving
15a70 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35   from ticket #35
15a80 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20  0..**.**  (13)  
15a90 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
15aa0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
15ab0 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d  not both use LIM
15ac0 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20  IT..**.**  (14) 
15ad0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
15ae0 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45  es not use OFFSE
15af0 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20  T..**.**  (15)  
15b00 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
15b10 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
15b20 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
15b30 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   or the.**      
15b40 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20    subquery does 
15b50 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54  not have a LIMIT
15b60 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20   clause..**     
15b70 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23     (See ticket #
15b80 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74 20  2339 and ticket 
15b90 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a  [02a8e81d44])..*
15ba0 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20  *.**  (16)  The 
15bb0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
15bc0 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
15bd0 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20  or the subquery 
15be0 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e  does.**        n
15bf0 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  ot contain ORDER
15c00 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32   BY.  (Ticket #2
15c10 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20  942)  This used 
15c20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a  to not matter.**
15c30 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65          until we
15c40 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20   introduced the 
15c50 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66  group_concat() f
15c60 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a  unction.  .**.**
15c70 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62 2d    (17)  The sub-
15c80 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63  query is not a c
15c90 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
15ca0 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e  or it is a UNION
15cb0 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20   ALL .**        
15cc0 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20  compound clause 
15cd0 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79  made up entirely
15ce0 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74   of non-aggregat
15cf0 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a  e queries, and .
15d00 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61  **        the pa
15d10 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  rent query:.**.*
15d20 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
15d30 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74 20  not itself part 
15d40 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
15d50 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20  lect,.**        
15d60 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67    * is not an ag
15d70 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54 49  gregate or DISTI
15d80 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a  NCT query, and.*
15d90 2a 20 20 20 20 20 20 20 20 20 20 2a 20 68 61 73  *          * has
15da0 20 6e 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 73   no other tables
15db0 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 73 20   or sub-selects 
15dc0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
15dd0 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  se..**.**       
15de0 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20   The parent and 
15df0 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f  sub-query may co
15e00 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75  ntain WHERE clau
15e10 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a  ses. Subject to.
15e20 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20  **        rules 
15e30 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28  (11), (13) and (
15e40 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c  14), they may al
15e50 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  so contain ORDER
15e60 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c   BY,.**        L
15e70 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
15e80 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  clauses..**.**  
15e90 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62  (18)  If the sub
15ea0 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
15eb0 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
15ec0 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
15ed0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44  he.**        ORD
15ee0 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20  ER by clause of 
15ef0 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20  the parent must 
15f00 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65  be simple refere
15f10 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20  nces to .**     
15f20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68     columns of th
15f30 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a  e sub-query..**.
15f40 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20 73 75  **  (19)  The su
15f50 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
15f60 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
15f70 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
15f80 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
15f90 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61  have a WHERE cla
15fa0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29  use..**.**  (20)
15fb0 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
15fc0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
15fd0 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74   select, then it
15fe0 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a   must not use.**
15ff0 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52          an ORDER
16000 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63   BY clause.  Tic
16010 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65 20 63  ket #3773.  We c
16020 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20  ould relax this 
16030 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20  constraint.**   
16040 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79       somewhat by
16050 20 73 61 79 69 6e 67 20 74 68 61 74 20 74 68 65   saying that the
16060 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
16070 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75  DER BY clause mu
16080 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70  st.**        app
16090 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65  ear as unmodifie
160a0 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  d result columns
160b0 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
160c0 65 72 79 2e 20 20 42 75 74 0a 2a 2a 20 20 20 20  ery.  But.**    
160d0 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f      have other o
160e0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20  ptimizations in 
160f0 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74  mind to deal wit
16100 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a  h that case..**.
16110 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
16120 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
16130 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
16140 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
16150 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
16160 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
16170 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
16180 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
16190 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
161a0 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
161b0 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73  s and subqueryIs
161c0 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
161d0 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
161e0 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
161f0 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
16200 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
16210 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
16220 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
16230 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20  eturns 0..** If 
16240 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74  flattening is at
16250 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75  tempted this rou
16260 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a  tine returns 1..
16270 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
16280 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
16290 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20  ysis must occur 
162a0 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65  on both the oute
162b0 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74  r query and.** t
162c0 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f  he subquery befo
162d0 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
162e0 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  runs..*/.static 
162f0 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75  int flattenSubqu
16300 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
16310 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
16320 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
16330 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
16340 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16350 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
16360 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
16370 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
16380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
16390 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
163a0 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
163b0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
163c0 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20  nt isAgg,       
163d0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
163e0 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
163f0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
16400 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ions */.  int su
16410 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f  bqueryIsAgg    /
16420 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75  * True if the su
16430 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
16440 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
16450 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
16460 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
16470 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
16480 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
16490 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b  Select *pParent;
164a0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
164b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
164c0 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75  ner query or "su
164d0 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c  bquery" */.  Sel
164e0 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20  ect *pSub1;     
164f0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
16500 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c  he rightmost sel
16510 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79  ect in sub-query
16520 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
16530 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
16540 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
16550 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
16560 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
16570 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  ubSrc;   /* The 
16580 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
16590 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
165a0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
165b0 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  ;    /* The resu
165c0 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75  lt set of the ou
165d0 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
165e0 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  nt iParent;     
165f0 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
16600 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
16610 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20  pSub result set 
16620 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
16630 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
16640 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
16650 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ter */.  Expr *p
16660 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
16670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16680 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
16690 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
166a0 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d  t_item *pSubitem
166b0 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75  ;   /* The subqu
166c0 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
166d0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
166e0 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  b;..  /* Check t
166f0 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
16700 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
16710 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
16720 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ot..  */.  asser
16730 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
16740 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
16750 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20  0 );  /* Unable 
16760 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f  to flatten compo
16770 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  und queries */. 
16780 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
16790 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61   SQLITE_QueryFla
167a0 74 74 65 6e 65 72 20 29 20 72 65 74 75 72 6e 20  ttener ) return 
167b0 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  0;.  pSrc = p->p
167c0 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
167d0 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20  Src && iFrom>=0 
167e0 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e  && iFrom<pSrc->n
167f0 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65  Src );.  pSubite
16800 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72  m = &pSrc->a[iFr
16810 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d  om];.  iParent =
16820 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73   pSubitem->iCurs
16830 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75  or;.  pSub = pSu
16840 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  bitem->pSelect;.
16850 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d    assert( pSub!=
16860 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67  0 );.  if( isAgg
16870 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
16880 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  g ) return 0;   
16890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
168a0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29   Restriction (1)
168b0 20 20 2a 2f 0a 20 20 69 66 28 20 73 75 62 71 75    */.  if( subqu
168c0 65 72 79 49 73 41 67 67 20 26 26 20 70 53 72 63  eryIsAgg && pSrc
168d0 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72  ->nSrc>1 ) retur
168e0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  n 0;          /*
168f0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29   Restriction (2)
16900 20 20 2a 2f 0a 20 20 70 53 75 62 53 72 63 20 3d    */.  pSubSrc =
16910 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61   pSub->pSrc;.  a
16920 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29  ssert( pSubSrc )
16930 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20  ;.  /* Prior to 
16940 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77  version 3.1.2, w
16950 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  hen LIMIT and OF
16960 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20 73  FSET had to be s
16970 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c  imple constants,
16980 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72  .  ** not arbitr
16990 61 72 79 20 65 78 70 72 65 73 73 73 69 6f 6e 73  ary expresssions
169a0 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d  , we allowed som
169b0 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c  e combining of L
169c0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
169d0 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65    ** because the
169e0 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75  y could be compu
169f0 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ted at compile-t
16a00 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c  ime.  But when L
16a10 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
16a20 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69    ** became arbi
16a30 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  trary expression
16a40 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63 65  s, we were force
16a50 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69 63  d to add restric
16a60 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20  tions (13).  ** 
16a70 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69  and (14). */.  i
16a80 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
16a90 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72  && p->pLimit ) r
16aa0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
16ab0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
16ac0 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69  tion (13) */.  i
16ad0 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74  f( pSub->pOffset
16ae0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
16af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b00 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
16b10 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69  tion (14) */.  i
16b20 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  f( p->pRightmost
16b30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74   && pSub->pLimit
16b40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
16b50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16b80 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29  Restriction (15)
16b90 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
16ba0 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29  ubSrc->nSrc==0 )
16bb0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
16bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bd0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
16be0 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  (7)  */.  if( pS
16bf0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
16c00 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74  F_Distinct ) ret
16c10 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
16c20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
16c30 28 35 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  (5)  */.  if( pS
16c40 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70  ub->pLimit && (p
16c50 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69  Src->nSrc>1 || i
16c60 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65  sAgg) ){.     re
16c70 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
16c80 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20  /* Restrictions 
16c90 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20  (8)(9) */.  }.  
16ca0 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
16cb0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
16cc0 3d 30 20 26 26 20 73 75 62 71 75 65 72 79 49 73  =0 && subqueryIs
16cd0 41 67 67 20 29 7b 0a 20 20 20 20 20 72 65 74 75  Agg ){.     retu
16ce0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
16cf0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29   Restriction (6)
16d00 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70    */.  }.  if( p
16d10 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 53  ->pOrderBy && pS
16d20 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
16d30 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
16d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
16d70 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a  riction (11) */.
16d80 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20    }.  if( isAgg 
16d90 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
16da0 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  y ) return 0;   
16db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16dc0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29  Restriction (16)
16dd0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
16de0 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68  pLimit && p->pWh
16df0 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
16e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16e10 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29  Restriction (19)
16e20 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45   */..  /* OBSOLE
16e30 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20  TE COMMENT 1:.  
16e40 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33  ** Restriction 3
16e50 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
16e60 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61  ry is a join, ma
16e70 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
16e80 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f  uery is .  ** no
16e90 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69  t used as the ri
16ea0 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
16eb0 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45  n outer join.  E
16ec0 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
16ed0 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  his.  ** is not 
16ee0 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
16ef0 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
16f00 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74  FT OUTER JOIN (t
16f10 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a  2 JOIN t3).  **.
16f20 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74    ** If we flatt
16f30 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65  en the above, we
16f40 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a   would get.  **.
16f50 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31    **         (t1
16f60 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
16f70 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a   t2) JOIN t3.  *
16f80 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20  *.  ** which is 
16f90 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73  not at all the s
16fa0 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a  ame thing..  **.
16fb0 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f    ** OBSOLETE CO
16fc0 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65  MMENT 2:.  ** Re
16fd0 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49  striction 12:  I
16fe0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
16ff0 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
17000 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
17010 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d  ter.  ** join, m
17020 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
17030 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45  query has no WHE
17040 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20  RE clause..  ** 
17050 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77  An examples of w
17060 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  hy this is not a
17070 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
17080 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
17090 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45  T OUTER JOIN (SE
170a0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57  LECT * FROM t2 W
170b0 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a  HERE t2.x>0).  *
170c0 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
170d0 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
170e0 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
170f0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
17100 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
17110 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e  IN t2) WHERE t2.
17120 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75  x>0.  **.  ** Bu
17130 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73  t the t2.x>0 tes
17140 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61  t will always fa
17150 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77  il on a NULL row
17160 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20   of t2, which.  
17170 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63  ** effectively c
17180 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45  onverts the OUTE
17190 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49  R JOIN into an I
171a0 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a  NNER JOIN..  **.
171b0 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49    ** THIS OVERRI
171c0 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d  DES OBSOLETE COM
171d0 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42  MENTS 1 AND 2 AB
171e0 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74  OVE:.  ** Ticket
171f0 20 23 33 33 30 30 20 73 68 6f 77 73 20 74 68 61   #3300 shows tha
17200 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65  t flattening the
17210 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
17220 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20   LEFT JOIN.  ** 
17230 69 73 20 66 72 61 75 67 68 74 20 77 69 74 68 20  is fraught with 
17240 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f  danger.  Best to
17250 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65   avoid the whole
17260 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a   thing.  If the.
17270 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73    ** subquery is
17280 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
17290 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20  of a LEFT JOIN, 
172a0 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74  then do not flat
172b0 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ten..  */.  if( 
172c0 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74  (pSubitem->joint
172d0 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
172e0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
172f0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
17300 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66  striction 17: If
17310 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
17320 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
17330 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ECT, then it mus
17340 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20  t.  ** use only 
17350 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  the UNION ALL op
17360 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65  erator. And none
17370 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73   of the simple s
17380 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20  elect queries.  
17390 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ** that make up 
173a0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
173b0 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  ECT are allowed 
173c0 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20  to be aggregate 
173d0 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a  or distinct.  **
173e0 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20   queries..  */. 
173f0 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f   if( pSub->pPrio
17400 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75  r ){.    if( pSu
17410 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
17420 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
17430 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32  /* Restriction 2
17440 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  0 */.    }.    i
17450 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e  f( isAgg || (p->
17460 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
17470 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53  stinct)!=0 || pS
17480 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20  rc->nSrc!=1 ){. 
17490 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
174a0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75     }.    for(pSu
174b0 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20  b1=pSub; pSub1; 
174c0 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72  pSub1=pSub1->pPr
174d0 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74  ior){.      test
174e0 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65  case( (pSub1->se
174f0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
17500 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
17510 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
17520 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
17530 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
17540 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
17550 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
17560 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74  e))==SF_Aggregat
17570 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  e );.      if( (
17580 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
17590 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
175a0 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30  F_Aggregate))!=0
175b0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62  .       || (pSub
175c0 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75  1->pPrior && pSu
175d0 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  b1->op!=TK_ALL) 
175e0 0a 20 20 20 20 20 20 20 7c 7c 20 4e 45 56 45 52  .       || NEVER
175f0 28 70 53 75 62 31 2d 3e 70 53 72 63 3d 3d 30 29  (pSub1->pSrc==0)
17600 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d   || pSub1->pSrc-
17610 3e 6e 53 72 63 21 3d 31 0a 20 20 20 20 20 20 29  >nSrc!=1.      )
17620 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
17630 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
17640 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69  }..    /* Restri
17650 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20  ction 18. */.   
17660 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
17670 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
17680 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
17690 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79  ; ii<p->pOrderBy
176a0 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a  ->nExpr; ii++){.
176b0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
176c0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 69  OrderBy->a[ii].i
176d0 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Col==0 ) return 
176e0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
176f0 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49  .  }..  /***** I
17700 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
17710 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e  point, flattenin
17720 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
17730 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74  *****/..  /* Aut
17740 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75  horize the subqu
17750 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d  ery */.  pParse-
17760 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
17770 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b  pSubitem->zName;
17780 0a 20 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  .  sqlite3AuthCh
17790 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
177a0 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
177b0 20 30 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a   0);.  pParse->z
177c0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
177d0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
177e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75  ..  /* If the su
177f0 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
17800 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
17810 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79  tement, then (by
17820 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20   restrictions.  
17830 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f  ** 17 and 18 abo
17840 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  ve) it must be a
17850 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74   UNION ALL and t
17860 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
17870 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66  must .  ** be of
17880 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a   the form:.  **.
17890 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
178a0 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d  <expr-list> FROM
178b0 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c   (<sub-query>) <
178c0 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20  where-clause> . 
178d0 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65   **.  ** followe
178e0 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42  d by any ORDER B
178f0 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20  Y, LIMIT and/or 
17900 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
17910 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20  This block.  ** 
17920 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69  creates N-1 copi
17930 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  es of the parent
17940 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61   query without a
17950 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
17960 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53  IT or .  ** OFFS
17970 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a  ET clauses and j
17980 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65  oins them to the
17990 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20   left-hand-side 
179a0 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  of the original.
179b0 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e    ** using UNION
179c0 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20   ALL operators. 
179d0 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69  In this case N i
179e0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
179f0 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65  simple.  ** sele
17a00 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ct statements in
17a10 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75   the compound su
17a20 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20  b-query..  **.  
17a30 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  ** Example:.  **
17a40 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
17a50 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a   a+1 FROM (.  **
17a60 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78          SELECT x
17a70 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
17a80 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
17a90 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
17aa0 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT y FROM tab.  
17ab0 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
17ac0 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
17ad0 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20  SELECT abs(z*2) 
17ae0 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20  FROM tab2.  **  
17af0 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35 20     ) WHERE a!=5 
17b00 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
17b10 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64    ** Transformed
17b20 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
17b30 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20       SELECT x+1 
17b40 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78  FROM tab WHERE x
17b50 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
17b60 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
17b70 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f    SELECT y+1 FRO
17b80 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31 21  M tab WHERE y+1!
17b90 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
17ba0 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
17bb0 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31  ELECT abs(z*2)+1
17bc0 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45   FROM tab2 WHERE
17bd0 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20   abs(z*2)+1!=5. 
17be0 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59   **     ORDER BY
17bf0 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20   1.  **.  ** We 
17c00 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63  call this the "c
17c10 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
17c20 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20   flattening"..  
17c30 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53  */.  for(pSub=pS
17c40 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62  ub->pPrior; pSub
17c50 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  ; pSub=pSub->pPr
17c60 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ior){.    Select
17c70 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72   *pNew;.    Expr
17c80 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
17c90 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
17ca0 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d    Expr *pLimit =
17cb0 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
17cc0 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d  Select *pPrior =
17cd0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
17ce0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
17cf0 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30  .    p->pSrc = 0
17d00 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
17d10 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  = 0;.    p->pLim
17d20 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  it = 0;.    pNew
17d30 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
17d40 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20  Dup(db, p, 0);. 
17d50 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
17d60 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f  Limit;.    p->pO
17d70 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
17d80 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  y;.    p->pSrc =
17d90 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70   pSrc;.    p->op
17da0 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70   = TK_ALL;.    p
17db0 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30  ->pRightmost = 0
17dc0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
17dd0 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  0 ){.      pNew 
17de0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65  = pPrior;.    }e
17df0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
17e00 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
17e10 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52  ;.      pNew->pR
17e20 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20  ightmost = 0;.  
17e30 20 20 7d 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f    }.    p->pPrio
17e40 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 69 66  r = pNew;.    if
17e50 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
17e60 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
17e70 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66   }..  /* Begin f
17e80 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46  lattening the iF
17e90 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  rom-th entry of 
17ea0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
17eb0 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74  .  ** in the out
17ec0 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  er query..  */. 
17ed0 20 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20   pSub = pSub1 = 
17ee0 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
17ef0 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  t;..  /* Delete 
17f00 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61  the transient ta
17f10 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ble structure as
17f20 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
17f30 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a  e.  ** subquery.
17f40 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62    */.  sqlite3Db
17f50 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
17f60 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
17f70 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
17f80 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  b, pSubitem->zNa
17f90 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
17fa0 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
17fb0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53  m->zAlias);.  pS
17fc0 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
17fd0 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  e = 0;.  pSubite
17fe0 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  m->zName = 0;.  
17ff0 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
18000 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
18010 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a  ->pSelect = 0;..
18020 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74    /* Defer delet
18030 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62  ing the Table ob
18040 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
18050 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75  with the.  ** su
18060 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64  bquery until cod
18070 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a  e generation is.
18080 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73    ** complete, s
18090 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73  ince there may s
180a0 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e  till exist Expr.
180b0 70 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61  pTab entries tha
180c0 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20  t.  ** refer to 
180d0 74 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65  the subquery eve
180e0 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69  n after flatteni
180f0 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34  ng.  Ticket #334
18100 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75  6..  **.  ** pSu
18110 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61  bitem->pTab is a
18120 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62  lways non-NULL b
18130 79 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69  y test restricti
18140 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62  ons and tests ab
18150 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ove..  */.  if( 
18160 41 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d  ALWAYS(pSubitem-
18170 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
18180 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65   Table *pTabToDe
18190 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54  l = pSubitem->pT
181a0 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
181b0 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29  ToDel->nRef==1 )
181c0 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a 70  {.      Parse *p
181d0 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
181e0 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
181f0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70  pParse);.      p
18200 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a  TabToDel->pNextZ
18210 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65  ombie = pTopleve
18220 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20  l->pZombieTab;. 
18230 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e       pToplevel->
18240 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61  pZombieTab = pTa
18250 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73  bToDel;.    }els
18260 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44  e{.      pTabToD
18270 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  el->nRef--;.    
18280 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e  }.    pSubitem->
18290 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  pTab = 0;.  }.. 
182a0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
182b0 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65  g loop runs once
182c0 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69   for each term i
182d0 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
182e0 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74  query.  ** flatt
182f0 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69  ening (as descri
18300 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20  bed above).  If 
18310 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64  we are doing a d
18320 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20  ifferent kind.  
18330 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** of flattening
18340 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20   - a flattening 
18350 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d  other than a com
18360 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
18370 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a  lattening -.  **
18380 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20   then this loop 
18390 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a  only runs once..
183a0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
183b0 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66  oop moves all of
183c0 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e   the FROM elemen
183d0 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ts of the subque
183e0 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ry into the.  **
183f0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
18400 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
18410 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69  ery.  Before doi
18420 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65  ng this, remembe
18430 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  r.  ** the curso
18440 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
18450 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20   original outer 
18460 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65  query FROM eleme
18470 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65  nt in.  ** iPare
18480 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74  nt.  The iParent
18490 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76   cursor will nev
184a0 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62  er be used.  Sub
184b0 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a  sequent code.  *
184c0 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72  * will scan expr
184d0 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20  essions looking 
184e0 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65  for iParent refe
184f0 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61  rences and repla
18500 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65  ce.  ** those re
18510 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78  ferences with ex
18520 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
18530 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75  esolve to the su
18540 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a  bquery FROM.  **
18550 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65   elements we are
18560 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e   now copying in.
18570 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72  .  */.  for(pPar
18580 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20  ent=p; pParent; 
18590 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d  pParent=pParent-
185a0 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53  >pPrior, pSub=pS
185b0 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
185c0 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20   int nSubSrc;.  
185d0 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20    u8 jointype = 
185e0 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d  0;.    pSubSrc =
185f0 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20   pSub->pSrc;    
18600 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
18610 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  of subquery */. 
18620 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75     nSubSrc = pSu
18630 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20  bSrc->nSrc;  /* 
18640 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
18650 69 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  in subquery FROM
18660 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70   clause */.    p
18670 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  Src = pParent->p
18680 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
18690 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
186a0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20  uter query */.. 
186b0 20 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20     if( pSrc ){. 
186c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
186d0 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46  rent==p );  /* F
186e0 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67  irst time throug
186f0 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
18700 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70      jointype = p
18710 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  Subitem->jointyp
18720 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
18730 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
18740 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e  ent!=p );  /* 2n
18750 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
18760 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74   times through t
18770 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  he loop */.     
18780 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
18790 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  >pSrc = sqlite3S
187a0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c  rcListAppend(db,
187b0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
187c0 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a   if( pSrc==0 ){.
187d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
187e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
187f0 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
18800 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
18810 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62  ..    /* The sub
18820 71 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e  query uses a sin
18830 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20  gle slot of the 
18840 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
18850 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  he outer.    ** 
18860 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73  query.  If the s
18870 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65  ubquery has more
18880 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e   than one elemen
18890 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  t in its FROM cl
188a0 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ause,.    ** the
188b0 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  n expand the out
188c0 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65  er query to make
188d0 20 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f   space for it to
188e0 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e   hold all elemen
188f0 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ts.    ** of the
18900 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
18910 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65  *.    ** Example
18920 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
18930 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
18940 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a   tabA, (SELECT *
18950 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32   FROM sub1, sub2
18960 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a  ), tabB;.    **.
18970 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72      ** The outer
18980 20 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f   query has 3 slo
18990 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63  ts in its FROM c
189a0 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74  lause.  One slot
189b0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   of the.    ** o
189c0 75 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20  uter query (the 
189d0 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20  middle slot) is 
189e0 75 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71  used by the subq
189f0 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a  uery.  The next.
18a00 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20      ** block of 
18a10 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64  code will expand
18a20 20 74 68 65 20 6f 75 74 20 71 75 65 72 79 20 74   the out query t
18a30 6f 20 34 20 73 6c 6f 74 73 2e 20 20 54 68 65 20  o 4 slots.  The 
18a40 6d 69 64 64 6c 65 0a 20 20 20 20 2a 2a 20 73 6c  middle.    ** sl
18a50 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74  ot is expanded t
18a60 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f  o two slots in o
18a70 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61  rder to make spa
18a80 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  ce for the.    *
18a90 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69  * two elements i
18aa0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
18ab0 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
18ac0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
18ad0 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
18ae0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53       pParent->pS
18af0 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69  rc = pSrc = sqli
18b00 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
18b10 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62  e(db, pSrc, nSub
18b20 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a  Src-1,iFrom+1);.
18b30 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
18b40 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
18b50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18b60 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
18b70 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
18b80 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
18b90 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75  s from the subqu
18ba0 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ery into the.   
18bb0 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e   ** outer query.
18bc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
18bd0 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
18be0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
18bf0 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
18c00 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46  db, pSrc->a[i+iF
18c10 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20  rom].pUsing);.  
18c20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46      pSrc->a[i+iF
18c30 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e  rom] = pSubSrc->
18c40 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73  a[i];.      mems
18c50 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69  et(&pSubSrc->a[i
18c60 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75  ], 0, sizeof(pSu
18c70 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20  bSrc->a[i]));.  
18c80 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b    }.    pSrc->a[
18c90 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20  iFrom].jointype 
18ca0 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20  = jointype;.  . 
18cb0 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20     /* Now begin 
18cc0 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62  substituting sub
18cd0 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74  query result set
18ce0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72   expressions for
18cf0 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e   .    ** referen
18d00 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65  ces to the iPare
18d10 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  nt in the outer 
18d20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20  query..    ** . 
18d30 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20     ** Example:. 
18d40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53     **.    **   S
18d50 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20  ELECT a+5, b*10 
18d60 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33  FROM (SELECT x*3
18d70 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62   AS a, y+10 AS b
18d80 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20   FROM t1) WHERE 
18d90 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20  a>b;.    **   \ 
18da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18db0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
18dc0 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f  __ subquery ____
18dd0 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20  ______/         
18de0 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f   /.    **    \__
18df0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18e00 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20  ___ outer query 
18e10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18e20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
18e30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65      **.    ** We
18e40 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65   look at every e
18e50 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
18e60 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
18e70 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
18e80 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77  see.    ** "a" w
18e90 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a  e substitute "x*
18ea0 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  3" and every pla
18eb0 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65  ce we see "b" we
18ec0 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31   substitute "y+1
18ed0 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  0"..    */.    p
18ee0 4c 69 73 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e  List = pParent->
18ef0 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28  pEList;.    for(
18f00 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
18f10 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
18f20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   if( pList->a[i]
18f30 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  .zName==0 ){.   
18f40 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
18f50 2a 7a 53 70 61 6e 20 3d 20 70 4c 69 73 74 2d 3e  *zSpan = pList->
18f60 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
18f70 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a      if( ALWAYS(z
18f80 53 70 61 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  Span) ){.       
18f90 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a     pList->a[i].z
18fa0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
18fb0 53 74 72 44 75 70 28 64 62 2c 20 7a 53 70 61 6e  StrDup(db, zSpan
18fc0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
18fd0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
18fe0 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
18ff0 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74   pParent->pEList
19000 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
19010 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66  >pEList);.    if
19020 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 20  ( isAgg ){.     
19030 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
19040 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f  b, pParent->pGro
19050 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  upBy, iParent, p
19060 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
19070 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
19080 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72  ving = substExpr
19090 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48  (db, pParent->pH
190a0 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
190b0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
190c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75     }.    if( pSu
190d0 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
190e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
190f0 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rent->pOrderBy==
19100 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
19110 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  nt->pOrderBy = p
19120 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
19130 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65       pSub->pOrde
19140 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rBy = 0;.    }el
19150 73 65 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e  se if( pParent->
19160 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
19170 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
19180 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  db, pParent->pOr
19190 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  derBy, iParent, 
191a0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
191b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75     }.    if( pSu
191c0 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  b->pWhere ){.   
191d0 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69     pWhere = sqli
191e0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
191f0 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b  Sub->pWhere, 0);
19200 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19210 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
19220 20 20 7d 0a 20 20 20 20 69 66 28 20 73 75 62 71    }.    if( subq
19230 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
19240 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
19250 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29  nt->pHaving==0 )
19260 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
19270 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72 65  >pHaving = pPare
19280 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20  nt->pWhere;.    
19290 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
192a0 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20  e = pWhere;.    
192b0 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69    pParent->pHavi
192c0 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ng = substExpr(d
192d0 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  b, pParent->pHav
192e0 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ing, iParent, pS
192f0 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
19300 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
19310 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
19320 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74  rAnd(db, pParent
19330 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20 20 20  ->pHaving, .    
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
19360 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
19370 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20   pSub->pHaving, 
19380 30 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0));.      asser
19390 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f  t( pParent->pGro
193a0 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  upBy==0 );.     
193b0 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70   pParent->pGroup
193c0 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
193d0 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 75 62  ListDup(db, pSub
193e0 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a  ->pGroupBy, 0);.
193f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19400 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
19410 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
19420 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
19430 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
19440 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
19450 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20  pParent->pWhere 
19460 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
19470 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57  (db, pParent->pW
19480 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20  here, pWhere);. 
19490 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54     }.  .    /* T
194a0 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65  he flattened que
194b0 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69  ry is distinct i
194c0 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e  f either the inn
194d0 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  er or the.    **
194e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
194f0 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a  distinct. .    *
19500 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73  /.    pParent->s
19510 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d  elFlags |= pSub-
19520 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
19530 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20  istinct;.  .    
19540 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  /*.    ** SELECT
19550 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43   ... FROM (SELEC
19560 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46  T ... LIMIT a OF
19570 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20  FSET b) LIMIT x 
19580 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a  OFFSET y;.    **
19590 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74  .    ** One is t
195a0 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f  empted to try to
195b0 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20   add a and b to 
195c0 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69  combine the limi
195d0 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20  ts.  But this.  
195e0 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f    ** does not wo
195f0 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d  rk if either lim
19600 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
19610 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
19620 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
19630 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c       pParent->pL
19640 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69  imit = pSub->pLi
19650 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  mit;.      pSub-
19660 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
19670 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
19680 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68  ially, delete wh
19690 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68  at is left of th
196a0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72  e subquery and r
196b0 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65  eturn.  ** succe
196c0 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
196d0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
196e0 62 2c 20 70 53 75 62 31 29 3b 0a 0a 20 20 72 65  b, pSub1);..  re
196f0 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
19700 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
19710 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
19720 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
19730 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
19740 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79   */../*.** Analy
19750 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  ze the SELECT st
19760 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
19770 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  s an argument to
19780 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73   see if it.** is
19790 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28   a min() or max(
197a0 29 20 71 75 65 72 79 2e 20 52 65 74 75 72 6e 20  ) query. Return 
197b0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
197c0 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52  N or WHERE_ORDER
197d0 42 59 5f 4d 41 58 20 69 66 20 0a 2a 2a 20 69 74  BY_MAX if .** it
197e0 20 69 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77   is, or 0 otherw
197f0 69 73 65 2e 20 41 74 20 70 72 65 73 65 6e 74 2c  ise. At present,
19800 20 61 20 71 75 65 72 79 20 69 73 20 63 6f 6e 73   a query is cons
19810 69 64 65 72 65 64 20 74 6f 20 62 65 0a 2a 2a 20  idered to be.** 
19820 61 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20 71 75  a min()/max() qu
19830 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery if:.**.**   
19840 31 2e 20 54 68 65 72 65 20 69 73 20 61 20 73 69  1. There is a si
19850 6e 67 6c 65 20 6f 62 6a 65 63 74 20 69 6e 20 74  ngle object in t
19860 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
19870 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65 72 65  **.**   2. There
19880 20 69 73 20 61 20 73 69 6e 67 6c 65 20 65 78 70   is a single exp
19890 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72  ression in the r
198a0 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20 69  esult set, and i
198b0 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 65 69 74  t is.**      eit
198c0 68 65 72 20 6d 69 6e 28 78 29 20 6f 72 20 6d 61  her min(x) or ma
198d0 78 28 78 29 2c 20 77 68 65 72 65 20 78 20 69 73  x(x), where x is
198e0 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65   a column refere
198f0 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  nce..*/.static u
19900 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 53 65  8 minMaxQuery(Se
19910 6c 65 63 74 20 2a 70 29 7b 0a 20 20 45 78 70 72  lect *p){.  Expr
19920 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72 4c   *pExpr;.  ExprL
19930 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d  ist *pEList = p-
19940 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20  >pEList;..  if( 
19950 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
19960 20 29 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f   ) return WHERE_
19970 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
19980 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74    pExpr = pEList
19990 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
199a0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
199b0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
199c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
199d0 20 4e 45 56 45 52 28 45 78 70 72 48 61 73 50 72   NEVER(ExprHasPr
199e0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
199f0 5f 78 49 73 53 65 6c 65 63 74 29 29 20 29 20 72  _xIsSelect)) ) r
19a00 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73  eturn 0;.  pELis
19a10 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
19a20 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
19a30 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e  ==0 || pEList->n
19a40 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
19a50 20 30 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74   0;.  if( pEList
19a60 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
19a70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
19a80 29 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f  ) return WHERE_O
19a90 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20  RDERBY_NORMAL;. 
19aa0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
19ab0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
19ac0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
19ad0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
19ae0 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  rICmp(pExpr->u.z
19af0 54 6f 6b 65 6e 2c 22 6d 69 6e 22 29 3d 3d 30 20  Token,"min")==0 
19b00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 48  ){.    return WH
19b10 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b  ERE_ORDERBY_MIN;
19b20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
19b30 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70  ite3StrICmp(pExp
19b40 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 78  r->u.zToken,"max
19b50 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ")==0 ){.    ret
19b60 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
19b70 59 5f 4d 41 58 3b 0a 20 20 7d 0a 20 20 72 65 74  Y_MAX;.  }.  ret
19b80 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
19b90 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a  Y_NORMAL;.}../*.
19ba0 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74  ** The select st
19bb0 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
19bc0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
19bd0 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65  ment is an aggre
19be0 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54  gate query..** T
19bf0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 6d 65 6e  he second argmen
19c00 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61  t is the associa
19c10 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e  ted aggregate-in
19c20 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20  fo object. This 
19c30 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73  .** function tes
19c40 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  ts if the SELECT
19c50 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
19c60 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
19c70 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74  count(*) FROM <t
19c80 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  bl>.**.** where 
19c90 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62  table is a datab
19ca0 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  ase table, not a
19cb0 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
19cc0 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72  iew. If the quer
19cd0 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20  y.** does match 
19ce0 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68  this pattern, th
19cf0 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  en a pointer to 
19d00 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
19d10 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a   representing.**
19d20 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e   <tbl> is return
19d30 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
19d40 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
19d50 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69  .static Table *i
19d60 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c  sSimpleCount(Sel
19d70 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20  ect *p, AggInfo 
19d80 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61  *pAggInfo){.  Ta
19d90 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70  ble *pTab;.  Exp
19da0 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73  r *pExpr;..  ass
19db0 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42  ert( !p->pGroupB
19dc0 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  y );..  if( p->p
19dd0 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69  Where || p->pELi
19de0 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20  st->nExpr!=1 .  
19df0 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72   || p->pSrc->nSr
19e00 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d  c!=1 || p->pSrc-
19e10 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20  >a[0].pSelect.  
19e20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
19e30 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d  .  }.  pTab = p-
19e40 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
19e50 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70  ;.  pExpr = p->p
19e60 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
19e70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  r;.  assert( pTa
19e80 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c  b && !pTab->pSel
19e90 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a  ect && pExpr );.
19ea0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
19eb0 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
19ec0 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
19ed0 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
19ee0 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
19ef0 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d    if( (pAggInfo-
19f00 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d  >aFunc[0].pFunc-
19f10 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55  >flags&SQLITE_FU
19f20 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72  NC_COUNT)==0 ) r
19f30 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
19f40 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44  Expr->flags&EP_D
19f50 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
19f60 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54   0;..  return pT
19f70 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ab;.}../*.** If 
19f80 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
19f90 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61  item passed as a
19fa0 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61  n argument was a
19fb0 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e  ugmented with an
19fc0 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63  .** INDEXED BY c
19fd0 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20  lause, then try 
19fe0 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70  to locate the sp
19ff0 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49  ecified index. I
1a000 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73  f there.** was s
1a010 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64  uch a clause and
1a020 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
1a030 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
1a040 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
1a050 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65  ITE_ERROR and le
1a060 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
1a070 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73  pParse. Otherwis
1a080 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20  e, populate .** 
1a090 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e  pFrom->pIndex an
1a0a0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
1a0b0 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
1a0c0 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75  e3IndexedByLooku
1a0d0 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
1a0e0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1a0f0 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  item *pFrom){.  
1a100 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
1a110 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78  && pFrom->zIndex
1a120 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
1a130 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
1a140 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e  b;.    char *zIn
1a150 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e  dex = pFrom->zIn
1a160 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  dex;.    Index *
1a170 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
1a180 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
1a190 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26   .        pIdx &
1a1a0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
1a1b0 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49  (pIdx->zName, zI
1a1c0 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20 20  ndex); .        
1a1d0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
1a1e0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
1a1f0 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73  !pIdx ){.      s
1a200 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a210 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
1a220 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64  index: %s", zInd
1a230 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  ex, 0);.      pP
1a240 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
1a250 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  a = 1;.      ret
1a260 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
1a270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f  ;.    }.    pFro
1a280 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  m->pIndex = pIdx
1a290 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1a2a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1a2b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1a2c0 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c  is a Walker call
1a2d0 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64  back for "expand
1a2e0 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74  ing" a SELECT st
1a2f0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70  atement..** "Exp
1a300 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f  anding" means to
1a310 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   do the followin
1a320 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  g:.**.**    (1) 
1a330 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20   Make sure VDBE 
1a340 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
1a350 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
1a360 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20  d to every.**   
1a370 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66        element of
1a380 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1a390 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
1a3a0 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62  Fill in the pTab
1a3b0 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  List->a[].pTab f
1a3c0 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63  ields in the Src
1a3d0 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
1a3e0 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52        defines FR
1a3f0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e  OM clause.  When
1a400 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e   views appear in
1a410 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1a420 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c  ,.**         fil
1a430 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  l pTabList->a[].
1a440 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63  pSelect with a c
1a450 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
1a460 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  T statement.**  
1a470 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c         that impl
1a480 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e  ements the view.
1a490 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65    A copy is made
1a4a0 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53   of the view's S
1a4b0 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
1a4c0 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68   statement so th
1a4d0 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79  at we can freely
1a4e0 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74   modify or delet
1a4f0 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
1a500 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68  .**         with
1a510 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f  out worrying abo
1a520 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68  ut messing up th
1a530 65 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70  e presistent rep
1a540 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20  resentation.**  
1a550 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69         of the vi
1a560 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  ew..**.**    (3)
1a570 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
1a580 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1a590 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68  to accomodate th
1a5a0 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
1a5b0 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20  d.**         on 
1a5c0 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e  joins and the ON
1a5d0 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
1a5e0 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a  e of joins..**.*
1a5f0 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74  *    (4)  Scan t
1a600 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
1a610 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
1a620 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f   set (pEList) lo
1a630 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oking.**        
1a640 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f   for instances o
1a650 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74  f the "*" operat
1a660 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e  or or the TABLE.
1a670 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20  * operator..**  
1a680 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c         If found,
1a690 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22   expand each "*"
1a6a0 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
1a6b0 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62  umn in every tab
1a6c0 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e  le.**         an
1a6d0 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20  d TABLE.* to be 
1a6e0 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
1a6f0 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61  TABLE..**.*/.sta
1a700 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78  tic int selectEx
1a710 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70  pander(Walker *p
1a720 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
1a730 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
1a740 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
1a750 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20  Parse;.  int i, 
1a760 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20  j, k;.  SrcList 
1a770 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70  *pTabList;.  Exp
1a780 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
1a790 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1a7a0 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73  item *pFrom;.  s
1a7b0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1a7c0 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
1a7d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a7e0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1a7f0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20  WRC_Abort;.  }. 
1a800 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53   if( NEVER(p->pS
1a810 72 63 3d 3d 30 29 20 7c 7c 20 28 70 2d 3e 73 65  rc==0) || (p->se
1a820 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61  lFlags & SF_Expa
1a830 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  nded)!=0 ){.    
1a840 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
1a850 3b 0a 20 20 7d 0a 20 20 70 2d 3e 73 65 6c 46 6c  ;.  }.  p->selFl
1a860 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64  ags |= SF_Expand
1a870 65 64 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  ed;.  pTabList =
1a880 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
1a890 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
1a8a0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
1a8b0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
1a8c0 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
1a8d0 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73  d to all entries
1a8e0 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f   in.  ** the FRO
1a8f0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1a900 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1a910 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1a920 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
1a930 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61  sors(pParse, pTa
1a940 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  bList);..  /* Lo
1a950 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c  ok up every tabl
1a960 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
1a970 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1a980 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20  e select.  If.  
1a990 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  ** an entry of t
1a9a0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
1a9b0 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73  s a subquery ins
1a9c0 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20  tead of a table 
1a9d0 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68  or view,.  ** th
1a9e0 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e  en create a tran
1a9f0 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
1aa00 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62  cture to describ
1aa10 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  e the subquery..
1aa20 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
1aa30 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
1aa40 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
1aa50 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
1aa60 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
1aa70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46 72  Tab;.    if( pFr
1aa80 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20  om->pTab!=0 ){. 
1aa90 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61       /* This sta
1aaa0 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61  tement has alrea
1aab0 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64  dy been prepared
1aac0 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  .  There is no n
1aad0 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  eed.      ** to 
1aae0 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20  go further. */. 
1aaf0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d       assert( i==
1ab00 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1ab10 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
1ab20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d   }.    if( pFrom
1ab30 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69  ->zName==0 ){.#i
1ab40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ab50 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20  T_SUBQUERY.     
1ab60 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20   Select *pSel = 
1ab70 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
1ab80 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
1ab90 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
1aba0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
1abb0 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ECT */.      ass
1abc0 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a  ert( pSel!=0 );.
1abd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
1abe0 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
1abf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
1ac00 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
1ac10 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 70 46   pSel);.      pF
1ac20 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
1ac30 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1ac40 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
1ac50 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20  f(Table));.     
1ac60 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
1ac70 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
1ac80 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65  .      pTab->nRe
1ac90 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 61  f = 1;.      pTa
1aca0 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
1acb0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
1acc0 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79 5f 25  qlite_subquery_%
1acd0 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62  p_", (void*)pTab
1ace0 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
1acf0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20  pSel->pPrior ){ 
1ad00 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
1ad10 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c  ior; }.      sel
1ad20 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  ectColumnsFromEx
1ad30 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
1ad40 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54  Sel->pEList, &pT
1ad50 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
1ad60 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54  >aCol);.      pT
1ad70 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
1ad80 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77        pTab->nRow
1ad90 45 73 74 20 3d 20 31 30 30 30 30 30 30 3b 0a 20  Est = 1000000;. 
1ada0 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c       pTab->tabFl
1adb0 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
1adc0 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ral;.#endif.    
1add0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
1ade0 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
1adf0 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69  e or view name i
1ae00 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1ae10 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
1ae20 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
1ae30 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
1ae40 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
1ae50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ae60 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
1ae70 73 65 2c 30 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d  se,0,pFrom->zNam
1ae80 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61  e,pFrom->zDataba
1ae90 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  se);.      if( p
1aea0 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
1aeb0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
1aec0 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23   pTab->nRef++;.#
1aed0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1aee0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
1aef0 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54   !defined (SQLIT
1af00 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1af10 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 70  BLE).      if( p
1af20 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20  Tab->pSelect || 
1af30 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
1af40 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
1af50 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74   reach here if t
1af60 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
1af70 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65  s a really a vie
1af80 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  w */.        if(
1af90 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
1afa0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
1afb0 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72  e, pTab) ) retur
1afc0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
1afd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
1afe0 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
1aff0 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  ;.        pFrom-
1b000 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
1b010 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
1b020 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pTab->pSelect, 0
1b030 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1b040 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
1b050 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65  lker, pFrom->pSe
1b060 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  lect);.      }.#
1b070 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
1b080 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69   /* Locate the i
1b090 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68  ndex named by th
1b0a0 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  e INDEXED BY cla
1b0b0 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a  use, if any. */.
1b0c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1b0d0 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70  ndexedByLookup(p
1b0e0 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b  Parse, pFrom) ){
1b0f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
1b100 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  C_Abort;.    }. 
1b110 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73   }..  /* Process
1b120 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
1b130 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53  s, and ON and US
1b140 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a  ING clauses of j
1b150 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  oins..  */.  if(
1b160 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1b170 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65  d || sqliteProce
1b180 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70  ssJoin(pParse, p
1b190 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1b1a0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
1b1b0 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22    /* For every "
1b1c0 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  *" that occurs i
1b1d0 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
1b1e0 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  t, insert the na
1b1f0 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20  mes of.  ** all 
1b200 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
1b210 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20  ables.  And for 
1b220 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e  every TABLE.* in
1b230 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20  sert the names. 
1b240 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d   ** of all colum
1b250 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68  ns in TABLE.  Th
1b260 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65  e parser inserte
1b270 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72  d a special expr
1b280 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68  ession.  ** with
1b290 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72   the TK_ALL oper
1b2a0 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a  ator for each "*
1b2b0 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20  " that it found 
1b2c0 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
1b2d0 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c  st..  ** The fol
1b2e0 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74  lowing code just
1b2f0 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74   has to locate t
1b300 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73  he TK_ALL expres
1b310 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64  sions and expand
1b320 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74  .  ** each one t
1b330 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
1b340 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
1b350 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
1b360 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f  ** The first loo
1b370 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f  p just checks to
1b380 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
1b390 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74  e any "*" operat
1b3a0 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65  ors.  ** that ne
1b3b0 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20  ed expanding..  
1b3c0 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  */.  for(k=0; k<
1b3d0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
1b3e0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
1b3f0 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d  E = pEList->a[k]
1b400 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
1b410 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  pE->op==TK_ALL )
1b420 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65   break;.    asse
1b430 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
1b440 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74  OT || pE->pRight
1b450 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
1b460 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
1b470 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21  T || (pE->pLeft!
1b480 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d  =0 && pE->pLeft-
1b490 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20  >op==TK_ID) );. 
1b4a0 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
1b4b0 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69  K_DOT && pE->pRi
1b4c0 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  ght->op==TK_ALL 
1b4d0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
1b4e0 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
1b4f0 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
1b500 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
1b510 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
1b520 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
1b530 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
1b540 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
1b550 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
1b560 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
1b570 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
1b580 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
1b590 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
1b5a0 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
1b5b0 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
1b5c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
1b5d0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1b5e0 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
1b5f0 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
1b600 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e  pNew = 0;.    in
1b610 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65  t flags = pParse
1b620 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ->db->flags;.   
1b630 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d   int longNames =
1b640 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1b650 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
1b660 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
1b670 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67          && (flag
1b680 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
1b690 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20  ColNames)==0;.. 
1b6a0 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45     for(k=0; k<pE
1b6b0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
1b6c0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
1b6d0 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  E = a[k].pExpr;.
1b6e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1b6f0 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
1b700 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b  pE->pRight!=0 );
1b710 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  .      if( pE->o
1b720 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45  p!=TK_ALL && (pE
1b730 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
1b740 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d  pE->pRight->op!=
1b750 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20  TK_ALL) ){.     
1b760 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
1b770 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
1b780 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
1b790 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
1b7a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1b7b0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
1b7c0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
1b7d0 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b  Parse, pNew, a[k
1b7e0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
1b7f0 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
1b800 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
1b810 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
1b820 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
1b830 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e;.          pNe
1b840 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
1b850 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d  -1].zSpan = a[k]
1b860 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20  .zSpan;.        
1b870 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
1b880 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
1b890 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20  .zSpan = 0;.    
1b8a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b      }.        a[
1b8b0 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  k].pExpr = 0;.  
1b8c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b8d0 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
1b8e0 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
1b8f0 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
1b900 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
1b910 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
1b920 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
1b930 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
1b940 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
1b950 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
1b960 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
1b970 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20  char *zTName;   
1b980 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74           /* text
1b990 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c   of name of TABL
1b9a0 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  E */.        if(
1b9b0 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
1b9c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
1b9d0 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d  ert( pE->pLeft!=
1b9e0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
1b9f0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1ba00 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66  roperty(pE->pLef
1ba10 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  t, EP_IntValue) 
1ba20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  );.          zTN
1ba30 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d  ame = pE->pLeft-
1ba40 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
1ba50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ba60 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a      zTName = 0;.
1ba70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ba80 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
1ba90 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
1baa0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
1bab0 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
1bac0 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a           Table *
1bad0 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
1bae0 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  ab;.          ch
1baf0 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
1bb00 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  From->zAlias;.  
1bb10 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
1bb20 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
1bb30 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20         zTabName 
1bb40 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
1bb50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1bb60 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
1bb70 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
1bb80 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  k;.          if(
1bb90 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74   zTName && sqlit
1bba0 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65  e3StrICmp(zTName
1bbb0 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29  , zTabName)!=0 )
1bbc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
1bbd0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1bbe0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61    }.          ta
1bbf0 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20  bleSeen = 1;.   
1bc00 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
1bc10 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
1bc20 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
1bc30 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 52  Expr *pExpr, *pR
1bc40 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
1bc50 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
1bc60 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
1bc70 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
1bc80 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b   char *zColname;
1bc90 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65    /* The compute
1bca0 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  d column name */
1bcb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
1bcc0 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a  r *zToFree;   /*
1bcd0 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67   Malloced string
1bce0 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
1bcf0 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20  e freed */.     
1bd00 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f         Token sCo
1bd10 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75  lname;  /* Compu
1bd20 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ted column name 
1bd30 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20  as a token */.. 
1bd40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1bd50 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72   a column is mar
1bd60 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 20  ked as 'hidden' 
1bd70 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20  (currently only 
1bd80 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
1bd90 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74       ** for virt
1bda0 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20  ual tables), do 
1bdb0 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69  not include it i
1bdc0 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20  n the expanded. 
1bdd0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65             ** re
1bde0 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20  sult-set list.. 
1bdf0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
1be00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73            if( Is
1be10 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54  HiddenColumn(&pT
1be20 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a  ab->aCol[j]) ){.
1be30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1be40 73 65 72 74 28 49 73 56 69 72 74 75 61 6c 28 70  sert(IsVirtual(p
1be50 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Tab));.         
1be60 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1be70 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20             }..  
1be80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
1be90 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29  0 && zTName==0 )
1bea0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1beb0 69 66 28 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e  if( (pFrom->join
1bec0 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
1bed0 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  L)!=0.          
1bee0 20 20 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e        && tableAn
1bef0 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61  dColumnIndex(pTa
1bf00 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c  bList, i, zName,
1bf10 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20   0, 0).         
1bf20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1bf30 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
1bf40 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
1bf50 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
1bf60 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
1bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1bf80 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69   table to the ri
1bf90 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ght of the join 
1bfa0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1bfb0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1bfc0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1bfd0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
1bfe0 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
1bff0 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c  x(pFrom->pUsing,
1c000 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
1c010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c020 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20   In a join with 
1c030 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20  a USING clause, 
1c040 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  omit columns in 
1c050 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
1c060 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61      ** using cla
1c070 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62  use from the tab
1c080 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  le on the right.
1c090 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1c0a0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1c0b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1c0c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c0d0 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
1c0e0 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
1c0f0 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a   TK_ID, zName);.
1c100 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
1c110 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  name = zName;.  
1c120 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
1c130 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
1c140 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73     if( longNames
1c150 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   || pTabList->nS
1c160 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rc>1 ){.        
1c170 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
1c180 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
1c190 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
1c1a0 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
1c1b0 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zTabName);.     
1c1c0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
1c1d0 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
1c1e0 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
1c1f0 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b  eft, pRight, 0);
1c200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1c210 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a  f( longNames ){.
1c220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c230 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74  zColname = sqlit
1c240 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
1c250 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c  s.%s", zTabName,
1c260 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
1c270 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65           zToFree
1c280 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20   = zColname;.   
1c290 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1c2a0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1c2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1c2c0 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  xpr = pRight;.  
1c2d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c2e0 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
1c2f0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
1c300 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
1c310 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  w, pExpr);.     
1c320 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e         sColname.
1c330 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20  z = zColname;.  
1c340 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61            sColna
1c350 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  me.n = sqlite3St
1c360 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65 29  rlen30(zColname)
1c370 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
1c380 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
1c390 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65  Name(pParse, pNe
1c3a0 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29  w, &sColname, 0)
1c3b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
1c3c0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1c3d0 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20  zToFree);.      
1c3e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1c3f0 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62          if( !tab
1c400 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20  leSeen ){.      
1c410 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29      if( zTName )
1c420 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1c430 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1c440 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
1c450 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d  able: %s", zTNam
1c460 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  e);.          }e
1c470 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1c480 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1c490 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62  (pParse, "no tab
1c4a0 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b  les specified");
1c4b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1c4c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1c4d0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1c4e0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
1c4f0 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b, pEList);.    
1c500 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77  p->pEList = pNew
1c510 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  ;.  }.#if SQLITE
1c520 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66  _MAX_COLUMN.  if
1c530 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
1c540 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ->pEList->nExpr>
1c550 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
1c560 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
1c570 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1c580 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1c590 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
1c5a0 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29   in result set")
1c5b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
1c5c0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
1c5d0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d  ue;.}../*.** No-
1c5e0 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74  op routine for t
1c5f0 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61  he parse-tree wa
1c600 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  lker..**.** When
1c610 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1c620 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70   the Walker.xExp
1c630 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65  rCallback then e
1c640 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a  xpression trees.
1c650 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69  ** are walked wi
1c660 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e  thout any action
1c670 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74  s being taken at
1c680 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65   each node.  Pre
1c690 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e  sumably,.** when
1c6a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1c6b0 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72   used for Walker
1c6c0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74  .xExprCallback t
1c6d0 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78  hen .** Walker.x
1c6e0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69  SelectCallback i
1c6f0 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65  s set to do some
1c700 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72  thing useful for
1c710 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75   every .** subqu
1c720 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65  ery in the parse
1c730 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  r tree..*/.stati
1c740 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f  c int exprWalkNo
1c750 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73  op(Walker *NotUs
1c760 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65  ed, Expr *NotUse
1c770 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
1c780 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
1c790 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
1c7a0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
1c7b0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ue;.}../*.** Thi
1c7c0 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e  s routine "expan
1c7d0 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ds" a SELECT sta
1c7e0 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f  tement and all o
1c7f0 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73  f its subqueries
1c800 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f  ..** For additio
1c810 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
1c820 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73  on what it means
1c830 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53   to "expand" a S
1c840 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
1c850 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d  nt, see the comm
1c860 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63  ent on the selec
1c870 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63  tExpand worker c
1c880 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a  allback above..*
1c890 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61  *.** Expanding a
1c8a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1c8b0 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  t is the first s
1c8c0 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e  tep in processin
1c8d0 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  g a.** SELECT st
1c8e0 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45  atement.  The SE
1c8f0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d  LECT statement m
1c900 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20  ust be expanded 
1c910 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72  before.** name r
1c920 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72  esolution is per
1c930 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  formed..**.** If
1c940 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
1c950 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d  rong, an error m
1c960 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65  essage is writte
1c970 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a  n into pParse..*
1c980 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
1c990 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63  nction can detec
1c9a0 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79  t the problem by
1c9b0 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72   looking at pPar
1c9c0 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f  se->nErr.** and/
1c9d0 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  or pParse->db->m
1c9e0 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a  allocFailed..*/.
1c9f0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
1ca00 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
1ca10 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1ca20 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
1ca30 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
1ca40 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
1ca50 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65   = selectExpande
1ca60 72 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  r;.  w.xExprCall
1ca70 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e  back = exprWalkN
1ca80 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
1ca90 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  = pParse;.  sqli
1caa0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
1cab0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a  , pSelect);.}...
1cac0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1cad0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
1cae0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c  ** This is a Wal
1caf0 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
1cb00 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ack callback for
1cb10 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65   the sqlite3Sele
1cb20 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20  ctTypeInfo().** 
1cb30 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
1cb40 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63   For each FROM-c
1cb50 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20  lause subquery, 
1cb60 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  add Column.zType
1cb70 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c   and Column.zCol
1cb80 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
1cb90 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74   to the Table st
1cba0 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
1cbb0 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
1cbc0 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61  lt set.** of tha
1cbd0 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  t subquery..**.*
1cbe0 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
1cbf0 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
1cc00 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
1cc10 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75   set was constru
1cc20 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63  cted.** by selec
1cc30 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20  tExpander() but 
1cc40 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c  the type and col
1cc50 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  lation informati
1cc60 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a  on was omitted.*
1cc70 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  * at that point 
1cc80 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69  because identifi
1cc90 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ers had not yet 
1cca0 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20  been resolved.  
1ccb0 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
1ccc0 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
1ccd0 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c  identifier resol
1cce0 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
1ccf0 20 69 6e 74 20 73 65 6c 65 63 74 41 64 64 53 75   int selectAddSu
1cd00 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57  bqueryTypeInfo(W
1cd10 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
1cd20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
1cd30 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69  rse *pParse;.  i
1cd40 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20  nt i;.  SrcList 
1cd50 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72  *pTabList;.  str
1cd60 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1cd70 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65   *pFrom;..  asse
1cd80 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
1cd90 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b  & SF_Resolved );
1cda0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1cdb0 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
1cdc0 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Info)==0 ){.    
1cdd0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
1cde0 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20  F_HasTypeInfo;. 
1cdf0 20 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c     pParse = pWal
1ce00 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  ker->pParse;.   
1ce10 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
1ce20 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Src;.    for(i=0
1ce30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
1ce40 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
1ce50 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
1ce60 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  m++){.      Tabl
1ce70 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
1ce80 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  >pTab;.      if(
1ce90 20 41 4c 57 41 59 53 28 70 54 61 62 21 3d 30 29   ALWAYS(pTab!=0)
1cea0 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c   && (pTab->tabFl
1ceb0 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
1cec0 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
1ced0 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
1cee0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1cef0 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
1cf00 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63  */.        Selec
1cf10 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d  t *pSel = pFrom-
1cf20 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
1cf30 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 20 29    assert( pSel )
1cf40 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
1cf50 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20   pSel->pPrior ) 
1cf60 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
1cf70 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73 65 6c  ior;.        sel
1cf80 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
1cf90 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
1cfa0 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c  rse, pTab->nCol,
1cfb0 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53 65   pTab->aCol, pSe
1cfc0 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
1cfd0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
1cfe0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 23  RC_Continue;.}.#
1cff0 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
1d000 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20  is routine adds 
1d010 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c  datatype and col
1d020 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1d030 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a  information to.*
1d040 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  * the Table stru
1d050 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52  ctures of all FR
1d060 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
1d070 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c  ries in a.** SEL
1d080 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
1d090 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f  *.** Use this ro
1d0a0 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65  utine after name
1d0b0 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a   resolution..*/.
1d0c0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
1d0d0 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65  te3SelectAddType
1d0e0 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
1d0f0 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
1d100 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ect){.#ifndef SQ
1d110 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1d120 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  RY.  Walker w;. 
1d130 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
1d140 63 6b 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75  ck = selectAddSu
1d150 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a  bqueryTypeInfo;.
1d160 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
1d170 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70  k = exprWalkNoop
1d180 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
1d190 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
1d1a0 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
1d1b0 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a  Select);.#endif.
1d1c0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
1d1d0 6f 75 74 69 6e 65 20 73 65 74 73 20 6f 66 20 61  outine sets of a
1d1e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1d1f0 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
1d200 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  .  The.** follow
1d210 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73  ing is accomplis
1d220 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  hed:.**.**     *
1d230 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75    VDBE Cursor nu
1d240 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e  mbers are assign
1d250 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63  ed to all FROM-c
1d260 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  lause terms..** 
1d270 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c      *  Ephemeral
1d280 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61   Table objects a
1d290 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
1d2a0 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
1d2b0 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20  ubqueries..**   
1d2c0 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e    *  ON and USIN
1d2d0 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68  G clauses are sh
1d2e0 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45  ifted into WHERE
1d2f0 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20   statements.**  
1d300 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20     *  Wildcards 
1d310 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a  "*" and "TABLE.*
1d320 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73  " in result sets
1d330 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a   are expanded..*
1d340 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66  *     *  Identif
1d350 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69  iers in expressi
1d360 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74  on are matched t
1d370 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  o tables..**.** 
1d380 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  This routine act
1d390 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  s recursively on
1d3a0 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20   all subqueries 
1d3b0 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43  within the SELEC
1d3c0 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
1d3d0 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20  e3SelectPrep(.  
1d3e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1d3f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1d400 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
1d410 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
1d420 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d430 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1d440 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
1d450 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
1d460 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d  pOuterNC  /* Nam
1d470 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f  e context for co
1d480 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20  ntainer */.){.  
1d490 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1d4a0 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
1d4b0 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20   return;.  db = 
1d4c0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
1d4d0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
1d4e0 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29  SF_HasTypeInfo )
1d4f0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
1d500 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70  e3SelectExpand(p
1d510 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28  Parse, p);.  if(
1d520 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
1d530 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1d540 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  d ) return;.  sq
1d550 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65  lite3ResolveSele
1d560 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  ctNames(pParse, 
1d570 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20  p, pOuterNC);.  
1d580 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1d590 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1d5a0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
1d5b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
1d5c0 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65  dTypeInfo(pParse
1d5d0 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , p);.}../*.** R
1d5e0 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
1d5f0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  te accumulator..
1d600 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67  **.** The aggreg
1d610 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
1d620 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f  is a set of memo
1d630 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f  ry cells that ho
1d640 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61  ld.** intermedia
1d650 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65  te results while
1d660 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20   calculating an 
1d670 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73  aggregate.  This
1d680 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d 70  .** routine simp
1d690 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20  ly stores NULLs 
1d6a0 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20  in all of those 
1d6b0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f  memory cells..*/
1d6c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
1d6d0 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  etAccumulator(Pa
1d6e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
1d6f0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
1d700 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1d710 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1d720 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
1d730 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e  gInfo_func *pFun
1d740 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66  c;.  if( pAggInf
1d750 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66  o->nFunc+pAggInf
1d760 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  o->nColumn==0 ){
1d770 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1d780 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
1d790 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
1d7a0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
1d7b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d7c0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67  OP_Null, 0, pAgg
1d7d0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
1d7e0 65 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70  em);.  }.  for(p
1d7f0 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  Func=pAggInfo->a
1d800 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67  Func, i=0; i<pAg
1d810 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
1d820 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20  +, pFunc++){.   
1d830 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d840 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1d850 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b 0a  , pFunc->iMem);.
1d860 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69      if( pFunc->i
1d870 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20  Distinct>=0 ){. 
1d880 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
1d890 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20  pFunc->pExpr;.  
1d8a0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1d8b0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c  rHasProperty(pE,
1d8c0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
1d8d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
1d8e0 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45  x.pList==0 || pE
1d8f0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
1d900 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
1d910 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1d920 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54  Parse, "DISTINCT
1d930 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74   aggregates must
1d940 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e   have exactly on
1d950 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  e ".           "
1d960 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20  argument");.    
1d970 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74      pFunc->iDist
1d980 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
1d990 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d9a0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1d9b0 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
1d9c0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
1d9d0 70 45 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pE->x.pList);.  
1d9e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d9f0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
1da00 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75  enEphemeral, pFu
1da10 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30  nc->iDistinct, 0
1da20 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1da30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1da40 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
1da50 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
1da60 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FF);.      }.   
1da70 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1da80 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67  Invoke the OP_Ag
1da90 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65  gFinalize opcode
1daa0 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65   for every aggre
1dab0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  gate function.**
1dac0 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20   in the AggInfo 
1dad0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
1dae0 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69  atic void finali
1daf0 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50  zeAggFunctions(P
1db00 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
1db10 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
1db20 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1db30 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1db40 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
1db50 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
1db60 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
1db70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
1db80 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
1db90 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
1dba0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
1dbb0 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
1dbc0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
1dbd0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1dbe0 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
1dbf0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
1dc00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1dc10 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67  eAddOp4(v, OP_Ag
1dc20 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d  gFinal, pF->iMem
1dc30 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  , pList ? pList-
1dc40 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20  >nExpr : 0, 0,. 
1dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc60 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e       (void*)pF->
1dc70 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
1dc80 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  F);.  }.}../*.**
1dc90 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75   Update the accu
1dca0 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63  mulator memory c
1dcb0 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72  ells for an aggr
1dcc0 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a  egate based on.*
1dcd0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  * the current cu
1dce0 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
1dcf0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70  /.static void up
1dd00 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
1dd10 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
1dd20 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1dd30 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1dd40 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1dd50 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1dd60 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
1dd70 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
1dd80 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70  fo_col *pC;..  p
1dd90 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
1dda0 6f 64 65 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74  ode = 1;.  sqlit
1ddb0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
1ddc0 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28  (pParse);.  for(
1ddd0 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
1dde0 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
1ddf0 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
1de00 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20   pF++){.    int 
1de10 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64  nArg;.    int ad
1de20 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  drNext = 0;.    
1de30 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20  int regAgg;.    
1de40 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
1de50 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
1de60 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
1de70 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1de80 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
1de90 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
1dea0 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a     if( pList ){.
1deb0 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69        nArg = pLi
1dec0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
1ded0 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65   regAgg = sqlite
1dee0 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
1def0 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20  arse, nArg);.   
1df00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1df10 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
1df20 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67  e, pList, regAgg
1df30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1df40 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b  .      nArg = 0;
1df50 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20  .      regAgg = 
1df60 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
1df70 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d   pF->iDistinct>=
1df80 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e  0 ){.      addrN
1df90 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ext = sqlite3Vdb
1dfa0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1dfb0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72       assert( nAr
1dfc0 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63 6f  g==1 );.      co
1dfd0 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73  deDistinct(pPars
1dfe0 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  e, pF->iDistinct
1dff0 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72  , addrNext, 1, r
1e000 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20  egAgg);.    }.  
1e010 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d    if( pF->pFunc-
1e020 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1e030 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b  FUNC_NEEDCOLL ){
1e040 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
1e050 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  pColl = 0;.     
1e060 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1e070 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1e080 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
1e090 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
1e0a0 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d  0 );  /* pList!=
1e0b0 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68  0 if pF->pFunc h
1e0c0 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20  as NEEDCOLL */. 
1e0d0 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
1e0e0 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70  tem=pList->a; !p
1e0f0 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20  Coll && j<nArg; 
1e100 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
1e110 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
1e120 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1e130 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
1e140 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >pExpr);.      }
1e150 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
1e160 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
1e170 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
1e180 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
1e190 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1e1a0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1e1b0 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
1e1c0 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
1e1d0 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
1e1e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1e1f0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1e200 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65  P_AggStep, 0, re
1e210 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a  gAgg, pF->iMem,.
1e220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e230 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d        (void*)pF-
1e240 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
1e250 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EF);.    sqlite3
1e260 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
1e270 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73  (u8)nArg);.    s
1e280 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
1e290 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
1e2a0 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
1e2b0 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
1e2c0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
1e2d0 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
1e2e0 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20   nArg);.    if( 
1e2f0 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20  addrNext ){.    
1e300 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1e310 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
1e320 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71  rNext);.      sq
1e330 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
1e340 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
1e350 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66   }.  }..  /* Bef
1e360 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74  ore populating t
1e370 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  he accumulator r
1e380 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20  egisters, clear 
1e390 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1e3a0 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  ..  ** Otherwise
1e3b0 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  , if any of the 
1e3c0 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20  required column 
1e3d0 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61  values are alrea
1e3e0 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a  dy present .  **
1e3f0 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73   in registers, s
1e400 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
1e410 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70   may use OP_SCop
1e420 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61  y to copy the va
1e430 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e  lue.  ** to pC->
1e440 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65  iMem. But by the
1e450 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20   time the value 
1e460 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69  is used, the ori
1e470 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20  ginal register. 
1e480 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65   ** may have bee
1e490 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61  n used, invalida
1e4a0 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79  ting the underly
1e4b0 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69  ing buffer holdi
1e4c0 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74  ng the.  ** text
1e4d0 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20   or blob value. 
1e4e0 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30  See ticket [8830
1e4f0 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20  34dcb5]..  **.  
1e500 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74  ** Another solut
1e510 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ion would be to 
1e520 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43  change the OP_SC
1e530 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79  opy used to copy
1e540 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c   cached.  ** val
1e550 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70  ues to an OP_Cop
1e560 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
1e570 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
1e580 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69  pParse);.  for(i
1e590 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d  =0, pC=pAggInfo-
1e5a0 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66  >aCol; i<pAggInf
1e5b0 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b  o->nAccumulator;
1e5c0 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20   i++, pC++){.   
1e5d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e5e0 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78  (pParse, pC->pEx
1e5f0 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20  pr, pC->iMem);. 
1e600 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64   }.  pAggInfo->d
1e610 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20  irectMode = 0;. 
1e620 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1e630 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
1e640 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73  }../*.** Add a s
1e650 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e  ingle OP_Explain
1e660 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
1e670 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c  the VDBE to expl
1e680 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20  ain a simple.** 
1e690 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28  count(*) query (
1e6a0 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
1e6b0 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f   FROM pTab")..*/
1e6c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e6d0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61  OMIT_EXPLAIN.sta
1e6e0 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
1e6f0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50  SimpleCount(.  P
1e700 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e720 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
1e730 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1e740 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e750 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65       /* Table be
1e760 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20  ing queried */. 
1e770 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
1e780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e790 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74   /* Index used t
1e7a0 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c  o optimize scan,
1e7b0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   or NULL */.){. 
1e7c0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
1e7d0 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63  lain==2 ){.    c
1e7e0 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69  har *zEqp = sqli
1e7f0 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
1e800 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41 42  e->db, "SCAN TAB
1e810 4c 45 20 25 73 20 25 73 25 73 28 7e 25 64 20 72  LE %s %s%s(~%d r
1e820 6f 77 73 29 22 2c 0a 20 20 20 20 20 20 20 20 70  ows)",.        p
1e830 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20  Tab->zName, .   
1e840 20 20 20 20 20 70 49 64 78 20 3f 20 22 55 53 49       pIdx ? "USI
1e850 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
1e860 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20  X " : "",.      
1e870 20 20 70 49 64 78 20 3f 20 70 49 64 78 2d 3e 7a    pIdx ? pIdx->z
1e880 4e 61 6d 65 20 3a 20 22 22 2c 0a 20 20 20 20 20  Name : "",.     
1e890 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74     pTab->nRowEst
1e8a0 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
1e8b0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
1e8c0 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70         pParse->p
1e8d0 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  Vdbe, OP_Explain
1e8e0 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
1e8f0 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c  tId, 0, 0, zEqp,
1e900 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20   P4_DYNAMIC.    
1e910 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
1e920 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
1e930 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63  impleCount(a,b,c
1e940 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1e950 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
1e960 72 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  r the SELECT sta
1e970 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20  tement given in 
1e980 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20  the p argument. 
1e990 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
1e9a0 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75  lts are distribu
1e9b0 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77  ted in various w
1e9c0 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ays depending on
1e9d0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
1e9e0 20 6f 66 20 74 68 65 20 53 65 6c 65 63 74 44 65   of the SelectDe
1e9f0 73 74 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  st structure poi
1ea00 6e 74 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d  nted to by argum
1ea10 65 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61 73 20  ent pDest.** as 
1ea20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1ea30 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20     pDest->eDest 
1ea40 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20     Result.**    
1ea50 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20   ------------   
1ea60 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
1ea70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ea80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
1ea90 20 20 20 20 53 52 54 5f 4f 75 74 70 75 74 20 20      SRT_Output  
1eaa0 20 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 72      Generate a r
1eab0 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 28 75 73  ow of output (us
1eac0 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 73 75 6c  ing the OP_Resul
1ead0 74 52 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  tRow.**         
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 63 6f              opco
1eaf0 64 65 29 20 66 6f 72 20 65 61 63 68 20 72 6f 77  de) for each row
1eb00 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
1eb10 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  et..**.**     SR
1eb20 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 4f 6e  T_Mem         On
1eb30 6c 79 20 76 61 6c 69 64 20 69 66 20 74 68 65 20  ly valid if the 
1eb40 72 65 73 75 6c 74 20 69 73 20 61 20 73 69 6e 67  result is a sing
1eb50 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20  le column..**   
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb70 20 20 53 74 6f 72 65 20 74 68 65 20 66 69 72 73    Store the firs
1eb80 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
1eb90 66 69 72 73 74 20 72 65 73 75 6c 74 20 72 6f 77  first result row
1eba0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1ebb0 20 20 20 20 20 20 20 20 69 6e 20 72 65 67 69 73          in regis
1ebc0 74 65 72 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ter pDest->iParm
1ebd0 20 74 68 65 6e 20 61 62 61 6e 64 6f 6e 20 74 68   then abandon th
1ebe0 65 20 72 65 73 74 0a 2a 2a 20 20 20 20 20 20 20  e rest.**       
1ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
1ec00 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69   the query.  Thi
1ec10 73 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 6d  s destination im
1ec20 70 6c 69 65 73 20 22 4c 49 4d 49 54 20 31 22 2e  plies "LIMIT 1".
1ec30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53  .**.**     SRT_S
1ec40 65 74 20 20 20 20 20 20 20 20 20 54 68 65 20 72  et         The r
1ec50 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 61 20  esult must be a 
1ec60 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20  single column.  
1ec70 53 74 6f 72 65 20 65 61 63 68 0a 2a 2a 20 20 20  Store each.**   
1ec80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec90 20 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 20    row of result 
1eca0 61 73 20 74 68 65 20 6b 65 79 20 69 6e 20 74 61  as the key in ta
1ecb0 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ble pDest->iParm
1ecc0 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  . .**           
1ecd0 20 20 20 20 20 20 20 20 20 20 41 70 70 6c 79 20            Apply 
1ece0 74 68 65 20 61 66 66 69 6e 69 74 79 20 70 44 65  the affinity pDe
1ecf0 73 74 2d 3e 61 66 66 69 6e 69 74 79 20 62 65 66  st->affinity bef
1ed00 6f 72 65 20 73 74 6f 72 69 6e 67 0a 2a 2a 20 20  ore storing.**  
1ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed20 20 20 20 72 65 73 75 6c 74 73 2e 20 20 55 73 65     results.  Use
1ed30 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22  d to implement "
1ed40 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
1ed50 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1ed60 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72  Union       Stor
1ed70 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b  e results as a k
1ed80 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ey in a temporar
1ed90 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
1eda0 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
1edb0 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20  SRT_Except      
1edc0 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66  Remove results f
1edd0 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rom the temporar
1ede0 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
1edf0 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
1ee00 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20  SRT_Table       
1ee10 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e  Store results in
1ee20 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1ee30 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a   pDest->iParm..*
1ee40 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1ee50 20 20 20 20 20 20 54 68 69 73 20 69 73 20 6c 69        This is li
1ee60 6b 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20  ke SRT_EphemTab 
1ee70 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
1ee80 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
1ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
1eea0 61 73 73 75 6d 65 64 20 74 6f 20 61 6c 72 65 61  assumed to alrea
1eeb0 64 79 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a  dy be open..**.*
1eec0 2a 20 20 20 20 20 53 52 54 5f 45 70 68 65 6d 54  *     SRT_EphemT
1eed0 61 62 20 20 20 20 43 72 65 61 74 65 20 61 6e 20  ab    Create an 
1eee0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1eef0 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 61 6e 64  pDest->iParm and
1ef00 20 73 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 20   store.**       
1ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
1ef20 65 20 72 65 73 75 6c 74 20 74 68 65 72 65 2e 20  e result there. 
1ef30 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1ef40 66 74 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a 2a  ft open after.**
1ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef60 20 20 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 20       returning. 
1ef70 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52   This is like SR
1ef80 54 5f 54 61 62 6c 65 20 65 78 63 65 70 74 20 74  T_Table except t
1ef90 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1efa0 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 20             this 
1efb0 64 65 73 74 69 6e 61 74 69 6f 6e 20 75 73 65 73  destination uses
1efc0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1efd0 6c 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 20  l to create.**  
1efe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eff0 20 20 20 74 68 65 20 74 61 62 6c 65 20 66 69 72     the table fir
1f000 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  st..**.**     SR
1f010 54 5f 43 6f 72 6f 75 74 69 6e 65 20 20 20 47 65  T_Coroutine   Ge
1f020 6e 65 72 61 74 65 20 61 20 63 6f 2d 72 6f 75 74  nerate a co-rout
1f030 69 6e 65 20 74 68 61 74 20 72 65 74 75 72 6e 73  ine that returns
1f040 20 61 20 6e 65 77 20 72 6f 77 20 6f 66 0a 2a 2a   a new row of.**
1f050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f060 20 20 20 20 20 72 65 73 75 6c 74 73 20 65 61 63       results eac
1f070 68 20 74 69 6d 65 20 69 74 20 69 73 20 69 6e 76  h time it is inv
1f080 6f 6b 65 64 2e 20 20 54 68 65 20 65 6e 74 72 79  oked.  The entry
1f090 20 70 6f 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20   point.**       
1f0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
1f0b0 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
1f0c0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  is stored in reg
1f0d0 69 73 74 65 72 20 70 44 65 73 74 2d 3e 69 50 61  ister pDest->iPa
1f0e0 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  rm..**.**     SR
1f0f0 54 5f 45 78 69 73 74 73 20 20 20 20 20 20 53 74  T_Exists      St
1f100 6f 72 65 20 61 20 31 20 69 6e 20 6d 65 6d 6f 72  ore a 1 in memor
1f110 79 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 50  y cell pDest->iP
1f120 61 72 6d 20 69 66 20 74 68 65 20 72 65 73 75 6c  arm if the resul
1f130 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1f140 20 20 20 20 20 20 20 20 20 73 65 74 20 69 73 20           set is 
1f150 6e 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a  not empty..**.**
1f160 20 20 20 20 20 53 52 54 5f 44 69 73 63 61 72 64       SRT_Discard
1f170 20 20 20 20 20 54 68 72 6f 77 20 74 68 65 20 72       Throw the r
1f180 65 73 75 6c 74 73 20 61 77 61 79 2e 20 20 54 68  esults away.  Th
1f190 69 73 20 69 73 20 75 73 65 64 20 62 79 20 53 45  is is used by SE
1f1a0 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
1f1b0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74              stat
1f1c0 65 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 72  ements within tr
1f1d0 69 67 67 65 72 73 20 77 68 6f 73 65 20 6f 6e 6c  iggers whose onl
1f1e0 79 20 70 75 72 70 6f 73 65 20 69 73 0a 2a 2a 20  y purpose is.** 
1f1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f200 20 20 20 20 74 68 65 20 73 69 64 65 2d 65 66 66      the side-eff
1f210 65 63 74 73 20 6f 66 20 66 75 6e 63 74 69 6f 6e  ects of function
1f220 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
1f230 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1f240 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
1f250 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
1f260 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
1f270 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
1f280 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
1f290 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
1f2a0 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
1f2b0 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
1f2c0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
1f2d0 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
1f2e0 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
1f2f0 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
1f300 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
1f310 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
1f320 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  at..*/.int sqlit
1f330 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  e3Select(.  Pars
1f340 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1f350 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
1f360 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
1f370 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
1f380 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
1f390 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
1f3a0 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53  ng coded. */.  S
1f3b0 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
1f3c0 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
1f3d0 20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65   do with the que
1f3e0 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
1f3f0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
1f400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1f410 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
1f420 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1f430 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  o;     /* Return
1f440 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65   from sqlite3Whe
1f450 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56  reBegin() */.  V
1f460 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
1f470 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
1f480 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64  tual machine und
1f490 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
1f4a0 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20  */.  int isAgg; 
1f4b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f4c0 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c  rue for select l
1f4d0 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74  ists like "count
1f4e0 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69  (*)" */.  ExprLi
1f4f0 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
1f500 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75   /* List of colu
1f510 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20  mns to extract. 
1f520 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
1f530 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c  abList;     /* L
1f540 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f  ist of tables to
1f550 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a   select from */.
1f560 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
1f570 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f580 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d  WHERE clause.  M
1f590 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1f5a0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
1f5b0 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  By;    /* The OR
1f5c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
1f5d0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
1f5e0 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
1f5f0 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47  pBy;    /* The G
1f600 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
1f610 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
1f620 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b    Expr *pHaving;
1f630 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f640 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20  HAVING clause.  
1f650 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
1f660 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b   int isDistinct;
1f670 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1f680 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
1f690 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
1f6a0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74  nt */.  int dist
1f6b0 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f  inct;          /
1f6c0 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66  * Table to use f
1f6d0 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
1f6e0 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  set */.  int rc 
1f6f0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
1f700 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
1f710 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  rn from this fun
1f720 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
1f730 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20  ddrSortIndex;   
1f740 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1f750 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  an OP_OpenEpheme
1f760 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
1f770 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67  */.  AggInfo sAg
1f780 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49  gInfo;      /* I
1f790 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20  nformation used 
1f7a0 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65  by aggregate que
1f7b0 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ries */.  int iE
1f7c0 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
1f7d0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1f7e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75  he end of the qu
1f7f0 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
1f800 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
1f810 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1f820 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20  connection */.. 
1f830 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1f840 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
1f850 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1f860 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1f870 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1f880 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
1f890 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1f8a0 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
1f8b0 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  CT, 0, 0, 0) ) r
1f8c0 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65  eturn 1;.  memse
1f8d0 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20  t(&sAggInfo, 0, 
1f8e0 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29  sizeof(sAggInfo)
1f8f0 29 3b 0a 0a 20 20 69 66 28 20 49 67 6e 6f 72 61  );..  if( Ignora
1f900 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
1f910 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
1f920 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1f930 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73  T_Exists || pDes
1f940 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e  t->eDest==SRT_Un
1f950 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ion || .        
1f960 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
1f970 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70  =SRT_Except || p
1f980 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
1f990 5f 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20 2f  _Discard);.    /
1f9a0 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61  * If ORDER BY ma
1f9b0 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63  kes no differenc
1f9c0 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  e in the output 
1f9d0 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65  then neither doe
1f9e0 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43  s.    ** DISTINC
1f9f0 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72  T so it can be r
1fa00 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20  emoved too. */. 
1fa10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
1fa20 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
1fa30 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70  pOrderBy);.    p
1fa40 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
1fa50 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
1fa60 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b  &= ~SF_Distinct;
1fa70 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65  .  }.  sqlite3Se
1fa80 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
1fa90 20 70 2c 20 30 29 3b 0a 20 20 70 4f 72 64 65 72   p, 0);.  pOrder
1faa0 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
1fab0 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
1fac0 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
1fad0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
1fae0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1faf0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1fb00 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
1fb10 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
1fb20 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73  .  isAgg = (p->s
1fb30 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
1fb40 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 61 73  regate)!=0;.  as
1fb50 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
1fb60 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67  );..  /* Begin g
1fb70 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a  enerating code..
1fb80 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
1fb90 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1fba0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
1fbb0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1fbc0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1fbd0 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
1fbe0 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  -queries in the 
1fbf0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
1fc00 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1fc10 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1fc20 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1fc30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1fc40 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d  ).  for(i=0; !p-
1fc50 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61  >pPrior && i<pTa
1fc60 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
1fc70 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
1fc80 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1fc90 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
1fca0 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44  [i];.    SelectD
1fcb0 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65  est dest;.    Se
1fcc0 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74  lect *pSub = pIt
1fcd0 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  em->pSelect;.   
1fce0 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 0a   int isAggSub;..
1fcf0 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
1fd00 7c 7c 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75  || pItem->isPopu
1fd10 6c 61 74 65 64 20 29 20 63 6f 6e 74 69 6e 75 65  lated ) continue
1fd20 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  ;..    /* Increm
1fd30 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68  ent Parse.nHeigh
1fd40 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20  t by the height 
1fd50 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  of the largest e
1fd60 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
1fd70 20 74 72 65 65 20 72 65 66 65 72 65 64 20 74 6f   tree refered to
1fd80 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61   by this, the pa
1fd90 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65  rent select. The
1fda0 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20   child select.  
1fdb0 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e    ** may contain
1fdc0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
1fdd0 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20  s of at most.   
1fde0 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f   ** (SQLITE_MAX_
1fdf0 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65  EXPR_DEPTH-Parse
1fe00 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74  .nHeight) height
1fe10 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a  . This is a bit.
1fe20 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73      ** more cons
1fe30 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65  ervative than ne
1fe40 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63  cessary, but muc
1fe50 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e  h easier than en
1fe60 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61  forcing.    ** a
1fe70 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20  n exact limit.. 
1fe80 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65     */.    pParse
1fe90 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c  ->nHeight += sql
1fea0 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
1feb0 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  ight(p);..    /*
1fec0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1fed0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63 61   the subquery ca
1fee0 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e  n be absorbed in
1fef0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a  to the parent. *
1ff00 2f 0a 20 20 20 20 69 73 41 67 67 53 75 62 20 3d  /.    isAggSub =
1ff10 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
1ff20 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
1ff30 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  !=0;.    if( fla
1ff40 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61  ttenSubquery(pPa
1ff50 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67  rse, p, i, isAgg
1ff60 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20  , isAggSub) ){. 
1ff70 20 20 20 20 20 69 66 28 20 69 73 41 67 67 53 75       if( isAggSu
1ff80 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41  b ){.        isA
1ff90 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  gg = 1;.        
1ffa0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
1ffb0 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20  F_Aggregate;.   
1ffc0 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d     }.      i = -
1ffd0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1ffe0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
1fff0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
20000 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70   SRT_EphemTab, p
20010 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
20020 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
20030 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64  tem->isPopulated
20040 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
20050 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
20060 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b  e, pSub, &dest);
20070 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 73  .      pItem->is
20080 50 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b 0a 20  Populated = 1;. 
20090 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
200a0 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 28 75 6e 73  ->nRowEst = (uns
200b0 69 67 6e 65 64 29 70 53 75 62 2d 3e 6e 53 65 6c  igned)pSub->nSel
200c0 65 63 74 52 6f 77 3b 0a 20 20 20 20 7d 0a 20 20  ectRow;.    }.  
200d0 20 20 69 66 28 20 2f 2a 70 50 61 72 73 65 2d 3e    if( /*pParse->
200e0 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61  nErr ||*/ db->ma
200f0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
20100 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
20110 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  end;.    }.    p
20120 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d  Parse->nHeight -
20130 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
20140 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20  xprHeight(p);.  
20150 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
20160 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21 49  pSrc;.    if( !I
20170 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
20180 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pDest) ){.      
20190 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
201a0 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20  rderBy;.    }.  
201b0 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  }.  pEList = p->
201c0 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66 0a 20  pEList;.#endif. 
201d0 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
201e0 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20  ere;.  pGroupBy 
201f0 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
20200 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
20210 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73 74 69  aving;.  isDisti
20220 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  nct = (p->selFla
20230 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
20240 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53  )!=0;..#ifndef S
20250 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
20260 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20  UND_SELECT.  /* 
20270 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20  If there is are 
20280 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75  a sequence of qu
20290 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61  eries, do the ea
202a0 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74  rlier ones first
202b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
202c0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
202d0 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ( p->pRightmost=
202e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65  =0 ){.      Sele
202f0 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69 67  ct *pLoop, *pRig
20300 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  ht = 0;.      in
20310 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  t cnt = 0;.     
20320 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b 0a 20   int mxSelect;. 
20330 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70       for(pLoop=p
20340 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
20350 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e  Loop->pPrior, cn
20360 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t++){.        pL
20370 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20  oop->pRightmost 
20380 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  = p;.        pLo
20390 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69 67  op->pNext = pRig
203a0 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52 69 67  ht;.        pRig
203b0 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20  ht = pLoop;.    
203c0 20 20 7d 0a 20 20 20 20 20 20 6d 78 53 65 6c 65    }.      mxSele
203d0 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  ct = db->aLimit[
203e0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d  SQLITE_LIMIT_COM
203f0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b 0a 20  POUND_SELECT];. 
20400 20 20 20 20 20 69 66 28 20 6d 78 53 65 6c 65 63       if( mxSelec
20410 74 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c 65 63  t && cnt>mxSelec
20420 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
20430 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
20440 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74  rse, "too many t
20450 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e 64  erms in compound
20460 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20 20   SELECT");.     
20470 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
20480 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
20490 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63  eturn multiSelec
204a0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  t(pParse, p, pDe
204b0 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  st);.  }.#endif.
204c0 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67  .  /* If writing
204d0 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65   to memory or ge
204e0 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20  nerating a set. 
204f0 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   ** only a singl
20500 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20  e column may be 
20510 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66  output..  */.#if
20520 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20530 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
20540 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c  checkForMultiCol
20550 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70  umnSelectError(p
20560 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45  Parse, pDest, pE
20570 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
20580 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
20590 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  end;.  }.#endif.
205a0 0a 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c  .  /* If possibl
205b0 65 2c 20 72 65 77 72 69 74 65 20 74 68 65 20 71  e, rewrite the q
205c0 75 65 72 79 20 74 6f 20 75 73 65 20 47 52 4f 55  uery to use GROU
205d0 50 20 42 59 20 69 6e 73 74 65 61 64 20 6f 66 20  P BY instead of 
205e0 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2a 20 47  DISTINCT..  ** G
205f0 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75 73  ROUP BY might us
20600 65 20 61 6e 20 69 6e 64 65 78 2c 20 44 49 53 54  e an index, DIST
20610 49 4e 43 54 20 6e 65 76 65 72 20 64 6f 65 73 2e  INCT never does.
20620 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
20630 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 7c  p->pGroupBy==0 |
20640 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
20650 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d   SF_Aggregate)!=
20660 30 20 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73  0 );.  if( (p->s
20670 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
20680 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
20690 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
206a0 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 47 72  ct ){.    p->pGr
206b0 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
206c0 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
206d0 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20  ->pEList, 0);.  
206e0 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
206f0 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 2d  pGroupBy;.    p-
20700 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
20710 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 69  _Distinct;.    i
20720 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  sDistinct = 0;. 
20730 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
20740 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55  e is both a GROU
20750 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45  P BY and an ORDE
20760 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20  R BY clause and 
20770 74 68 65 79 20 61 72 65 0a 20 20 2a 2a 20 69 64  they are.  ** id
20780 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 64 69  entical, then di
20790 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20  sable the ORDER 
207a0 42 59 20 63 6c 61 75 73 65 20 73 69 6e 63 65 20  BY clause since 
207b0 74 68 65 20 47 52 4f 55 50 20 42 59 0a 20 20 2a  the GROUP BY.  *
207c0 2a 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65  * will cause ele
207d0 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75  ments to come ou
207e0 74 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  t in the correct
207f0 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69 73   order.  This is
20800 0a 20 20 2a 2a 20 61 6e 20 6f 70 74 69 6d 69 7a  .  ** an optimiz
20810 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72  ation - the corr
20820 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c  ect answer shoul
20830 64 20 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c  d result regardl
20840 65 73 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68  ess..  ** Use th
20850 65 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79  e SQLITE_GroupBy
20860 4f 72 64 65 72 20 66 6c 61 67 20 77 69 74 68 20  Order flag with 
20870 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
20880 4f 50 54 49 4d 49 5a 45 52 0a 20 20 2a 2a 20 74  OPTIMIZER.  ** t
20890 6f 20 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f  o disable this o
208a0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
208b0 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
208c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
208d0 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
208e0 61 72 65 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c  are(p->pGroupBy,
208f0 20 70 4f 72 64 65 72 42 79 29 3d 3d 30 0a 20 20   pOrderBy)==0.  
20900 20 20 20 20 20 20 20 26 26 20 28 64 62 2d 3e 66         && (db->f
20910 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 47 72  lags & SQLITE_Gr
20920 6f 75 70 42 79 4f 72 64 65 72 29 3d 3d 30 20 29  oupByOrder)==0 )
20930 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d  {.    pOrderBy =
20940 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
20950 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
20960 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
20970 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a  en this sorting.
20980 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74    ** index might
20990 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e   end up being un
209a0 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61  used if the data
209b0 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78   can be .  ** ex
209c0 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73  tracted in pre-s
209d0 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66  orted order.  If
209e0 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
209f0 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  e, then the.  **
20a00 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
20a10 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69  l instruction wi
20a20 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f  ll be changed to
20a30 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65   an OP_Noop once
20a40 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20  .  ** we figure 
20a50 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72  out that the sor
20a60 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f  ting index is no
20a70 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61  t needed.  The a
20a80 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a  ddrSortIndex.  *
20a90 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  * variable is us
20aa0 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  ed to facilitate
20ab0 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20   that change..  
20ac0 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
20ad0 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
20ae0 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
20af0 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
20b00 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
20b10 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29  Parse, pOrderBy)
20b20 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e  ;.    pOrderBy->
20b30 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  iECursor = pPars
20b40 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70  e->nTab++;.    p
20b50 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
20b60 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e 64 65  ] = addrSortInde
20b70 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x =.      sqlite
20b80 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
20b90 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
20ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20bb0 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64              pOrd
20bc0 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
20bd0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
20be0 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  2, 0,.          
20bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c00 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
20c10 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
20c20 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DOFF);.  }else{.
20c30 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e 64 65      addrSortInde
20c40 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  x = -1;.  }..  /
20c50 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
20c60 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
20c70 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
20c80 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
20c90 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
20ca0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
20cb0 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20  _EphemTab ){.   
20cc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20cd0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
20ce0 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69  emeral, pDest->i
20cf0 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Parm, pEList->nE
20d00 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  xpr);.  }..  /* 
20d10 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e  Set the limiter.
20d20 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73  .  */.  iEnd = s
20d30 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
20d40 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65  bel(v);.  p->nSe
20d50 6c 65 63 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c  lectRow = (doubl
20d60 65 29 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b  e)LARGEST_INT64;
20d70 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
20d80 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
20d90 20 70 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a   p, iEnd);..  /*
20da0 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20   Open a virtual 
20db0 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
20dc0 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
20dd0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  t..  */.  if( is
20de0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
20df0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
20e00 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  o;.    assert( i
20e10 73 41 67 67 20 7c 7c 20 70 47 72 6f 75 70 42 79  sAgg || pGroupBy
20e20 20 29 3b 0a 20 20 20 20 64 69 73 74 69 6e 63 74   );.    distinct
20e30 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
20e40 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  +;.    pKeyInfo 
20e50 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
20e60 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d  rList(pParse, p-
20e70 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71  >pEList);.    sq
20e80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
20e90 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
20ea0 72 61 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20 30  ral, distinct, 0
20eb0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
20ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
20ed0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
20ee0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
20ef0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
20f00 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  distinct = -1;. 
20f10 20 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67 61   }..  /* Aggrega
20f20 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65  te and non-aggre
20f30 67 61 74 65 20 71 75 65 72 69 65 73 20 61 72 65  gate queries are
20f40 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
20f50 6e 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21 69  ntly */.  if( !i
20f60 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79  sAgg && pGroupBy
20f70 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
20f80 69 73 20 63 61 73 65 20 69 73 20 66 6f 72 20 6e  is case is for n
20f90 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65  on-aggregate que
20fa0 72 69 65 73 0a 20 20 20 20 2a 2a 20 42 65 67 69  ries.    ** Begi
20fb0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  n the database s
20fc0 63 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  can.    */.    p
20fd0 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
20fe0 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
20ff0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
21000 72 65 2c 20 26 70 4f 72 64 65 72 42 79 2c 20 30  re, &pOrderBy, 0
21010 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
21020 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
21030 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  ct_end;.    if( 
21040 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20  pWInfo->nRowOut 
21050 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  < p->nSelectRow 
21060 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
21070 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  = pWInfo->nRowOu
21080 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f  t;..    /* If so
21090 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
210a0 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
210b0 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
210c0 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
210d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
210e0 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
210f0 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
21100 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
21110 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
21120 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
21130 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
21140 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
21150 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   && pOrderBy==0 
21160 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
21170 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
21180 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65  (v, addrSortInde
21190 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e  x, 1);.      p->
211a0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
211b0 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  = -1;.    }..   
211c0 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
211d0 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a  dard inner loop.
211e0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
211f0 74 28 21 69 73 44 69 73 74 69 6e 63 74 29 3b 0a  t(!isDistinct);.
21200 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
21210 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
21220 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
21230 64 65 72 42 79 2c 20 2d 31 2c 20 70 44 65 73 74  derBy, -1, pDest
21240 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21250 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43        pWInfo->iC
21260 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d  ontinue, pWInfo-
21270 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 20 20 2f  >iBreak);..    /
21280 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61  * End the databa
21290 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  se scan loop..  
212a0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
212b0 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
212c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
212d0 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 70 72  * This is the pr
212e0 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67  ocessing for agg
212f0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a  regate queries *
21300 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  /.    NameContex
21310 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d  t sNC;    /* Nam
21320 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72  e context for pr
21330 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61  ocessing aggrega
21340 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  te information *
21350 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b  /.    int iAMem;
21360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
21370 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
21380 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65  or storing curre
21390 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  nt GROUP BY */. 
213a0 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20     int iBMem;   
213b0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
213c0 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
213d0 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42  previous GROUP B
213e0 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73  Y */.    int iUs
213f0 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  eFlag;       /* 
21400 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64  Mem address hold
21410 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74  ing flag indicat
21420 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73  ing that at leas
21430 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
21440 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65            ** one
21450 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75   row of the inpu
21460 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  t to the aggrega
21470 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20  tor has been.   
21480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21490 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
214a0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62  d */.    int iAb
214b0 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20  ortFlag;     /* 
214c0 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63  Mem address whic
214d0 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61  h causes query a
214e0 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65  bort if positive
214f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75   */.    int grou
21500 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52  pBySort;    /* R
21510 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f  ows come from so
21520 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59  urce in GROUP BY
21530 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e   order */.    in
21540 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
21550 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63    /* End of proc
21560 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20  essing for this 
21570 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f  SELECT */..    /
21580 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64  * Remove any and
21590 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74   all aliases bet
215a0 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  ween the result 
215b0 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20  set and the.    
215c0 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  ** GROUP BY clau
215d0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
215e0 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
215f0 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20       int k;     
21600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21610 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
21620 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  er */.      stru
21630 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
21640 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72   *pItem;  /* For
21650 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78   looping over ex
21660 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69  pression in a li
21670 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72  st */..      for
21680 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  (k=p->pEList->nE
21690 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45  xpr, pItem=p->pE
216a0 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  List->a; k>0; k-
216b0 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
216c0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69       pItem->iAli
216d0 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  as = 0;.      }.
216e0 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f        for(k=pGro
216f0 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74  upBy->nExpr, pIt
21700 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20  em=pGroupBy->a; 
21710 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b  k>0; k--, pItem+
21720 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
21730 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20  m->iAlias = 0;. 
21740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
21750 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28   p->nSelectRow>(
21760 64 6f 75 62 6c 65 29 31 30 30 20 29 20 70 2d 3e  double)100 ) p->
21770 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 28 64 6f  nSelectRow = (do
21780 75 62 6c 65 29 31 30 30 3b 0a 20 20 20 20 7d 65  uble)100;.    }e
21790 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  lse{.      p->nS
217a0 65 6c 65 63 74 52 6f 77 20 3d 20 28 64 6f 75 62  electRow = (doub
217b0 6c 65 29 31 3b 0a 20 20 20 20 7d 0a 0a 20 0a 20  le)1;.    }.. . 
217c0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c     /* Create a l
217d0 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20  abel to jump to 
217e0 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
217f0 61 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20  abort the query 
21800 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d  */.    addrEnd =
21810 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
21820 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f  Label(v);..    /
21830 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c  * Convert TK_COL
21840 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54  UMN nodes into T
21850 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64  K_AGG_COLUMN and
21860 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e   make entries in
21870 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f  .    ** sAggInfo
21880 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f   for all TK_AGG_
21890 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69  FUNCTION nodes i
218a0 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  n expressions of
218b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45   the.    ** SELE
218c0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
218d0 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
218e0 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
218f0 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
21900 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
21910 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
21920 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20   = pTabList;.   
21930 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20   sNC.pAggInfo = 
21940 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73  &sAggInfo;.    s
21950 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
21960 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42  Column = pGroupB
21970 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y ? pGroupBy->nE
21980 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73  xpr+1 : 0;.    s
21990 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79  AggInfo.pGroupBy
219a0 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20   = pGroupBy;.   
219b0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
219c0 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
219d0 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71   pEList);.    sq
219e0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
219f0 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f  AggList(&sNC, pO
21a00 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28  rderBy);.    if(
21a10 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
21a20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
21a30 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26  lyzeAggregates(&
21a40 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20  sNC, pHaving);. 
21a50 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
21a60 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d  o.nAccumulator =
21a70 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d   sAggInfo.nColum
21a80 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  n;.    for(i=0; 
21a90 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63  i<sAggInfo.nFunc
21aa0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
21ab0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
21ac0 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e  operty(sAggInfo.
21ad0 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20  aFunc[i].pExpr, 
21ae0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
21af0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
21b00 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
21b10 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e  (&sNC, sAggInfo.
21b20 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e  aFunc[i].pExpr->
21b30 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  x.pList);.    }.
21b40 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
21b50 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
21b60 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20  select_end;..   
21b70 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66   /* Processing f
21b80 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69  or aggregates wi
21b90 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76  th GROUP BY is v
21ba0 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e  ery different an
21bb0 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f  d.    ** much mo
21bc0 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20  re complex than 
21bd0 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f  aggregates witho
21be0 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20  ut a GROUP BY.. 
21bf0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
21c00 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
21c10 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
21c20 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e  o;  /* Keying in
21c30 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
21c40 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73  e group by claus
21c50 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  e */.      int j
21c60 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;             /
21c70 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69  * A-vs-B compari
21c80 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20  sion jump */.   
21c90 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75     int addrOutpu
21ca0 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20  tRow;  /* Start 
21cb0 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  of subroutine th
21cc0 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73  at outputs a res
21cd0 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20  ult row */.     
21ce0 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f   int regOutputRo
21cf0 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61  w;   /* Return a
21d00 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
21d10 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f  for output subro
21d20 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69  utine */.      i
21d30 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b  nt addrSetAbort;
21d40 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62     /* Set the ab
21d50 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74  ort flag and ret
21d60 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  urn */.      int
21d70 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20   addrTopOfLoop; 
21d80 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
21d90 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
21da0 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69     int addrSorti
21db0 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50  ngIdx; /* The OP
21dc0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66  _OpenEphemeral f
21dd0 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  or the sorting i
21de0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ndex */.      in
21df0 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20  t addrReset;    
21e00 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20    /* Subroutine 
21e10 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68  for resetting th
21e20 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f  e accumulator */
21e30 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65  .      int regRe
21e40 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  set;       /* Re
21e50 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
21e60 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20  ister for reset 
21e70 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20  subroutine */.. 
21e80 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
21e90 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63   is a GROUP BY c
21ea0 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e  lause we might n
21eb0 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  eed a sorting in
21ec0 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  dex to.      ** 
21ed0 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41  implement it.  A
21ee0 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72  llocate that sor
21ef0 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20  ting index now. 
21f00 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74   If it turns out
21f10 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
21f20 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74  e do not need it
21f30 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20   after all, the 
21f40 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
21f50 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20  struction.      
21f60 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65  ** will be conve
21f70 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70  rted into a Noop
21f80 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  .  .      */.   
21f90 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
21fa0 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d  ingIdx = pParse-
21fb0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >nTab++;.      p
21fc0 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
21fd0 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
21fe0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b  arse, pGroupBy);
21ff0 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69  .      addrSorti
22000 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56  ngIdx = sqlite3V
22010 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
22020 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a  OpenEphemeral, .
22030 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
22040 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73  fo.sortingIdx, s
22050 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
22060 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20  Column, .       
22070 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65     0, (char*)pKe
22080 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
22090 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20  O_HANDOFF);..   
220a0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
220b0 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
220c0 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20  s used by GROUP 
220d0 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f  BY aggregate pro
220e0 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f  cessing.      */
220f0 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20  .      iUseFlag 
22100 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
22110 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c  ;.      iAbortFl
22120 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
22130 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75  Mem;.      regOu
22140 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72  tputRow = ++pPar
22150 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
22160 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
22170 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
22180 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72  abel(v);.      r
22190 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72  egReset = ++pPar
221a0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
221b0 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69  addrReset = sqli
221c0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
221d0 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d  (v);.      iAMem
221e0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
221f0 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
22200 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
22210 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
22220 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65    iBMem = pParse
22230 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
22240 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
22250 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
22260 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
22270 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
22280 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62  _Integer, 0, iAb
22290 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
222a0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
222b0 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61  "clear abort fla
222c0 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
222d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
222e0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
222f0 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
22300 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
22310 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d   "indicate accum
22320 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b  ulator empty"));
22330 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e  ..      /* Begin
22340 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
22350 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f  l extract all so
22360 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f  urce rows in GRO
22370 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20  UP BY order..   
22380 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
22390 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70   involve two sep
223a0 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68  arate loops with
223b0 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62   an OP_Sort in b
223c0 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20  etween, or.     
223d0 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
223e0 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68  a single loop th
223f0 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  at uses an index
22400 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f   to extract info
22410 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  rmation.      **
22420 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72   in the right or
22430 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74  der to begin wit
22440 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
22450 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22460 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
22470 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
22480 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49  eset);.      pWI
22490 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
224a0 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
224b0 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
224c0 2c 20 26 70 47 72 6f 75 70 42 79 2c 20 30 29 3b  , &pGroupBy, 0);
224d0 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
224e0 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
224f0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66  ct_end;.      if
22500 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  ( pGroupBy==0 ){
22510 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
22520 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c  optimizer is abl
22530 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77  e to deliver row
22540 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72  s in group by or
22550 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a  der so.        *
22560 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65  * we do not have
22570 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f   to sort.  The O
22580 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
22590 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20  table will be.  
225a0 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c        ** cancell
225b0 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65  ed later because
225c0 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
225d0 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e  o use the pKeyIn
225e0 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  fo.        */.  
225f0 20 20 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d        pGroupBy =
22600 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
22610 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
22620 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  t = 0;.      }el
22630 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52  se{.        /* R
22640 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f  ows are coming o
22650 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e  ut in undetermin
22660 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61  ed order.  We ha
22670 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20  ve to push.     
22680 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69     ** each row i
22690 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  nto a sorting in
226a0 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74  dex, terminate t
226b0 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20  he first loop,. 
226c0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c         ** then l
226d0 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72  oop over the sor
226e0 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72  ting index in or
226f0 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f  der to get the o
22700 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a  utput.        **
22710 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
22720 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
22730 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b      int regBase;
22740 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
22750 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20  Record;.        
22760 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  int nCol;.      
22770 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a    int nGroupBy;.
22780 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
22790 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sort = 1;.      
227a0 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72    nGroupBy = pGr
227b0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
227c0 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72        nCol = nGr
227d0 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20 20  oupBy + 1;.     
227e0 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b     j = nGroupBy+
227f0 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  1;.        for(i
22800 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
22810 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
22820 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67          if( sAgg
22830 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f  Info.aCol[i].iSo
22840 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
22850 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f  .            nCo
22860 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  l++;.           
22870 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
22880 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
22890 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71      regBase = sq
228a0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
228b0 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b  e(pParse, nCol);
228c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
228d0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
228e0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
228f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
22900 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
22910 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73  pGroupBy, regBas
22920 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  e, 0);.        s
22930 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22940 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
22950 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
22960 67 49 64 78 2c 72 65 67 42 61 73 65 2b 6e 47 72  gIdx,regBase+nGr
22970 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20  oupBy);.        
22980 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a  j = nGroupBy+1;.
22990 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
229a0 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
229b0 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
229c0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
229d0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
229e0 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69  &sAggInfo.aCol[i
229f0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
22a00 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
22a10 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
22a20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
22a30 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20  j + regBase;.   
22a40 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b           int r2;
22a50 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 32  ..            r2
22a60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
22a70 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
22a80 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
22a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22aa0 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20      pCol->pTab, 
22ab0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  pCol->iColumn, p
22ac0 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 29  Col->iTable, r1)
22ad0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
22ae0 28 20 72 31 21 3d 72 32 20 29 7b 0a 20 20 20 20  ( r1!=r2 ){.    
22af0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22b00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
22b10 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72 31 29  P_SCopy, r2, r1)
22b20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
22b30 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b              j++;
22b40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
22b60 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
22b70 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
22b80 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
22b90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
22ba0 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
22bb0 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c  , regBase, nCol,
22bc0 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
22bd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22be0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
22bf0 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f  Insert, sAggInfo
22c00 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67  .sortingIdx, reg
22c10 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
22c20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
22c30 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
22c40 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
22c50 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
22c60 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
22c70 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  e, regBase, nCol
22c80 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
22c90 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
22ca0 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
22cb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22cc0 20 4f 50 5f 53 6f 72 74 2c 20 73 41 67 67 49 6e   OP_Sort, sAggIn
22cd0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61  fo.sortingIdx, a
22ce0 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20  ddrEnd);.       
22cf0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
22d00 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22   "GROUP BY sort"
22d10 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  ));.        sAgg
22d20 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49  Info.useSortingI
22d30 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  dx = 1;.        
22d40 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
22d50 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
22d60 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
22d70 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75   Evaluate the cu
22d80 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
22d90 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69  erms and store i
22da0 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a  n b0, b1, b2....
22db0 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20        ** (b0 is 
22dc0 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
22dd0 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69  iBMem+0, b1 is i
22de0 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66  BMem+1, and so f
22df0 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54  orth).      ** T
22e00 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20  hen compare the 
22e10 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
22e20 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74   terms against t
22e30 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  he GROUP BY term
22e40 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
22e50 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
22e60 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
22e70 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e  d in a0, a1, a2.
22e80 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
22e90 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20    addrTopOfLoop 
22ea0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
22eb0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
22ec0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
22ed0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
22ee0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
22ef0 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
22f00 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
22f10 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
22f20 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
22f30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
22f40 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
22f50 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
22f60 64 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b  dx, j, iBMem+j);
22f70 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
22f80 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
22f90 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  fo.directMode = 
22fa0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  1;.          sql
22fb0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
22fc0 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
22fd0 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d  [j].pExpr, iBMem
22fe0 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +j);.        }. 
22ff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
23000 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
23010 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41  , OP_Compare, iA
23020 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f  Mem, iBMem, pGro
23030 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  upBy->nExpr,.   
23040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23050 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
23060 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
23070 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20  FO);.      j1 = 
23080 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
23090 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
230a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
230b0 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a  p3(v, OP_Jump, j
230c0 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a  1+1, 0, j1+1);..
230d0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
230e0 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73  e code that runs
230f0 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52   whenever the GR
23100 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a  OUP BY changes..
23110 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73        ** Changes
23120 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59   in the GROUP BY
23130 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79   are detected by
23140 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f   the previous co
23150 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63  de.      ** bloc
23160 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72  k.  If there wer
23170 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68  e no changes, th
23180 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70  is block is skip
23190 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ped..      **.  
231a0 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65      ** This code
231b0 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20   copies current 
231c0 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69  group by terms i
231d0 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20  n b0,b1,b2,.... 
231e0 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20       ** over to 
231f0 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68  a0,a1,a2.  It th
23200 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74  en calls the out
23210 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  put subroutine. 
23220 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
23230 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65  ts the aggregate
23240 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
23250 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72  isters in prepar
23260 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66  ation.      ** f
23270 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55  or the next GROU
23280 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20  P BY batch..    
23290 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
232a0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
232b0 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41  Parse, iBMem, iA
232c0 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  Mem, pGroupBy->n
232d0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
232e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
232f0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
23300 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
23310 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
23320 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
23330 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22  "output one row"
23340 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
23350 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
23360 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46  P_IfPos, iAbortF
23370 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  lag, addrEnd);. 
23380 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
23390 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72  ((v, "check abor
233a0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
233b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
233c0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
233d0 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
233e0 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  set);.      Vdbe
233f0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73  Comment((v, "res
23400 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  et accumulator")
23410 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  );..      /* Upd
23420 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74  ate the aggregat
23430 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62  e accumulators b
23440 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
23450 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ent of.      ** 
23460 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a  the current row.
23470 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
23480 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
23490 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20  re(v, j1);.     
234a0 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
234b0 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
234c0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
234d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
234e0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
234f0 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
23500 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
23510 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61  , "indicate data
23520 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22   in accumulator"
23530 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e  ));..      /* En
23540 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  d of the loop.  
23550 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
23560 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
23570 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23580 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
23590 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Next, sAggInfo.s
235a0 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54  ortingIdx, addrT
235b0 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  opOfLoop);.     
235c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
235d0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
235e0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
235f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
23600 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
23610 53 6f 72 74 69 6e 67 49 64 78 2c 20 31 29 3b 0a  SortingIdx, 1);.
23620 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
23630 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e  * Output the fin
23640 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  al row of result
23650 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
23660 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23670 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
23680 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
23690 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
236a0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
236b0 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c  v, "output final
236c0 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20   row"));..      
236d0 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65  /* Jump over the
236e0 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20   subroutines.   
236f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
23700 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
23710 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
23720 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  rEnd);..      /*
23730 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
23740 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
23750 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  uts a single row
23760 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20   of the result. 
23770 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68       ** set.  Th
23780 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69  is subroutine fi
23790 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65  rst looks at the
237a0 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69   iUseFlag.  If i
237b0 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a  UseFlag.      **
237c0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
237d0 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20   equal to zero, 
237e0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69  the subroutine i
237f0 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20  s a no-op.  If. 
23800 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63       ** the proc
23810 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72  essing calls for
23820 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62   the query to ab
23830 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75  ort, this subrou
23840 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tine.      ** in
23850 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62  crements the iAb
23860 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c  ortFlag memory l
23870 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72  ocation before r
23880 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20  eturning in.    
23890 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69    ** order to si
238a0 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20  gnal the caller 
238b0 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20  to abort..      
238c0 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74  */.      addrSet
238d0 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Abort = sqlite3V
238e0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
238f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23900 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
23910 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62  _Integer, 1, iAb
23920 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
23930 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
23940 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22  "set abort flag"
23950 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
23960 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
23970 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
23980 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73  putRow);.      s
23990 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
239a0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75  eLabel(v, addrOu
239b0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
239c0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
239d0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
239e0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
239f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23a00 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p2(v, OP_IfPos, 
23a10 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75  iUseFlag, addrOu
23a20 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20  tputRow+2);.    
23a30 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
23a40 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c  , "Groupby resul
23a50 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72  t generator entr
23a60 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20  y point"));.    
23a70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23a80 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
23a90 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
23aa0 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41  .      finalizeA
23ab0 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
23ac0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
23ad0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23ae0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
23af0 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75   pHaving, addrOu
23b00 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54  tputRow+1, SQLIT
23b10 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
23b20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
23b30 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
23b40 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p->pEList, 0, 0,
23b50 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   pOrderBy,.     
23b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b70 20 64 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74   distinct, pDest
23b80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23b90 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70          addrOutp
23ba0 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74  utRow+1, addrSet
23bb0 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71  Abort);.      sq
23bc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
23bd0 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
23be0 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
23bf0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
23c00 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20  v, "end groupby 
23c10 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72  result generator
23c20 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  "));..      /* G
23c30 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
23c40 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72  tine that will r
23c50 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62  eset the group-b
23c60 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20  y accumulator.  
23c70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
23c80 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
23c90 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65  abel(v, addrRese
23ca0 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41  t);.      resetA
23cb0 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
23cc0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
23cd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23ce0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
23cf0 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a  urn, regReset);.
23d00 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65       .    } /* e
23d10 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20  ndif pGroupBy.  
23d20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65 20  Begin aggregate 
23d30 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 20  queries without 
23d40 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20  GROUP BY: */.   
23d50 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78   else {.      Ex
23d60 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30  prList *pDel = 0
23d70 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
23d80 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
23d90 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
23da0 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ab;.      if( (p
23db0 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f  Tab = isSimpleCo
23dc0 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f  unt(p, &sAggInfo
23dd0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
23de0 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43   /* If isSimpleC
23df0 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61  ount() returns a
23e00 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61   pointer to a Ta
23e10 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 74  ble structure, t
23e20 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  hen.        ** t
23e30 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
23e40 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
23e50 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
23e60 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
23e70 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74  count(*) FROM <t
23e80 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  bl>.        **. 
23e90 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20         ** where 
23ea0 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
23eb0 75 72 65 20 72 65 74 75 72 6e 65 64 20 72 65 70  ure returned rep
23ec0 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74  resents table <t
23ed0 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  bl>..        **.
23ee0 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
23ef0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20  statement is so 
23f00 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69  common that it i
23f10 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63  s optimized spec
23f20 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20  ially. The.     
23f30 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69     ** OP_Count i
23f40 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78  nstruction is ex
23f50 65 63 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e  ecuted either on
23f60 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c   the intkey tabl
23f70 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  e that.        *
23f80 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
23f90 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74  ata for table <t
23fa0 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66  bl> or on one of
23fb0 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74   its indexes. It
23fc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62  .        ** is b
23fd0 65 74 74 65 72 20 74 6f 20 65 78 65 63 75 74 65  etter to execute
23fe0 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e   the op on an in
23ff0 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20  dex, as indexes 
24000 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20  are almost.     
24010 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72     ** always spr
24020 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20  ead across less 
24030 70 61 67 65 73 20 74 68 61 6e 20 74 68 65 69 72  pages than their
24040 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
24050 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  ables..        *
24060 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  /.        const 
24070 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
24080 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
24090 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
240a0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
240b0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73     const int iCs
240c0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
240d0 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ++;     /* Curso
240e0 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65  r to scan b-tree
240f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65   */.        Inde
24100 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
24110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24120 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
24130 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  iable */.       
24140 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
24150 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  fo = 0;         
24160 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f        /* Keyinfo
24170 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64   for scanned ind
24180 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e  ex */.        In
24190 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20  dex *pBest = 0; 
241a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241b0 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78     /* Best index
241c0 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f   found so far */
241d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f  .        int iRo
241e0 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b  ot = pTab->tnum;
241f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24200 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63   Root page of sc
24210 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a  anned b-tree */.
24220 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24230 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
24240 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
24250 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61         sqlite3Ta
24260 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
24270 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
24280 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
24290 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ;..        /* Se
242a0 61 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64  arch for the ind
242b0 65 78 20 74 68 61 74 20 68 61 73 20 74 68 65 20  ex that has the 
242c0 6c 65 61 73 74 20 61 6d 6f 75 6e 74 20 6f 66 20  least amount of 
242d0 63 6f 6c 75 6d 6e 73 2e 20 49 66 0a 20 20 20 20  columns. If.    
242e0 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20      ** there is 
242f0 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2c 20 61  such an index, a
24300 6e 64 20 69 74 20 68 61 73 20 6c 65 73 73 20 63  nd it has less c
24310 6f 6c 75 6d 6e 73 20 74 68 61 6e 20 74 68 65 20  olumns than the 
24320 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a  table.        **
24330 20 64 6f 65 73 2c 20 74 68 65 6e 20 77 65 20 63   does, then we c
24340 61 6e 20 61 73 73 75 6d 65 20 74 68 61 74 20 69  an assume that i
24350 74 20 63 6f 6e 73 75 6d 65 73 20 6c 65 73 73 20  t consumes less 
24360 73 70 61 63 65 20 6f 6e 20 64 69 73 6b 20 61 6e  space on disk an
24370 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c  d.        ** wil
24380 6c 20 74 68 65 72 65 66 6f 72 65 20 62 65 20 63  l therefore be c
24390 68 65 61 70 65 72 20 74 6f 20 73 63 61 6e 20 74  heaper to scan t
243a0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
243b0 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 20 20  query result..  
243c0 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
243d0 20 63 61 73 65 20 73 65 74 20 69 52 6f 6f 74 20   case set iRoot 
243e0 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
243f0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
24400 6e 64 65 78 20 62 2d 74 72 65 65 0a 20 20 20 20  ndex b-tree.    
24410 20 20 20 20 2a 2a 20 61 6e 64 20 70 4b 65 79 49      ** and pKeyI
24420 6e 66 6f 20 74 6f 20 74 68 65 20 4b 65 79 49 6e  nfo to the KeyIn
24430 66 6f 20 73 74 72 75 63 74 75 72 65 20 72 65 71  fo structure req
24440 75 69 72 65 64 20 74 6f 20 6e 61 76 69 67 61 74  uired to navigat
24450 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  e the.        **
24460 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
24470 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32  **.        ** (2
24480 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f  011-04-15) Do no
24490 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e  t do a full scan
244a0 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64   of an unordered
244b0 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
244c0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  **.        ** In
244d0 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65   practice the Ke
244e0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
244f0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64  will not be used
24500 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20  . It is only .  
24510 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20        ** passed 
24520 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52  to keep OP_OpenR
24530 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20  ead happy..     
24540 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f     */.        fo
24550 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
24560 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
24570 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
24580 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
24590 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 20  ->bUnordered==0 
245a0 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49  && (!pBest || pI
245b0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 42 65 73  dx->nColumn<pBes
245c0 74 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 7b 0a 20  t->nColumn) ){. 
245d0 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74             pBest
245e0 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20   = pIdx;.       
245f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
24600 20 20 20 20 20 20 20 69 66 28 20 70 42 65 73 74         if( pBest
24610 20 26 26 20 70 42 65 73 74 2d 3e 6e 43 6f 6c 75   && pBest->nColu
24620 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  mn<pTab->nCol ){
24630 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74  .          iRoot
24640 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a   = pBest->tnum;.
24650 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
24660 66 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  fo = sqlite3Inde
24670 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
24680 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20   pBest);.       
24690 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   }..        /* O
246a0 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  pen a read-only 
246b0 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20  cursor, execute 
246c0 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c  the OP_Count, cl
246d0 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ose the cursor. 
246e0 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
246f0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
24700 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 73  OP_OpenRead, iCs
24710 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 29 3b 0a  r, iRoot, iDb);.
24720 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
24730 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
24740 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
24750 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
24760 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  ar *)pKeyInfo, P
24770 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
24780 46 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  F);.        }.  
24790 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
247a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
247b0 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49  unt, iCsr, sAggI
247c0 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65  nfo.aFunc[0].iMe
247d0 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
247e0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
247f0 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29   OP_Close, iCsr)
24800 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ;.        explai
24810 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61  nSimpleCount(pPa
24820 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74  rse, pTab, pBest
24830 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
24840 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
24850 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20  OMIT_BTREECOUNT 
24860 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  */.      {.     
24870 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
24880 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f  he query is of o
24890 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
248a0 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20  ing forms:.     
248b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
248c0 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29     SELECT min(x)
248d0 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20   FROM ....      
248e0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61    **   SELECT ma
248f0 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  x(x) FROM ....  
24900 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
24910 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68   ** If it is, th
24920 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20  en ask the code 
24930 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74  in where.c to at
24940 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65  tempt to sort re
24950 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  sults.        **
24960 20 61 73 20 69 66 20 74 68 65 72 65 20 77 61 73   as if there was
24970 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22   an "ORDER ON x"
24980 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20   or "ORDER ON x 
24990 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20  DESC" clause. . 
249a0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65         ** If whe
249b0 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20  re.c is able to 
249c0 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20  produce results 
249d0 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f  sorted in this o
249e0 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20  rder, then.     
249f0 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63     ** add vdbe c
24a00 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ode to break out
24a10 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69   of the processi
24a20 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68  ng loop after th
24a30 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  e .        ** fi
24a40 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73  rst iteration (s
24a50 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69  ince the first i
24a60 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
24a70 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20  loop is .       
24a80 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74   ** guaranteed t
24a90 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
24aa0 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69   row with the mi
24ab0 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d  nimum or maximum
24ac0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c   .        ** val
24ad0 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c  ue of x, the onl
24ae0 79 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e  y row required).
24af0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
24b00 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c      ** A special
24b10 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61   flag must be pa
24b20 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
24b30 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73  hereBegin() to s
24b40 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20  lightly.        
24b50 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69  ** modify behavi
24b60 6f 75 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  our as follows:.
24b70 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
24b80 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65     **   + If the
24b90 20 71 75 65 72 79 20 69 73 20 61 20 22 53 45 4c   query is a "SEL
24ba0 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65  ECT min(x)", the
24bb0 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64  n the loop coded
24bc0 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   by.        **  
24bd0 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c     where.c shoul
24be0 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76  d not iterate ov
24bf0 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69  er any values wi
24c00 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a  th a NULL value.
24c10 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66          **     f
24c20 6f 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  or x..        **
24c30 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  .        **   + 
24c40 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f  The optimizer co
24c50 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74  de in where.c (t
24c60 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 64 65  he thing that de
24c70 63 69 64 65 73 20 77 68 69 63 68 0a 20 20 20 20  cides which.    
24c80 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78      **     index
24c90 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75   or indices to u
24ca0 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65  se) should place
24cb0 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 69   a different pri
24cc0 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20  ority on .      
24cd0 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79    **     satisfy
24ce0 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20 42  ing the 'ORDER B
24cf0 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69  Y' clause than i
24d00 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20  t does in other 
24d10 63 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  cases..        *
24d20 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f 20 63  *     Refer to c
24d30 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73  ode and comments
24d40 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20   in where.c for 
24d50 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20  details..       
24d60 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
24d70 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20  List *pMinMax = 
24d80 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c  0;.        u8 fl
24d90 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79  ag = minMaxQuery
24da0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
24db0 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20   flag ){.       
24dc0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
24dd0 48 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e 70  HasProperty(p->p
24de0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
24df0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
24e00 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d   );.          pM
24e10 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45  inMax = sqlite3E
24e20 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
24e30 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
24e40 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 30 29  Expr->x.pList,0)
24e50 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 65 6c  ;.          pDel
24e60 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20   = pMinMax;.    
24e70 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61        if( pMinMa
24e80 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  x && !db->malloc
24e90 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
24ea0 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
24eb0 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
24ec0 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45  flag!=WHERE_ORDE
24ed0 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20  RBY_MIN ?1:0;.  
24ee0 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
24ef0 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  x->a[0].pExpr->o
24f00 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
24f10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24f20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
24f30 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e  /* This case run
24f40 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61  s if the aggrega
24f50 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20  te has no GROUP 
24f60 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a  BY clause.  The.
24f70 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
24f80 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69  ssing is much si
24f90 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72  mpler since ther
24fa0 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  e is only a sing
24fb0 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a  le row.        *
24fc0 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20  * of output..   
24fd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
24fe0 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
24ff0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
25000 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49  fo);.        pWI
25010 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
25020 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
25030 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
25040 2c 20 26 70 4d 69 6e 4d 61 78 2c 20 66 6c 61 67  , &pMinMax, flag
25050 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
25060 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  WInfo==0 ){.    
25070 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25080 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
25090 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  pDel);.         
250a0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
250b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
250c0 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
250d0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
250e0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
250f0 20 20 69 66 28 20 21 70 4d 69 6e 4d 61 78 20 26    if( !pMinMax &
25100 26 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  & flag ){.      
25110 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25120 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
25130 2c 20 30 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  , 0, pWInfo->iBr
25140 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eak);.          
25150 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
25160 22 25 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c  "%s() by index",
25170 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25180 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52   (flag==WHERE_OR
25190 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a  DERBY_MIN?"min":
251a0 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20  "max")));.      
251b0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
251c0 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
251d0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66 69 6e  fo);.        fin
251e0 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
251f0 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
25200 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  nfo);.      }.. 
25210 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
25220 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
25230 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
25240 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
25250 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  rEnd, SQLITE_JUM
25260 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
25270 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
25280 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
25290 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d  List, 0, 0, 0, -
252a0 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  1, .            
252b0 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2c            pDest,
252c0 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e   addrEnd, addrEn
252d0 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
252e0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
252f0 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d  db, pDel);.    }
25300 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
25310 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
25320 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20  addrEnd);.    . 
25330 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72   } /* endif aggr
25340 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a  egate query */..
25350 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
25360 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
25370 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65  use, then we nee
25380 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65  d to sort the re
25390 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73  sults.  ** and s
253a0 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20  end them to the 
253b0 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20  callback one by 
253c0 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
253d0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
253e0 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
253f0 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70  (pParse, p, v, p
25400 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44  EList->nExpr, pD
25410 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  est);.  }..  /* 
25420 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69  Jump here to ski
25430 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a  p this query.  *
25440 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
25450 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
25460 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  End);..  /* The 
25470 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65  SELECT was succe
25480 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20  ssfully coded.  
25490 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20   Set the return 
254a0 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74  code to 0.  ** t
254b0 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72  o indicate no er
254c0 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  rors..  */.  rc 
254d0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72  = 0;..  /* Contr
254e0 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65  ol jumps to here
254f0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
25500 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76  encountered abov
25510 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20  e, or upon.  ** 
25520 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e  successful codin
25530 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  g of the SELECT.
25540 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64  .  */.select_end
25550 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79  :..  /* Identify
25560 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66   column names if
25570 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
25580 53 45 4c 45 43 54 20 61 72 65 20 74 6f 20 62 65  SELECT are to be
25590 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20   output..  */.  
255a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
255b0 4b 20 26 26 20 70 44 65 73 74 2d 3e 65 44 65 73  K && pDest->eDes
255c0 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
255d0 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
255e0 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
255f0 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
25600 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  t);.  }..  sqlit
25610 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67  e3DbFree(db, sAg
25620 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73  gInfo.aCol);.  s
25630 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
25640 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29   sAggInfo.aFunc)
25650 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
25660 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
25670 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
25680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
256a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
256b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
256c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
256d0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
256e0 63 6f 64 65 20 69 73 20 75 73 65 64 20 66 6f 72  code is used for
256f0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
25700 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68  ugging only.  Th
25710 65 20 63 6f 64 65 0a 2a 2a 20 74 68 61 74 20 66  e code.** that f
25720 6f 6c 6c 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20  ollows does not 
25730 61 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61 6c  appear in normal
25740 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 54   builds..**.** T
25750 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
25760 65 20 75 73 65 64 20 74 6f 20 70 72 69 6e 74 20  e used to print 
25770 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  out the content 
25780 6f 66 20 61 6c 6c 20 6f 72 20 70 61 72 74 20 6f  of all or part o
25790 66 20 61 20 0a 2a 2a 20 70 61 72 73 65 20 73 74  f a .** parse st
257a0 72 75 63 74 75 72 65 73 20 73 75 63 68 20 61 73  ructures such as
257b0 20 53 65 6c 65 63 74 20 6f 72 20 45 78 70 72 2e   Select or Expr.
257c0 20 20 53 75 63 68 20 70 72 69 6e 74 6f 75 74 73    Such printouts
257d0 20 61 72 65 20 75 73 65 66 75 6c 0a 2a 2a 20 66   are useful.** f
257e0 6f 72 20 68 65 6c 70 69 6e 67 20 74 6f 20 75 6e  or helping to un
257f0 64 65 72 73 74 61 6e 64 20 77 68 61 74 20 69 73  derstand what is
25800 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 73 69 64   happening insid
25810 65 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  e the code gener
25820 61 74 6f 72 0a 2a 2a 20 64 75 72 69 6e 67 20 74  ator.** during t
25830 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  he execution of 
25840 63 6f 6d 70 6c 65 78 20 53 45 4c 45 43 54 20 73  complex SELECT s
25850 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a  tatements..**.**
25860 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 20 61   These routine a
25870 72 65 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 6e  re not called an
25880 79 77 68 65 72 65 20 66 72 6f 6d 20 77 69 74 68  ywhere from with
25890 69 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a  in the normal.**
258a0 20 63 6f 64 65 20 62 61 73 65 2e 20 20 54 68 65   code base.  The
258b0 6e 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 74  n are intended t
258c0 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  o be called from
258d0 20 77 69 74 68 69 6e 20 74 68 65 20 64 65 62 75   within the debu
258e0 67 67 65 72 0a 2a 2a 20 6f 72 20 66 72 6f 6d 20  gger.** or from 
258f0 74 65 6d 70 6f 72 61 72 79 20 22 70 72 69 6e 74  temporary "print
25900 66 22 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  f" statements in
25910 73 65 72 74 65 64 20 66 6f 72 20 64 65 62 75 67  serted for debug
25920 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ging..*/.void sq
25930 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 45  lite3PrintExpr(E
25940 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 21  xpr *p){.  if( !
25950 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
25960 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
25970 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
25980 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
25990 75 67 50 72 69 6e 74 66 28 22 28 25 73 22 2c 20  ugPrintf("(%s", 
259a0 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  p->u.zToken);.  
259b0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
259c0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28  e3DebugPrintf("(
259d0 25 64 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20 20 7d  %d", p->op);.  }
259e0 0a 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20  .  if( p->pLeft 
259f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
25a00 62 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a  bugPrintf(" ");.
25a10 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
25a20 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a  Expr(p->pLeft);.
25a30 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 52 69    }.  if( p->pRi
25a40 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ght ){.    sqlit
25a50 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
25a60 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ");.    sqlite3P
25a70 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 52 69 67  rintExpr(p->pRig
25a80 68 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ht);.  }.  sqlit
25a90 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 29  e3DebugPrintf(")
25aa0 22 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  ");.}.void sqlit
25ab0 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28  e3PrintExprList(
25ac0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
25ad0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
25ae0 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
25af0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
25b00 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
25b10 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
25b20 70 72 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 70  pr);.    if( i<p
25b30 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b  List->nExpr-1 ){
25b40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
25b50 62 75 67 50 72 69 6e 74 66 28 22 2c 20 22 29 3b  bugPrintf(", ");
25b60 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69  .    }.  }.}.voi
25b70 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65  d sqlite3PrintSe
25b80 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  lect(Select *p, 
25b90 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 73  int indent){.  s
25ba0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25bb0 66 28 22 25 2a 73 53 45 4c 45 43 54 28 25 70 29  f("%*sSELECT(%p)
25bc0 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 2c 20   ", indent, "", 
25bd0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 72 69  p);.  sqlite3Pri
25be0 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  ntExprList(p->pE
25bf0 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
25c00 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
25c10 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63  );.  if( p->pSrc
25c20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50   ){.    char *zP
25c30 72 65 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 69  refix;.    int i
25c40 3b 0a 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20  ;.    zPrefix = 
25c50 22 46 52 4f 4d 22 3b 0a 20 20 20 20 66 6f 72 28  "FROM";.    for(
25c60 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e  i=0; i<p->pSrc->
25c70 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
25c80 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
25c90 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
25ca0 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  p->pSrc->a[i];. 
25cb0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
25cc0 67 50 72 69 6e 74 66 28 22 25 2a 73 20 22 2c 20  gPrintf("%*s ", 
25cd0 69 6e 64 65 6e 74 2b 36 2c 20 7a 50 72 65 66 69  indent+6, zPrefi
25ce0 78 29 3b 0a 20 20 20 20 20 20 7a 50 72 65 66 69  x);.      zPrefi
25cf0 78 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 69 66  x = "";.      if
25d00 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
25d10 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
25d20 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25d30 28 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 73  (\n");.        s
25d40 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63  qlite3PrintSelec
25d50 74 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  t(pItem->pSelect
25d60 2c 20 69 6e 64 65 6e 74 2b 31 30 29 3b 0a 20 20  , indent+10);.  
25d70 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
25d80 75 67 50 72 69 6e 74 66 28 22 25 2a 73 29 22 2c  ugPrintf("%*s)",
25d90 20 69 6e 64 65 6e 74 2b 38 2c 20 22 22 29 3b 0a   indent+8, "");.
25da0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
25db0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a  pItem->zName ){.
25dc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
25dd0 65 62 75 67 50 72 69 6e 74 66 28 22 25 73 22 2c  ebugPrintf("%s",
25de0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
25df0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
25e00 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b  ( pItem->pTab ){
25e10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25e20 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 74 61  DebugPrintf("(ta
25e30 62 6c 65 3a 20 25 73 29 22 2c 20 70 49 74 65 6d  ble: %s)", pItem
25e40 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  ->pTab->zName);.
25e50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
25e60 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
25e70 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
25e80 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
25e90 41 53 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  AS %s", pItem->z
25ea0 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a  Alias);.      }.
25eb0 20 20 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 70        if( i<p->p
25ec0 53 72 63 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20  Src->nSrc-1 ){. 
25ed0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
25ee0 62 75 67 50 72 69 6e 74 66 28 22 2c 22 29 3b 0a  bugPrintf(",");.
25ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
25f00 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
25f10 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ("\n");.    }.  
25f20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  }.  if( p->pWher
25f30 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
25f40 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73  DebugPrintf("%*s
25f50 20 57 48 45 52 45 20 22 2c 20 69 6e 64 65 6e 74   WHERE ", indent
25f60 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  , "");.    sqlit
25f70 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70  e3PrintExpr(p->p
25f80 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69  Where);.    sqli
25f90 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25fa0 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  \n");.  }.  if( 
25fb0 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  p->pGroupBy ){. 
25fc0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
25fd0 72 69 6e 74 66 28 22 25 2a 73 20 47 52 4f 55 50  rintf("%*s GROUP
25fe0 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22   BY ", indent, "
25ff0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ");.    sqlite3P
26000 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  rintExprList(p->
26010 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
26020 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
26030 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69  f("\n");.  }.  i
26040 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b  f( p->pHaving ){
26050 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
26060 67 50 72 69 6e 74 66 28 22 25 2a 73 20 48 41 56  gPrintf("%*s HAV
26070 49 4e 47 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22  ING ", indent, "
26080 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ");.    sqlite3P
26090 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 48 61 76  rintExpr(p->pHav
260a0 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ing);.    sqlite
260b0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
260c0 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ");.  }.  if( p-
260d0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
260e0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
260f0 6e 74 66 28 22 25 2a 73 20 4f 52 44 45 52 20 42  ntf("%*s ORDER B
26100 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29  Y ", indent, "")
26110 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
26120 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f  ntExprList(p->pO
26130 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c  rderBy);.    sql
26140 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
26150 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20  "\n");.  }.}./* 
26160 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75 63  End of the struc
26170 74 75 72 65 20 64 65 62 75 67 20 70 72 69 6e 74  ture debug print
26180 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a  ing code.*******
26190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
261a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
261b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
261c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
261d0 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f  ******/.#endif /
261e0 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
261f0 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65  _TEST) || define
26200 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
26210 2a 2f 0a                                         */.