/ Hex Artifact Content
Login

Artifact 015f2371832c921254220f9f15568f66601935f6:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
0210: 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  l the content of
0220: 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74   a Select struct
0230: 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ure but do not d
0240: 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65  eallocate.** the
0250: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
0260: 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61  e itself..*/.sta
0270: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0280: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0290: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
02a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c  elete(db, p->pEL
02c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
02d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
02e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c   p->pSrc);.  sql
02f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0300: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
0310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0330: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
0340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0350: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0380: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
0390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
03a0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
03b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
03c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
03d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
03e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
03f0: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
0400: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c  Initialize a Sel
0410: 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
0420: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
0430: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
0440: 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65  (SelectDest *pDe
0450: 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  st, int eDest, i
0460: 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65  nt iParm){.  pDe
0470: 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29  st->eDest = (u8)
0480: 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e  eDest;.  pDest->
0490: 69 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20  iParm = iParm;. 
04a0: 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79   pDest->affinity
04b0: 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69   = 0;.  pDest->i
04c0: 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  Mem = 0;.  pDest
04d0: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 7d 0a 0a 0a  ->nMem = 0;.}...
04e0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
04f0: 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75   new Select stru
0500: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
0510: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0520: 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  at.** structure.
0530: 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  .*/.Select *sqli
0540: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
0550: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0560: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0570: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
0580: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
0590: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
05a0: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
05b0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
05c0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
05d0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
05e0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
05f0: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0600: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0610: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0620: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0630: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0640: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0650: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0660: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0670: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
0680: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
0690: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
06a0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
06b0: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
06c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
06d0: 69 73 44 69 73 74 69 6e 63 74 2c 20 20 20 20 20  isDistinct,     
06e0: 20 20 2f 2a 20 74 72 75 65 20 69 66 20 74 68 65    /* true if the
06f0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
0700: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
0710: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
0720: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54          /* LIMIT
0730: 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65   value.  NULL me
0740: 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a  ans not used */.
0750: 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20    Expr *pOffset 
0760: 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45          /* OFFSE
0770: 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d  T value.  NULL m
0780: 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a  eans no offset *
0790: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
07a0: 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74  New;.  Select st
07b0: 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  andin;.  sqlite3
07c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
07d0: 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
07e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
07f0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
0800: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ) );.  assert( d
0810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0820: 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70  || !pOffset || p
0830: 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f 46 46 53  Limit ); /* OFFS
0840: 45 54 20 69 6d 70 6c 69 65 73 20 4c 49 4d 49 54  ET implies LIMIT
0850: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   */.  if( pNew==
0860: 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  0 ){.    pNew = 
0870: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65  &standin;.    me
0880: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
0890: 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
08a0: 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  }.  if( pEList==
08b0: 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20  0 ){.    pEList 
08c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
08d0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
08e0: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
08f0: 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20  b,TK_ALL,0));.  
0900: 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  }.  pNew->pEList
0910: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65   = pEList;.  pNe
0920: 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  w->pSrc = pSrc;.
0930: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
0940: 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d   pWhere;.  pNew-
0950: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
0960: 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  upBy;.  pNew->pH
0970: 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b  aving = pHaving;
0980: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
0990: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
09a0: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
09b0: 20 69 73 44 69 73 74 69 6e 63 74 20 3f 20 53 46   isDistinct ? SF
09c0: 5f 44 69 73 74 69 6e 63 74 20 3a 20 30 3b 0a 20  _Distinct : 0;. 
09d0: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53   pNew->op = TK_S
09e0: 45 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70  ELECT;.  pNew->p
09f0: 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
0a00: 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
0a10: 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73  = pOffset;.  ass
0a20: 65 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20  ert( pOffset==0 
0a30: 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a  || pLimit!=0 );.
0a40: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0a50: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
0a60: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0a70: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
0a80: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0a90: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  [2] = -1;.  if( 
0aa0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
0ab0: 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65   ) {.    clearSe
0ac0: 6c 65 63 74 28 64 62 2c 20 70 4e 65 77 29 3b 0a  lect(db, pNew);.
0ad0: 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 26 73      if( pNew!=&s
0ae0: 74 61 6e 64 69 6e 20 29 20 73 71 6c 69 74 65 33  tandin ) sqlite3
0af0: 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29  DbFree(db, pNew)
0b00: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
0b10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
0b20: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  w;.}../*.** Dele
0b30: 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c  te the given Sel
0b40: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e  ect structure an
0b50: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
0b60: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
0b70: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0b80: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
0b90: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  *db, Select *p){
0ba0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
0bb0: 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20  clearSelect(db, 
0bc0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
0bd0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
0be0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
0bf0: 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69   1 to 3 identifi
0c00: 65 72 73 20 70 72 65 63 65 65 64 69 6e 67 20 74  ers preceeding t
0c10: 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c  he JOIN keyword,
0c20: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a   determine the.*
0c30: 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20  * type of join. 
0c40: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
0c50: 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74  er constant that
0c60: 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20   expresses that 
0c70: 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73  type.** in terms
0c80: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0c90: 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a  g bit values:.**
0ca0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52  .**     JT_INNER
0cb0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53  .**     JT_CROSS
0cc0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52  .**     JT_OUTER
0cd0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52  .**     JT_NATUR
0ce0: 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46  AL.**     JT_LEF
0cf0: 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48  T.**     JT_RIGH
0d00: 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f  T.**.** A full o
0d10: 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65  uter join is the
0d20: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
0d30: 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52  JT_LEFT and JT_R
0d40: 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  IGHT..**.** If a
0d50: 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73  n illegal or uns
0d60: 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79  upported join ty
0d70: 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e  pe is seen, then
0d80: 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a   still return.**
0d90: 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75   a join type, bu
0da0: 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69  t put an error i
0db0: 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
0dc0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
0dd0: 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50  qlite3JoinType(P
0de0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
0df0: 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a  ken *pA, Token *
0e00: 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a  pB, Token *pC){.
0e10: 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d    int jointype =
0e20: 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41   0;.  Token *apA
0e30: 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a  ll[3];.  Token *
0e40: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p;.             
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e60: 2f 2a 20 20 20 30 31 32 33 34 35 36 37 38 39 20  /*   0123456789 
0e70: 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36  123456789 123456
0e80: 37 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61  789 123 */.  sta
0e90: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
0ea0: 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74  KeyText[] = "nat
0eb0: 75 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74  uraleftouteright
0ec0: 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b  fullinnercross";
0ed0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
0ee0: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20  struct {.    u8 
0ef0: 69 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67  i;        /* Beg
0f00: 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72  inning of keywor
0f10: 64 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65  d text in zKeyTe
0f20: 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e  xt[] */.    u8 n
0f30: 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67  Char;    /* Leng
0f40: 74 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72  th of the keywor
0f50: 64 20 69 6e 20 63 68 61 72 61 63 74 65 72 73 20  d in characters 
0f60: 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20  */.    u8 code; 
0f70: 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65      /* Join type
0f80: 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65   mask */.  } aKe
0f90: 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  yword[] = {.    
0fa0: 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20  /* natural */ { 
0fb0: 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41  0,  7, JT_NATURA
0fc0: 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L               
0fd0: 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20   },.    /* left 
0fe0: 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a     */ { 6,  4, J
0ff0: 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20  T_LEFT|JT_OUTER 
1000: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1010: 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20  /* outer   */ { 
1020: 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20  10, 5, JT_OUTER 
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1040: 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74   },.    /* right
1050: 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a     */ { 14, 5, J
1060: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
1070: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1080: 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20  /* full    */ { 
1090: 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a  19, 4, JT_LEFT|J
10a0: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
10b0: 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72   },.    /* inner
10c0: 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a     */ { 23, 5, J
10d0: 54 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20  T_INNER         
10e0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
10f0: 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20  /* cross   */ { 
1100: 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c  28, 5, JT_INNER|
1110: 4a 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20  JT_CROSS        
1120: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
1130: 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20  , j;.  apAll[0] 
1140: 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d  = pA;.  apAll[1]
1150: 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32   = pB;.  apAll[2
1160: 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d  ] = pC;.  for(i=
1170: 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b  0; i<3 && apAll[
1180: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  i]; i++){.    p 
1190: 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20  = apAll[i];.    
11a0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79  for(j=0; j<Array
11b0: 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20  Size(aKeyword); 
11c0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
11d0: 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a  p->n==aKeyword[j
11e0: 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20  ].nChar .       
11f0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
1200: 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e  NICmp((char*)p->
1210: 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65  z, &zKeyText[aKe
1220: 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e  yword[j].i], p->
1230: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  n)==0 ){.       
1240: 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65   jointype |= aKe
1250: 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20  yword[j].code;. 
1260: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1270: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1280: 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c  testcase( j==0 |
1290: 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c  | j==1 || j==2 |
12a0: 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c  | j==3 || j==4 |
12b0: 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29  | j==5 || j==6 )
12c0: 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72  ;.    if( j>=Arr
12d0: 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29  aySize(aKeyword)
12e0: 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   ){.      jointy
12f0: 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a  pe |= JT_ERROR;.
1300: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1310: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20   }.  }.  if(.   
1320: 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a    (jointype & (J
1330: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
1340: 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54  ))==(JT_INNER|JT
1350: 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20  _OUTER) ||.     
1360: 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45  (jointype & JT_E
1370: 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20  RROR)!=0.  ){.  
1380: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1390: 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73  p = " ";.    ass
13a0: 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20  ert( pB!=0 );.  
13b0: 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a    if( pC==0 ){ z
13c0: 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69  Sp++; }.    sqli
13d0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13e0: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20  se, "unknown or 
13f0: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
1400: 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20   type: ".       
1410: 22 25 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c  "%T %T%s%T", pA,
1420: 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20   pB, zSp, pC);. 
1430: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
1440: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20  _INNER;.  }else 
1450: 69 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20  if( (jointype & 
1460: 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20  JT_OUTER)!=0 .  
1470: 20 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74         && (joint
1480: 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  ype & (JT_LEFT|J
1490: 54 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45  T_RIGHT))!=JT_LE
14a0: 46 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  FT ){.    sqlite
14b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14c0: 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48 54 20  , .      "RIGHT 
14d0: 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a  and FULL OUTER J
14e0: 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72  OINs are not cur
14f0: 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64  rently supported
1500: 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65  ");.    jointype
1510: 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d   = JT_INNER;.  }
1520: 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79  .  return jointy
1530: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  pe;.}../*.** Ret
1540: 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
1550: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74   a column in a t
1560: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31  able.  Return -1
1570: 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a   if the column.*
1580: 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  * is not contain
1590: 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ed in the table.
15a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
15b0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65  olumnIndex(Table
15c0: 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68   *pTab, const ch
15d0: 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74  ar *zCol){.  int
15e0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
15f0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
1600: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1610: 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e  e3StrICmp(pTab->
1620: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  aCol[i].zName, z
1630: 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Col)==0 ) return
1640: 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
1650: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   -1;.}../*.** Se
1660: 61 72 63 68 20 74 68 65 20 66 69 72 73 74 20 4e  arch the first N
1670: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c   tables in pSrc,
1680: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
1690: 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ght, looking for
16a0: 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74   a.** table that
16b0: 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61   has a column na
16c0: 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a  med zCol.  .**.*
16d0: 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65  * When found, se
16e0: 74 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69  t *piTab and *pi
16f0: 43 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65  Col to the table
1700: 20 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d   index and colum
1710: 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68  n index.** of th
1720: 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  e matching colum
1730: 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55  n and return TRU
1740: 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20  E..**.** If not 
1750: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41  found, return FA
1760: 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LSE..*/.static i
1770: 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  nt tableAndColum
1780: 6e 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73  nIndex(.  SrcLis
1790: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f  t *pSrc,       /
17a0: 2a 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65  * Array of table
17b0: 73 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  s to search */. 
17c0: 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
17d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17e0: 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72  of tables in pSr
17f0: 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68  c->a[] to search
1800: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1810: 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61   *zCol,    /* Na
1820: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
1830: 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20   we are looking 
1840: 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  for */.  int *pi
1850: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Tab,          /*
1860: 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20   Write index of 
1870: 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a  pSrc->a[] here *
1880: 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20  /.  int *piCol  
1890: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
18a0: 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d  e index of pSrc-
18b0: 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d  >a[*piTab].pTab-
18c0: 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a  >aCol[] here */.
18d0: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
18e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
18f0: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61   looping over ta
1900: 62 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a  bles in pSrc */.
1910: 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
1920: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1930: 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69  of column matchi
1940: 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73  ng zCol */..  as
1950: 73 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29  sert( (piTab==0)
1960: 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20  ==(piCol==0) ); 
1970: 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74   /* Both or neit
1980: 68 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a  her are NULL */.
1990: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20    for(i=0; i<N; 
19a0: 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  i++){.    iCol =
19b0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72   columnIndex(pSr
19c0: 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43  c->a[i].pTab, zC
19d0: 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  ol);.    if( iCo
19e0: 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  l>=0 ){.      if
19f0: 28 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20  ( piTab ){.     
1a00: 20 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20     *piTab = i;. 
1a10: 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20         *piCol = 
1a20: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iCol;.      }.  
1a30: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1a40: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1a50: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
1a60: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
1a70: 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20  ed to add terms 
1a80: 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20  implied by JOIN 
1a90: 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a  syntax to the.**
1aa0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78   WHERE clause ex
1ab0: 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45  pression of a SE
1ac0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
1ad0: 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68  The new term, wh
1ae0: 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20  ich.** is ANDed 
1af0: 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69 6e  with the existin
1b00: 67 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  g WHERE clause, 
1b10: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
1b20: 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63  **.**    (tab1.c
1b30: 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29  ol1 = tab2.col2)
1b40: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62  .**.** where tab
1b50: 31 20 69 73 20 74 68 65 20 69 53 72 63 27 74 68  1 is the iSrc'th
1b60: 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73   table in SrcLis
1b70: 74 20 70 53 72 63 20 61 6e 64 20 74 61 62 32 20  t pSrc and tab2 
1b80: 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63  is the .** (iSrc
1b90: 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63  +1)'th. Column c
1ba0: 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43  ol1 is column iC
1bb0: 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20  olLeft of tab1, 
1bc0: 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63  and col2 is.** c
1bd0: 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20  olumn iColRight 
1be0: 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74  of tab2..*/.stat
1bf0: 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72 65  ic void addWhere
1c00: 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
1c10: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
1c20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1c30: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1c40: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
1c70: 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65  s in FROM clause
1c80: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c   */.  int iLeft,
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1cb0: 66 20 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f  f first table to
1cc0: 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f   join in pSrc */
1cd0: 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c  .  int iColLeft,
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
1d00: 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74  olumn in first t
1d10: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
1d20: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
1d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1d40: 65 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62  ex of second tab
1d50: 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  le in pSrc */.  
1d60: 69 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20  int iColRight,  
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
1d90: 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62  mn in second tab
1da0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75  le */.  int isOu
1db0: 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20  terJoin,        
1dc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1dd0: 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55  if this is an OU
1de0: 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78  TER join */.  Ex
1df0: 70 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20  pr **ppWhere    
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e10: 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45   IN/OUT: The WHE
1e20: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64  RE clause to add
1e30: 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69   to */.){.  sqli
1e40: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1e50: 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  ->db;.  Expr *pE
1e60: 31 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a  1;.  Expr *pE2;.
1e70: 20 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20    Expr *pEq;..  
1e80: 61 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52  assert( iLeft<iR
1e90: 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74  ight );.  assert
1ea0: 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69  ( pSrc->nSrc>iRi
1eb0: 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ght );.  assert(
1ec0: 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e   pSrc->a[iLeft].
1ed0: 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74  pTab );.  assert
1ee0: 28 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74  ( pSrc->a[iRight
1ef0: 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31  ].pTab );..  pE1
1f00: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
1f10: 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70  ColumnExpr(db, p
1f20: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c  Src, iLeft, iCol
1f30: 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73  Left);.  pE2 = s
1f40: 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75  qlite3CreateColu
1f50: 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c  mnExpr(db, pSrc,
1f60: 20 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67   iRight, iColRig
1f70: 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71  ht);..  pEq = sq
1f80: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1f90: 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70  e, TK_EQ, pE1, p
1fa0: 45 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45  E2, 0);.  if( pE
1fb0: 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e  q && isOuterJoin
1fc0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
1fd0: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
1fe0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
1ff0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41  ssert( !ExprHasA
2000: 6e 79 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  nyProperty(pEq, 
2010: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
2020: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
2030: 45 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62  ExprSetIrreducib
2040: 6c 65 28 70 45 71 29 3b 0a 20 20 20 20 70 45 71  le(pEq);.    pEq
2050: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2060: 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69 54  e = (i16)pE2->iT
2070: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 57  able;.  }.  *ppW
2080: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
2090: 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68 65  prAnd(db, *ppWhe
20a0: 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a  re, pEq);.}../*.
20b0: 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72  ** Set the EP_Fr
20c0: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
20d0: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  on all terms of 
20e0: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
20f0: 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74  sion..** And set
2100: 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   the Expr.iRight
2110: 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61  JoinTable to iTa
2120: 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65  ble for every te
2130: 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70  rm in the.** exp
2140: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ression..**.** T
2150: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
2160: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
2170: 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65  on terms of an e
2180: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c  xpression to tel
2190: 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55  l.** the LEFT OU
21a0: 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73  TER JOIN process
21b0: 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74  ing logic that t
21c0: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
21d0: 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20   of the.** join 
21e0: 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63  restriction spec
21f0: 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  ified in the ON 
2200: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
2210: 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a  and not a part.*
2220: 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65  * of the more ge
2230: 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75  neral WHERE clau
2240: 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73  se.  These terms
2250: 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20   are moved over 
2260: 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  to the.** WHERE 
2270: 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f  clause during jo
2280: 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75  in processing bu
2290: 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d  t we need to rem
22a0: 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a  ember that they.
22b0: 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e  ** originated in
22c0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
22d0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54   clause..**.** T
22e0: 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  he Expr.iRightJo
22f0: 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68  inTable tells th
2300: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
2310: 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74  rocessing that t
2320: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
2330: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c   depends on tabl
2340: 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  e iRightJoinTabl
2350: 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74  e even if that t
2360: 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65  able is not.** e
2370: 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f  xplicitly mentio
2380: 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65  ned in the expre
2390: 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66  ssion.  That inf
23a0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64  ormation is need
23b0: 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20  ed.** for cases 
23c0: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
23d0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
23e0: 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
23f0: 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41  2 ON t1.a=t2.b A
2400: 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20  ND t1.x=5.**.** 
2410: 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  The where clause
2420: 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20   needs to defer 
2430: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
2440: 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65  the t1.x=5.** te
2450: 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74  rm until after t
2460: 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68  he t2 loop of th
2470: 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74  e join.  In that
2480: 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20   way, a.** NULL 
2490: 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69  t2 row will be i
24a0: 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72  nserted whenever
24b0: 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65   t1.x!=5.  If we
24c0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72   do not.** defer
24d0: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
24e0: 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c   t1.x=5, it will
24f0: 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d   be processed im
2500: 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74  mediately.** aft
2510: 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61  er the t1 loop a
2520: 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e  nd rows with t1.
2530: 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20  x!=5 will never 
2540: 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65  appear in.** the
2550: 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69   output, which i
2560: 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a  s incorrect..*/.
2570: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a  static void setJ
2580: 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c  oinExpr(Expr *p,
2590: 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
25a0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
25b0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
25c0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  p, EP_FromJoin);
25d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
25e0: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
25f0: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
2600: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
2610: 20 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64      ExprSetIrred
2620: 75 63 69 62 6c 65 28 70 29 3b 0a 20 20 20 20 70  ucible(p);.    p
2630: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2640: 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b  e = (i16)iTable;
2650: 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72  .    setJoinExpr
2660: 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  (p->pLeft, iTabl
2670: 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  e);.    p = p->p
2680: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
2690: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26a0: 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  e processes the 
26b0: 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  join information
26c0: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
26d0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61  atement..** ON a
26e0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
26f0: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
2700: 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20  nto extra terms 
2710: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
2720: 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20  use..** NATURAL 
2730: 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74  joins also creat
2740: 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  e extra WHERE cl
2750: 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a  ause terms..**.*
2760: 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61  * The terms of a
2770: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65   FROM clause are
2780: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
2790: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74  e Select.pSrc st
27a0: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20  ructure..** The 
27b0: 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20  left most table 
27c0: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  is the first ent
27d0: 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72  ry in Select.pSr
27e0: 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  c.  The right-mo
27f0: 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74  st.** table is t
2800: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20  he last entry.  
2810: 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  The join operato
2820: 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65  r is held in the
2830: 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65   entry to.** the
2840: 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74   left.  Thus ent
2850: 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68  ry 0 contains th
2860: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
2870: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74  for the join bet
2880: 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ween.** entries 
2890: 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e  0 and 1.  Any ON
28a0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
28b0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
28c0: 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a  h the join are.*
28d0: 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20  * also attached 
28e0: 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72  to the left entr
28f0: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
2900: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
2910: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
2920: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  rs encountered..
2930: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
2940: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
2950: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
2960: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
2970: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2990: 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  All tables in th
29a0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
29b0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
29e0: 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ers */.  struct 
29f0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
2a00: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74  eft;     /* Left
2a10: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
2a20: 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
2a30: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52  SrcList_item *pR
2a40: 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68  ight;    /* Righ
2a50: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
2a60: 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20  ined */..  pSrc 
2a70: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65  = p->pSrc;.  pLe
2a80: 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d  ft = &pSrc->a[0]
2a90: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c  ;.  pRight = &pL
2aa0: 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  eft[1];.  for(i=
2ab0: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
2ac0: 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b  1; i++, pRight++
2ad0: 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20  , pLeft++){.    
2ae0: 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20  Table *pLeftTab 
2af0: 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20  = pLeft->pTab;. 
2b00: 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74     Table *pRight
2b10: 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54  Tab = pRight->pT
2b20: 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75  ab;.    int isOu
2b30: 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45  ter;..    if( NE
2b40: 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d 30 20  VER(pLeftTab==0 
2b50: 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29  || pRightTab==0)
2b60: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2b70: 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67   isOuter = (pRig
2b80: 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ht->jointype & J
2b90: 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20  T_OUTER)!=0;..  
2ba0: 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41    /* When the NA
2bb0: 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73  TURAL keyword is
2bc0: 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48   present, add WH
2bd0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
2be0: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72   for.    ** ever
2bf0: 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68  y column that th
2c00: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76  e two tables hav
2c10: 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20  e in common..   
2c20: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
2c30: 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ht->jointype & J
2c40: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
2c50: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
2c60: 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55  On || pRight->pU
2c70: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  sing ){.        
2c80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2c90: 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52  pParse, "a NATUR
2ca0: 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20  AL join may not 
2cb0: 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20  have ".         
2cc0: 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e    "an ON or USIN
2cd0: 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20  G clause", 0);. 
2ce0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
2cf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2d00: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74  or(j=0; j<pRight
2d10: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
2d20: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
2d30: 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
2d40: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  of column in the
2d50: 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a   right table */.
2d60: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
2d70: 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69  t;     /* Matchi
2d80: 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f  ng left table */
2d90: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
2da0: 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68  ftCol;  /* Match
2db0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ing column in th
2dc0: 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  e left table */.
2dd0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
2de0: 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c   pRightTab->aCol
2df0: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
2e00: 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43     if( tableAndC
2e10: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c  olumnIndex(pSrc,
2e20: 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c   i+1, zName, &iL
2e30: 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20  eft, &iLeftCol) 
2e40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
2e50: 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65  WhereTerm(pParse
2e60: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
2e70: 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c  LeftCol, i+1, j,
2e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e90: 20 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c          isOuter,
2ea0: 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   &p->pWhere);.  
2eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2ec0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
2ed0: 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61  sallow both ON a
2ee0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
2ef0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
2f00: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  n.    */.    if(
2f10: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20   pRight->pOn && 
2f20: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
2f30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2f40: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2f50: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
2f60: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
2f70: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
2f80: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
2f90: 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  in");.      retu
2fa0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
2fb0: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
2fc0: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
2fd0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2fe0: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
2ff0: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44  by.    ** an AND
3000: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
3010: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3020: 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  ->pOn ){.      i
3030: 66 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74  f( isOuter ) set
3040: 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d  JoinExpr(pRight-
3050: 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43  >pOn, pRight->iC
3060: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d  ursor);.      p-
3070: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
3080: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
3090: 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  >db, p->pWhere, 
30a0: 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20  pRight->pOn);.  
30b0: 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20      pRight->pOn 
30c0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
30d0: 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20  /* Create extra 
30e0: 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45  terms on the WHE
30f0: 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61  RE clause for ea
3100: 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a  ch column named.
3110: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53      ** in the US
3120: 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61  ING clause.  Exa
3130: 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f  mple: If the two
3140: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3150: 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a  ined are .    **
3160: 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65   A and B and the
3170: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61   USING clause na
3180: 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c  mes X, Y, and Z,
3190: 20 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20   then add this. 
31a0: 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45     ** to the WHE
31b0: 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e  RE clause:    A.
31c0: 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e  X=B.X AND A.Y=B.
31d0: 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20  Y AND A.Z=B.Z.  
31e0: 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65    ** Report an e
31f0: 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75  rror if any colu
3200: 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  mn mentioned in 
3210: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3220: 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63   is.    ** not c
3230: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68  ontained in both
3240: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3250: 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ined..    */.   
3260: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73   if( pRight->pUs
3270: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c  ing ){.      IdL
3280: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69  ist *pList = pRi
3290: 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20  ght->pUsing;.   
32a0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
32b0: 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a  ist->nId; j++){.
32c0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
32d0: 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame;     /* Name
32e0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20   of the term in 
32f0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3300: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3310: 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20  iLeft;       /* 
3320: 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66  Table on the lef
3330: 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20  t with matching 
3340: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
3350: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
3360: 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col;    /* Colum
3370: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  n number of matc
3380: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74  hing column on t
3390: 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20  he left */.     
33a0: 20 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c     int iRightCol
33b0: 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75  ;   /* Column nu
33c0: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67  mber of matching
33d0: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72   column on the r
33e0: 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ight */..       
33f0: 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e   zName = pList->
3400: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
3410: 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20      iRightCol = 
3420: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67  columnIndex(pRig
3430: 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  htTab, zName);. 
3440: 20 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68         if( iRigh
3450: 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20  tCol<0.         
3460: 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75  || !tableAndColu
3470: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b  mnIndex(pSrc, i+
3480: 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74  1, zName, &iLeft
3490: 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20  , &iLeftCol).   
34a0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
34b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
34c0: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
34d0: 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c  t join using col
34e0: 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20  umn %s - column 
34f0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e  ".            "n
3500: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f  ot present in bo
3510: 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d  th tables", zNam
3520: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
3530: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
3540: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65  }.        addWhe
3550: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  reTerm(pParse, p
3560: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66  Src, iLeft, iLef
3570: 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68  tCol, i+1, iRigh
3580: 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tCol,.          
3590: 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74             isOut
35a0: 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b  er, &p->pWhere);
35b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
35c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
35d0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63  ../*.** Insert c
35e0: 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61  ode into "v" tha
35f0: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
3600: 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f  record on the to
3610: 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63  p of the.** stac
3620: 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65  k into the sorte
3630: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
3640: 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72  d pushOntoSorter
3650: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3660: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
3670: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
3680: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
3690: 65 72 42 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  erBy,    /* The 
36a0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
36b0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
36c0: 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  lect,       /* T
36d0: 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20  he whole SELECT 
36e0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
36f0: 6e 74 20 72 65 67 44 61 74 61 20 20 20 20 20 20  nt regData      
3700: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
3710: 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 74  r holding data t
3720: 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 29  o be sorted */.)
3730: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
3740: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
3750: 6e 74 20 6e 45 78 70 72 20 3d 20 70 4f 72 64 65  nt nExpr = pOrde
3760: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e  rBy->nExpr;.  in
3770: 74 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69  t regBase = sqli
3780: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
3790: 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 32 29  pParse, nExpr+2)
37a0: 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  ;.  int regRecor
37b0: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
37c0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
37d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
37e0: 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
37f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
3800: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
3810: 2c 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42  , pOrderBy, regB
3820: 61 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ase, 0);.  sqlit
3830: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3840: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72  OP_Sequence, pOr
3850: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
3860: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
3870: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
3880: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
3890: 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b  egData, regBase+
38a0: 6e 45 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73  nExpr+1, 1);.  s
38b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
38c0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
38d0: 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70  d, regBase, nExp
38e0: 72 20 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64  r + 2, regRecord
38f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3900: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
3910: 49 6e 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79  Insert, pOrderBy
3920: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52  ->iECursor, regR
3930: 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
3940: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
3950: 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
3960: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  d);.  sqlite3Rel
3970: 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
3980: 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
3990: 45 78 70 72 2b 32 29 3b 0a 20 20 69 66 28 20 70  Expr+2);.  if( p
39a0: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29  Select->iLimit )
39b0: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c  {.    int addr1,
39c0: 20 61 64 64 72 32 3b 0a 20 20 20 20 69 6e 74 20   addr2;.    int 
39d0: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66 28 20  iLimit;.    if( 
39e0: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
39f0: 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74   ){.      iLimit
3a00: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66   = pSelect->iOff
3a10: 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  set+1;.    }else
3a20: 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d  {.      iLimit =
3a30: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
3a40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72  ;.    }.    addr
3a50: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
3a60: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp1(v, OP_IfZe
3a70: 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  ro, iLimit);.   
3a80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3a90: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
3aa0: 20 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20   iLimit, -1);.  
3ab0: 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
3ac0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
3ad0: 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c  P_Goto);.    sql
3ae0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
3af0: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
3b00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3b10: 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f  1(v, OP_Last, pO
3b20: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
3b30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3b40: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44  beAddOp1(v, OP_D
3b50: 65 6c 65 74 65 2c 20 70 4f 72 64 65 72 42 79 2d  elete, pOrderBy-
3b60: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
3b70: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
3b80: 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20  ere(v, addr2);. 
3b90: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
3ba0: 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
3bb0: 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a  t the OFFSET.*/.
3bc0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
3bd0: 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a  Offset(.  Vdbe *
3be0: 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47  v,          /* G
3bf0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
3c00: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53  o this VM */.  S
3c10: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
3c20: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
3c30: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
3c40: 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  oded */.  int iC
3c50: 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a  ontinue     /* J
3c60: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
3c70: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
3c80: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ord */.){.  if( 
3c90: 70 2d 3e 69 4f 66 66 73 65 74 20 26 26 20 69 43  p->iOffset && iC
3ca0: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20  ontinue!=0 ){.  
3cb0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
3cc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3cd0: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
3ce0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 2d 31 29 3b  p->iOffset, -1);
3cf0: 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
3d00: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
3d10: 20 4f 50 5f 49 66 4e 65 67 2c 20 70 2d 3e 69 4f   OP_IfNeg, p->iO
3d20: 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  ffset);.    sqli
3d30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3d40: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f   OP_Goto, 0, iCo
3d50: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62  ntinue);.    Vdb
3d60: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b  eComment((v, "sk
3d70: 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64  ip OFFSET record
3d80: 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  s"));.    sqlite
3d90: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
3da0: 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   addr);.  }.}../
3db0: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68  *.** Add code th
3dc0: 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f  at will check to
3dd0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e   make sure the N
3de0: 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
3df0: 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66  ing at iMem.** f
3e00: 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65  orm a distinct e
3e10: 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61  ntry.  iTab is a
3e20: 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
3e30: 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f  hat holds previo
3e40: 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d  usly.** seen com
3e50: 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  binations of the
3e60: 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65   N values.  A ne
3e70: 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20  w entry is made 
3e80: 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68  in iTab.** if th
3e90: 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75  e current N valu
3ea0: 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a  es are new..**.*
3eb0: 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72  * A jump to addr
3ec0: 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61  Repeat is made a
3ed0: 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65  nd the N+1 value
3ee0: 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f  s are popped fro
3ef0: 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69  m the.** stack i
3f00: 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d  f the top N elem
3f10: 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73  ents are not dis
3f20: 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  tinct..*/.static
3f30: 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e   void codeDistin
3f40: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
3f50: 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
3f60: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
3f70: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
3f80: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
3f90: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72          /* A sor
3fa0: 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20  ting index used 
3fb0: 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74  to test for dist
3fc0: 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e  inctness */.  in
3fd0: 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20  t addrRepeat,   
3fe0: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
3ff0: 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74   if not distinct
4000: 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20   */.  int N,    
4010: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4020: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a  er of elements *
4030: 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20  /.  int iMem    
4040: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
4050: 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  element */.){.  
4060: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72  Vdbe *v;.  int r
4070: 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65  1;..  v = pParse
4080: 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20  ->pVdbe;.  r1 = 
4090: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
40a0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
40b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
40c0: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
40d0: 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c  Tab, addrRepeat,
40e0: 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c   iMem, N);.  sql
40f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4100: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
4110: 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20   iMem, N, r1);. 
4120: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4130: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
4140: 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20  rt, iTab, r1);. 
4150: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
4160: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
4170: 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  1);.}..#ifndef S
4180: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
4190: 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ERY./*.** Genera
41a0: 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
41b0: 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c 45 43  age when a SELEC
41c0: 54 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e  T is used within
41d0: 20 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e   a subexpression
41e0: 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20 20 22  .** (example:  "
41f0: 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  a IN (SELECT * F
4200: 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62 75 74  ROM table)") but
4210: 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74 68 61   it has more tha
4220: 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f  n 1 result.** co
4230: 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74 68 69  lumn.  We do thi
4240: 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e  s in a subroutin
4250: 65 20 62 65 63 61 75 73 65 20 74 68 65 20 65 72  e because the er
4260: 72 6f 72 20 75 73 65 64 20 74 6f 20 6f 63 63 75  ror used to occu
4270: 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65  r.** in multiple
4280: 20 70 6c 61 63 65 73 2e 20 20 28 54 68 65 20 65   places.  (The e
4290: 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73  rror only occurs
42a0: 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f   in one place no
42b0: 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20 72 65 74  w, but we.** ret
42c0: 61 69 6e 20 74 68 65 20 73 75 62 72 6f 75 74 69  ain the subrouti
42d0: 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63  ne to minimize c
42e0: 6f 64 65 20 64 69 73 72 75 70 74 69 6f 6e 2e 29  ode disruption.)
42f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
4300: 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
4310: 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 0a 20  mnSelectError(. 
4320: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4330: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
4340: 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c  ontext. */.  Sel
4350: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
4360: 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
4370: 20 6f 66 20 53 45 4c 45 43 54 20 72 65 73 75 6c   of SELECT resul
4380: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70  ts */.  int nExp
4390: 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
43a0: 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  Number of result
43b0: 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
43c0: 64 20 62 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29  d by SELECT */.)
43d0: 7b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  {.  int eDest = 
43e0: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20  pDest->eDest;.  
43f0: 69 66 28 20 6e 45 78 70 72 3e 31 20 26 26 20 28  if( nExpr>1 && (
4400: 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c  eDest==SRT_Mem |
4410: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74  | eDest==SRT_Set
4420: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
4430: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4440: 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20   "only a single 
4450: 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66  result allowed f
4460: 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61 20 53  or ".       "a S
4470: 45 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61  ELECT that is pa
4480: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
4490: 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ion");.    retur
44a0: 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 1;.  }else{.  
44b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
44c0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
44d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
44e0: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
44f0: 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f  for the inside o
4500: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
4510: 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e  .** of a SELECT.
4520: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62  .**.** If srcTab
4530: 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65   and nColumn are
4540: 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e   both zero, then
4550: 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70 72   the pEList expr
4560: 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65  essions.** are e
4570: 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65  valuated in orde
4580: 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74  r to get the dat
4590: 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20  a for this row. 
45a0: 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a   If nColumn>0.**
45b0: 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75   then data is pu
45c0: 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62  lled from srcTab
45d0: 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75   and pEList is u
45e0: 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20  sed only to get 
45f0: 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73  the.** datatypes
4600: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
4610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4620: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
4630: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4640: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
4650: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
4660: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
4670: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4680: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
4690: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
46a0: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
46b0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
46c0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
46d0: 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67   of values being
46e0: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20   extracted */.  
46f0: 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20  int srcTab,     
4700: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20          /* Pull 
4710: 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74  data from this t
4720: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
4730: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
4740: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
4750: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f  olumns in the so
4760: 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  urce table */.  
4770: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
4780: 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  By,     /* If no
4790: 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73  t NULL, sort res
47a0: 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73 20  ults using this 
47b0: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  key */.  int dis
47c0: 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20  tinct,          
47d0: 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65   /* If >=0, make
47e0: 20 73 75 72 65 20 72 65 73 75 6c 74 73 20 61 72   sure results ar
47f0: 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  e distinct */.  
4800: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
4810: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
4820: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
4830: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
4840: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
4850: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4860: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
4870: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
4880: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
4890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
48a0: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
48b0: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
48c0: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
48d0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
48e0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
48f0: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
4900: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
4910: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
4920: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
4930: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  sent */.  int re
4940: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
4950: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
4960: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
4970: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
4980: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
4990: 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20  st->eDest;   /* 
49a0: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
49b0: 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  f results */.  i
49c0: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
49d0: 2d 3e 69 50 61 72 6d 3b 20 20 20 2f 2a 20 46 69  ->iParm;   /* Fi
49e0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
49f0: 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
4a00: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  */.  int nResult
4a10: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
4a20: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
4a30: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
4a40: 0a 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a  .  assert( v );.
4a50: 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
4a60: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  ) ) return;.  as
4a70: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
4a80: 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74  );.  hasDistinct
4a90: 20 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30 3b 0a   = distinct>=0;.
4aa0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
4ab0: 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63  0 && !hasDistinc
4ac0: 74 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66  t ){.    codeOff
4ad0: 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69  set(v, p, iConti
4ae0: 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nue);.  }..  /* 
4af0: 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74  Pull the request
4b00: 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f  ed columns..  */
4b10: 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30  .  if( nColumn>0
4b20: 20 29 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43   ){.    nResultC
4b30: 6f 6c 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  ol = nColumn;.  
4b40: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 75  }else{.    nResu
4b50: 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e  ltCol = pEList->
4b60: 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28  nExpr;.  }.  if(
4b70: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20   pDest->iMem==0 
4b80: 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 4d  ){.    pDest->iM
4b90: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
4ba0: 6d 2b 31 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e  m+1;.    pDest->
4bb0: 6e 4d 65 6d 20 3d 20 6e 52 65 73 75 6c 74 43 6f  nMem = nResultCo
4bc0: 6c 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  l;.    pParse->n
4bd0: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
4be0: 6c 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20  l;.  }else{ .   
4bf0: 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e   assert( pDest->
4c00: 6e 4d 65 6d 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c  nMem==nResultCol
4c10: 20 29 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 73   );.  }.  regRes
4c20: 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 4d 65  ult = pDest->iMe
4c30: 6d 3b 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e  m;.  if( nColumn
4c40: 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  >0 ){.    for(i=
4c50: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
4c60: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
4c70: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4c80: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
4c90: 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  , i, regResult+i
4ca0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
4cb0: 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
4cc0: 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a  Exists ){.    /*
4cd0: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
4ce0: 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53  ion is an EXISTS
4cf0: 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
4d00: 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20  , the actual.   
4d10: 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72   ** values retur
4d20: 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
4d30: 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72  T are not requir
4d40: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
4d50: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
4d60: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
4d70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
4d80: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
4d90: 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73  , pEList, regRes
4da0: 75 6c 74 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f  ult, eDest==SRT_
4db0: 4f 75 74 70 75 74 29 3b 0a 20 20 7d 0a 20 20 6e  Output);.  }.  n
4dc0: 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74  Column = nResult
4dd0: 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Col;..  /* If th
4de0: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
4df0: 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f  rd was present o
4e00: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
4e10: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20  tement.  ** and 
4e20: 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65  this row has bee
4e30: 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74  n seen before, t
4e40: 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20  hen do not make 
4e50: 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61  this row.  ** pa
4e60: 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
4e70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73  ..  */.  if( has
4e80: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
4e90: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
4ea0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
4eb0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
4ec0: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 63  nColumn );.    c
4ed0: 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
4ee0: 73 65 2c 20 64 69 73 74 69 6e 63 74 2c 20 69 43  se, distinct, iC
4ef0: 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e  ontinue, nColumn
4f00: 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  , regResult);.  
4f10: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
4f20: 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f  0 ){.      codeO
4f30: 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e  ffset(v, p, iCon
4f40: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
4f50: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
4f60: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
4f70: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
4f80: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
4f90: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
4fa0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
4fb0: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
4fc0: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
4fd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
4fe0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
4ff0: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
5000: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
5010: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
5020: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
5030: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
5040: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5050: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
5060: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
5070: 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20  lumn, r1);.     
5080: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5090: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
50a0: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a  rt, iParm, r1);.
50b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
50c0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
50d0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
50e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
50f0: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20   /* Construct a 
5100: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
5110: 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75  query result, bu
5120: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20  t instead of.   
5130: 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20   ** saving that 
5140: 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61  record, use it a
5150: 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74  s a key to delet
5160: 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a  e elements from.
5170: 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f      ** the tempo
5180: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
5190: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
51a0: 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a  e SRT_Except: {.
51b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
51c0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64  eAddOp3(v, OP_Id
51d0: 78 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20  xDelete, iParm, 
51e0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
51f0: 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
5200: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
5210: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
5220: 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
5230: 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
5240: 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
5250: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
5260: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
5270: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
5280: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
5290: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
52a0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
52b0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62  ( eDest==SRT_Tab
52c0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  le );.      test
52d0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
52e0: 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20  _EphemTab );.   
52f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5300: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
5310: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
5320: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a  , nColumn, r1);.
5330: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
5340: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  By ){.        pu
5350: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
5360: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
5370: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , r1);.      }el
5380: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
5390: 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
53a0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
53b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
53c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
53d0: 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c  NewRowid, iParm,
53e0: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r2);.        sq
53f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5400: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50  v, OP_Insert, iP
5410: 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20  arm, r1, r2);.  
5420: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5430: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
5440: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
5450: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
5460: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5470: 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r2);.      }.
5480: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
5490: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
54a0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
54b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
54c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
54d0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a  _SUBQUERY.    /*
54e0: 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74   If we are creat
54f0: 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e  ing a set for an
5500: 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43   "expr IN (SELEC
5510: 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63  T ...)" construc
5520: 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  t,.    ** then t
5530: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
5540: 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20   single item on 
5550: 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74  the stack.  Writ
5560: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74  e this.    ** it
5570: 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20  em into the set 
5580: 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73  table with bogus
5590: 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
55a0: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
55b0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
55c0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
55d0: 20 20 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20      p->affinity 
55e0: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
55f0: 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d  Affinity(pEList-
5600: 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65  >a[0].pExpr, pDe
5610: 73 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20  st->affinity);. 
5620: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
5630: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  y ){.        /* 
5640: 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20  At first glance 
5650: 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20  you would think 
5660: 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a  we could optimiz
5670: 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20  e out the.      
5680: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e    ** ORDER BY in
5690: 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65   this case since
56a0: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e   the order of en
56b0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74  tries in the set
56c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
56d0: 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75   not matter.  Bu
56e0: 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  t there might be
56f0: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c   a LIMIT clause,
5700: 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   in which.      
5710: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72    ** case the or
5720: 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20  der does matter 
5730: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  */.        pushO
5740: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
5750: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72  , pOrderBy, p, r
5760: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
5770: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5780: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
5790: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
57a0: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
57b0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
57c0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
57d0: 72 65 67 52 65 73 75 6c 74 2c 20 31 2c 20 72 31  regResult, 1, r1
57e0: 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20  , &p->affinity, 
57f0: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
5800: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
5810: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
5820: 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31 29  e, regResult, 1)
5830: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5840: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5850: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
5860: 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  rm, r1);.       
5870: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5880: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5890: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
58a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
58b0: 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f      /* If any ro
58c0: 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72  w exist in the r
58d0: 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72  esult set, recor
58e0: 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20  d that fact and 
58f0: 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  abort..    */.  
5900: 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74    case SRT_Exist
5910: 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s: {.      sqlit
5920: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5930: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
5940: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Parm);.      /* 
5950: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
5960: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
5970: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
5980: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
5990: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
59a0: 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
59b0: 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
59c0: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
59d0: 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
59e0: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
59f0: 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
5a00: 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
5a10: 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
5a20: 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
5a30: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
5a40: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
5a50: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
5a60: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
5a70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
5a80: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
5a90: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
5aa0: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
5ab0: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b  , p, regResult);
5ac0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5ad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
5ae0: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
5af0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 69 50 61  , regResult, iPa
5b00: 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  rm, 1);.        
5b10: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
5b20: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
5b30: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
5b40: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r us */.      }.
5b50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5b60: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
5b70: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5b80: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
5b90: 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61    /* Send the da
5ba0: 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ta to the callba
5bb0: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74  ck function or t
5bc0: 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  o a subroutine. 
5bd0: 20 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   In the.    ** c
5be0: 61 73 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ase of a subrout
5bf0: 69 6e 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ine, the subrout
5c00: 69 6e 65 20 69 74 73 65 6c 66 20 69 73 20 72 65  ine itself is re
5c10: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20  sponsible for.  
5c20: 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65    ** popping the
5c30: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73   data from the s
5c40: 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tack..    */.   
5c50: 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
5c60: 69 6e 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ine:.    case SR
5c70: 54 5f 4f 75 74 70 75 74 3a 20 7b 0a 20 20 20 20  T_Output: {.    
5c80: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
5c90: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
5ca0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
5cb0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  se( eDest==SRT_O
5cc0: 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69  utput );.      i
5cd0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
5ce0: 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
5cf0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
5d00: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
5d10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5d20: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
5d30: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
5d40: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a  , nColumn, r1);.
5d50: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
5d60: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
5d70: 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b  OrderBy, p, r1);
5d80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5d90: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5da0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
5db0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
5dc0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
5dd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
5de0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
5df0: 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
5e00: 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  ->iParm);.      
5e10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5e20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5e30: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
5e40: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
5e50: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  lumn);.        s
5e60: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
5e70: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
5e80: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
5e90: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
5ea0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
5eb0: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
5ec0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
5ed0: 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20  TRIGGER).    /* 
5ee0: 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75  Discard the resu
5ef0: 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  lts.  This is us
5f00: 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74  ed for SELECT st
5f10: 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a  atements inside.
5f20: 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20      ** the body 
5f30: 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54  of a TRIGGER.  T
5f40: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75  he purpose of su
5f50: 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f  ch selects is to
5f60: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   call.    ** use
5f70: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
5f80: 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69  ons that have si
5f90: 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20  de effects.  We 
5fa0: 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20  do not care.    
5fb0: 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74  ** about the act
5fc0: 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74  ual results of t
5fd0: 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a  he select..    *
5fe0: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
5ff0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
6000: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
6010: 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d );.      break
6020: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
6030: 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
6040: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
6050: 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49  loop if the LIMI
6060: 54 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 45  T is reached.  E
6070: 78 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74  xcept, if.  ** t
6080: 68 65 72 65 20 69 73 20 61 20 73 6f 72 74 65 72  here is a sorter
6090: 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  , in which case 
60a0: 74 68 65 20 73 6f 72 74 65 72 20 68 61 73 20 61  the sorter has a
60b0: 6c 72 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20  lready limited. 
60c0: 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66   ** the output f
60d0: 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  or us..  */.  if
60e0: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ( pOrderBy==0 &&
60f0: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
6100: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6110: 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op3(v, OP_IfZero
6120: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
6130: 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d 0a 7d 0a  eak, -1);.  }.}.
6140: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  ./*.** Given an 
6150: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
6160: 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49   generate a KeyI
6170: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
6180: 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68  at records.** th
6190: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
61a0: 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78  ence for each ex
61b0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74  pression in that
61c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
61d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
61e0: 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52  xprList is an OR
61f0: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
6200: 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74  BY clause then t
6210: 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20  he resulting.** 
6220: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
6230: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
6240: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
6250: 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  g a virtual inde
6260: 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  x to.** implemen
6270: 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20  t that clause.  
6280: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
6290: 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  is the result se
62a0: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a  t of a SELECT.**
62b0: 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66   then the KeyInf
62c0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
62d0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
62e0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
62f0: 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74  rtual.** index t
6300: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49  o implement a DI
6310: 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a  STINCT test..**.
6320: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
6330: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
6340: 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
6350: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54   from malloc.  T
6360: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
6370: 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
6380: 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67  sible for seeing
6390: 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63   that this struc
63a0: 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c  ture is eventual
63b0: 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20 41 64  ly.** freed.  Ad
63c0: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
63d0: 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 50  ructure to the P
63e0: 34 20 66 69 65 6c 64 20 6f 66 20 61 6e 20 6f 70  4 field of an op
63f0: 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20 50 34  code using.** P4
6400: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
6410: 20 69 73 20 74 68 65 20 75 73 75 61 6c 20 77 61   is the usual wa
6420: 79 20 6f 66 20 64 65 61 6c 69 6e 67 20 77 69 74  y of dealing wit
6430: 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  h this..*/.stati
6440: 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e  c KeyInfo *keyIn
6450: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 50  foFromExprList(P
6460: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
6470: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
6480: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
6490: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
64a0: 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e  t nExpr;.  KeyIn
64b0: 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72  fo *pInfo;.  str
64c0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
64d0: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
64e0: 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c  i;..  nExpr = pL
64f0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
6500: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
6510: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
6520: 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20 6e  zeof(*pInfo) + n
6530: 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  Expr*(sizeof(Col
6540: 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69  lSeq*)+1) );.  i
6550: 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20  f( pInfo ){.    
6560: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
6570: 72 20 3d 20 28 75 38 2a 29 26 70 49 6e 66 6f 2d  r = (u8*)&pInfo-
6580: 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20  >aColl[nExpr];. 
6590: 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64     pInfo->nField
65a0: 20 3d 20 28 75 31 36 29 6e 45 78 70 72 3b 0a 20   = (u16)nExpr;. 
65b0: 20 20 20 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20     pInfo->enc = 
65c0: 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 49 6e  ENC(db);.    pIn
65d0: 66 6f 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  fo->db = db;.   
65e0: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
65f0: 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70  pList->a; i<nExp
6600: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
6610: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
6620: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43  *pColl;.      pC
6630: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
6640: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
6650: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
6660: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
6670: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
6680: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
6690: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
66a0: 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d   pInfo->aColl[i]
66b0: 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
66c0: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
66d0: 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f  r[i] = pItem->so
66e0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
66f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66   }.  return pInf
6700: 6f 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  o;.}..#ifndef SQ
6710: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
6720: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
6730: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e  Name of the conn
6740: 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c  ection operator,
6750: 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20   used for error 
6760: 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61  messages..*/.sta
6770: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
6780: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74  selectOpName(int
6790: 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b   id){.  char *z;
67a0: 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b  .  switch( id ){
67b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
67c0: 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49  :       z = "UNI
67d0: 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b  ON ALL";   break
67e0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  ;.    case TK_IN
67f0: 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e  TERSECT: z = "IN
6800: 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61  TERSECT";   brea
6810: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
6820: 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45  XCEPT:    z = "E
6830: 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65  XCEPT";      bre
6840: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
6850: 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22             z = "
6860: 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72  UNION";       br
6870: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
6880: 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n z;.}.#endif /*
6890: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
68a0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
68b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
68c0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
68d0: 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58  ** Unless an "EX
68e0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
68f0: 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69  " command is bei
6900: 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68  ng processed, th
6910: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
6920: 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
6930: 77 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20  wise, it adds a 
6940: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75  single row of ou
6950: 74 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20  tput to the EQP 
6960: 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65  result,.** where
6970: 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20   the caption is 
6980: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
6990: 2a 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20 42  **   "USE TEMP B
69a0: 2d 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a  -TREE FOR xxx".*
69b0: 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69  *.** where xxx i
69c0: 73 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e  s one of "DISTIN
69d0: 43 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20  CT", "ORDER BY" 
69e0: 6f 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45  or "GROUP BY". E
69f0: 78 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20  xactly which.** 
6a00: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
6a10: 20 74 68 65 20 7a 55 73 61 67 65 20 61 72 67 75   the zUsage argu
6a20: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
6a30: 76 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70  void explainTemp
6a40: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
6a50: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
6a60: 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69 66 28 20  *zUsage){.  if( 
6a70: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
6a80: 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =2 ){.    Vdbe *
6a90: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
6aa0: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  e;.    char *zMs
6ab0: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
6ac0: 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
6ad0: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
6ae0: 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29  FOR %s", zUsage)
6af0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6b00: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
6b10: 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
6b20: 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
6b30: 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
6b40: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6b50: 41 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f  Assign expressio
6b60: 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e  n b to lvalue a.
6b70: 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70   A second, no-op
6b80: 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69  , version of thi
6b90: 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72  s macro.** is pr
6ba0: 6f 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49  ovided when SQLI
6bb0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
6bc0: 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73  is defined. This
6bd0: 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65   allows the code
6be0: 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65  .** in sqlite3Se
6bf0: 6c 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e  lect() to assign
6c00: 20 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63   values to struc
6c10: 74 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69  ture member vari
6c20: 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e  ables that.** on
6c30: 6c 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49  ly exist if SQLI
6c40: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
6c50: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77  is not defined w
6c60: 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67  ithout polluting
6c70: 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74   the.** code wit
6c80: 68 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74  h #ifndef direct
6c90: 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e  ives..*/.# defin
6ca0: 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65  e explainSetInte
6cb0: 67 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a  ger(a, b) a = b.
6cc0: 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20  .#else./* No-op 
6cd0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
6ce0: 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e  explainXXX() fun
6cf0: 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f  ctions and macro
6d00: 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s. */.# define e
6d10: 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
6d20: 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78  y,z).# define ex
6d30: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
6d40: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  y,z).#endif..#if
6d50: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6d60: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 26  _OMIT_EXPLAIN) &
6d70: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
6d80: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
6d90: 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e  SELECT)./*.** Un
6da0: 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e  less an "EXPLAIN
6db0: 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d   QUERY PLAN" com
6dc0: 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72  mand is being pr
6dd0: 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75  ocessed, this fu
6de0: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e  nction.** is a n
6df0: 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
6e00: 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c   it adds a singl
6e10: 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20  e row of output 
6e20: 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c  to the EQP resul
6e30: 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20  t,.** where the 
6e40: 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e  caption is of on
6e50: 65 20 6f 66 20 74 68 65 20 74 77 6f 20 66 6f 72  e of the two for
6e60: 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d  ms:.**.**   "COM
6e70: 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45  POSITE SUBQUERIE
6e80: 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62  S iSub1 and iSub
6e90: 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f  2 (op)".**   "CO
6ea0: 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49  MPOSITE SUBQUERI
6eb0: 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75  ES iSub1 and iSu
6ec0: 62 32 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  b2 USING TEMP B-
6ed0: 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a  TREE (op)".**.**
6ee0: 20 77 68 65 72 65 20 69 53 75 62 31 20 61 6e 64   where iSub1 and
6ef0: 20 69 53 75 62 32 20 61 72 65 20 74 68 65 20 69   iSub2 are the i
6f00: 6e 74 65 67 65 72 73 20 70 61 73 73 65 64 20 61  ntegers passed a
6f10: 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
6f20: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
6f30: 70 61 72 61 6d 65 74 65 72 73 2c 20 61 6e 64 20  parameters, and 
6f40: 6f 70 20 69 73 20 74 68 65 20 74 65 78 74 20 72  op is the text r
6f50: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
6f60: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 0a 2a   the parameter.*
6f70: 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  * of the same na
6f80: 6d 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  me. The paramete
6f90: 72 20 22 6f 70 22 20 6d 75 73 74 20 62 65 20 6f  r "op" must be o
6fa0: 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20  ne of TK_UNION, 
6fb0: 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b  TK_EXCEPT,.** TK
6fc0: 5f 49 4e 54 45 52 53 45 43 54 20 6f 72 20 54 4b  _INTERSECT or TK
6fd0: 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72 73 74 20  _ALL. The first 
6fe0: 66 6f 72 6d 20 69 73 20 75 73 65 64 20 69 66 20  form is used if 
6ff0: 61 72 67 75 6d 65 6e 74 20 62 55 73 65 54 6d 70  argument bUseTmp
7000: 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f   is .** false, o
7010: 72 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  r the second for
7020: 6d 20 69 66 20 69 74 20 69 73 20 74 72 75 65 2e  m if it is true.
7030: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7040: 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65  explainComposite
7050: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
7060: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7070: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
7080: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  text */.  int op
7090: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
70a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
70b0: 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b   of TK_UNION, TK
70c0: 5f 45 58 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a  _EXCEPT etc. */.
70d0: 20 20 69 6e 74 20 69 53 75 62 31 2c 20 20 20 20    int iSub1,    
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64    /* Subquery id
7100: 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62   1 */.  int iSub
7110: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
7120: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75          /* Subqu
7130: 65 72 79 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e  ery id 2 */.  in
7140: 74 20 62 55 73 65 54 6d 70 20 20 20 20 20 20 20  t bUseTmp       
7150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7160: 20 54 72 75 65 20 69 66 20 61 20 74 65 6d 70 20   True if a temp 
7170: 74 61 62 6c 65 20 77 61 73 20 75 73 65 64 20 2a  table was used *
7180: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6f  /.){.  assert( o
7190: 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f  p==TK_UNION || o
71a0: 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20  p==TK_EXCEPT || 
71b0: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
71c0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29   || op==TK_ALL )
71d0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
71e0: 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
71f0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
7200: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63  se->pVdbe;.    c
7210: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
7220: 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20  te3MPrintf(.    
7230: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20      pParse->db, 
7240: 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45  "COMPOUND SUBQUE
7250: 52 49 45 53 20 25 64 20 41 4e 44 20 25 64 20 25  RIES %d AND %d %
7260: 73 28 25 73 29 22 2c 20 69 53 75 62 31 2c 20 69  s(%s)", iSub1, i
7270: 53 75 62 32 2c 0a 20 20 20 20 20 20 20 20 62 55  Sub2,.        bU
7280: 73 65 54 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d  seTmp?"USING TEM
7290: 50 20 42 2d 54 52 45 45 20 22 3a 22 22 2c 20 73  P B-TREE ":"", s
72a0: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a  electOpName(op).
72b0: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
72c0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
72d0: 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72  OP_Explain, pPar
72e0: 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30  se->iSelectId, 0
72f0: 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  , 0, zMsg, P4_DY
7300: 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  NAMIC);.  }.}.#e
7310: 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72  lse./* No-op ver
7320: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  sions of the exp
7330: 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69  lainXXX() functi
7340: 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20  ons and macros. 
7350: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
7360: 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77  ainComposite(v,w
7370: 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  ,x,y,z).#endif..
7380: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
7390: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
73a0: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
73b0: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
73c0: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
73d0: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
73e0: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
73f0: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
7400: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
7410: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
7420: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
7430: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
7440: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
7450: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
7460: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
7470: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
7480: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
7490: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
74a0: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72  eSortTail(.  Par
74b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
74c0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
74d0: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
74e0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
74f0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7500: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20   */.  Vdbe *v,  
7510: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
7520: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
7530: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  is VDBE */.  int
7540: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f   nColumn,      /
7550: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
7560: 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  mns of data */. 
7570: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
7580: 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  st /* Write the 
7590: 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68  sorted results h
75a0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
75b0: 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69  addrBreak = sqli
75c0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
75d0: 28 76 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70  (v);     /* Jump
75e0: 20 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f   here to exit lo
75f0: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
7600: 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
7610: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
7620: 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  v);  /* Jump her
7630: 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65  e for next cycle
7640: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a   */.  int addr;.
7650: 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e    int iTab;.  in
7660: 74 20 70 73 65 75 64 6f 54 61 62 20 3d 20 30 3b  t pseudoTab = 0;
7670: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
7680: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
7690: 72 42 79 3b 0a 0a 20 20 69 6e 74 20 65 44 65 73  rBy;..  int eDes
76a0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
76b0: 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  ;.  int iParm = 
76c0: 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 0a 0a 20  pDest->iParm;.. 
76d0: 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69   int regRow;.  i
76e0: 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20 20  nt regRowid;..  
76f0: 69 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79 2d  iTab = pOrderBy-
7700: 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 72 65 67  >iECursor;.  reg
7710: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Row = sqlite3Get
7720: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
7730: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
7740: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
7750: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
7760: 20 29 7b 0a 20 20 20 20 70 73 65 75 64 6f 54 61   ){.    pseudoTa
7770: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
7780: 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ++;.    sqlite3V
7790: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
77a0: 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 73 65 75  OpenPseudo, pseu
77b0: 64 6f 54 61 62 2c 20 72 65 67 52 6f 77 2c 20 6e  doTab, regRow, n
77c0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 72 65 67  Column);.    reg
77d0: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 7d 65 6c  Rowid = 0;.  }el
77e0: 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64  se{.    regRowid
77f0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7800: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
7810: 7d 0a 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73  }.  addr = 1 + s
7820: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7830: 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61  (v, OP_Sort, iTa
7840: 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  b, addrBreak);. 
7850: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
7860: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
7870: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
7880: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
7890: 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65 72 42  n, iTab, pOrderB
78a0: 79 2d 3e 6e 45 78 70 72 20 2b 20 31 2c 20 72 65  y->nExpr + 1, re
78b0: 67 52 6f 77 29 3b 0a 20 20 73 77 69 74 63 68 28  gRow);.  switch(
78c0: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61   eDest ){.    ca
78d0: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
78e0: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
78f0: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  Tab: {.      tes
7900: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
7910: 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  T_Table );.     
7920: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
7930: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
7940: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7950: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7960: 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c  NewRowid, iParm,
7970: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
7980: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7990: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
79a0: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c  , iParm, regRow,
79b0: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
79c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
79d0: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
79e0: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62  APPEND);.      b
79f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
7a00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7a10: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
7a20: 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
7a30: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
7a40: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
7a50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
7a60: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
7a70: 64 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65  d, regRow, 1, re
7a80: 67 52 6f 77 69 64 2c 20 26 70 2d 3e 61 66 66 69  gRowid, &p->affi
7a90: 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
7aa0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
7ab0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
7ac0: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31  Parse, regRow, 1
7ad0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7ae0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7af0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
7b00: 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  m, regRowid);.  
7b10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7b20: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
7b30: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
7b40: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
7b50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
7b60: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
7b70: 65 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d  e, regRow, iParm
7b80: 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
7b90: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
7ba0: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
7bb0: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
7bc0: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
7bd0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
7be0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
7bf0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 61 73   int i;.      as
7c00: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
7c10: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
7c20: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
7c30: 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63 61  ); .      testca
7c40: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  se( eDest==SRT_O
7c50: 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 74  utput );.      t
7c60: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
7c70: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
7c80: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
7c90: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
7ca0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7cb0: 20 72 65 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e   regRow!=pDest->
7cc0: 69 4d 65 6d 2b 69 20 29 3b 0a 20 20 20 20 20 20  iMem+i );.      
7cd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7ce0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
7cf0: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 69 2c 20  , pseudoTab, i, 
7d00: 70 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 29 3b 0a  pDest->iMem+i);.
7d10: 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30          if( i==0
7d20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7d30: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7d40: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41  5(v, OPFLAG_CLEA
7d50: 52 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20  RCACHE);.       
7d60: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
7d70: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
7d80: 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
7d90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7da0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
7db0: 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d  Row, pDest->iMem
7dc0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
7dd0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
7de0: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
7df0: 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  ge(pParse, pDest
7e00: 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29  ->iMem, nColumn)
7e10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7e20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7e30: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
7e40: 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50 61  ield, pDest->iPa
7e50: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
7e60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7e70: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
7e80: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
7e90: 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73  se, regRow);.  s
7ea0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
7eb0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
7ec0: 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 54 68  Rowid);..  /* Th
7ed0: 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20  e bottom of the 
7ee0: 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  loop.  */.  sqli
7ef0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
7f00: 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69  bel(v, addrConti
7f10: 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nue);.  sqlite3V
7f20: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7f30: 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
7f40: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
7f50: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
7f60: 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66  addrBreak);.  if
7f70: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
7f80: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
7f90: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
7fa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7fb0: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
7fc0: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b  , pseudoTab, 0);
7fd0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
7fe0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
7ff0: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  o a string conta
8000: 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61  ining the 'decla
8010: 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20  ration type' of 
8020: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
8030: 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74 72  n pExpr. The str
8040: 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61 74  ing may be treat
8050: 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79 20  ed as static by 
8060: 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
8070: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
8080: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
8090: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
80a0: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
80b0: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72  d from the.** or
80c0: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
80d0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
80e0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
80f0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65  is a column. The
8100: 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  .** declaration 
8110: 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44  type for a ROWID
8120: 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45   field is INTEGE
8130: 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20  R. Exactly when 
8140: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  an expression.**
8150: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
8160: 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63   column can be c
8170: 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72  omplex in the pr
8180: 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65  esence of subque
8190: 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73  ries. The.** res
81a0: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
81b0: 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65  on in all of the
81c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43   following SELEC
81d0: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20  T statements is 
81e0: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
81f0: 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20   column by this 
8200: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
8210: 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f    SELECT col FRO
8220: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
8230: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
8240: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
8250: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
8260: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20   FROM tbl);.**  
8270: 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d   SELECT abc FROM
8280: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20   (SELECT col AS 
8290: 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  abc FROM tbl);.*
82a0: 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  * .** The declar
82b0: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
82c0: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74  ny expression ot
82d0: 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d  her than a colum
82e0: 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  n is NULL..*/.st
82f0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
8300: 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20 20 4e  *columnType(.  N
8310: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
8320: 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c   .  Expr *pExpr,
8330: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
8340: 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20 63 6f  pzOriginDb,.  co
8350: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
8360: 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20  ginTab,.  const 
8370: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 43  char **pzOriginC
8380: 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  ol.){.  char con
8390: 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  st *zType = 0;. 
83a0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
83b0: 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20 63 68  iginDb = 0;.  ch
83c0: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69  ar const *zOrigi
83d0: 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72  nTab = 0;.  char
83e0: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 43   const *zOriginC
83f0: 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b  ol = 0;.  int j;
8400: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78  .  if( NEVER(pEx
8410: 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e 70  pr==0) || pNC->p
8420: 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  SrcList==0 ) ret
8430: 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74 63 68  urn 0;..  switch
8440: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
8450: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
8460: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
8470: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
8480: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
8490: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
84a0: 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  . Locate the tab
84b0: 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  le the column is
84c0: 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   being.      ** 
84d0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69  extracted from i
84e0: 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53  n NameContext.pS
84f0: 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62  rcList. This tab
8500: 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20  le may be real. 
8510: 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
8520: 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71   table or a subq
8530: 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  uery..      */. 
8540: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
8550: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
8560: 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74   /* Table struct
8570: 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78  ure column is ex
8580: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a  tracted from */.
8590: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
85a0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
85b0: 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20    /* Select the 
85c0: 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63  column is extrac
85d0: 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20  ted from */.    
85e0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78    int iCol = pEx
85f0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a  pr->iColumn;  /*
8600: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
8610: 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20   in pTab */.    
8620: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
8630: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
8640: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
8650: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
8660: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
8670: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43        while( pNC
8680: 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20   && !pTab ){.   
8690: 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54       SrcList *pT
86a0: 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  abList = pNC->pS
86b0: 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  rcList;.        
86c0: 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69  for(j=0;j<pTabLi
86d0: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
86e0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
86f0: 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  or!=pExpr->iTabl
8700: 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20  e;j++);.        
8710: 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  if( j<pTabList->
8720: 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  nSrc ){.        
8730: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
8740: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
8750: 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61          pS = pTa
8760: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c  bList->a[j].pSel
8770: 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ect;.        }el
8780: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
8790: 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a  C = pNC->pNext;.
87a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
87b0: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  }..      if( pTa
87c0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
87d0: 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20  /* At one time, 
87e0: 63 6f 64 65 20 73 75 63 68 20 61 73 20 22 53 45  code such as "SE
87f0: 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68  LECT new.x" with
8800: 69 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f 75  in a trigger wou
8810: 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  ld.        ** ca
8820: 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69  use this conditi
8830: 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63  on to run.  Sinc
8840: 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20  e then, we have 
8850: 72 65 73 74 72 75 63 74 75 72 65 64 20 68 6f 77  restructured how
8860: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67  .        ** trig
8870: 67 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65  ger code is gene
8880: 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69  rated and so thi
8890: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e  s condition is n
88a0: 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20  o longer .      
88b0: 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48    ** possible. H
88c0: 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73  owever, it can s
88d0: 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72  till be true for
88e0: 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65   statements like
88f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
8900: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20  following:.     
8910: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
8920: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
8930: 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b  t1(col INTEGER);
8940: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
8950: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e  LECT (SELECT t1.
8960: 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74  col) FROM FROM t
8970: 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  1;.        **.  
8980: 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f        ** when co
8990: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
89a0: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
89b0: 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20  ession "t1.col" 
89c0: 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  in the .        
89d0: 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49  ** sub-select. I
89e0: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 65 74  n this case, set
89f0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
8a00: 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20   to NULL, even. 
8a10: 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68         ** though
8a20: 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c   it should reall
8a30: 79 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a  y be "INTEGER"..
8a40: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
8a50: 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
8a60: 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20  t a problem, as 
8a70: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
8a80: 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e  of "t1.col" is n
8a90: 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ever.        ** 
8aa0: 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d  used. When colum
8ab0: 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65  nType() is calle
8ac0: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
8ad0: 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ion .        ** 
8ae0: 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29  "(SELECT t1.col)
8af0: 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 74  ", the correct t
8b00: 79 70 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ype is returned 
8b10: 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45  (see the TK_SELE
8b20: 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72  CT.        ** br
8b30: 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a  anch below.  */.
8b40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8b50: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
8b60: 73 65 72 74 28 20 70 54 61 62 20 26 26 20 70 45  sert( pTab && pE
8b70: 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20  xpr->pTab==pTab 
8b80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20  );.      if( pS 
8b90: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
8ba0: 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74  e "table" is act
8bb0: 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65  ually a sub-sele
8bc0: 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20  ct or a view in 
8bd0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
8be0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
8bf0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
8c00: 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  nt. Return the d
8c10: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
8c20: 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20  and origin.     
8c30: 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74     ** data for t
8c40: 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f  he result-set co
8c50: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d  lumn of the sub-
8c60: 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20  select..        
8c70: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
8c80: 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59 53  Col>=0 && ALWAYS
8c90: 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74  (iCol<pS->pEList
8ca0: 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
8cb0: 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c        /* If iCol
8cc0: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
8cd0: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  ro, then the exp
8ce0: 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73  ression requests
8cf0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
8d00: 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73  * rowid of the s
8d10: 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65  ub-select or vie
8d20: 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73 69  w. This expressi
8d30: 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65  on is legal (see
8d40: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74   .          ** t
8d50: 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32  est case misc2.2
8d60: 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20  .2) - it always 
8d70: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
8d80: 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  L..          */.
8d90: 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f            NameCo
8da0: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20  ntext sNC;.     
8db0: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
8dc0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  S->pEList->a[iCo
8dd0: 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  l].pExpr;.      
8de0: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
8df0: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
8e00: 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74         sNC.pNext
8e10: 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20   = pNC;.        
8e20: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
8e30: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  NC->pParse;.    
8e40: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
8e50: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
8e60: 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a  , &zOriginDb, &z
8e70: 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69  OriginTab, &zOri
8e80: 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20  ginCol); .      
8e90: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
8ea0: 69 66 28 20 41 4c 57 41 59 53 28 70 54 61 62 2d  if( ALWAYS(pTab-
8eb0: 3e 70 53 63 68 65 6d 61 29 20 29 7b 0a 20 20 20  >pSchema) ){.   
8ec0: 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74       /* A real t
8ed0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
8ee0: 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20  assert( !pS );. 
8ef0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
8f00: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
8f10: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
8f20: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
8f30: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
8f40: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
8f50: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
8f60: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
8f70: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
8f80: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20  EGER";.         
8f90: 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72   zOriginCol = "r
8fa0: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d  owid";.        }
8fb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
8fc0: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
8fd0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
8fe0: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69            zOrigi
8ff0: 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  nCol = pTab->aCo
9000: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
9010: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9020: 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 70 54   zOriginTab = pT
9030: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
9040: 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72     if( pNC->pPar
9050: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
9060: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
9070: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
9080: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  NC->pParse->db, 
9090: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
90a0: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69            zOrigi
90b0: 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  nDb = pNC->pPars
90c0: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
90d0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
90e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
90f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
9100: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9110: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
9120: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
9130: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
9140: 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d  ession is a sub-
9150: 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74  select. Return t
9160: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
9170: 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ype and.      **
9180: 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72   origin info for
9190: 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75   the single colu
91a0: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
91b0: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
91c0: 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  CT.      ** stat
91d0: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
91e0: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
91f0: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c  t sNC;.      Sel
9200: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
9210: 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
9220: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
9230: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
9240: 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
9250: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
9260: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
9270: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
9280: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
9290: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73  S->pSrc;.      s
92a0: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
92b0: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
92c0: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
92d0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
92e0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
92f0: 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a  , &zOriginDb, &z
9300: 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69  OriginTab, &zOri
9310: 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20  ginCol); .      
9320: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
9330: 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28  dif.  }.  .  if(
9340: 20 70 7a 4f 72 69 67 69 6e 44 62 20 29 7b 0a 20   pzOriginDb ){. 
9350: 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69     assert( pzOri
9360: 67 69 6e 54 61 62 20 26 26 20 70 7a 4f 72 69 67  ginTab && pzOrig
9370: 69 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a  inCol );.    *pz
9380: 4f 72 69 67 69 6e 44 62 20 3d 20 7a 4f 72 69 67  OriginDb = zOrig
9390: 69 6e 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  inDb;.    *pzOri
93a0: 67 69 6e 54 61 62 20 3d 20 7a 4f 72 69 67 69 6e  ginTab = zOrigin
93b0: 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  Tab;.    *pzOrig
93c0: 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69 67 69 6e 43  inCol = zOriginC
93d0: 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ol;.  }.  return
93e0: 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zType;.}../*.**
93f0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
9400: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
9410: 65 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61  e VDBE the decla
9420: 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20  ration types of 
9430: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
9440: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f  e result set..*/
9450: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
9460: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
9470: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
9480: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
9490: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
94a0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
94b0: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
94c0: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
94d0: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
94e0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
94f0: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
9500: 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64   set */.){.#ifnd
9510: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
9520: 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a  ECLTYPE.  Vdbe *
9530: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
9540: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  e;.  int i;.  Na
9550: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
9560: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
9570: 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e  pTabList;.  sNC.
9580: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
9590: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
95a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
95b0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
95c0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
95d0: 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  xpr;.    const c
95e0: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64  har *zType;.#ifd
95f0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
9600: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
9610: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
9620: 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20  *zOrigDb = 0;.  
9630: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
9640: 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  rigTab = 0;.    
9650: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
9660: 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54  gCol = 0;.    zT
9670: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
9680: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
9690: 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26  Db, &zOrigTab, &
96a0: 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20  zOrigCol);..    
96b0: 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74  /* The vdbe must
96c0: 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f   make its own co
96d0: 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  py of the column
96e0: 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20  -type and other 
96f0: 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73  .    ** column s
9700: 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c  pecific strings,
9710: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68   in case the sch
9720: 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66  ema is reset bef
9730: 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ore this.    ** 
9740: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
9750: 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  is deleted..    
9760: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
9770: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
9780: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42  i, COLNAME_DATAB
9790: 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51  ASE, zOrigDb, SQ
97a0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
97b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
97c0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
97d0: 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20   COLNAME_TABLE, 
97e0: 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45  zOrigTab, SQLITE
97f0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
9800: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
9810: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
9820: 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72  NAME_COLUMN, zOr
9830: 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52  igCol, SQLITE_TR
9840: 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a  ANSIENT);.#else.
9850: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
9860: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
9870: 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  0, 0, 0);.#endif
9880: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9890: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
98a0: 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50   COLNAME_DECLTYP
98b0: 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45  E, zType, SQLITE
98c0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
98d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
98e0: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 20  E_OMIT_DECLTYPE 
98f0: 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  */.}../*.** Gene
9900: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
9910: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
9920: 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63  E the names of c
9930: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
9940: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68   result set.  Th
9950: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
9960: 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64  s used to provid
9970: 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d  e the.** azCol[]
9980: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63   values in the c
9990: 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  allback..*/.stat
99a0: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
99b0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50  ColumnNames(.  P
99c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
99d0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
99e0: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
99f0: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
9a00: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
9a10: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
9a20: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
9a30: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
9a40: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
9a50: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
9a60: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
9a70: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73  .  int i, j;.  s
9a80: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
9a90: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66  rse->db;.  int f
9aa0: 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e  ullNames, shortN
9ab0: 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ames;..#ifndef S
9ac0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
9ad0: 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  IN.  /* If this 
9ae0: 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73  is an EXPLAIN, s
9af0: 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f  kip this step */
9b00: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
9b10: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65  xplain ){.    re
9b20: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
9b30: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
9b40: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 4e  colNamesSet || N
9b50: 45 56 45 52 28 76 3d 3d 30 29 20 7c 7c 20 64 62  EVER(v==0) || db
9b60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
9b70: 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73   return;.  pPars
9b80: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
9b90: 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20   1;.  fullNames 
9ba0: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
9bb0: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
9bc0: 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e  es)!=0;.  shortN
9bd0: 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ames = (db->flag
9be0: 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
9bf0: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
9c00: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
9c10: 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d  mCols(v, pEList-
9c20: 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69  >nExpr);.  for(i
9c30: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
9c40: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
9c50: 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20  xpr *p;.    p = 
9c60: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
9c70: 70 72 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  pr;.    if( NEVE
9c80: 52 28 70 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e  R(p==0) ) contin
9c90: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69  ue;.    if( pELi
9ca0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29  st->a[i].zName )
9cb0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
9cc0: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
9cd0: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
9ce0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
9cf0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
9d00: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c  AME_NAME, zName,
9d10: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
9d20: 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  T);.    }else if
9d30: 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( (p->op==TK_COL
9d40: 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  UMN || p->op==TK
9d50: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20  _AGG_COLUMN) && 
9d60: 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20  pTabList ){.    
9d70: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
9d80: 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b       char *zCol;
9d90: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
9da0: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
9db0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57      for(j=0; ALW
9dc0: 41 59 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  AYS(j<pTabList->
9dd0: 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nSrc); j++){.   
9de0: 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73       if( pTabLis
9df0: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d  t->a[j].iCursor=
9e00: 3d 70 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65  =p->iTable ) bre
9e10: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
9e20: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62    assert( j<pTab
9e30: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
9e40: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
9e50: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
9e60: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
9e70: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
9e80: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73  iPKey;.      ass
9e90: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
9ea0: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
9eb0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
9ec0: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
9ed0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  0 ){.        zCo
9ee0: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
9ef0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9f00: 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61    zCol = pTab->a
9f10: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
9f20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9f30: 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26  f( !shortNames &
9f40: 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a  & !fullNames ){.
9f50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9f60: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
9f70: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
9f80: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  , .            s
9f90: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
9fa0: 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  b, pEList->a[i].
9fb0: 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44  zSpan), SQLITE_D
9fc0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d  YNAMIC);.      }
9fd0: 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d  else if( fullNam
9fe0: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  es ){.        ch
9ff0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
a000: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73         zName = s
a010: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
a020: 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d  , "%s.%s", pTab-
a030: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20  >zName, zCol);. 
a040: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a050: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
a060: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
a070: 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44   zName, SQLITE_D
a080: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d  YNAMIC);.      }
a090: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
a0a0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
a0b0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
a0c0: 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51  E_NAME, zCol, SQ
a0d0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
a0e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
a0f0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
a100: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
a110: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
a120: 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  ME, .          s
a130: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
a140: 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  b, pEList->a[i].
a150: 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44  zSpan), SQLITE_D
a160: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20  YNAMIC);.    }. 
a170: 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c   }.  generateCol
a180: 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c  umnTypes(pParse,
a190: 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
a1a0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  t);.}../*.** Giv
a1b0: 65 6e 20 61 20 61 6e 20 65 78 70 72 65 73 73 69  en a an expressi
a1c0: 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20 69  on list (which i
a1d0: 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73  s really the lis
a1e0: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
a1f0: 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68  .** that form th
a200: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
a210: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
a220: 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72  nt) compute appr
a230: 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d  opriate.** colum
a240: 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61  n names for a ta
a250: 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68  ble that would h
a260: 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
a270: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41  on list..**.** A
a280: 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ll column names 
a290: 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a  will be unique..
a2a0: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63  **.** Only the c
a2b0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20  olumn names are 
a2c0: 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d  computed.  Colum
a2d0: 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e  n.zType, Column.
a2e0: 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74  zColl,.** and ot
a2f0: 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f  her fields of Co
a300: 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e  lumn are zeroed.
a310: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
a320: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
a330: 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  ss.  If a memory
a340: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
a350: 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f  r occurs,.** sto
a360: 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f  re NULL in *paCo
a370: 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f  l and 0 in *pnCo
a380: 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  l and return SQL
a390: 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74  ITE_NOMEM..*/.st
a3a0: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 43  atic int selectC
a3b0: 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
a3c0: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
a3d0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
a3e0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
a3f0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
a400: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
a410: 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20   Expr list from 
a420: 77 68 69 63 68 20 74 6f 20 64 65 72 69 76 65 20  which to derive 
a430: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
a440: 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c 20 20 20    int *pnCol,   
a450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
a460: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
a470: 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f   columns here */
a480: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f  .  Column **paCo
a490: 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  l          /* Wr
a4a0: 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75  ite the new colu
a4b0: 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a  mn list here */.
a4c0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
a4d0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
a4e0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
a4f0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
a500: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
a510: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
a520: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
a530: 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  nt cnt;         
a540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
a550: 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b  dex added to mak
a560: 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75  e the name uniqu
a570: 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  e */.  Column *a
a580: 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20  Col, *pCol;     
a590: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
a5a0: 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f  g over result co
a5b0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
a5c0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
a5d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a5e0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
a5f0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
a600: 0a 20 20 45 78 70 72 20 2a 70 3b 20 20 20 20 20  .  Expr *p;     
a610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a620: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72  * Expression for
a630: 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
a640: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
a650: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
a660: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
a670: 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  mn name */.  int
a680: 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
a690: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
a6a0: 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d   of name in zNam
a6b0: 65 5b 5d 20 2a 2f 0a 0a 20 20 2a 70 6e 43 6f 6c  e[] */..  *pnCol
a6c0: 20 3d 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74   = nCol = pEList
a6d0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 43 6f 6c 20  ->nExpr;.  aCol 
a6e0: 3d 20 2a 70 61 43 6f 6c 20 3d 20 73 71 6c 69 74  = *paCol = sqlit
a6f0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
a700: 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30  b, sizeof(aCol[0
a710: 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20  ])*nCol);.  if( 
a720: 61 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  aCol==0 ) return
a730: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
a740: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61   for(i=0, pCol=a
a750: 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  Col; i<nCol; i++
a760: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f  , pCol++){.    /
a770: 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72  * Get an appropr
a780: 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  iate name for th
a790: 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a  e column.    */.
a7a0: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
a7b0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
a7c0: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
a7d0: 74 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50  t==0 || ExprHasP
a7e0: 72 6f 70 65 72 74 79 28 70 2d 3e 70 52 69 67 68  roperty(p->pRigh
a7f0: 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 0a  t, EP_IntValue).
a800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
a810: 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 75 2e 7a  | p->pRight->u.z
a820: 54 6f 6b 65 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70  Token==0 || p->p
a830: 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  Right->u.zToken[
a840: 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  0]!=0 );.    if(
a850: 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   (zName = pEList
a860: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30  ->a[i].zName)!=0
a870: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
a880: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  the column conta
a890: 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65  ins an "AS <name
a8a0: 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c  >" phrase, use <
a8b0: 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d  name> as the nam
a8c0: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
a8d0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
a8e0: 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  up(db, zName);. 
a8f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a900: 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d  Expr *pColExpr =
a910: 20 70 3b 20 20 2f 2a 20 54 68 65 20 65 78 70 72   p;  /* The expr
a920: 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 74  ession that is t
a930: 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  he result column
a940: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54   name */.      T
a950: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
a960: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 61 73 73      /* Table ass
a970: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
a980: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
a990: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f        while( pCo
a9a0: 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  lExpr->op==TK_DO
a9b0: 54 20 29 20 70 43 6f 6c 45 78 70 72 20 3d 20 70  T ) pColExpr = p
a9c0: 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ColExpr->pRight;
a9d0: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45  .      if( pColE
a9e0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
a9f0: 4d 4e 20 26 26 20 41 4c 57 41 59 53 28 70 43 6f  MN && ALWAYS(pCo
aa00: 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 29 20  lExpr->pTab!=0) 
aa10: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ){.        /* Fo
aa20: 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68  r columns use th
aa30: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61  e column name na
aa40: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  me */.        in
aa50: 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70  t iCol = pColExp
aa60: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
aa70: 20 20 20 20 70 54 61 62 20 3d 20 70 43 6f 6c 45      pTab = pColE
aa80: 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
aa90: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
aaa0: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
aab0: 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ey;.        zNam
aac0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
aad0: 74 66 28 64 62 2c 20 22 25 73 22 2c 0a 20 20 20  tf(db, "%s",.   
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
aaf0: 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43  ol>=0 ? pTab->aC
ab00: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a  ol[iCol].zName :
ab10: 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20   "rowid");.     
ab20: 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 45   }else if( pColE
ab30: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
ab40: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
ab50: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
ab60: 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f  ty(pColExpr, EP_
ab70: 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
ab80: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
ab90: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
aba0: 22 25 73 22 2c 20 70 43 6f 6c 45 78 70 72 2d 3e  "%s", pColExpr->
abb0: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
abc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
abd0: 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69  /* Use the origi
abe0: 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20  nal text of the 
abf0: 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
ac00: 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f  n as its name */
ac10: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
ac20: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
ac30: 64 62 2c 20 22 25 73 22 2c 20 70 45 4c 69 73 74  db, "%s", pEList
ac40: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[i].zSpan);. 
ac50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ac60: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
ac70: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73  ailed ){.      s
ac80: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
ac90: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62   zName);.      b
aca0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
acb0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
acc0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  e column name is
acd0: 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65   unique.  If the
ace0: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69   name is not uni
acf0: 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65  que,.    ** appe
ad00: 6e 64 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20  nd a integer to 
ad10: 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  the name so that
ad20: 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71   it becomes uniq
ad30: 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  ue..    */.    n
ad40: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
ad50: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
ad60: 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20     for(j=cnt=0; 
ad70: 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
ad80: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
ad90: 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  Cmp(aCol[j].zNam
ada0: 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  e, zName)==0 ){.
adb0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
adc0: 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  ewName;.        
add0: 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30  zName[nName] = 0
ade0: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 4e 61  ;.        zNewNa
adf0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
ae00: 6e 74 66 28 64 62 2c 20 22 25 73 3a 25 64 22 2c  ntf(db, "%s:%d",
ae10: 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a   zName, ++cnt);.
ae20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
ae30: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
ae40: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
ae50: 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20  = zNewName;.    
ae60: 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20      j = -1;.    
ae70: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
ae80: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
ae90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c  }.    }.    pCol
aea0: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
aeb0: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d  .  }.  if( db->m
aec0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
aed0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b     for(j=0; j<i;
aee0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   j++){.      sql
aef0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
af00: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col[j].zName);. 
af10: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
af20: 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29  DbFree(db, aCol)
af30: 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30  ;.    *paCol = 0
af40: 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30  ;.    *pnCol = 0
af50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
af60: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
af70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
af80: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  K;.}../*.** Add 
af90: 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
afa0: 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  on information t
afb0: 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  o a column list 
afc0: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45  based on.** a SE
afd0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
afe0: 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ** .** The colum
aff0: 6e 20 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c  n list presumabl
b000: 79 20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65  y came from sele
b010: 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f  ctColumnNamesFro
b020: 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20  mExprList()..** 
b030: 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  The column list 
b040: 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20  has only names, 
b050: 6e 6f 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c  not types or col
b060: 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a  lations.  This.*
b070: 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  * routine goes t
b080: 68 72 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20  hrough and adds 
b090: 74 68 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f  the types and co
b0a0: 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  llations..**.** 
b0b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71  This routine req
b0c0: 75 69 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69  uires that all i
b0d0: 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68  dentifiers in th
b0e0: 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74  e SELECT.** stat
b0f0: 65 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65  ement be resolve
b100: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
b110: 64 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d  d selectAddColum
b120: 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
b130: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
b140: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
b150: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a  rsing contexts *
b160: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 20 20  /.  int nCol,   
b170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b180: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a  ber of columns *
b190: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  /.  Column *aCol
b1a0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  ,         /* Lis
b1b0: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  t of columns */.
b1c0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
b1d0: 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43  t       /* SELEC
b1e0: 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  T used to determ
b1f0: 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f  ine types and co
b200: 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  llations */.){. 
b210: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b220: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d  Parse->db;.  Nam
b230: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
b240: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
b250: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
b260: 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20    int i;.  Expr 
b270: 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  *p;.  struct Exp
b280: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 0a  rList_item *a;..
b290: 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63    assert( pSelec
b2a0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
b2b0: 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46  ( (pSelect->selF
b2c0: 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
b2d0: 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ed)!=0 );.  asse
b2e0: 72 74 28 20 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63  rt( nCol==pSelec
b2f0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
b300: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
b310: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62  iled );.  if( db
b320: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b330: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65   return;.  memse
b340: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
b350: 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70  f(sNC));.  sNC.p
b360: 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
b370: 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70  t->pSrc;.  a = p
b380: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
b390: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  a;.  for(i=0, pC
b3a0: 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b  ol=aCol; i<nCol;
b3b0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
b3c0: 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70     p = a[i].pExp
b3d0: 72 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79  r;.    pCol->zTy
b3e0: 70 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  pe = sqlite3DbSt
b3f0: 72 44 75 70 28 64 62 2c 20 63 6f 6c 75 6d 6e 54  rDup(db, columnT
b400: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20  ype(&sNC, p, 0, 
b410: 30 2c 20 30 29 29 3b 0a 20 20 20 20 70 43 6f 6c  0, 0));.    pCol
b420: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
b430: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
b440: 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  (p);.    if( pCo
b450: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29  l->affinity==0 )
b460: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
b470: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
b480: 45 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  E;.    pColl = s
b490: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
b4a0: 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
b4b0: 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
b4c0: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c       pCol->zColl
b4d0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
b4e0: 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  up(db, pColl->zN
b4f0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
b500: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
b510: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
b520: 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61  t, generate a Ta
b530: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
b540: 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20  at describes.** 
b550: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
b560: 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a  f that SELECT..*
b570: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
b580: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
b590: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
b5a0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
b5b0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
b5c0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
b5d0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
b5e0: 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  int savedFlags;.
b5f0: 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20  .  savedFlags = 
b600: 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d  db->flags;.  db-
b610: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
b620: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a  E_FullColNames;.
b630: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
b640: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
b650: 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  mes;.  sqlite3Se
b660: 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
b670: 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20   pSelect, 0);.  
b680: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
b690: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77   ) return 0;.  w
b6a0: 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70  hile( pSelect->p
b6b0: 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20  Prior ) pSelect 
b6c0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
b6d0: 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d  r;.  db->flags =
b6e0: 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70   savedFlags;.  p
b6f0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
b700: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
b710: 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
b720: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
b730: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
b740: 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74  }.  /* The sqlit
b750: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
b760: 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73  ect() is only us
b770: 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68  ed n contexts wh
b780: 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20  ere lookaside.  
b790: 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ** is disabled *
b7a0: 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  /.  assert( db->
b7b0: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
b7c0: 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54 61 62 2d  ed==0 );.  pTab-
b7d0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  >nRef = 1;.  pTa
b7e0: 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  b->zName = 0;.  
b7f0: 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20  pTab->nRowEst = 
b800: 31 30 30 30 30 30 30 3b 0a 20 20 73 65 6c 65 63  1000000;.  selec
b810: 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  tColumnsFromExpr
b820: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
b830: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70  lect->pEList, &p
b840: 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
b850: 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63  ->aCol);.  selec
b860: 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
b870: 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73  dCollation(pPars
b880: 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70  e, pTab->nCol, p
b890: 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c 65  Tab->aCol, pSele
b8a0: 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b  ct);.  pTab->iPK
b8b0: 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64  ey = -1;.  if( d
b8c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b8d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
b8e0: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
b8f0: 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ab);.    return 
b900: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
b910: 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pTab;.}../*.** G
b920: 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
b930: 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
b940: 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
b950: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
b960: 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
b970: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
b980: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
b990: 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
b9a0: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
b9b0: 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62  e *sqlite3GetVdb
b9c0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
b9d0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
b9e0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
b9f0: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76  f( v==0 ){.    v
ba00: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
ba10: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 72   = sqlite3VdbeCr
ba20: 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29  eate(pParse->db)
ba30: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
ba40: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20  _OMIT_TRACE.    
ba50: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20 73  if( v ){.      s
ba60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
ba70: 28 76 2c 20 4f 50 5f 54 72 61 63 65 29 3b 0a 20  (v, OP_Trace);. 
ba80: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
ba90: 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a    return v;.}...
baa0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
bab0: 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  e iLimit and iOf
bac0: 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
bad0: 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20  he SELECT based 
bae0: 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74  on the.** pLimit
baf0: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70   and pOffset exp
bb00: 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69  ressions.  pLimi
bb10: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f  t and pOffset ho
bb20: 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
bb30: 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  ns.** that appea
bb40: 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r in the origina
bb50: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
bb60: 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20  after the LIMIT 
bb70: 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65  and OFFSET.** ke
bb80: 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c  ywords.  Or NULL
bb90: 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72   if those keywor
bba0: 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20  ds are omitted. 
bbb0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
bbc0: 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69  et .** are the i
bbd0: 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65  nteger memory re
bbe0: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66  gister numbers f
bbf0: 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  or counters used
bc00: 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20   to compute .** 
bc10: 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  the limit and of
bc20: 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20  fset.  If there 
bc30: 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f  is no limit and/
bc40: 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20  or offset, then 
bc50: 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  .** iLimit and i
bc60: 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74  Offset are negat
bc70: 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
bc80: 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20  routine changes 
bc90: 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c  the values of iL
bca0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
bcb0: 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69   only if.** a li
bcc0: 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73  mit or offset is
bcd0: 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d   defined by pLim
bce0: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20  it and pOffset. 
bcf0: 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69   iLimit and.** i
bd00: 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61  Offset should ha
bd10: 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74  ve been preset t
bd20: 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65  o appropriate de
bd30: 66 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20  fault values.** 
bd40: 28 75 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74  (usually but not
bd50: 20 61 6c 77 61 79 73 20 2d 31 29 20 70 72 69 6f   always -1) prio
bd60: 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
bd70: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e  s routine..** On
bd80: 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20  ly if pLimit!=0 
bd90: 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f  or pOffset!=0 do
bda0: 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
bdb0: 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65  ters get.** rede
bdc0: 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f  fined.  The UNIO
bdd0: 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75  N ALL operator u
bde0: 73 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74  ses this propert
bdf0: 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68  y to force.** th
be00: 65 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73  e reuse of the s
be10: 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  ame limit and of
be20: 66 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61  fset registers a
be30: 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a  cross multiple.*
be40: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
be50: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
be60: 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  oid computeLimit
be70: 52 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20  Registers(Parse 
be80: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
be90: 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b  *p, int iBreak){
bea0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a  .  Vdbe *v = 0;.
beb0: 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30    int iLimit = 0
bec0: 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b  ;.  int iOffset;
bed0: 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20 6e 3b  .  int addr1, n;
bee0: 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
bef0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
bf00: 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31   .  ** "LIMIT -1
bf10: 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61  " always shows a
bf20: 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20  ll rows.  There 
bf30: 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e  is some.  ** con
bf40: 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20 77  traversy about w
bf50: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
bf60: 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20  behavior should 
bf70: 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72  be..  ** The cur
bf80: 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
bf90: 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22  ion interprets "
bfa0: 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e  LIMIT 0" to mean
bfb0: 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20  .  ** no rows.. 
bfc0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
bfd0: 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
bfe0: 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  se);.  assert( p
bff0: 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20  ->pOffset==0 || 
c000: 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a  p->pLimit!=0 );.
c010: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
c020: 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  ){.    p->iLimit
c030: 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50   = iLimit = ++pP
c040: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
c050: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
c060: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
c070: 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
c080: 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 56 44  ) return;  /* VD
c090: 42 45 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  BE should have a
c0a0: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
c0b0: 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  cated */.    if(
c0c0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
c0d0: 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c  teger(p->pLimit,
c0e0: 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71   &n) ){.      sq
c0f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c100: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e  v, OP_Integer, n
c110: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
c120: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
c130: 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22   "LIMIT counter"
c140: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d  ));.      if( n=
c150: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
c160: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c170: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
c180: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65  Break);.      }e
c190: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
c1a0: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e   p->nSelectRow >
c1b0: 20 28 64 6f 75 62 6c 65 29 6e 20 29 20 70 2d 3e   (double)n ) p->
c1c0: 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 28 64 6f  nSelectRow = (do
c1d0: 75 62 6c 65 29 6e 3b 0a 20 20 20 20 20 20 7d 0a  uble)n;.      }.
c1e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c1f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c200: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d  (pParse, p->pLim
c210: 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  it, iLimit);.   
c220: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c230: 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
c240: 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  eInt, iLimit);. 
c250: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
c260: 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
c270: 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71  ter"));.      sq
c280: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c290: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c  v, OP_IfZero, iL
c2a0: 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  imit, iBreak);. 
c2b0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
c2c0: 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  pOffset ){.     
c2d0: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f   p->iOffset = iO
c2e0: 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  ffset = ++pParse
c2f0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50  ->nMem;.      pP
c300: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20  arse->nMem++;   
c310: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65  /* Allocate an e
c320: 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f  xtra register fo
c330: 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a  r limit+offset *
c340: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
c350: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
c360: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66  p->pOffset, iOff
c370: 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  set);.      sqli
c380: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
c390: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
c3a0: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56  Offset);.      V
c3b0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
c3c0: 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29  OFFSET counter")
c3d0: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d  );.      addr1 =
c3e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c3f0: 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
c400: 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  iOffset);.      
c410: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c420: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
c430: 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20   0, iOffset);.  
c440: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
c450: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
c460: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c470: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
c480: 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f  _Add, iLimit, iO
c490: 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b 31  ffset, iOffset+1
c4a0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
c4b0: 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b  ment((v, "LIMIT+
c4c0: 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 20  OFFSET"));.     
c4d0: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
c4e0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
c4f0: 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b  _IfPos, iLimit);
c500: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c510: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
c520: 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66  nteger, -1, iOff
c530: 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  set+1);.      sq
c540: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
c550: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
c560: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
c570: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
c580: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
c590: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
c5a0: 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61  ppropriate colla
c5b0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
c5c0: 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  r the iCol-th co
c5d0: 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72  lumn of.** the r
c5e0: 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68  esult set for th
c5f0: 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  e compound-selec
c600: 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e  t statement "p".
c610: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
c620: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68  .** the column h
c630: 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f  as no default co
c640: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
c650: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ..**.** The coll
c660: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
c670: 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  or the compound 
c680: 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20  select is taken 
c690: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74  from the.** left
c6a0: 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68  -most term of th
c6b0: 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68 61  e select that ha
c6c0: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  s a collating se
c6d0: 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  quence..*/.stati
c6e0: 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69  c CollSeq *multi
c6f0: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61  SelectCollSeq(Pa
c700: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
c710: 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c  ect *p, int iCol
c720: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52  ){.  CollSeq *pR
c730: 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  et;.  if( p->pPr
c740: 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20  ior ){.    pRet 
c750: 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
c760: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
c770: 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20  pPrior, iCol);. 
c780: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74   }else{.    pRet
c790: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
c7a0: 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20  rt( iCol>=0 );. 
c7b0: 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20   if( pRet==0 && 
c7c0: 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e  iCol<p->pEList->
c7d0: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 70 52 65  nExpr ){.    pRe
c7e0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
c7f0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
c800: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
c810: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  ].pExpr);.  }.  
c820: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23  return pRet;.}.#
c830: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
c840: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
c850: 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77  LECT */../* Forw
c860: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
c870: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
c880: 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a  iSelectOrderBy(.
c890: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c8a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
c8b0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
c8c0: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
c8d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
c8e0: 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
c8f0: 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
c900: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
c910: 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
c920: 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
c930: 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b  ry results */.);
c940: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
c950: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
c960: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69  SELECT./*.** Thi
c970: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
c980: 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61  led to process a
c990: 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
c9a0: 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f  form from.** two
c9b0: 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
c9c0: 65 20 71 75 65 72 69 65 73 20 75 73 69 6e 67 20  e queries using 
c9d0: 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c  UNION, UNION ALL
c9e0: 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20  , EXCEPT, or.** 
c9f0: 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20  INTERSECT.**.** 
ca00: 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  "p" points to th
ca10: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
ca20: 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e  the two queries.
ca30: 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74    the query on t
ca40: 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d  he.** left is p-
ca50: 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65  >pPrior.  The le
ca60: 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61  ft query could a
ca70: 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  lso be a compoun
ca80: 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68  d query.** in wh
ca90: 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f  ich case this ro
caa0: 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
cab0: 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
cac0: 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  . .**.** The res
cad0: 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61  ults of the tota
cae0: 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62  l query are to b
caf0: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61  e written into a
cb00: 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20   destination.** 
cb10: 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69  of type eDest wi
cb20: 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61  th parameter iPa
cb30: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  rm..**.** Exampl
cb40: 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61  e 1:  Consider a
cb50: 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f   three-way compo
cb60: 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  und SQL statemen
cb70: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  t..**.**     SEL
cb80: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e  ECT a FROM t1 UN
cb90: 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ION SELECT b FRO
cba0: 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
cbb0: 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a  T c FROM t3.**.*
cbc0: 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
cbd0: 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73   is parsed up as
cbe0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
cbf0: 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f      SELECT c FRO
cc00: 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a  M t3.**      |.*
cc10: 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20  *      `----->  
cc20: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
cc30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
cc40: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
cc50: 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20         `------> 
cc60: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
cc70: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f  1.**.** The arro
cc80: 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  ws in the diagra
cc90: 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e  m above represen
cca0: 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72  t the Select.pPr
ccb0: 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20  ior pointer..** 
ccc0: 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
ccd0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  ne is called wit
cce0: 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65  h p equal to the
ccf0: 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a   t3 query, then.
cd00: 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62  ** pPrior will b
cd10: 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20  e the t2 query. 
cd20: 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54   p->op will be T
cd30: 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20  K_UNION in this 
cd40: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69  case..**.** Noti
cd50: 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  ce that because 
cd60: 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74  of the way SQLit
cd70: 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e  e parses compoun
cd80: 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a  d SELECTs, the.*
cd90: 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  * individual sel
cda0: 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75  ects always grou
cdb0: 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  p from left to r
cdc0: 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
cdd0: 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  int multiSelect(
cde0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
cdf0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
ce00: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
ce10: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
ce20: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
ce30: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
ce40: 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
ce50: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
ce60: 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
ce70: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
ce80: 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
ce90: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
cea0: 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63  ITE_OK;   /* Suc
ceb0: 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61  cess code from a
cec0: 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
ced0: 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
cee0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
cef0: 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
cf00: 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
cf10: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
cf30: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
cf40: 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53  this VDBE */.  S
cf50: 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
cf60: 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74       /* Alternat
cf70: 69 76 65 20 64 61 74 61 20 64 65 73 74 69 6e 61  ive data destina
cf80: 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
cf90: 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20   *pDelete = 0;  
cfa0: 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70  /* Chain of simp
cfb0: 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65  le selects to de
cfc0: 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lete */.  sqlite
cfd0: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
cfe0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
cff0: 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65  ection */.#ifnde
d000: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
d010: 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62  PLAIN.  int iSub
d020: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
d030: 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d   EQP id of left-
d040: 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  hand query */.  
d050: 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20  int iSub2;      
d060: 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
d070: 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75  of right-hand qu
d080: 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ery */.#endif.. 
d090: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
d0a0: 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
d0b0: 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75  BY or LIMIT clau
d0c0: 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
d0d0: 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20  CTs.  Only.  ** 
d0e0: 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d  the last (right-
d0f0: 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20  most) SELECT in 
d100: 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68  the series may h
d110: 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
d120: 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20  or LIMIT..  */. 
d130: 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d   assert( p && p-
d140: 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43  >pPrior );  /* C
d150: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
d160: 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20  guarantees this 
d170: 6d 75 63 68 20 2a 2f 0a 20 20 64 62 20 3d 20 70  much */.  db = p
d180: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72  Parse->db;.  pPr
d190: 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
d1a0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
d1b0: 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70  r->pRightmost!=p
d1c0: 50 72 69 6f 72 20 29 3b 0a 20 20 61 73 73 65 72  Prior );.  asser
d1d0: 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68  t( pPrior->pRigh
d1e0: 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74  tmost==p->pRight
d1f0: 6d 6f 73 74 20 29 3b 0a 20 20 64 65 73 74 20 3d  most );.  dest =
d200: 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70   *pDest;.  if( p
d210: 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
d220: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d230: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f  rorMsg(pParse,"O
d240: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73  RDER BY clause s
d250: 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
d260: 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
d270: 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
d280: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
d290: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
d2a0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
d2b0: 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  nd;.  }.  if( pP
d2c0: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  rior->pLimit ){.
d2d0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d2e0: 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49  Msg(pParse,"LIMI
d2f0: 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  T clause should 
d300: 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
d310: 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
d320: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
d330: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
d340: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
d350: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
d360: 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  }..  v = sqlite3
d370: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
d380: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
d390: 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20  );  /* The VDBE 
d3a0: 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20  already created 
d3b0: 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  by calling funct
d3c0: 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65  ion */..  /* Cre
d3d0: 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74  ate the destinat
d3e0: 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ion temporary ta
d3f0: 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ble if necessary
d400: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
d410: 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  .eDest==SRT_Ephe
d420: 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  mTab ){.    asse
d430: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
d440: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d450: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
d460: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74  nEphemeral, dest
d470: 2e 69 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73  .iParm, p->pELis
d480: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73  t->nExpr);.    s
d490: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
d4a0: 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52  P5(v, BTREE_UNOR
d4b0: 44 45 52 45 44 29 3b 0a 20 20 20 20 64 65 73 74  DERED);.    dest
d4c0: 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62  .eDest = SRT_Tab
d4d0: 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  le;.  }..  /* Ma
d4e0: 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45  ke sure all SELE
d4f0: 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  CTs in the state
d500: 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61  ment have the sa
d510: 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  me number of ele
d520: 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68  ments.  ** in th
d530: 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e  eir result sets.
d540: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
d550: 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72  p->pEList && pPr
d560: 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ior->pEList );. 
d570: 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   if( p->pEList->
d580: 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70  nExpr!=pPrior->p
d590: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
d5a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d5b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c  Msg(pParse, "SEL
d5c0: 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ECTs to the left
d5d0: 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73   and right of %s
d5e0: 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74  ".      " do not
d5f0: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
d600: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
d610: 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74  columns", select
d620: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
d630: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
d640: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
d650: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
d660: 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   Compound SELECT
d670: 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f  s that have an O
d680: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
d690: 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72  re handled separ
d6a0: 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
d6b0: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
d6c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
d6d0: 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70  iSelectOrderBy(p
d6e0: 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
d6f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
d700: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
d710: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
d720: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
d730: 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63  ts..  */.  switc
d740: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
d750: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20  case TK_ALL: {. 
d760: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
d770: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69  0;.      int nLi
d780: 6d 69 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  mit;.      asser
d790: 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  t( !pPrior->pLim
d7a0: 69 74 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69  it );.      pPri
d7b0: 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->pLimit = p->
d7c0: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50  pLimit;.      pP
d7d0: 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20  rior->pOffset = 
d7e0: 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
d7f0: 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
d800: 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
d810: 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
d820: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
d830: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
d840: 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
d850: 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
d860: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
d870: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
d880: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
d890: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
d8a0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
d8b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
d8c0: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
d8d0: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72   p->iLimit = pPr
d8e0: 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ior->iLimit;.   
d8f0: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
d900: 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b  pPrior->iOffset;
d910: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c  .      if( p->iL
d920: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
d930: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
d940: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
d950: 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  fZero, p->iLimit
d960: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
d970: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70  omment((v, "Jump
d980: 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20   ahead if LIMIT 
d990: 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20  reached"));.    
d9a0: 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69    }.      explai
d9b0: 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
d9c0: 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
d9d0: 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
d9e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
d9f0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
da00: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
da10: 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
da20: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44  E_OK );.      pD
da30: 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
da40: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
da50: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
da60: 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
da70: 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c   += pPrior->nSel
da80: 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66  ectRow;.      if
da90: 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  ( pPrior->pLimit
daa0: 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
dab0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
dac0: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20  pPrior->pLimit, 
dad0: 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20  &nLimit).       
dae0: 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  && p->nSelectRow
daf0: 20 3e 20 28 64 6f 75 62 6c 65 29 6e 4c 69 6d 69   > (double)nLimi
db00: 74 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  t .      ){.    
db10: 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
db20: 77 20 3d 20 28 64 6f 75 62 6c 65 29 6e 4c 69 6d  w = (double)nLim
db30: 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
db40: 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20    if( addr ){.  
db50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
db60: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
db70: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
db80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
db90: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
dba0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  T:.    case TK_U
dbb0: 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NION: {.      in
dbc0: 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f  t unionTab;    /
dbd0: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
dbe0: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
dbf0: 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72   table holding r
dc00: 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75  esult */.      u
dc10: 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20  8 op = 0;       
dc20: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52  /* One of the SR
dc30: 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  T_ operations to
dc40: 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a   apply to self *
dc50: 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f  /.      int prio
dc60: 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rOp;     /* The 
dc70: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74  SRT_ operation t
dc80: 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72  o apply to prior
dc90: 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20   selects */.    
dca0: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
dcb0: 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76  *pOffset; /* Sav
dcc0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e  ed values of p->
dcd0: 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f  nLimit and p->nO
dce0: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69  ffset */.      i
dcf0: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
dd00: 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64  electDest uniond
dd10: 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74  est;..      test
dd20: 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
dd30: 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20  EXCEPT );.      
dd40: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
dd50: 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
dd60: 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54     priorOp = SRT
dd70: 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66  _Union;.      if
dd80: 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72  ( dest.eDest==pr
dd90: 69 6f 72 4f 70 20 26 26 20 41 4c 57 41 59 53 28  iorOp && ALWAYS(
dda0: 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 21 70 2d  !p->pLimit &&!p-
ddb0: 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20 20  >pOffset) ){.   
ddc0: 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72       /* We can r
ddd0: 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79  euse a temporary
dde0: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
ddf0: 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20   by a SELECT to 
de00: 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  our.        ** r
de10: 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ight..        */
de20: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
de30: 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d   p->pRightmost!=
de40: 70 20 29 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c  p );  /* Can onl
de50: 79 20 68 61 70 70 65 6e 20 66 6f 72 20 6c 65 66  y happen for lef
de60: 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 0a 20  tward elements. 
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de90: 20 20 20 20 2a 2a 20 6f 66 20 61 20 33 2d 77 61      ** of a 3-wa
dea0: 79 20 6f 72 20 6d 6f 72 65 20 63 6f 6d 70 6f 75  y or more compou
deb0: 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  nd */.        as
dec0: 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d  sert( p->pLimit=
ded0: 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f  =0 );      /* No
dee0: 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66  t allowed on lef
def0: 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a  tward elements *
df00: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
df10: 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
df20: 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c  );     /* Not al
df30: 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72  lowed on leftwar
df40: 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  d elements */.  
df50: 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
df60: 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20   dest.iParm;.   
df70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
df80: 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65    /* We will nee
df90: 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  d to create our 
dfa0: 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  own temporary ta
dfb0: 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ble to hold the.
dfc0: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
dfd0: 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
dfe0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
dff0: 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70      unionTab = p
e000: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
e010: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e020: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
e030: 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
e040: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e050: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
e060: 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c  meral, unionTab,
e070: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   0);.        ass
e080: 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
e090: 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[0] == -1 );
e0a0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72  .        p->addr
e0b0: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
e0c0: 64 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  dr;.        p->p
e0d0: 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c  Rightmost->selFl
e0e0: 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
e0f0: 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20  hemeral;.       
e100: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
e110: 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  st );.      }.. 
e120: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
e130: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
e140: 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20  ts to our left. 
e150: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
e160: 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
e170: 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20  OrderBy );.     
e180: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
e190: 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73  stInit(&uniondes
e1a0: 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f  t, priorOp, unio
e1b0: 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70  nTab);.      exp
e1c0: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
e1d0: 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
e1e0: 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
e1f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e200: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
e210: 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73  Prior, &uniondes
e220: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
e230: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
e240: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
e250: 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
e260: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
e270: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  rrent SELECT sta
e280: 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a  tement.      */.
e290: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
e2a0: 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20  =TK_EXCEPT ){.  
e2b0: 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45        op = SRT_E
e2c0: 78 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c  xcept;.      }el
e2d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
e2e0: 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  rt( p->op==TK_UN
e2f0: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f  ION );.        o
e300: 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
e310: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
e320: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
e330: 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
e340: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
e350: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
e360: 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
e370: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
e380: 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
e390: 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65     uniondest.eDe
e3a0: 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65  st = op;.      e
e3b0: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
e3c0: 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
e3d0: 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
e3e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e3f0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
e400: 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b   p, &uniondest);
e410: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e420: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e430: 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79  ;.      /* Query
e440: 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73   flattening in s
e450: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d  qlite3Select() m
e460: 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70  ight refill p->p
e470: 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a  OrderBy..      *
e480: 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c  * Be sure to del
e490: 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ete p->pOrderBy,
e4a0: 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61   therefore, to a
e4b0: 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65  void a memory le
e4c0: 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ak. */.      sql
e4d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
e4e0: 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  te(db, p->pOrder
e4f0: 42 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  By);.      pDele
e500: 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
e510: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
e520: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
e530: 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
e540: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  .      if( p->op
e550: 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e  ==TK_UNION ) p->
e560: 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50  nSelectRow += pP
e570: 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
e580: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
e590: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
e5a0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
e5b0: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
e5c0: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
e5d0: 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
e5e0: 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
e5f0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  = 0;.      p->iO
e600: 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20  ffset = 0;..    
e610: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
e620: 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d   data in the tem
e630: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74  porary table int
e640: 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a  o whatever form.
e650: 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74        ** it is t
e660: 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79  hat we currently
e670: 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
e680: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e        assert( un
e690: 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 50 61  ionTab==dest.iPa
e6a0: 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74  rm || dest.eDest
e6b0: 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20  !=priorOp );.   
e6c0: 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
e6d0: 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20  t!=priorOp ){.  
e6e0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
e6f0: 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
e700: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e710: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
e720: 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
e730: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
e740: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65   ){.          Se
e750: 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
e760: 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  ;.          whil
e770: 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
e780: 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
e790: 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
e7a0: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
e7b0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
e7c0: 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45  e, 0, pFirst->pE
e7d0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  List);.        }
e7e0: 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20  .        iBreak 
e7f0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
e800: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
e810: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
e820: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
e830: 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  v);.        comp
e840: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
e850: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
e860: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
e870: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e880: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e  v, OP_Rewind, un
e890: 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b  ionTab, iBreak);
e8a0: 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
e8b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
e8c0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
e8d0: 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
e8e0: 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
e8f0: 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e  p->pEList, union
e900: 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  Tab, p->pEList->
e910: 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
e920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
e930: 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20 69 43 6f  , -1, &dest, iCo
e940: 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
e950: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e960: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
e970: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  iCont);.        
e980: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e990: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e  2(v, OP_Next, un
e9a0: 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b  ionTab, iStart);
e9b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e9c0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
e9d0: 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
e9e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e9f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
ea00: 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  se, unionTab, 0)
ea10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ea20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ea30: 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
ea40: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  ( p->op==TK_INTE
ea50: 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20  RSECT ); {.     
ea60: 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
ea70: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
ea80: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
ea90: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
eaa0: 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a  imit, *pOffset;.
eab0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
eac0: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
ead0: 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a   intersectdest;.
eae0: 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20        int r1;.. 
eaf0: 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
eb00: 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
eb10: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
eb20: 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
eb30: 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65  .      ** two te
eb40: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
eb50: 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
eb60: 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
eb70: 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  in.      ** by a
eb80: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
eb90: 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
eba0: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
ebb0: 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
ebc0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
ebd0: 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
ebe0: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  ab++;.      asse
ebf0: 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
ec00: 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64  =0 );..      add
ec10: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
ec20: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
ec30: 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c  Ephemeral, tab1,
ec40: 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
ec50: 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
ec60: 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
ec70: 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
ec80: 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
ec90: 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d        p->pRightm
eca0: 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  ost->selFlags |=
ecb0: 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
ecc0: 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  l;.      assert(
ecd0: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20   p->pEList );.. 
ece0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
ecf0: 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20   SELECTs to our 
ed00: 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72  left into tempor
ed10: 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22  ary table "tab1"
ed20: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
ed30: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
ed40: 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63  stInit(&intersec
ed50: 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e  tdest, SRT_Union
ed60: 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 65  , tab1);.      e
ed70: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
ed80: 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
ed90: 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
eda0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
edb0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
edc0: 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73   pPrior, &inters
edd0: 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
ede0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
edf0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
ee00: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
ee10: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
ee20: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
ee30: 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  CT into temporar
ee40: 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20  y table "tab2". 
ee50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
ee60: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
ee70: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
ee80: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32  nEphemeral, tab2
ee90: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
eea0: 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
eeb0: 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[1] == -1 );.
eec0: 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
eed0: 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b  nEphm[1] = addr;
eee0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
eef0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d   = 0;.      pLim
ef00: 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
ef10: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
ef20: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73  = 0;.      pOffs
ef30: 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
ef40: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
ef50: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
ef60: 65 72 73 65 63 74 64 65 73 74 2e 69 50 61 72 6d  ersectdest.iParm
ef70: 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65   = tab2;.      e
ef80: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
ef90: 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
efa0: 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
efb0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
efc0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
efd0: 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65   p, &intersectde
efe0: 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
eff0: 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
f000: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  OK );.      pDel
f010: 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
f020: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
f030: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
f040: 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
f050: 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  ow>pPrior->nSele
f060: 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
f070: 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
f080: 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
f090: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
f0a0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
f0b0: 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
f0c0: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
f0d0: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
f0e0: 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20   pOffset;..     
f0f0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
f100: 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
f110: 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
f120: 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
f130: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e        ** tables.
f140: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
f150: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
f160: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  t );.      if( d
f170: 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  est.eDest==SRT_O
f180: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
f190: 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
f1a0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69  = p;.        whi
f1b0: 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
f1c0: 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
f1d0: 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
f1e0: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
f1f0: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
f200: 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  , 0, pFirst->pEL
f210: 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
f220: 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
f230: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
f240: 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e  l(v);.      iCon
f250: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
f260: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
f270: 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
f280: 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
f290: 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
f2a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f2b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
f2c0: 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
f2d0: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
f2e0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
f2f0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53  Parse);.      iS
f300: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
f310: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
f320: 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29  owKey, tab1, r1)
f330: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f340: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
f350: 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62  OP_NotFound, tab
f360: 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29  2, iCont, r1, 0)
f370: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
f380: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
f390: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
f3a0: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
f3b0: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
f3c0: 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e  EList, tab1, p->
f3d0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20  pEList->nExpr,. 
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3f0: 20 20 20 20 20 30 2c 20 2d 31 2c 20 26 64 65 73       0, -1, &des
f400: 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
f410: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f420: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
f430: 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
f440: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f450: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
f460: 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20  tab1, iStart);. 
f470: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f480: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
f490: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
f4a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f4b0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
f4c0: 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b2, 0);.      sq
f4d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f4e0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
f4f0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
f500: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
f510: 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
f520: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c  e(pParse, p->op,
f530: 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 70   iSub1, iSub2, p
f540: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a  ->op!=TK_ALL);..
f550: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
f560: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
f570: 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74   used by .  ** t
f580: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20  emporary tables 
f590: 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d  needed to implem
f5a0: 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  ent the compound
f5b0: 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74   select..  ** At
f5c0: 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f  tach the KeyInfo
f5d0: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c   structure to al
f5e0: 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  l temporary tabl
f5f0: 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
f600: 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75  is section is ru
f610: 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d  n by the right-m
f620: 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
f630: 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20  ment only..  ** 
f640: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
f650: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c  s to the left al
f660: 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70  ways skip this p
f670: 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d  art.  The right-
f680: 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54  most.  ** SELECT
f690: 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70   might also skip
f6a0: 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74   this part if it
f6b0: 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59   has no ORDER BY
f6c0: 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a   clause and.  **
f6d0: 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20   no temp tables 
f6e0: 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20  are required..  
f6f0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
f700: 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45 70  lags & SF_UsesEp
f710: 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69  hemeral ){.    i
f720: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f740: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
f750: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
f760: 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yInfo;          
f770: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
f780: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
f790: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
f7a0: 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b    Select *pLoop;
f7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7c0: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
f7d0: 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74  hrough SELECT st
f7e0: 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  atements */.    
f7f0: 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c  CollSeq **apColl
f800: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
f810: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
f820: 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ough pKeyInfo->a
f830: 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e  Coll[] */.    in
f840: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
f850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
f860: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
f870: 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a   in result set *
f880: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
f890: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20  ->pRightmost==p 
f8a0: 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d  );.    nCol = p-
f8b0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
f8c0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
f8d0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
f8e0: 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20  ro(db,.         
f8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
f900: 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b  zeof(*pKeyInfo)+
f910: 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  nCol*(sizeof(Col
f920: 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20  lSeq*) + 1));.  
f930: 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20    if( !pKeyInfo 
f940: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
f950: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
f960: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
f970: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a  ect_end;.    }..
f980: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e      pKeyInfo->en
f990: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
f9a0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
f9b0: 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 0a  d = (u16)nCol;..
f9c0: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43      for(i=0, apC
f9d0: 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  oll=pKeyInfo->aC
f9e0: 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  oll; i<nCol; i++
f9f0: 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20  , apColl++){.   
fa00: 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c     *apColl = mul
fa10: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
fa20: 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
fa30: 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43       if( 0==*apC
fa40: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  oll ){.        *
fa50: 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66  apColl = db->pDf
fa60: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
fa70: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
fa80: 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
fa90: 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
faa0: 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
fab0: 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
fac0: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
fad0: 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
fae0: 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
faf0: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
fb00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
fb10: 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
fb20: 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
fb30: 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
fb40: 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
fb50: 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
fb60: 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
fb70: 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
fb80: 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
fb90: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
fba0: 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
fbb0: 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
fbc0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
fbd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fbe0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
fbf0: 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
fc00: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
fc10: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
fc20: 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
fc30: 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
fc40: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
fc50: 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
fc60: 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[i] = -1;.   
fc70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
fc80: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
fc90: 20 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a   pKeyInfo);.  }.
fca0: 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e  .multi_select_en
fcb0: 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d  d:.  pDest->iMem
fcc0: 20 3d 20 64 65 73 74 2e 69 4d 65 6d 3b 0a 20 20   = dest.iMem;.  
fcd0: 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 64 65  pDest->nMem = de
fce0: 73 74 2e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  st.nMem;.  sqlit
fcf0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
fd00: 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72  b, pDelete);.  r
fd10: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
fd20: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
fd30: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
fd40: 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  T */../*.** Code
fd50: 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f   an output subro
fd60: 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f  utine for a coro
fd70: 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61  utine implementa
fd80: 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c  tion of a.** SEL
fd90: 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a  ECT statment..**
fda0: 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20  .** The data to 
fdb0: 62 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e  be output is con
fdc0: 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69  tained in pIn->i
fdd0: 4d 65 6d 2e 20 20 54 68 65 72 65 20 61 72 65 0a  Mem.  There are.
fde0: 2a 2a 20 70 49 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c  ** pIn->nMem col
fdf0: 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75  umns to be outpu
fe00: 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65  t.  pDest is whe
fe10: 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68  re the output sh
fe20: 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e  ould.** be sent.
fe30: 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e  .**.** regReturn
fe40: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
fe50: 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68  f the register h
fe60: 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f  olding the subro
fe70: 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20  utine.** return 
fe80: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  address..**.** I
fe90: 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
fea0: 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74   it is the first
feb0: 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76   register in a v
fec0: 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65  ector that.** re
fed0: 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f  cords the previo
fee0: 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b  us output.  mem[
fef0: 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c  regPrev] is a fl
ff00: 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65  ag that is false
ff10: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73  .** if there has
ff20: 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75   been no previou
ff30: 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65  s output.  If re
ff40: 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64  gPrev>0 then cod
ff50: 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65  e is.** generate
ff60: 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75  d to suppress du
ff70: 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49  plicates.  pKeyI
ff80: 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20  nfo is used for 
ff90: 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79  comparing.** key
ffa0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
ffb0: 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70  LIMIT found in p
ffc0: 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63  ->iLimit is reac
ffd0: 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69  hed, jump immedi
ffe0: 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65  ately to.** iBre
fff0: 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ak..*/.static in
10000 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  t generateOutput
10010 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61  Subroutine(.  Pa
10020 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
10030 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
10040 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
10050 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
10060 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
10070 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
10080 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
10090 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  In,        /* Co
100a0 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e  routine supplyin
100b0 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65  g data */.  Sele
100c0 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
100d0 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
100e0 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f  send the data */
100f0 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e  .  int regReturn
10100 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
10110 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
10120 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
10130 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20  nt regPrev,     
10140 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
10150 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  us result regist
10160 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65  er.  No uniquene
10170 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79  ss if 0 */.  Key
10180 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
10190 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70       /* For comp
101a0 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69  aring with previ
101b0 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  ous entry */.  i
101c0 6e 74 20 70 34 74 79 70 65 2c 20 20 20 20 20 20  nt p4type,      
101d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 34         /* The p4
101e0 20 74 79 70 65 20 66 6f 72 20 70 4b 65 79 49 6e   type for pKeyIn
101f0 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  fo */.  int iBre
10200 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ak              
10210 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
10220 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54  we hit the LIMIT
10230 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
10240 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
10250 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  ;.  int iContinu
10260 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a  e;.  int addr;..
10270 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
10280 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
10290 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20  v);.  iContinue 
102a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
102b0 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
102c0 20 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   Suppress duplic
102d0 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20  ates for UNION, 
102e0 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
102f0 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66  RSECT .  */.  if
10300 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20  ( regPrev ){.   
10310 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20   int j1, j2;.   
10320 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
10330 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
10340 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  Not, regPrev);. 
10350 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56     j2 = sqlite3V
10360 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
10370 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 4d  Compare, pIn->iM
10380 65 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70  em, regPrev+1, p
10390 49 6e 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20 20  In->nMem,.      
103a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103b0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
103c0 4b 65 79 49 6e 66 6f 2c 20 70 34 74 79 70 65 29  KeyInfo, p4type)
103d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
103e0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
103f0 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69  mp, j2+2, iConti
10400 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20  nue, j2+2);.    
10410 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
10420 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
10430 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
10440 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  opy(pParse, pIn-
10450 3e 69 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31  >iMem, regPrev+1
10460 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  , pIn->nMem);.  
10470 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10480 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
10490 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a  r, 1, regPrev);.
104a0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
104b0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
104c0 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  ed ) return 0;..
104d0 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68    /* Suppress th
104e0 65 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53  e the first OFFS
104f0 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68  ET entries if th
10500 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54  ere is an OFFSET
10510 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63   clause.  */.  c
10520 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
10530 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73  iContinue);..  s
10540 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44  witch( pDest->eD
10550 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74  est ){.    /* St
10560 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61  ore the result a
10570 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75  s data using a u
10580 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a  nique key..    *
10590 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  /.    case SRT_T
105a0 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
105b0 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
105c0 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
105d0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
105e0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
105f0 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47  nt r2 = sqlite3G
10600 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
10610 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
10620 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  e( pDest->eDest=
10630 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20  =SRT_Table );.  
10640 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44      testcase( pD
10650 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
10660 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20  EphemTab );.    
10670 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10680 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
10690 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c  cord, pIn->iMem,
106a0 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 20 72 31 29 3b   pIn->nMem, r1);
106b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
106c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
106d0 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e  ewRowid, pDest->
106e0 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  iParm, r2);.    
106f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10700 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
10710 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20  , pDest->iParm, 
10720 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  r1, r2);.      s
10730 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
10740 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
10750 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  END);.      sqli
10760 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
10770 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
10780 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
10790 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
107a0 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
107b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
107c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
107d0 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
107e0 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
107f0 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
10800 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
10810 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
10820 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
10830 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
10840 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
10850 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
10860 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
10870 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
10880 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
10890 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
108a0 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
108b0 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
108c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
108d0 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20  ->nMem==1 );.   
108e0 20 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d     p->affinity =
108f0 20 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74   .         sqlit
10900 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
10910 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  y(p->pEList->a[0
10920 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e  ].pExpr, pDest->
10930 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20  affinity);.     
10940 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
10950 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
10960 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10970 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
10980 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
10990 69 4d 65 6d 2c 20 31 2c 20 72 31 2c 20 26 70 2d  iMem, 1, r1, &p-
109a0 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  >affinity, 1);. 
109b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
109c0 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
109d0 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
109e0 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20  >iMem, 1);.     
109f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10a00 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
10a10 72 74 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  rt, pDest->iParm
10a20 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
10a30 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
10a40 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
10a50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10a60 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65   }..#if 0  /* Ne
10a70 76 65 72 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e  ver occurs on an
10a80 20 4f 52 44 45 52 20 42 59 20 71 75 65 72 79 20   ORDER BY query 
10a90 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79  */.    /* If any
10aa0 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68   row exist in th
10ab0 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65  e result set, re
10ac0 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61  cord that fact a
10ad0 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f  nd abort..    */
10ae0 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
10af0 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71  ists: {.      sq
10b00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10b10 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
10b20 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b  , pDest->iParm);
10b30 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
10b40 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
10b50 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
10b60 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
10b70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10b80 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
10b90 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
10ba0 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
10bb0 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
10bc0 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
10bd0 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
10be0 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
10bf0 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
10c00 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
10c10 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
10c20 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
10c30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
10c40 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
10c50 73 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d  sert( pIn->nMem=
10c60 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
10c70 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
10c80 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65  pParse, pIn->iMe
10c90 6d 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c  m, pDest->iParm,
10ca0 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68   1);.      /* Th
10cb0 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
10cc0 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20  ill jump out of 
10cd0 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
10ce0 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
10cf0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
10d00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10d10 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
10d20 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  .    /* The resu
10d30 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  lts are stored i
10d40 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  n a sequence of 
10d50 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a  registers.    **
10d60 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 44 65   starting at pDe
10d70 73 74 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 6e 20  st->iMem.  Then 
10d80 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79  the co-routine y
10d90 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ields..    */.  
10da0 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
10db0 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66  tine: {.      if
10dc0 28 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30  ( pDest->iMem==0
10dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73   ){.        pDes
10de0 74 2d 3e 69 4d 65 6d 20 3d 20 73 71 6c 69 74 65  t->iMem = sqlite
10df0 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
10e00 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29  arse, pIn->nMem)
10e10 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  ;.        pDest-
10e20 3e 6e 4d 65 6d 20 3d 20 70 49 6e 2d 3e 6e 4d 65  >nMem = pIn->nMe
10e30 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
10e40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10e50 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
10e60 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69  ->iMem, pDest->i
10e70 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 6e 4d 65 6d  Mem, pDest->nMem
10e80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10e90 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
10ea0 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
10eb0 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65  Parm);.      bre
10ec0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
10ed0 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
10ee0 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65   above, then the
10ef0 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74   result destinat
10f00 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20  ion must be.    
10f10 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20  ** SRT_Output.  
10f20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10f30 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  never called wit
10f40 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20  h any other.    
10f50 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f  ** destination o
10f60 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ther than the on
10f70 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65  es handled above
10f80 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a   or SRT_Output..
10f90 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
10fa0 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65  r SRT_Output, re
10fb0 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
10fc0 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f   in a sequence o
10fd0 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20  f registers.  . 
10fe0 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f     ** Then the O
10ff0 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f  P_ResultRow opco
11000 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 61  de is used to ca
11010 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  use sqlite3_step
11020 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74  () to.    ** ret
11030 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77  urn the next row
11040 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20   of result..    
11050 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
11060 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
11070 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
11080 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
11090 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
110a0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
110b0 52 6f 77 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  Row, pIn->iMem, 
110c0 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  pIn->nMem);.    
110d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
110e0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
110f0 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d  (pParse, pIn->iM
11100 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a  em, pIn->nMem);.
11110 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11120 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d   }.  }..  /* Jum
11130 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
11140 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20  the loop if the 
11150 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64  LIMIT is reached
11160 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
11170 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  iLimit ){.    sq
11180 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11190 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
111a0 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c  >iLimit, iBreak,
111b0 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   -1);.  }..  /* 
111c0 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75 62  Generate the sub
111d0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20  routine return. 
111e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
111f0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
11200 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73   iContinue);.  s
11210 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
11220 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
11230 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65  egReturn);..  re
11240 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
11250 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20  .** Alternative 
11260 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
11270 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66  code generator f
11280 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74 68  or cases when th
11290 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44  ere.** is an ORD
112a0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a  ER BY clause..**
112b0 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20  .** We assume a 
112c0 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c  query of the fol
112d0 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a  lowing form:.**.
112e0 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41  **      <selectA
112f0 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c  >  <operator>  <
11300 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20  selectB>  ORDER 
11310 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e  BY <orderbylist>
11320 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72  .**.** <operator
11330 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f  > is one of UNIO
11340 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58  N ALL, UNION, EX
11350 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45  CEPT, or INTERSE
11360 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a  CT.  The idea.**
11370 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68   is to code both
11380 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c   <selectA> and <
11390 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68  selectB> with th
113a0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
113b0 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69  e as.** co-routi
113c0 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74  nes.  Then run t
113d0 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69  he co-routines i
113e0 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d  n parallel and m
113f0 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74 73  erge the results
11400 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  .** into the out
11410 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f  put.  In additio
11420 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72  n to the two cor
11430 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20  outines (called 
11440 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73  selectA and.** s
11450 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61 72  electB) there ar
11460 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a  e 7 subroutines:
11470 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20  .**.**    outA: 
11480 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70     Move the outp
11490 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ut of the select
114a0 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f  A coroutine into
114b0 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20   the output.**  
114c0 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
114d0 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
114e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  ..**.**    outB:
114f0 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
11500 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
11510 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tB coroutine int
11520 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
11530 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
11540 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
11550 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61  y.  (Only genera
11560 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e  ted for UNION an
11570 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
11580 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43   UNION ALL.  EXC
11590 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45  EPT and INSERTSE
115a0 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20  CT never output 
115b0 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20  a row that.**   
115c0 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61 72            appear
115d0 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a  s only in B.).**
115e0 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20  .**    AltB:    
115f0 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
11600 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
11610 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
11620 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A<B..**.**   
11630 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64   AeqB:    Called
11640 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
11650 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
11660 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d  routines and A==
11670 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42  B..**.**    AgtB
11680 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
11690 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
116a0 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
116b0 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a  nes and A>B..**.
116c0 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43  **    EofA:    C
116d0 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20  alled when data 
116e0 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f  is exhausted fro
116f0 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a  m selectA..**.**
11700 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c      EofB:    Cal
11710 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
11720 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
11730 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54  selectB..**.** T
11740 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
11750 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20  n of the latter 
11760 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73  five subroutines
11770 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68   depend on which
11780 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20   .** <operator> 
11790 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a  is used:.**.**.*
117a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e  *             UN
117b0 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20  ION ALL         
117c0 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20  UNION           
117d0 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20 20   EXCEPT         
117e0 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20   INTERSECT.**   
117f0 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
11800 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
11810 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
11820 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
11830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
11840 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  AltB:   outA, ne
11850 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  xtA      outA, n
11860 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c  extA       outA,
11870 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e   nextA         n
11880 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71  extA.**.**   Aeq
11890 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
118a0 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
118b0 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 41             nextA
118c0 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e           outA, n
118d0 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74  extA.**.**   Agt
118e0 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42  B:   outB, nextB
118f0 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74        outB, next
11900 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42  B          nextB
11910 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
11920 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20  B.**.**   EofA: 
11930 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
11940 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
11950 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20 20          halt    
11960 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a           halt.**
11970 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75  .**   EofB:   ou
11980 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f  tA, nextA      o
11990 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
119a0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
119b0 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20       halt.**.** 
119c0 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71  In the AltB, Aeq
119d0 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62 72  B, and AgtB subr
119e0 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20  outines, an EOF 
119f0 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  on A following n
11a00 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61  extA.** causes a
11a10 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70  n immediate jump
11a20 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20   to EofA and an 
11a30 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69  EOF on B followi
11a40 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a  ng nextB causes.
11a50 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  ** an immediate 
11a60 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57  jump to EofB.  W
11a70 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45  ithin EofA and E
11a80 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20  ofB, and EOF on 
11a90 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c  entry or.** foll
11aa0 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73  owing nextX caus
11ab0 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65  es a jump to the
11ac0 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65   end of the sele
11ad0 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  ct processing..*
11ae0 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72  *.** Duplicate r
11af0 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e  emoval in the UN
11b00 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64  ION, EXCEPT, and
11b10 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65 73   INTERSECT cases
11b20 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77   is handled.** w
11b30 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ithin the output
11b40 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68   subroutine.  Th
11b50 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73 74  e regPrev regist
11b60 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65  er set holds the
11b70 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f   previously.** o
11b80 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20  utput value.  A 
11b90 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61  comparison is ma
11ba0 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20  de against this 
11bb0 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75  value and the ou
11bc0 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70  tput.** is skipp
11bd0 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20 72  ed if the next r
11be0 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20  esults would be 
11bf0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
11c00 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20  previous..**.** 
11c10 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
11c20 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d  on plan is to im
11c30 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20  plement the two 
11c40 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73  coroutines and s
11c50 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69  even.** subrouti
11c60 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20  nes first, then 
11c70 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20  put the control 
11c80 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f 74  logic at the bot
11c90 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  tom.  Like this:
11ca0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
11cb0 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20  goto Init.**    
11cc0 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20   coA: coroutine 
11cd0 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20 28  for left query (
11ce0 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63  A).**     coB: c
11cf0 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67  oroutine for rig
11d00 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20  ht query (B).** 
11d10 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20     outA: output 
11d20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20  one row of A.** 
11d30 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20     outB: output 
11d40 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e  one row of B (UN
11d50 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c  ION and UNION AL
11d60 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f  L only).**    Eo
11d70 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f  fA: ....**    Eo
11d80 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c  fB: ....**    Al
11d90 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65  tB: ....**    Ae
11da0 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67  qB: ....**    Ag
11db0 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e  tB: ....**    In
11dc0 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63  it: initialize c
11dd0 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65  oroutine registe
11de0 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79  rs.**          y
11df0 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20  ield coA.**     
11e00 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20 67       if eof(A) g
11e10 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20  oto EofA.**     
11e20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a       yield coB.*
11e30 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f  *          if eo
11e40 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a  f(B) goto EofB.*
11e50 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61  *    Cmpr: Compa
11e60 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20  re A, B.**      
11e70 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41      Jump AltB, A
11e80 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20  eqB, AgtB.**    
11e90 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20   End: ....**.** 
11ea0 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65  We call AltB, Ae
11eb0 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20  qB, AgtB, EofA, 
11ec0 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75  and EofB "subrou
11ed0 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79 20  tines" but they 
11ee0 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61  are not.** actua
11ef0 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67  lly called using
11f00 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20   Gosub and they 
11f10 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20  do not Return.  
11f20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f  EofA and EofB lo
11f30 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20  op.** until all 
11f40 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
11f50 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74  d then jump to t
11f60 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20  he "end" labe.  
11f70 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61  AltB, AeqB,.** a
11f80 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20  nd AgtB jump to 
11f90 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20  either L2 or to 
11fa0 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45  one of EofA or E
11fb0 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ofB..*/.#ifndef 
11fc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
11fd0 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74  OUND_SELECT.stat
11fe0 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
11ff0 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72  ctOrderBy(.  Par
12000 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
12010 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
12020 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
12030 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
12040 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
12050 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
12060 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
12070 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
12080 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
12090 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
120a0 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
120b0 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
120c0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
120d0 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ters */.  Select
120e0 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
120f0 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
12100 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
12110 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
12120 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
12130 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
12140 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
12150 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  BE */.  SelectDe
12160 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a  st destA;     /*
12170 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
12180 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a   coroutine A */.
12190 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
121a0 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69  tB;     /* Desti
121b0 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75  nation for corou
121c0 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20  tine B */.  int 
121d0 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20 20  regAddrA;       
121e0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
121f0 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
12200 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -A coroutine */.
12210 20 20 69 6e 74 20 72 65 67 45 6f 66 41 3b 20 20    int regEofA;  
12220 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
12230 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e  to indicate when
12240 20 73 65 6c 65 63 74 2d 41 20 69 73 20 63 6f 6d   select-A is com
12250 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 72  plete */.  int r
12260 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20  egAddrB;        
12270 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
12280 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
12290 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
122a0 20 69 6e 74 20 72 65 67 45 6f 66 42 3b 20 20 20   int regEofB;   
122b0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74         /* Flag t
122c0 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20  o indicate when 
122d0 73 65 6c 65 63 74 2d 42 20 69 73 20 63 6f 6d 70  select-B is comp
122e0 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  lete */.  int ad
122f0 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20  drSelectA;      
12300 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
12310 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  e select-A corou
12320 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
12330 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20  drSelectB;      
12340 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
12350 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  e select-B corou
12360 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
12370 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20  gOutA;          
12380 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
12390 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70  ter for the outp
123a0 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
123b0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42  */.  int regOutB
123c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
123d0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
123e0 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20  or the output-B 
123f0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
12400 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20  int addrOutA;   
12410 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
12420 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41   of the output-A
12430 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
12440 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20   int addrOutB = 
12450 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  0;     /* Addres
12460 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d  s of the output-
12470 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
12480 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20    int addrEofA; 
12490 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
124a0 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
124b0 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62  -A-exhausted sub
124c0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
124d0 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20   addrEofB;      
124e0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
124f0 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78   the select-B-ex
12500 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
12510 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
12520 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AltB;         /*
12530 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
12540 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A<B subroutine *
12550 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42  /.  int addrAeqB
12560 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
12570 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42  ress of the A==B
12580 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
12590 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20   int addrAgtB;  
125a0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
125b0 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62  s of the A>B sub
125c0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
125d0 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20   regLimitA;     
125e0 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
125f0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
12600 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  A */.  int regLi
12610 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitB;        /* 
12620 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
12630 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
12640 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
12650 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67         /* A rang
12660 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  e of registers t
12670 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20  o hold previous 
12680 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
12690 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20  savedLimit;     
126a0 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
126b0 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f   of p->iLimit */
126c0 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73  .  int savedOffs
126d0 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65  et;      /* Save
126e0 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f  d value of p->iO
126f0 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  ffset */.  int l
12700 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20  abelCmpr;       
12710 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
12720 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d  e start of the m
12730 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a  erge algorithm *
12740 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64  /.  int labelEnd
12750 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  ;         /* Lab
12760 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f  el for the end o
12770 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45  f the overall SE
12780 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69  LECT stmt */.  i
12790 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20  nt j1;          
127a0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73       /* Jump ins
127b0 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67  tructions that g
127c0 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a  et retargetted *
127d0 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
127e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
127f0 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55   of TK_ALL, TK_U
12800 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c  NION, TK_EXCEPT,
12810 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f   TK_INTERSECT */
12820 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
12830 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70  Dup = 0; /* Comp
12840 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  arison informati
12850 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  on for duplicate
12860 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65   removal */.  Ke
12870 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65  yInfo *pKeyMerge
12880 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f  ;   /* Compariso
12890 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
128a0 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a  r merging rows *
128b0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
128c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
128d0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
128e0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
128f0 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54  pOrderBy;   /* T
12900 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
12910 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64  se */.  int nOrd
12920 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  erBy;         /*
12930 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
12940 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
12950 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
12960 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20   *aPermute;     
12970 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72     /* Mapping fr
12980 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  om ORDER BY term
12990 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20  s to result set 
129a0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64  columns */.#ifnd
129b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
129c0 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75  XPLAIN.  int iSu
129d0 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b1;            /
129e0 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74  * EQP id of left
129f0 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20  -hand query */. 
12a00 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20   int iSub2;     
12a10 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
12a20 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71   of right-hand q
12a30 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  uery */.#endif..
12a40 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
12a50 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73  derBy!=0 );.  as
12a60 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30  sert( pKeyDup==0
12a70 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22   ); /* "Managed"
12a80 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73   code needs this
12a90 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e  .  Ticket #3382.
12aa0 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
12ab0 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61  e->db;.  v = pPa
12ac0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
12ad0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20  sert( v!=0 );   
12ae0 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74      /* Already t
12af0 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20  hrown the error 
12b00 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61  if VDBE alloc fa
12b10 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45  iled */.  labelE
12b20 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
12b30 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
12b40 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69  labelCmpr = sqli
12b50 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
12b60 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63  (v);...  /* Patc
12b70 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42  h up the ORDER B
12b80 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  Y clause.  */.  
12b90 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20  op = p->op;  .  
12ba0 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
12bb0 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
12bc0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rior->pOrderBy==
12bd0 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  0 );.  pOrderBy 
12be0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
12bf0 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
12c00 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20  y );.  nOrderBy 
12c10 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
12c20 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65  r;..  /* For ope
12c30 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61  rators other tha
12c40 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68  n UNION ALL we h
12c50 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ave to make sure
12c60 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f   that.  ** the O
12c70 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
12c80 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d  overs every term
12c90 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
12ca0 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65  et.  Add.  ** te
12cb0 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52  rms to the ORDER
12cc0 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65   BY clause as ne
12cd0 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
12ce0 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29  if( op!=TK_ALL )
12cf0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64  {.    for(i=1; d
12d00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
12d10 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69  =0 && i<=p->pELi
12d20 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
12d30 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
12d40 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
12d50 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  em;.      for(j=
12d60 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
12d70 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79  y->a; j<nOrderBy
12d80 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
12d90 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
12da0 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20 29   pItem->iCol>0 )
12db0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
12dc0 74 65 6d 2d 3e 69 43 6f 6c 3d 3d 69 20 29 20 62  tem->iCol==i ) b
12dd0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
12de0 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65      if( j==nOrde
12df0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45  rBy ){.        E
12e00 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
12e10 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
12e20 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20  NTEGER, 0);.    
12e30 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
12e40 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
12e50 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70  NOMEM;.        p
12e60 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
12e70 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20  _IntValue;.     
12e80 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75     pNew->u.iValu
12e90 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70  e = i;.        p
12ea0 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
12eb0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
12ec0 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
12ed0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
12ee0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72   pOrderBy->a[nOr
12ef0 64 65 72 42 79 2b 2b 5d 2e 69 43 6f 6c 20 3d 20  derBy++].iCol = 
12f00 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a  (u16)i;.      }.
12f10 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12f20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70  Compute the comp
12f30 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69  arison permutati
12f40 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74  on and keyinfo t
12f50 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68  hat is used with
12f60 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74  .  ** the permut
12f70 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65  ation used to de
12f80 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e  termine if the n
12f90 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  ext.  ** row of 
12fa0 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72  results comes fr
12fb0 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65  om selectA or se
12fc0 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64  lectB.  Also add
12fd0 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63   explicit.  ** c
12fe0 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  ollations to the
12ff0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
13000 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77   terms so that w
13010 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69  hen the subqueri
13020 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72  es.  ** to the r
13030 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66  ight and the lef
13040 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c  t are evaluated,
13050 20 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f   they use the co
13060 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  rrect.  ** colla
13070 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65  tion..  */.  aPe
13080 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44  rmute = sqlite3D
13090 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
130a0 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65  izeof(int)*nOrde
130b0 72 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72  rBy);.  if( aPer
130c0 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75  mute ){.    stru
130d0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
130e0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72   *pItem;.    for
130f0 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (i=0, pItem=pOrd
13100 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65  erBy->a; i<nOrde
13110 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; i++, pItem+
13120 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
13130 28 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20  ( pItem->iCol>0 
13140 20 26 26 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3c   && pItem->iCol<
13150 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
13160 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d  r );.      aPerm
13170 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e  ute[i] = pItem->
13180 69 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a  iCol - 1;.    }.
13190 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 0a      pKeyMerge =.
131a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 4d        sqlite3DbM
131b0 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
131c0 65 6f 66 28 2a 70 4b 65 79 4d 65 72 67 65 29 2b  eof(*pKeyMerge)+
131d0 6e 4f 72 64 65 72 42 79 2a 28 73 69 7a 65 6f 66  nOrderBy*(sizeof
131e0 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a  (CollSeq*)+1));.
131f0 20 20 20 20 69 66 28 20 70 4b 65 79 4d 65 72 67      if( pKeyMerg
13200 65 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 4d  e ){.      pKeyM
13210 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72  erge->aSortOrder
13220 20 3d 20 28 75 38 2a 29 26 70 4b 65 79 4d 65 72   = (u8*)&pKeyMer
13230 67 65 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72  ge->aColl[nOrder
13240 42 79 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d  By];.      pKeyM
13250 65 72 67 65 2d 3e 6e 46 69 65 6c 64 20 3d 20 28  erge->nField = (
13260 75 31 36 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20  u16)nOrderBy;.  
13270 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 65      pKeyMerge->e
13280 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
13290 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
132a0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
132b0 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
132c0 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 45  pColl;.        E
132d0 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 4f 72  xpr *pTerm = pOr
132e0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
132f0 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  r;.        if( p
13300 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50  Term->flags & EP
13310 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20  _ExpCollate ){. 
13320 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
13330 20 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c 3b 0a 20   pTerm->pColl;. 
13340 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
13350 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
13360 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
13370 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 61 50  eq(pParse, p, aP
13380 65 72 6d 75 74 65 5b 69 5d 29 3b 0a 20 20 20 20  ermute[i]);.    
13390 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61        pTerm->fla
133a0 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c  gs |= EP_ExpColl
133b0 61 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ate;.          p
133c0 54 65 72 6d 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43  Term->pColl = pC
133d0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  oll;.        }. 
133e0 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65         pKeyMerge
133f0 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
13400 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  ll;.        pKey
13410 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65  Merge->aSortOrde
13420 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d  r[i] = pOrderBy-
13430 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
13440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13450 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79   }else{.    pKey
13460 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Merge = 0;.  }..
13470 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68    /* Reattach th
13480 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
13490 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a  e to the query..
134a0 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72    */.  p->pOrder
134b0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
134c0 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
134d0 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
134e0 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64  istDup(pParse->d
134f0 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b  b, pOrderBy, 0);
13500 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
13510 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f  a range of tempo
13520 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61  rary registers a
13530 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e  nd the KeyInfo n
13540 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74  eeded.  ** for t
13550 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65  he logic that re
13560 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20  moves duplicate 
13570 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e  result rows when
13580 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74   the.  ** operat
13590 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43  or is UNION, EXC
135a0 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43  EPT, or INTERSEC
135b0 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e  T (but not UNION
135c0 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66   ALL)..  */.  if
135d0 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op==TK_ALL ){.
135e0 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b      regPrev = 0;
135f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
13600 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c  t nExpr = p->pEL
13610 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
13620 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79  assert( nOrderBy
13630 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  >=nExpr || db->m
13640 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
13650 20 20 20 72 65 67 50 72 65 76 20 3d 20 73 71 6c     regPrev = sql
13660 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
13670 28 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 31  (pParse, nExpr+1
13680 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13690 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
136a0 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72  nteger, 0, regPr
136b0 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70  ev);.    pKeyDup
136c0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
136d0 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20  ocZero(db,.     
136e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
136f0 65 6f 66 28 2a 70 4b 65 79 44 75 70 29 20 2b 20  eof(*pKeyDup) + 
13700 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f  nExpr*(sizeof(Co
13710 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20  llSeq*)+1) );.  
13720 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b    if( pKeyDup ){
13730 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e  .      pKeyDup->
13740 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
13750 2a 29 26 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c  *)&pKeyDup->aCol
13760 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 20 20  l[nExpr];.      
13770 70 4b 65 79 44 75 70 2d 3e 6e 46 69 65 6c 64 20  pKeyDup->nField 
13780 3d 20 28 75 31 36 29 6e 45 78 70 72 3b 0a 20 20  = (u16)nExpr;.  
13790 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 65 6e 63      pKeyDup->enc
137a0 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20   = ENC(db);.    
137b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
137c0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
137d0 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c    pKeyDup->aColl
137e0 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  [i] = multiSelec
137f0 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
13800 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20   p, i);.        
13810 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72  pKeyDup->aSortOr
13820 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  der[i] = 0;.    
13830 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a    }.    }.  }. .
13840 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68    /* Separate th
13850 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72  e left and the r
13860 69 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20  ight query from 
13870 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f  one another.  */
13880 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30  .  p->pPrior = 0
13890 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
138a0 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
138b0 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
138c0 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
138d0 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
138e0 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
138f0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
13900 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
13910 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f  e, pPrior, pPrio
13920 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  r->pOrderBy, "OR
13930 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  DER");.  }..  /*
13940 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   Compute the lim
13950 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  it registers */.
13960 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
13970 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
13980 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
13990 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26  if( p->iLimit &&
139a0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
139b0 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b     regLimitA = +
139c0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
139d0 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b     regLimitB = +
139e0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
139f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13a00 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
13a10 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d   p->iOffset ? p-
13a20 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e  >iOffset+1 : p->
13a30 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  iLimit,.        
13a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a50 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d            regLim
13a60 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  itA);.    sqlite
13a70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13a80 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74  P_Copy, regLimit
13a90 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20  A, regLimitB);. 
13aa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c   }else{.    regL
13ab0 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74  imitA = regLimit
13ac0 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  B = 0;.  }.  sql
13ad0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
13ae0 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
13af0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
13b00 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
13b10 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73  ete(db, p->pOffs
13b20 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65  et);.  p->pOffse
13b30 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64  t = 0;..  regAdd
13b40 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rA = ++pParse->n
13b50 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 41 20 3d  Mem;.  regEofA =
13b60 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
13b70 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b  .  regAddrB = ++
13b80 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
13b90 72 65 67 45 6f 66 42 20 3d 20 2b 2b 70 50 61 72  regEofB = ++pPar
13ba0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
13bb0 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utA = ++pParse->
13bc0 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20  nMem;.  regOutB 
13bd0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
13be0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
13bf0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41  tDestInit(&destA
13c00 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
13c10 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
13c20 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
13c30 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f  nit(&destB, SRT_
13c40 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
13c50 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  drB);..  /* Jump
13c60 20 70 61 73 74 20 74 68 65 20 76 61 72 69 6f 75   past the variou
13c70 73 20 73 75 62 72 6f 75 74 69 6e 65 73 20 61 6e  s subroutines an
13c80 64 20 63 6f 72 6f 75 74 69 6e 65 73 20 74 6f 20  d coroutines to 
13c90 74 68 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d 65  the main.  ** me
13ca0 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  rge loop.  */.  
13cb0 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
13cc0 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
13cd0 6f 29 3b 0a 20 20 61 64 64 72 53 65 6c 65 63 74  o);.  addrSelect
13ce0 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  A = sqlite3VdbeC
13cf0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
13d00 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
13d10 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
13d20 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
13d30 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74  T statement to t
13d40 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20  he.  ** left of 
13d50 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65  the compound ope
13d60 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20  rator - the "A" 
13d70 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56  select..  */.  V
13d80 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
13d90 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74  v, "Begin corout
13da0 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c  ine for left SEL
13db0 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72  ECT"));.  pPrior
13dc0 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69  ->iLimit = regLi
13dd0 6d 69 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53  mitA;.  explainS
13de0 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
13df0 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
13e00 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74  lectId);.  sqlit
13e10 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
13e20 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29   pPrior, &destA)
13e30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
13e40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
13e50 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 41 29  ger, 1, regEofA)
13e60 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
13e70 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
13e80 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  d, regAddrA);.  
13e90 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
13ea0 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69  (v, "End corouti
13eb0 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45  ne for left SELE
13ec0 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  CT"));..  /* Gen
13ed0 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
13ee0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
13ef0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
13f00 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20  nt on .  ** the 
13f10 72 69 67 68 74 20 2d 20 74 68 65 20 22 42 22 20  right - the "B" 
13f20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64  select.  */.  ad
13f30 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69  drSelectB = sqli
13f40 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
13f50 64 72 28 76 29 3b 0a 20 20 56 64 62 65 4e 6f 6f  dr(v);.  VdbeNoo
13f60 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65  pComment((v, "Be
13f70 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  gin coroutine fo
13f80 72 20 72 69 67 68 74 20 53 45 4c 45 43 54 22 29  r right SELECT")
13f90 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20  );.  savedLimit 
13fa0 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73  = p->iLimit;.  s
13fb0 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e  avedOffset = p->
13fc0 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c  iOffset;.  p->iL
13fd0 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42  imit = regLimitB
13fe0 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
13ff0 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53   0;  .  explainS
14000 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
14010 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
14020 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74  lectId);.  sqlit
14030 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
14040 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70   p, &destB);.  p
14050 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64  ->iLimit = saved
14060 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66  Limit;.  p->iOff
14070 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65  set = savedOffse
14080 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  t;.  sqlite3Vdbe
14090 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
140a0 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 42  eger, 1, regEofB
140b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
140c0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
140d0 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20  ld, regAddrB);. 
140e0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
140f0 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74  ((v, "End corout
14100 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53 45  ine for right SE
14110 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47  LECT"));..  /* G
14120 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
14130 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
14140 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  s the current ro
14150 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20  w of the A.  ** 
14160 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65  select as the ne
14170 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66  xt output row of
14180 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
14190 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62  lect..  */.  Vdb
141a0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
141b0 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65   "Output routine
141c0 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64   for A"));.  add
141d0 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65  rOutA = generate
141e0 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
141f0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
14200 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65            p, &de
14210 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f  stA, pDest, regO
14220 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20  utA,.           
14230 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70        regPrev, p
14240 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e  KeyDup, P4_KEYIN
14250 46 4f 5f 48 41 4e 44 4f 46 46 2c 20 6c 61 62 65  FO_HANDOFF, labe
14260 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47  lEnd);.  .  /* G
14270 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
14280 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
14290 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  s the current ro
142a0 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20  w of the B.  ** 
142b0 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65  select as the ne
142c0 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66  xt output row of
142d0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
142e0 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lect..  */.  if(
142f0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
14300 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
14310 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
14320 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72  nt((v, "Output r
14330 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b  outine for B"));
14340 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20  .    addrOutB = 
14350 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
14360 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
14370 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14380 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65    p, &destB, pDe
14390 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20  st, regOutB,.   
143a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
143b0 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
143c0 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49  P4_KEYINFO_STATI
143d0 43 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  C, labelEnd);.  
143e0 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
143f0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f   a subroutine to
14400 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65   run when the re
14410 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63  sults from selec
14420 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68  t A.  ** are exh
14430 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20  austed and only 
14440 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42  data in select B
14450 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20   remains..  */. 
14460 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
14470 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72  ((v, "eof-A subr
14480 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 69 66 28  outine"));.  if(
14490 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c   op==TK_EXCEPT |
144a0 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  | op==TK_INTERSE
144b0 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f  CT ){.    addrEo
144c0 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fA = sqlite3Vdbe
144d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
144e0 6f 2c 20 30 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  o, 0, labelEnd);
144f0 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20  .  }else{  .    
14500 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74  addrEofA = sqlit
14510 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14520 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20  OP_If, regEofB, 
14530 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73  labelEnd);.    s
14540 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14550 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
14560 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
14570 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14580 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
14590 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  eld, regAddrB);.
145a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
145b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
145c0 2c 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  , 0, addrEofA);.
145d0 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
145e0 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  w += pPrior->nSe
145f0 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20  lectRow;.  }..  
14600 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
14610 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
14620 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
14630 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20   from select B. 
14640 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
14650 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
14660 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61  in select A rema
14670 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
14680 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
14690 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42   ){.    addrEofB
146a0 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20   = addrEofA;.   
146b0 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
146c0 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow > pPrior->nSe
146d0 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65  lectRow ) p->nSe
146e0 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72  lectRow = pPrior
146f0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
14700 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62  }else{  .    Vdb
14710 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
14720 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69   "eof-B subrouti
14730 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45  ne"));.    addrE
14740 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofB = sqlite3Vdb
14750 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
14760 2c 20 72 65 67 45 6f 66 41 2c 20 6c 61 62 65 6c  , regEofA, label
14770 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  End);.    sqlite
14780 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14790 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
147a0 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20  , addrOutA);.   
147b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
147c0 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
147d0 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73  regAddrA);.    s
147e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
147f0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
14800 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a  addrEofB);.  }..
14810 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
14820 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
14830 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a   case of A<B.  *
14840 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
14850 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20  ent((v, "A-lt-B 
14860 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
14870 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69   addrAltB = sqli
14880 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14890 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
148a0 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
148b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
148c0 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
148d0 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
148e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
148f0 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41  , OP_If, regEofA
14900 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73  , addrEofA);.  s
14910 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14920 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
14930 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
14940 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
14950 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
14960 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a  se of A==B.  */.
14970 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
14980 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
14990 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d   = addrAltB;.  }
149a0 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
149b0 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
149c0 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
149d0 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c  AltB;.    addrAl
149e0 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tB++;.  }else{. 
149f0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
14a00 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73  nt((v, "A-eq-B s
14a10 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
14a20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20    addrAeqB =.   
14a30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14a40 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
14a50 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73  regAddrA);.    s
14a60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14a70 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
14a80 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20  fA, addrEofA);. 
14a90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14aa0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
14ab0 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a   0, labelCmpr);.
14ac0 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
14ad0 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
14ae0 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e  e the case of A>
14af0 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
14b00 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
14b10 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  gt-B subroutine"
14b20 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d  ));.  addrAgtB =
14b30 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
14b40 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66  entAddr(v);.  if
14b50 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
14b60 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
14b70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14b80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
14b90 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72  b, regOutB, addr
14ba0 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  OutB);.  }.  sql
14bb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
14bc0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
14bd0 64 64 72 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrB);.  sqlite3
14be0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14bf0 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64  _If, regEofB, ad
14c00 64 72 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74  drEofB);.  sqlit
14c10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14c20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
14c30 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68  lCmpr);..  /* Th
14c40 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63  is code runs onc
14c50 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
14c60 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f  everything..  */
14c70 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
14c80 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
14c90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14ca0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
14cb0 2c 20 30 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20  , 0, regEofA);. 
14cc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14cd0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
14ce0 2c 20 30 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20  , 0, regEofB);. 
14cf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14d00 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
14d10 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 53 65  regAddrA, addrSe
14d20 6c 65 63 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  lectA);.  sqlite
14d30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14d40 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72  P_Gosub, regAddr
14d50 42 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b  B, addrSelectB);
14d60 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14d70 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
14d80 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41  egEofA, addrEofA
14d90 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14da0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
14db0 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f   regEofB, addrEo
14dc0 66 42 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65  fB);..  /* Imple
14dd0 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65  ment the main me
14de0 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  rge loop.  */.  
14df0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
14e00 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
14e10 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cmpr);.  sqlite3
14e20 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
14e30 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c  _Permutation, 0,
14e40 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50   0, 0, (char*)aP
14e50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52  ermute, P4_INTAR
14e60 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  RAY);.  sqlite3V
14e70 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
14e80 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69  Compare, destA.i
14e90 4d 65 6d 2c 20 64 65 73 74 42 2e 69 4d 65 6d 2c  Mem, destB.iMem,
14ea0 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   nOrderBy,.     
14eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ec0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d      (char*)pKeyM
14ed0 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  erge, P4_KEYINFO
14ee0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c  _HANDOFF);.  sql
14ef0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
14f00 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41  , OP_Jump, addrA
14f10 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61  ltB, addrAeqB, a
14f20 64 64 72 41 67 74 42 29 3b 0a 0a 20 20 2f 2a 20  ddrAgtB);..  /* 
14f30 52 65 6c 65 61 73 65 20 74 65 6d 70 6f 72 61 72  Release temporar
14f40 79 20 72 65 67 69 73 74 65 72 73 0a 20 20 2a 2f  y registers.  */
14f50 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29  .  if( regPrev )
14f60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  {.    sqlite3Rel
14f70 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
14f80 61 72 73 65 2c 20 72 65 67 50 72 65 76 2c 20 6e  arse, regPrev, n
14f90 4f 72 64 65 72 42 79 2b 31 29 3b 0a 20 20 7d 0a  OrderBy+1);.  }.
14fa0 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
14fb0 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  e this point in 
14fc0 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61  order to termina
14fd0 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  te the query..  
14fe0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
14ff0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
15000 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a  labelEnd);..  /*
15010 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
15020 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e  of output column
15030 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  s.  */.  if( pDe
15040 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
15050 75 74 70 75 74 20 29 7b 0a 20 20 20 20 53 65 6c  utput ){.    Sel
15060 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 50  ect *pFirst = pP
15070 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65 28  rior;.    while(
15080 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
15090 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
150a0 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 67  t->pPrior;.    g
150b0 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
150c0 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  es(pParse, 0, pF
150d0 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
150e0 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d   }..  /* Reassem
150f0 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  bly the compound
15100 20 71 75 65 72 79 20 73 6f 20 74 68 61 74 20 69   query so that i
15110 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
15120 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62  correctly.  ** b
15130 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
15140 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20  nction */.  if( 
15150 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
15160 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
15170 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69  lete(db, p->pPri
15180 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50  or);.  }.  p->pP
15190 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 0a  rior = pPrior;..
151a0 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73    /*** TBD:  Ins
151b0 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63  ert subroutine c
151c0 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75  alls to close cu
151d0 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c  rsors on incompl
151e0 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75  ete.  **** subqu
151f0 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78  eries ****/.  ex
15200 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70  plainComposite(p
15210 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53  Parse, p->op, iS
15220 75 62 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a  ub1, iSub2, 0);.
15230 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15240 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  OK;.}.#endif..#i
15250 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
15260 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
15270 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
15280 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
15290 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72  * Forward Declar
152a0 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63  ations */.static
152b0 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
152c0 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78  ist(sqlite3*, Ex
152d0 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78  prList*, int, Ex
152e0 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63  prList*);.static
152f0 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
15300 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65  t(sqlite3*, Sele
15310 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c  ct *, int, ExprL
15320 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ist *);../*.** S
15330 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
15340 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
15350 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79  .  Replace every
15360 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a   reference to.**
15370 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62   a column in tab
15380 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65  le number iTable
15390 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
153a0 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a  the iColumn-th.*
153b0 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73  * entry in pELis
153c0 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72  t.  (But leave r
153d0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
153e0 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a   ROWID column .*
153f0 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a  * unchanged.).**
15400 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15410 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
15420 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65  flattening proce
15430 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72  dure.  A subquer
15440 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c  y.** whose resul
15450 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  t set is defined
15460 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61   by pEList appea
15470 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74  rs as entry in t
15480 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  he.** FROM claus
15490 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75  e of a SELECT su
154a0 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45  ch that the VDBE
154b0 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   cursor assigned
154c0 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d   to that.** FORM
154d0 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73   clause entry is
154e0 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72   iTable.  This r
154f0 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20  outine make the 
15500 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68  necessary .** ch
15510 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73  anges to pExpr s
15520 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73  o that it refers
15530 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
15540 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a   source table.**
15550 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
15560 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75   rather the resu
15570 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75  lt set of the su
15580 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  bquery..*/.stati
15590 63 20 45 78 70 72 20 2a 73 75 62 73 74 45 78 70  c Expr *substExp
155a0 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
155b0 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f  ,        /* Repo
155c0 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
155d0 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   to this connect
155e0 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ion */.  Expr *p
155f0 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  Expr,        /* 
15600 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75  Expr in which su
15610 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72  bstitution occur
15620 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  s */.  int iTabl
15630 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  e,         /* Ta
15640 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69  ble to be substi
15650 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  tuted */.  ExprL
15660 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
15670 2a 20 53 75 62 73 74 69 74 75 74 65 20 65 78 70  * Substitute exp
15680 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  ressions */.){. 
15690 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
156a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
156b0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
156c0 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
156d0 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b  Table==iTable ){
156e0 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
156f0 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
15700 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
15710 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  K_NULL;.    }els
15720 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
15730 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72  New;.      asser
15740 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20  t( pEList!=0 && 
15750 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
15760 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
15770 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
15780 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
15790 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
157a0 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  0 );.      pNew 
157b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
157c0 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70  (db, pEList->a[p
157d0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70  Expr->iColumn].p
157e0 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
157f0 69 66 28 20 70 4e 65 77 20 26 26 20 70 45 78 70  if( pNew && pExp
15800 72 2d 3e 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  r->pColl ){.    
15810 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20      pNew->pColl 
15820 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a  = pExpr->pColl;.
15830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
15840 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
15850 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  db, pExpr);.    
15860 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a    pExpr = pNew;.
15870 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
15880 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
15890 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
158a0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54  pExpr->pLeft, iT
158b0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
158c0 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
158d0 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
158e0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
158f0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
15900 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
15910 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
15920 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
15930 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
15940 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e  ct(db, pExpr->x.
15950 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c  pSelect, iTable,
15960 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65   pEList);.    }e
15970 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74  lse{.      subst
15980 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45 78  ExprList(db, pEx
15990 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61  pr->x.pList, iTa
159a0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
159b0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
159c0 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63   pExpr;.}.static
159d0 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
159e0 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist(.  sqlite3 *
159f0 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  db,         /* R
15a00 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
15a10 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78  ors here */.  Ex
15a20 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
15a30 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63     /* List to sc
15a40 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20  an and in which 
15a50 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
15a60 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  tes */.  int iTa
15a70 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
15a80 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62   Table to be sub
15a90 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78  stituted */.  Ex
15aa0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
15ab0 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
15ac0 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
15ad0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
15ae0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
15af0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
15b00 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
15b10 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  .    pList->a[i]
15b20 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45 78  .pExpr = substEx
15b30 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  pr(db, pList->a[
15b40 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
15b50 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  , pEList);.  }.}
15b60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
15b70 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69  stSelect(.  sqli
15b80 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
15b90 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
15ba0 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f  c errors here */
15bb0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
15bc0 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
15bd0 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77  T statement in w
15be0 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
15bf0 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20  stitutions */.  
15c00 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
15c10 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
15c20 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a   be replaced */.
15c30 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
15c40 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69  st     /* Substi
15c50 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29  tute values */.)
15c60 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
15c70 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  c;.  struct SrcL
15c80 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
15c90 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
15ca0 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  !p ) return;.  s
15cb0 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
15cc0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62   p->pEList, iTab
15cd0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
15ce0 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
15cf0 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54   p->pGroupBy, iT
15d00 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
15d10 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
15d20 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
15d30 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
15d40 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20  .  p->pHaving = 
15d50 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
15d60 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65  >pHaving, iTable
15d70 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e  , pEList);.  p->
15d80 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78  pWhere = substEx
15d90 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  pr(db, p->pWhere
15da0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
15db0 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63 74  );.  substSelect
15dc0 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  (db, p->pPrior, 
15dd0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
15de0 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
15df0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
15e00 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66 6f  c );  /* Even fo
15e10 72 20 28 53 45 4c 45 43 54 20 31 29 20 77 65 20  r (SELECT 1) we 
15e20 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62 75  have: pSrc!=0 bu
15e30 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  t pSrc->nSrc==0 
15e40 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  */.  if( ALWAYS(
15e50 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f 72  pSrc) ){.    for
15e60 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70  (i=pSrc->nSrc, p
15e70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e  Item=pSrc->a; i>
15e80 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
15e90 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  {.      substSel
15ea0 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ect(db, pItem->p
15eb0 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20  Select, iTable, 
15ec0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  pEList);.    }. 
15ed0 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
15ee0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
15ef0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
15f00 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
15f10 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
15f20 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
15f30 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
15f40 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
15f50 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
15f60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
15f70 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
15f80 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
15f90 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  es in order to s
15fa0 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f  peed.** executio
15fb0 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 31  n.  It returns 1
15fc0 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61   if it makes cha
15fd0 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f  nges and 0 if no
15fe0 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f   flattening.** o
15ff0 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
16000 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
16010 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
16020 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
16030 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
16040 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
16050 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
16060 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
16070 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
16080 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
16090 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
160a0 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
160b0 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
160c0 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
160d0 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
160e0 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
160f0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
16100 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
16110 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
16120 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
16130 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
16140 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
16150 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
16160 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
16170 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
16180 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
16190 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
161a0 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
161b0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
161c0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
161d0 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
161e0 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
161f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
16200 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
16210 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
16220 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
16230 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
16240 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
16250 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
16260 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
16270 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
16280 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
16290 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
162a0 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
162b0 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20  ification gives 
162c0 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a  the same result.
162d0 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20  ** but only has 
162e0 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61  to scan the data
162f0 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61   once.  And beca
16300 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68  use indices migh
16310 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74  t .** exist on t
16320 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63  he table t1, a c
16330 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20  omplete scan of 
16340 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62  the data might b
16350 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a  e.** avoided..**
16360 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69  .** Flattening i
16370 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64  s only attempted
16380 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
16390 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
163a0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  e:.**.**   (1)  
163b0 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
163c0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
163d0 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
163e0 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
163f0 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75  **   (2)  The su
16400 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e  bquery is not an
16410 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68   aggregate or th
16420 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
16430 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
16440 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75  **   (3)  The su
16450 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68  bquery is not th
16460 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
16470 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20  of a left outer 
16480 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28  join.**        (
16490 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65  Originally ticke
164a0 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e 67 74  t #306.  Strengt
164b0 68 65 6e 65 64 20 62 79 20 74 69 63 6b 65 74 20  hened by ticket 
164c0 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28  #3300).**.**   (
164d0 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
164e0 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
164f0 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41  ..**.**  (**)  A
16500 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74  t one point rest
16510 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64  rictions (4) and
16520 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20 73   (5) defined a s
16530 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43  ubset of DISTINC
16540 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d  T.**        sub-
16550 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65 72  queries that wer
16560 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20  e excluded from 
16570 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
16580 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a  n. Restriction .
16590 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68 61  **        (4) ha
165a0 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70  s since been exp
165b0 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65  anded to exclude
165c0 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75   all DISTINCT su
165d0 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20  bqueries..**.** 
165e0 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75    (6)  The subqu
165f0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
16600 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
16610 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
16620 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
16630 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
16640 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
16650 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63  ery has a FROM c
16660 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  lause..**.**   (
16670 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  8)  The subquery
16680 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
16690 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
166a0 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
166b0 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39  join..**.**   (9
166c0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
166d0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
166e0 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
166f0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
16700 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
16710 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
16720 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65  (10)  The subque
16730 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
16740 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
16750 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
16760 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
16770 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
16780 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62  *  (11)  The sub
16790 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
167a0 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
167b0 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52   both have ORDER
167c0 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a   BY clauses..**.
167d0 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d  **  (**)  Not im
167e0 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73  plemented.  Subs
167f0 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69  umed into restri
16800 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20  ction (3).  Was 
16810 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20  previously.**   
16820 20 20 20 20 20 61 20 73 65 70 61 72 61 74 65 20       a separate 
16830 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69  restriction deri
16840 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74  ving from ticket
16850 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31   #350..**.**  (1
16860 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
16870 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79   and outer query
16880 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
16890 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28   LIMIT..**.**  (
168a0 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  14)  The subquer
168b0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f  y does not use O
168c0 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  FFSET..**.**  (1
168d0 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  5)  The outer qu
168e0 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20  ery is not part 
168f0 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
16900 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20  lect or the.**  
16910 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64        subquery d
16920 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c  oes not have a L
16930 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  IMIT clause..** 
16940 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b         (See tick
16950 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69 63  et #2339 and tic
16960 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d  ket [02a8e81d44]
16970 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20  )..**.**  (16)  
16980 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
16990 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
169a0 61 74 65 20 6f 72 20 74 68 65 20 73 75 62 71 75  ate or the subqu
169b0 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20  ery does.**     
169c0 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f     not contain O
169d0 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65  RDER BY.  (Ticke
169e0 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20 75  t #2942)  This u
169f0 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65  sed to not matte
16a00 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69  r.**        unti
16a10 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20  l we introduced 
16a20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  the group_concat
16a30 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a  () function.  .*
16a40 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65 20  *.**  (17)  The 
16a50 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74  sub-query is not
16a60 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
16a70 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20 55  ct, or it is a U
16a80 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20  NION ALL .**    
16a90 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61      compound cla
16aa0 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74 69  use made up enti
16ab0 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72  rely of non-aggr
16ac0 65 67 61 74 65 20 71 75 65 72 69 65 73 2c 20 61  egate queries, a
16ad0 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68  nd .**        th
16ae0 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a  e parent query:.
16af0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  **.**          *
16b00 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70   is not itself p
16b10 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  art of a compoun
16b20 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20  d select,.**    
16b30 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61        * is not a
16b40 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 44  n aggregate or D
16b50 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61  ISTINCT query, a
16b60 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  nd.**          *
16b70 20 68 61 73 20 6e 6f 20 6f 74 68 65 72 20 74 61   has no other ta
16b80 62 6c 65 73 20 6f 72 20 73 75 62 2d 73 65 6c 65  bles or sub-sele
16b90 63 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  cts in the FROM 
16ba0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
16bb0 20 20 20 20 20 54 68 65 20 70 61 72 65 6e 74 20       The parent 
16bc0 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20 6d 61  and sub-query ma
16bd0 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 20  y contain WHERE 
16be0 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65 63 74  clauses. Subject
16bf0 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72 75   to.**        ru
16c00 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29 20 61  les (11), (13) a
16c10 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20 6d 61  nd (14), they ma
16c20 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f  y also contain O
16c30 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20  RDER BY,.**     
16c40 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46     LIMIT and OFF
16c50 53 45 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  SET clauses..**.
16c60 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65  **  (18)  If the
16c70 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
16c80 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
16c90 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20   then all terms 
16ca0 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  of the.**       
16cb0 20 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73 65   ORDER by clause
16cc0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d   of the parent m
16cd0 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65  ust be simple re
16ce0 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20  ferences to .** 
16cf0 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f         columns o
16d00 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e  f the sub-query.
16d10 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68  .**.**  (19)  Th
16d20 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
16d30 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
16d40 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
16d50 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20   does not.**    
16d60 20 20 20 20 68 61 76 65 20 61 20 57 48 45 52 45      have a WHERE
16d70 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
16d80 28 32 30 29 20 20 49 66 20 74 68 65 20 73 75 62  (20)  If the sub
16d90 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
16da0 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
16db0 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73  n it must not us
16dc0 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f  e.**        an O
16dd0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
16de0 20 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20   Ticket #3773.  
16df0 57 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74  We could relax t
16e00 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  his constraint.*
16e10 2a 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61  *        somewha
16e20 74 20 62 79 20 73 61 79 69 6e 67 20 74 68 61 74  t by saying that
16e30 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68   the terms of th
16e40 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
16e50 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20  e must.**       
16e60 20 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64   appear as unmod
16e70 69 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c  ified result col
16e80 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65  umns in the oute
16e90 72 20 71 75 65 72 79 2e 20 20 42 75 74 0a 2a 2a  r query.  But.**
16ea0 20 20 20 20 20 20 20 20 68 61 76 65 20 6f 74 68          have oth
16eb0 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  er optimizations
16ec0 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c   in mind to deal
16ed0 20 77 69 74 68 20 74 68 61 74 20 63 61 73 65 2e   with that case.
16ee0 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54 68  .**.**  (21)  Th
16ef0 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
16f00 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
16f10 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
16f20 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20   is not.**      
16f30 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65    DISTINCT.  (Se
16f40 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36  e ticket [752e16
16f50 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e  46fc])..**.** In
16f60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74   this routine, t
16f70 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72  he "p" parameter
16f80 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
16f90 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
16fa0 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72  ..** The subquer
16fb0 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  y is p->pSrc->a[
16fc0 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69  iFrom].  isAgg i
16fd0 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75  s true if the ou
16fe0 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65  ter query.** use
16ff0 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64  s aggregates and
17000 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69   subqueryIsAgg i
17010 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75  s true if the su
17020 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
17030 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  egates..**.** If
17040 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e   flattening is n
17050 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68  ot attempted, th
17060 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
17070 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e  no-op and return
17080 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  s 0..** If flatt
17090 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
170a0 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
170b0 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
170c0 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
170d0 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
170e0 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
170f0 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
17100 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
17110 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
17120 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
17130 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
17140 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a  lattenSubquery(.
17150 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
17160 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
17170 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
17180 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
17190 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
171a0 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43  t or outer SELEC
171b0 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
171c0 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
171d0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
171e0 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f  n p->pSrc->a[] o
171f0 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71  f the inner subq
17200 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
17210 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Agg,           /
17220 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20  * True if outer 
17230 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72  SELECT uses aggr
17240 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
17250 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72  */.  int subquer
17260 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75  yIsAgg    /* Tru
17270 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
17280 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
17290 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b   functions */.){
172a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
172b0 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
172c0 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
172d0 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63  Context;.  Selec
172e0 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53 65  t *pParent;.  Se
172f0 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20  lect *pSub;     
17300 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71    /* The inner q
17310 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72  uery or "subquer
17320 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  y" */.  Select *
17330 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50  pSub1;      /* P
17340 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69  ointer to the ri
17350 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69  ghtmost select i
17360 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20  n sub-query */. 
17370 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
17380 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
17390 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
173a0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
173b0 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63  SrcList *pSubSrc
173c0 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
173d0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
173e0 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72  bquery */.  Expr
173f0 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
17400 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
17410 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  t of the outer q
17420 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50  uery */.  int iP
17430 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  arent;        /*
17440 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
17450 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20  ber of the pSub 
17460 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20  result set temp 
17470 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
17480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
17490 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
174a0 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
174b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
174c0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
174d0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
174e0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
174f0 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f  m *pSubitem;   /
17500 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a  * The subquery *
17510 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
17520 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
17530 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
17540 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   if flattening i
17550 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65  s permitted.  Re
17560 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20  turn 0 if not.. 
17570 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21   */.  assert( p!
17580 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
17590 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20  p->pPrior==0 ); 
175a0 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c   /* Unable to fl
175b0 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71  atten compound q
175c0 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 66 28 20  ueries */.  if( 
175d0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
175e0 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65  TE_QueryFlattene
175f0 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
17600 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
17610 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26    assert( pSrc &
17620 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46  & iFrom>=0 && iF
17630 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  rom<pSrc->nSrc )
17640 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26  ;.  pSubitem = &
17650 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a  pSrc->a[iFrom];.
17660 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62    iParent = pSub
17670 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  item->iCursor;. 
17680 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d   pSub = pSubitem
17690 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73  ->pSelect;.  ass
176a0 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a  ert( pSub!=0 );.
176b0 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73    if( isAgg && s
176c0 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72  ubqueryIsAgg ) r
176d0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
176e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
176f0 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a  riction (1)  */.
17700 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
17710 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72  Agg && pSrc->nSr
17720 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  c>1 ) return 0; 
17730 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
17740 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a  riction (2)  */.
17750 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
17760 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
17770 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f  ( pSubSrc );.  /
17780 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69  * Prior to versi
17790 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c  on 3.1.2, when L
177a0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
177b0 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65  had to be simple
177c0 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a   constants,.  **
177d0 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65   not arbitrary e
177e0 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77 65 20  xpresssions, we 
177f0 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d  allowed some com
17800 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20  bining of LIMIT 
17810 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
17820 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75  because they cou
17830 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61  ld be computed a
17840 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20  t compile-time. 
17850 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20   But when LIMIT 
17860 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
17870 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79  became arbitrary
17880 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65   expressions, we
17890 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20   were forced to 
178a0 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73  add restrictions
178b0 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28   (13).  ** and (
178c0 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53  14). */.  if( pS
178d0 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
178e0 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
178f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
17900 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
17910 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (13) */.  if( pS
17920 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65  ub->pOffset ) re
17930 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
17940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17950 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
17960 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d  (14) */.  if( p-
17970 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26 20 70  >pRightmost && p
17980 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
17990 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
179a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
179d0 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20  iction (15) */. 
179e0 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72 63   }.  if( pSubSrc
179f0 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75  ->nSrc==0 ) retu
17a00 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
17a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
17a20 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20  estriction (7)  
17a30 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73  */.  if( pSub->s
17a40 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
17a50 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30  tinct ) return 0
17a60 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
17a70 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20 20  estriction (5)  
17a80 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
17a90 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e  Limit && (pSrc->
17aa0 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29  nSrc>1 || isAgg)
17ab0 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
17ac0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
17ad0 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39  strictions (8)(9
17ae0 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28  ) */.  }.  if( (
17af0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
17b00 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 26 26  _Distinct)!=0 &&
17b10 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
17b20 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
17b30 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
17b40 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a  riction (6)  */.
17b50 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72    }.  if( p->pOr
17b60 64 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70  derBy && pSub->p
17b70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
17b80 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
17b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bb0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
17bc0 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20  on (11) */.  }. 
17bd0 20 69 66 28 20 69 73 41 67 67 20 26 26 20 70 53   if( isAgg && pS
17be0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72  ub->pOrderBy ) r
17bf0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
17c00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
17c10 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20  iction (16) */. 
17c20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
17c30 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29  t && p->pWhere )
17c40 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
17c50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
17c60 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20  iction (19) */. 
17c70 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
17c80 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  t && (p->selFlag
17c90 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
17ca0 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75  !=0 ){.     retu
17cb0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
17cc0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31   Restriction (21
17cd0 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  ) */.  }..  /* O
17ce0 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20  BSOLETE COMMENT 
17cf0 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74  1:.  ** Restrict
17d00 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73  ion 3:  If the s
17d10 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69  ubquery is a joi
17d20 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
17d30 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20   subquery is .  
17d40 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74  ** not used as t
17d50 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
17d60 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69   of an outer joi
17d70 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  n.  Examples of 
17d80 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73  why this.  ** is
17d90 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
17da0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
17db0 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
17dc0 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a  IN (t2 JOIN t3).
17dd0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
17de0 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
17df0 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
17e00 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
17e10 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
17e20 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74   JOIN t2) JOIN t
17e30 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63  3.  **.  ** whic
17e40 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20  h is not at all 
17e50 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a  the same thing..
17e60 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45    **.  ** OBSOLE
17e70 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20  TE COMMENT 2:.  
17e80 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  ** Restriction 1
17e90 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  2:  If the subqu
17ea0 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
17eb0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
17ec0 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f  ft outer.  ** jo
17ed0 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
17ee0 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e  e subquery has n
17ef0 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  o WHERE clause..
17f00 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73    ** An examples
17f10 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20   of why this is 
17f20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
17f30 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
17f40 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
17f50 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N (SELECT * FROM
17f60 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30   t2 WHERE t2.x>0
17f70 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
17f80 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
17f90 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
17fa0 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
17fb0 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
17fc0 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52  ER JOIN t2) WHER
17fd0 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20  E t2.x>0.  **.  
17fe0 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e  ** But the t2.x>
17ff0 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61  0 test will alwa
18000 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c  ys fail on a NUL
18010 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69  L row of t2, whi
18020 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76  ch.  ** effectiv
18030 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65  ely converts the
18040 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f   OUTER JOIN into
18050 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a   an INNER JOIN..
18060 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f    **.  ** THIS O
18070 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54  VERRIDES OBSOLET
18080 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44  E COMMENTS 1 AND
18090 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54   2 ABOVE:.  ** T
180a0 69 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77  icket #3300 show
180b0 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e  s that flattenin
180c0 67 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  g the right term
180d0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a   of a LEFT JOIN.
180e0 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20    ** is fraught 
180f0 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65  with danger.  Be
18100 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20  st to avoid the 
18110 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66  whole thing.  If
18120 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
18130 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
18140 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a  term of a LEFT J
18150 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  OIN, then do not
18160 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20   flatten..  */. 
18170 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e   if( (pSubitem->
18180 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
18190 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  TER)!=0 ){.    r
181a0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
181b0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  /* Restriction 1
181c0 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  7: If the sub-qu
181d0 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
181e0 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69  d SELECT, then i
181f0 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20  t must.  ** use 
18200 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41  only the UNION A
18210 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64  LL operator. And
18220 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d   none of the sim
18230 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69  ple select queri
18240 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b  es.  ** that mak
18250 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e  e up the compoun
18260 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c  d SELECT are all
18270 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65  owed to be aggre
18280 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74  gate or distinct
18290 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
182a0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
182b0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
182c0 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
182d0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
182e0 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74   0;  /* Restrict
182f0 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a  ion 20 */.    }.
18300 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c      if( isAgg ||
18310 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
18320 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
18330 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  || pSrc->nSrc!=1
18340 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
18350 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   0;.    }.    fo
18360 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53  r(pSub1=pSub; pS
18370 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31  ub1; pSub1=pSub1
18380 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
18390 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
183a0 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
183b0 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
183c0 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
183d0 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
183e0 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
183f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
18400 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
18410 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
18420 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20  regate );.      
18430 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  if( (pSub1->selF
18440 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
18450 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
18460 29 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ))!=0.       || 
18470 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26  (pSub1->pPrior &
18480 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f  & pSub1->op!=TK_
18490 41 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20  ALL) .       || 
184a0 4e 45 56 45 52 28 70 53 75 62 31 2d 3e 70 53 72  NEVER(pSub1->pSr
184b0 63 3d 3d 30 29 20 7c 7c 20 70 53 75 62 31 2d 3e  c==0) || pSub1->
184c0 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 0a 20 20  pSrc->nSrc!=1.  
184d0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72      ){.        r
184e0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
184f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
18500 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a  estriction 18. *
18510 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72  /.    if( p->pOr
18520 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69  derBy ){.      i
18530 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72  nt ii;.      for
18540 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72  (ii=0; ii<p->pOr
18550 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69  derBy->nExpr; ii
18560 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
18570 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b   p->pOrderBy->a[
18580 69 69 5d 2e 69 43 6f 6c 3d 3d 30 20 29 20 72 65  ii].iCol==0 ) re
18590 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
185a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a      }.  }..  /**
185b0 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20  *** If we reach 
185c0 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74  this point, flat
185d0 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
185e0 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f  ted. *****/..  /
185f0 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20  * Authorize the 
18600 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50  subquery */.  pP
18610 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
18620 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a  xt = pSubitem->z
18630 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 41  Name;.  sqlite3A
18640 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
18650 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
18660 30 2c 20 30 2c 20 30 29 3b 0a 20 20 70 50 61 72  0, 0, 0);.  pPar
18670 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
18680 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e   = zSavedAuthCon
18690 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  text;..  /* If t
186a0 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
186b0 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
186c0 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  T statement, the
186d0 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69 6f  n (by restrictio
186e0 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31  ns.  ** 17 and 1
186f0 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74  8 above) it must
18700 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   be a UNION ALL 
18710 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 71  and the parent q
18720 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20  uery must .  ** 
18730 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  be of the form:.
18740 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
18750 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e  LECT <expr-list>
18760 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72   FROM (<sub-quer
18770 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73  y>) <where-claus
18780 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f  e> .  **.  ** fo
18790 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52  llowed by any OR
187a0 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e  DER BY, LIMIT an
187b0 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75  d/or OFFSET clau
187c0 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a  ses. This block.
187d0 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31    ** creates N-1
187e0 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
187f0 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68  arent query with
18800 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59  out any ORDER BY
18810 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a  , LIMIT or .  **
18820 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20   OFFSET clauses 
18830 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74  and joins them t
18840 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d  o the left-hand-
18850 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67  side of the orig
18860 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20  inal.  ** using 
18870 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
18880 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ors. In this cas
18890 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
188a0 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a  r of simple.  **
188b0 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
188c0 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75  ts in the compou
188d0 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20  nd sub-query..  
188e0 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  **.  ** Example:
188f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
18900 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28  ELECT a+1 FROM (
18910 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
18920 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20  ECT x FROM tab. 
18930 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e   **        UNION
18940 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20   ALL.  **       
18950 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74   SELECT y FROM t
18960 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
18970 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
18980 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
18990 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20  z*2) FROM tab2. 
189a0 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45 20   **     ) WHERE 
189b0 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a  a!=5 ORDER BY 1.
189c0 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66    **.  ** Transf
189d0 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a  ormed into:.  **
189e0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
189f0 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48   x+1 FROM tab WH
18a00 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20  ERE x+1!=5.  ** 
18a10 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
18a20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b  **     SELECT y+
18a30 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45  1 FROM tab WHERE
18a40 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20   y+1!=5.  **    
18a50 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
18a60 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a      SELECT abs(z
18a70 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20  *2)+1 FROM tab2 
18a80 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31  WHERE abs(z*2)+1
18a90 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44  !=5.  **     ORD
18aa0 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a  ER BY 1.  **.  *
18ab0 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74  * We call this t
18ac0 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  he "compound-sub
18ad0 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  query flattening
18ae0 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53  "..  */.  for(pS
18af0 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b  ub=pSub->pPrior;
18b00 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62   pSub; pSub=pSub
18b10 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53  ->pPrior){.    S
18b20 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20  elect *pNew;.   
18b30 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
18b40 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
18b50 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69  y;.    Expr *pLi
18b60 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
18b70 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72  .    Select *pPr
18b80 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
18b90 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
18ba0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72   = 0;.    p->pSr
18bb0 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50  c = 0;.    p->pP
18bc0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rior = 0;.    p-
18bd0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
18be0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53   pNew = sqlite3S
18bf0 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20  electDup(db, p, 
18c00 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69  0);.    p->pLimi
18c10 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
18c20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
18c30 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70  rderBy;.    p->p
18c40 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
18c50 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a  p->op = TK_ALL;.
18c60 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73      p->pRightmos
18c70 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  t = 0;.    if( p
18c80 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
18c90 70 4e 65 77 20 3d 20 70 50 72 69 6f 72 3b 0a 20  pNew = pPrior;. 
18ca0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18cb0 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70  pNew->pPrior = p
18cc0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 4e 65  Prior;.      pNe
18cd0 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  w->pRightmost = 
18ce0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  0;.    }.    p->
18cf0 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20  pPrior = pNew;. 
18d00 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
18d10 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
18d20 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65   1;.  }..  /* Be
18d30 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74  gin flattening t
18d40 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72  he iFrom-th entr
18d50 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
18d60 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68  ause .  ** in th
18d70 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
18d80 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75   */.  pSub = pSu
18d90 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  b1 = pSubitem->p
18da0 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65  Select;..  /* De
18db0 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69 65  lete the transie
18dc0 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
18dd0 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  re associated wi
18de0 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
18df0 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
18e00 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
18e10 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
18e20 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
18e30 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
18e40 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
18e50 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
18e60 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ubitem->zAlias);
18e70 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  .  pSubitem->zDa
18e80 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53  tabase = 0;.  pS
18e90 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ubitem->zName = 
18ea0 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  0;.  pSubitem->z
18eb0 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75  Alias = 0;.  pSu
18ec0 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  bitem->pSelect =
18ed0 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20   0;..  /* Defer 
18ee0 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62  deleting the Tab
18ef0 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  le object associ
18f00 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
18f10 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74 69  ** subquery unti
18f20 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  l code generatio
18f30 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65  n is.  ** comple
18f40 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20  te, since there 
18f50 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20  may still exist 
18f60 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65  Expr.pTab entrie
18f70 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65  s that.  ** refe
18f80 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  r to the subquer
18f90 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61  y even after fla
18fa0 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74  ttening.  Ticket
18fb0 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a   #3346..  **.  *
18fc0 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  * pSubitem->pTab
18fd0 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e   is always non-N
18fe0 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73 74  ULL by test rest
18ff0 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73  rictions and tes
19000 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20  ts above..  */. 
19010 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75 62   if( ALWAYS(pSub
19020 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29  item->pTab!=0) )
19030 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
19040 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65  bToDel = pSubite
19050 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
19060 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
19070 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72  ==1 ){.      Par
19080 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
19090 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
190a0 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
190b0 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70      pTabToDel->p
190c0 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f  NextZombie = pTo
190d0 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
190e0 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65  ab;.      pTople
190f0 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20  vel->pZombieTab 
19100 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20  = pTabToDel;.   
19110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
19120 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b  abToDel->nRef--;
19130 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69  .    }.    pSubi
19140 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  tem->pTab = 0;. 
19150 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
19160 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73  lowing loop runs
19170 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
19180 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  erm in a compoun
19190 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d-subquery.  ** 
191a0 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64  flattening (as d
191b0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e  escribed above).
191c0 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e    If we are doin
191d0 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69  g a different ki
191e0 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74  nd.  ** of flatt
191f0 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65  ening - a flatte
19200 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  ning other than 
19210 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  a compound-subqu
19220 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d  ery flattening -
19230 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  .  ** then this 
19240 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f  loop only runs o
19250 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
19260 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61  his loop moves a
19270 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65  ll of the FROM e
19280 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
19290 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
192a0 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
192b0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
192c0 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
192d0 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
192e0 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20  member.  ** the 
192f0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
19300 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
19310 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
19320 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20  element in.  ** 
19330 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50  iParent.  The iP
19340 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c  arent cursor wil
19350 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  l never be used.
19360 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64    Subsequent cod
19370 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e  e.  ** will scan
19380 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
19390 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
193a0 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
193b0 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f  replace.  ** tho
193c0 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  se references wi
193d0 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  th expressions t
193e0 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74  hat resolve to t
193f0 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  he subquery FROM
19400 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77  .  ** elements w
19410 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
19420 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  g in..  */.  for
19430 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72  (pParent=p; pPar
19440 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61  ent; pParent=pPa
19450 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53  rent->pPrior, pS
19460 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
19470 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72  {.    int nSubSr
19480 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79  c;.    u8 jointy
19490 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  pe = 0;.    pSub
194a0 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
194b0 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
194c0 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
194d0 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20   */.    nSubSrc 
194e0 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b  = pSubSrc->nSrc;
194f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
19500 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79  erms in subquery
19510 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
19520 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
19530 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  nt->pSrc;     /*
19540 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
19550 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
19560 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  */..    if( pSrc
19570 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
19580 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20  ( pParent==p ); 
19590 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74   /* First time t
195a0 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
195b0 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  */.      jointyp
195c0 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f  e = pSubitem->jo
195d0 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73  intype;.    }els
195e0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
195f0 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20   pParent!=p );  
19600 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65  /* 2nd and subse
19610 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f  quent times thro
19620 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
19630 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50 61        pSrc = pPa
19640 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c  rent->pSrc = sql
19650 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
19660 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d(db, 0, 0, 0);.
19670 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d        if( pSrc==
19680 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
19690 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
196a0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
196b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
196c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
196d0 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
196e0 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66  a single slot of
196f0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19700 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20   of the outer.  
19710 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20    ** query.  If 
19720 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
19730 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65   more than one e
19740 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52  lement in its FR
19750 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a  OM clause,.    *
19760 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68  * then expand th
19770 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f  e outer query to
19780 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20   make space for 
19790 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65  it to hold all e
197a0 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f  lements.    ** o
197b0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
197c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
197d0 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
197e0 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a    **    SELECT *
197f0 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c   FROM tabA, (SEL
19800 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c  ECT * FROM sub1,
19810 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20   sub2), tabB;.  
19820 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
19830 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20  outer query has 
19840 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46  3 slots in its F
19850 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65  ROM clause.  One
19860 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20   slot of the.   
19870 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
19880 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74  (the middle slot
19890 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  ) is used by the
198a0 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20   subquery.  The 
198b0 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63  next.    ** bloc
198c0 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65  k of code will e
198d0 78 70 61 6e 64 20 74 68 65 20 6f 75 74 20 71 75  xpand the out qu
198e0 65 72 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20  ery to 4 slots. 
198f0 20 54 68 65 20 6d 69 64 64 6c 65 0a 20 20 20 20   The middle.    
19900 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e  ** slot is expan
19910 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73  ded to two slots
19920 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
19930 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 0a  e space for the.
19940 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65      ** two eleme
19950 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  nts in the FROM 
19960 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
19970 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  bquery..    */. 
19980 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
19990 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
199a0 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d  t->pSrc = pSrc =
199b0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
199c0 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c  nlarge(db, pSrc,
199d0 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d   nSubSrc-1,iFrom
199e0 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  +1);.      if( d
199f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19a00 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
19a10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19a20 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  .    /* Transfer
19a30 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19a40 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
19a50 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
19a60 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
19a70 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
19a80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
19a90 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
19aa0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
19ab0 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61  lete(db, pSrc->a
19ac0 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67  [i+iFrom].pUsing
19ad0 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  );.      pSrc->a
19ae0 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
19af0 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
19b00 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
19b10 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
19b20 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
19b30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
19b40 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e  c->a[iFrom].join
19b50 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
19b60 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62  .  .    /* Now b
19b70 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
19b80 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
19b90 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
19ba0 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65  s for .    ** re
19bb0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
19bc0 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
19bd0 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
19be0 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70  ** .    ** Examp
19bf0 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
19c00 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
19c10 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
19c20 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
19c30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
19c40 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a  HERE a>b;.    **
19c50 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
19c60 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
19c70 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
19c80 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
19c90 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20        /.    **  
19ca0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
19cb0 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
19cc0 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
19cd0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
19ce0 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ___/.    **.    
19cf0 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
19d00 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
19d10 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
19d20 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
19d30 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20  e we see.    ** 
19d40 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "a" we substitut
19d50 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72  e "x*3" and ever
19d60 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22  y place we see "
19d70 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  b" we substitute
19d80 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a   "y+10"..    */.
19d90 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72      pList = pPar
19da0 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ent->pEList;.   
19db0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
19dc0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
19dd0 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
19de0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29  >a[i].zName==0 )
19df0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
19e00 63 68 61 72 20 2a 7a 53 70 61 6e 20 3d 20 70 4c  char *zSpan = pL
19e10 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b  ist->a[i].zSpan;
19e20 0a 20 20 20 20 20 20 20 20 69 66 28 20 41 4c 57  .        if( ALW
19e30 41 59 53 28 7a 53 70 61 6e 29 20 29 7b 0a 20 20  AYS(zSpan) ){.  
19e40 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61          pList->a
19e50 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
19e60 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
19e70 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20  zSpan);.        
19e80 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
19e90 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
19ea0 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  t(db, pParent->p
19eb0 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20  EList, iParent, 
19ec0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
19ed0 20 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a     if( isAgg ){.
19ee0 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
19ef0 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
19f00 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65  >pGroupBy, iPare
19f10 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
19f20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
19f30 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73  ->pHaving = subs
19f40 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e  tExpr(db, pParen
19f50 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72  t->pHaving, iPar
19f60 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
19f70 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
19f80 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
19f90 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
19fa0 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65  ( pParent->pOrde
19fb0 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
19fc0 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
19fd0 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  y = pSub->pOrder
19fe0 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  By;.      pSub->
19ff0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1a000 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72    }else if( pPar
1a010 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ent->pOrderBy ){
1a020 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
1a030 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
1a040 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72  ->pOrderBy, iPar
1a050 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
1a060 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
1a070 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29  ( pSub->pWhere )
1a080 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d  {.      pWhere =
1a090 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
1a0a0 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65  db, pSub->pWhere
1a0b0 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1a0c0 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20  .      pWhere = 
1a0d0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
1a0e0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
1a0f0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1a100 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1a110 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
1a120 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
1a130 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b  pParent->pWhere;
1a140 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1a150 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
1a160 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1a170 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45  pHaving = substE
1a180 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  xpr(db, pParent-
1a190 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e  >pHaving, iParen
1a1a0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1a1b0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1a1c0 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
1a1d0 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50  e3ExprAnd(db, pP
1a1e0 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20  arent->pHaving, 
1a1f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a210 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
1a220 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76  p(db, pSub->pHav
1a230 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  ing, 0));.      
1a240 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
1a250 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
1a260 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1a270 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
1a280 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
1a290 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c   pSub->pGroupBy,
1a2a0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1a2b0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1a2c0 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70  Where = substExp
1a2d0 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  r(db, pParent->p
1a2e0 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20  Where, iParent, 
1a2f0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
1a300 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
1a310 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
1a320 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e  prAnd(db, pParen
1a330 74 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72  t->pWhere, pWher
1a340 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  e);.    }.  .   
1a350 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65   /* The flattene
1a360 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  d query is disti
1a370 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68  nct if either th
1a380 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20  e inner or the. 
1a390 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
1a3a0 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a  y is distinct. .
1a3b0 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65      */.    pPare
1a3c0 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  nt->selFlags |= 
1a3d0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1a3e0 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20   SF_Distinct;.  
1a3f0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
1a400 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28  ELECT ... FROM (
1a410 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54  SELECT ... LIMIT
1a420 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d   a OFFSET b) LIM
1a430 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20  IT x OFFSET y;. 
1a440 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65     **.    ** One
1a450 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74   is tempted to t
1a460 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20  ry to add a and 
1a470 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65  b to combine the
1a480 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68   limits.  But th
1a490 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e  is.    ** does n
1a4a0 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65  ot work if eithe
1a4b0 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74  r limit is negat
1a4c0 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ive..    */.    
1a4d0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1a4e0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
1a4f0 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62  t->pLimit = pSub
1a500 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
1a510 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pSub->pLimit = 0
1a520 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1a530 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65  * Finially, dele
1a540 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20  te what is left 
1a550 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1a560 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  and return.  ** 
1a570 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  success..  */.  
1a580 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
1a590 65 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a  ete(db, pSub1);.
1a5a0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
1a5b0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
1a5c0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
1a5d0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
1a5e0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1a5f0 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  VIEW) */../*.** 
1a600 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45  Analyze the SELE
1a610 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  CT statement pas
1a620 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
1a630 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a  nt to see if it.
1a640 2a 2a 20 69 73 20 61 20 6d 69 6e 28 29 20 6f 72  ** is a min() or
1a650 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 52 65   max() query. Re
1a660 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  turn WHERE_ORDER
1a670 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f  BY_MIN or WHERE_
1a680 4f 52 44 45 52 42 59 5f 4d 41 58 20 69 66 20 0a  ORDERBY_MAX if .
1a690 2a 2a 20 69 74 20 69 73 2c 20 6f 72 20 30 20 6f  ** it is, or 0 o
1a6a0 74 68 65 72 77 69 73 65 2e 20 41 74 20 70 72 65  therwise. At pre
1a6b0 73 65 6e 74 2c 20 61 20 71 75 65 72 79 20 69 73  sent, a query is
1a6c0 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
1a6d0 65 0a 2a 2a 20 61 20 6d 69 6e 28 29 2f 6d 61 78  e.** a min()/max
1a6e0 28 29 20 71 75 65 72 79 20 69 66 3a 0a 2a 2a 0a  () query if:.**.
1a6f0 2a 2a 20 20 20 31 2e 20 54 68 65 72 65 20 69 73  **   1. There is
1a700 20 61 20 73 69 6e 67 6c 65 20 6f 62 6a 65 63 74   a single object
1a710 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1a720 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20  use..**.**   2. 
1a730 54 68 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c  There is a singl
1a740 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  e expression in 
1a750 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
1a760 61 6e 64 20 69 74 20 69 73 0a 2a 2a 20 20 20 20  and it is.**    
1a770 20 20 65 69 74 68 65 72 20 6d 69 6e 28 78 29 20    either min(x) 
1a780 6f 72 20 6d 61 78 28 78 29 2c 20 77 68 65 72 65  or max(x), where
1a790 20 78 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72   x is a column r
1a7a0 65 66 65 72 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  eference..*/.sta
1a7b0 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65  tic u8 minMaxQue
1a7c0 72 79 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  ry(Select *p){. 
1a7d0 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
1a7e0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
1a7f0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20   = p->pEList;.. 
1a800 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
1a810 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 57  pr!=1 ) return W
1a820 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
1a830 4d 41 4c 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  MAL;.  pExpr = p
1a840 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
1a850 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  r;.  if( pExpr->
1a860 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
1a870 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
1a880 20 20 69 66 28 20 4e 45 56 45 52 28 45 78 70 72    if( NEVER(Expr
1a890 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1a8a0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1a8b0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
1a8c0 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
1a8d0 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  x.pList;.  if( p
1a8e0 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69  EList==0 || pELi
1a8f0 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
1a900 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
1a910 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
1a920 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  r->op!=TK_AGG_CO
1a930 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 57 48  LUMN ) return WH
1a940 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
1a950 41 4c 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  AL;.  assert( !E
1a960 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1a970 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1a980 65 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  e) );.  if( sqli
1a990 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72  te3StrICmp(pExpr
1a9a0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 69 6e 22  ->u.zToken,"min"
1a9b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
1a9c0 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  rn WHERE_ORDERBY
1a9d0 5f 4d 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _MIN;.  }else if
1a9e0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1a9f0 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
1aa00 2c 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20  ,"max")==0 ){.  
1aa10 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f    return WHERE_O
1aa20 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 7d 0a  RDERBY_MAX;.  }.
1aa30 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f    return WHERE_O
1aa40 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d  RDERBY_NORMAL;.}
1aa50 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
1aa60 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
1aa70 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
1aa80 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
1aa90 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
1aaa0 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
1aab0 72 67 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73  rgment is the as
1aac0 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61  sociated aggrega
1aad0 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20  te-info object. 
1aae0 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
1aaf0 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53  n tests if the S
1ab00 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20  ELECT is of the 
1ab10 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  form:.**.**   SE
1ab20 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1ab30 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77  OM <tbl>.**.** w
1ab40 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20  here table is a 
1ab50 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20  database table, 
1ab60 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74  not a sub-select
1ab70 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65   or view. If the
1ab80 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d   query.** does m
1ab90 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72  atch this patter
1aba0 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  n, then a pointe
1abb0 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f  r to the Table o
1abc0 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69  bject representi
1abd0 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72  ng.** <tbl> is r
1abe0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
1abf0 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
1ac00 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62  d..*/.static Tab
1ac10 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e  le *isSimpleCoun
1ac20 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67  t(Select *p, Agg
1ac30 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
1ac40 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
1ac50 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a    Expr *pExpr;..
1ac60 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47    assert( !p->pG
1ac70 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28  roupBy );..  if(
1ac80 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d   p->pWhere || p-
1ac90 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
1aca0 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63  1 .   || p->pSrc
1acb0 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e  ->nSrc!=1 || p->
1acc0 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
1acd0 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  ct.  ){.    retu
1ace0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
1acf0 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
1ad00 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d  .pTab;.  pExpr =
1ad10 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
1ad20 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  .pExpr;.  assert
1ad30 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d  ( pTab && !pTab-
1ad40 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70  >pSelect && pExp
1ad50 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69  r );..  if( IsVi
1ad60 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
1ad70 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
1ad80 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
1ad90 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
1ada0 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67  n 0;.  if( (pAgg
1adb0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70  Info->aFunc[0].p
1adc0 46 75 6e 63 2d 3e 66 6c 61 67 73 26 53 51 4c 49  Func->flags&SQLI
1add0 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d  TE_FUNC_COUNT)==
1ade0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1adf0 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
1ae00 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72  &EP_Distinct ) r
1ae10 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75  eturn 0;..  retu
1ae20 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
1ae30 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d  * If the source-
1ae40 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64  list item passed
1ae50 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
1ae60 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69  was augmented wi
1ae70 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44  th an.** INDEXED
1ae80 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
1ae90 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74   try to locate t
1aea0 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64  he specified ind
1aeb0 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  ex. If there.** 
1aec0 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73  was such a claus
1aed0 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20  e and the named 
1aee0 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20  index cannot be 
1aef0 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a  found, return .*
1af00 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61  * SQLITE_ERROR a
1af10 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  nd leave an erro
1af20 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68  r in pParse. Oth
1af30 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65  erwise, populate
1af40 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64   .** pFrom->pInd
1af50 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ex and return SQ
1af60 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
1af70 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
1af80 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50  Lookup(Parse *pP
1af90 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63  arse, struct Src
1afa0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
1afb0 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  ){.  if( pFrom->
1afc0 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a  pTab && pFrom->z
1afd0 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 54 61 62  Index ){.    Tab
1afe0 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
1aff0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72  ->pTab;.    char
1b000 20 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72 6f 6d   *zIndex = pFrom
1b010 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20 49 6e  ->zIndex;.    In
1b020 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66  dex *pIdx;.    f
1b030 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
1b040 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70  ndex; .        p
1b050 49 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74  Idx && sqlite3St
1b060 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d  rICmp(pIdx->zNam
1b070 65 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20 20 20  e, zIndex); .   
1b080 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e       pIdx=pIdx->
1b090 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20  pNext.    );.   
1b0a0 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20   if( !pIdx ){.  
1b0b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1b0c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
1b0d0 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c  such index: %s",
1b0e0 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20   zIndex, 0);.   
1b0f0 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
1b100 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
1b110 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b120 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
1b130 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d   pFrom->pIndex =
1b140 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74   pIdx;.  }.  ret
1b150 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1b160 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1b170 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72  tine is a Walker
1b180 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65   callback for "e
1b190 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45  xpanding" a SELE
1b1a0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
1b1b0 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61   "Expanding" mea
1b1c0 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c  ns to do the fol
1b1d0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
1b1e0 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20   (1)  Make sure 
1b1f0 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
1b200 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
1b210 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a  signed to every.
1b220 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65  **         eleme
1b230 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  nt of the FROM c
1b240 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lause..**.**    
1b250 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  (2)  Fill in the
1b260 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
1b270 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68  Tab fields in th
1b280 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a  e SrcList that .
1b290 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e  **         defin
1b2a0 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  es FROM clause. 
1b2b0 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65   When views appe
1b2c0 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ar in the FROM c
1b2d0 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20  lause,.**       
1b2e0 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d    fill pTabList-
1b2f0 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74  >a[].pSelect wit
1b300 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
1b310 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1b320 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74  .**         that
1b330 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
1b340 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73  view.  A copy is
1b350 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65   made of the vie
1b360 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20  w's SELECT.**   
1b370 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20        statement 
1b380 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66  so that we can f
1b390 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20  reely modify or 
1b3a0 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74  delete that stat
1b3b0 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
1b3c0 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e   without worryin
1b3d0 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20  g about messing 
1b3e0 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65 6e  up the presisten
1b3f0 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
1b400 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74  .**         of t
1b410 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20  he view..**.**  
1b420 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73    (3)  Add terms
1b430 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
1b440 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61  ause to accomoda
1b450 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  te the NATURAL k
1b460 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20  eyword.**       
1b470 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74    on joins and t
1b480 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
1b490 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e  clause of joins.
1b4a0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53  .**.**    (4)  S
1b4b0 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  can the list of 
1b4c0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
1b4d0 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73  esult set (pELis
1b4e0 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20  t) looking.**   
1b4f0 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e        for instan
1b500 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f  ces of the "*" o
1b510 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54  perator or the T
1b520 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e  ABLE.* operator.
1b530 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66  .**         If f
1b540 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63  ound, expand eac
1b550 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72  h "*" to be ever
1b560 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72  y column in ever
1b570 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  y table.**      
1b580 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74     and TABLE.* t
1b590 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
1b5a0 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  n in TABLE..**.*
1b5b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
1b5c0 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b  ectExpander(Walk
1b5d0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
1b5e0 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
1b5f0 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
1b600 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e  er->pParse;.  in
1b610 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63  t i, j, k;.  Src
1b620 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
1b630 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
1b640 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
1b650 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
1b660 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1b670 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
1b680 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1b690 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65  ailed  ){.    re
1b6a0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
1b6b0 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28    }.  if( NEVER(
1b6c0 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28  p->pSrc==0) || (
1b6d0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1b6e0 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b  _Expanded)!=0 ){
1b6f0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
1b700 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Prune;.  }.  p->
1b710 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45  selFlags |= SF_E
1b720 78 70 61 6e 64 65 64 3b 0a 20 20 70 54 61 62 4c  xpanded;.  pTabL
1b730 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
1b740 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
1b750 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ist;..  /* Make 
1b760 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  sure cursor numb
1b770 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
1b780 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e  signed to all en
1b790 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68  tries in.  ** th
1b7a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1b7b0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
1b7c0 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  ement..  */.  sq
1b7d0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
1b7e0 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
1b7f0 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20  , pTabList);..  
1b800 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79  /* Look up every
1b810 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20   table named in 
1b820 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1b830 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20  of the select.  
1b840 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79  If.  ** an entry
1b850 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1b860 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72  use is a subquer
1b870 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74  y instead of a t
1b880 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20  able or view,.  
1b890 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  ** then create a
1b8a0 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
1b8b0 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65   structure to de
1b8c0 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75  scribe the subqu
1b8d0 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
1b8e0 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
1b8f0 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
1b900 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
1b910 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62  From++){.    Tab
1b920 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69 66  le *pTab;.    if
1b930 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30  ( pFrom->pTab!=0
1b940 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
1b950 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20  s statement has 
1b960 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65  already been pre
1b970 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69 73  pared.  There is
1b980 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a   no need.      *
1b990 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e  * to go further.
1b9a0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1b9b0 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( i==0 );.      
1b9c0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
1b9d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b9e0 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pFrom->zName==0 
1b9f0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1ba00 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1ba10 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
1ba20 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  el = pFrom->pSel
1ba30 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20  ect;.      /* A 
1ba40 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
1ba50 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1ba60 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
1ba70 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d    assert( pSel!=
1ba80 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1ba90 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
1baa0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1bab0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
1bac0 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20  lker, pSel);.   
1bad0 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
1bae0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44   pTab = sqlite3D
1baf0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
1bb00 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
1bb10 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
1bb20 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
1bb30 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62  bort;.      pTab
1bb40 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
1bb50 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
1bb60 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
1bb70 62 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75  b, "sqlite_subqu
1bb80 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a  ery_%p_", (void*
1bb90 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68  )pTab);.      wh
1bba0 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
1bbb0 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c  r ){ pSel = pSel
1bbc0 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20  ->pPrior; }.    
1bbd0 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46    selectColumnsF
1bbe0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
1bbf0 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  se, pSel->pEList
1bc00 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
1bc10 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
1bc20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
1bc30 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d   -1;.      pTab-
1bc40 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30 30 30 30  >nRowEst = 10000
1bc50 30 30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  00;.      pTab->
1bc60 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
1bc70 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66  phemeral;.#endif
1bc80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bc90 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
1bca0 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
1bcb0 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
1bcc0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
1bcd0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
1bce0 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
1bcf0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
1bd00 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71  ab = .        sq
1bd10 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
1bd20 28 70 50 61 72 73 65 2c 30 2c 70 46 72 6f 6d 2d  (pParse,0,pFrom-
1bd30 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44  >zName,pFrom->zD
1bd40 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20  atabase);.      
1bd50 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
1bd60 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
1bd70 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
1bd80 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ++;.#if !defined
1bd90 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1bda0 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28  W) || !defined (
1bdb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1bdc0 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20  UALTABLE).      
1bdd0 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
1bde0 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70  t || IsVirtual(p
1bdf0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
1be00 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65  /* We reach here
1be10 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   if the named ta
1be20 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20  ble is a really 
1be30 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  a view */.      
1be40 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65    if( sqlite3Vie
1be50 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
1be60 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 20  pParse, pTab) ) 
1be70 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1be80 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1be90 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
1bea0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
1beb0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  From->pSelect = 
1bec0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
1bed0 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65  (db, pTab->pSele
1bee0 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ct, 0);.        
1bef0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
1bf00 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d  t(pWalker, pFrom
1bf10 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
1bf20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
1bf30 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20  ..    /* Locate 
1bf40 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20  the index named 
1bf50 62 79 20 74 68 65 20 49 4e 44 45 58 45 44 20 42  by the INDEXED B
1bf60 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79  Y clause, if any
1bf70 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  . */.    if( sql
1bf80 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f  ite3IndexedByLoo
1bf90 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f  kup(pParse, pFro
1bfa0 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  m) ){.      retu
1bfb0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
1bfc0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
1bfd0 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65  ocess NATURAL ke
1bfe0 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61  ywords, and ON a
1bff0 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
1c000 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a   of joins..  */.
1c010 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1c020 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65  Failed || sqlite
1c030 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72  ProcessJoin(pPar
1c040 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65  se, p) ){.    re
1c050 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
1c060 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76    }..  /* For ev
1c070 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63  ery "*" that occ
1c080 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  urs in the colum
1c090 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74  n list, insert t
1c0a0 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a  he names of.  **
1c0b0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
1c0c0 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64  all tables.  And
1c0d0 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45   for every TABLE
1c0e0 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  .* insert the na
1c0f0 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  mes.  ** of all 
1c100 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45  columns in TABLE
1c110 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
1c120 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c  serted a special
1c130 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
1c140 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c   with the TK_ALL
1c150 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61   operator for ea
1c160 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66  ch "*" that it f
1c170 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ound in the colu
1c180 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68  mn list..  ** Th
1c190 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
1c1a0 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63   just has to loc
1c1b0 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65  ate the TK_ALL e
1c1c0 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65  xpressions and e
1c1d0 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20  xpand.  ** each 
1c1e0 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
1c1f0 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
1c200 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20  n all tables..  
1c210 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
1c220 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63  t loop just chec
1c230 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
1c240 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f  re are any "*" o
1c250 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68  perators.  ** th
1c260 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e  at need expandin
1c270 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  g..  */.  for(k=
1c280 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
1c290 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; k++){.    Ex
1c2a0 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d  pr *pE = pEList-
1c2b0 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[k].pExpr;.   
1c2c0 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
1c2d0 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ALL ) break;.   
1c2e0 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
1c2f0 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70  =TK_DOT || pE->p
1c300 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
1c310 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
1c320 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70  TK_DOT || (pE->p
1c330 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70  Left!=0 && pE->p
1c340 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29  Left->op==TK_ID)
1c350 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e   );.    if( pE->
1c360 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
1c370 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
1c380 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
1c390 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  }.  if( k<pEList
1c3a0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
1c3b0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
1c3c0 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
1c3d0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
1c3e0 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
1c3f0 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
1c400 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
1c410 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
1c420 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
1c430 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
1c440 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
1c450 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
1c460 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
1c470 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
1c480 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1c490 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
1c4a0 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
1c4b0 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
1c4c0 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
1c4d0 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
1c4e0 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61  ;.    int longNa
1c4f0 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53  mes = (flags & S
1c500 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
1c510 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  es)!=0.         
1c520 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
1c530 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1c540 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d  ShortColNames)==
1c550 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b  0;..    for(k=0;
1c560 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
1c570 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; k++){.      Ex
1c580 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45  pr *pE = a[k].pE
1c590 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
1c5a0 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
1c5b0 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21  T || pE->pRight!
1c5c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
1c5d0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26  pE->op!=TK_ALL &
1c5e0 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  & (pE->op!=TK_DO
1c5f0 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d  T || pE->pRight-
1c600 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a  >op!=TK_ALL) ){.
1c610 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
1c620 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65  particular expre
1c630 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e  ssion does not n
1c640 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
1c650 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
1c660 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
1c670 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
1c680 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77  end(pParse, pNew
1c690 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20  , a[k].pExpr);. 
1c6a0 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
1c6b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
1c6c0 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
1c6d0 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d  -1].zName = a[k]
1c6e0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
1c6f0 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
1c700 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d  nExpr-1].zSpan =
1c710 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20   a[k].zSpan;.   
1c720 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d         a[k].zNam
1c730 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
1c740 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b   a[k].zSpan = 0;
1c750 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c760 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20     a[k].pExpr = 
1c770 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
1c780 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
1c790 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
1c7a0 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e  "*" or a "TABLE.
1c7b0 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  *" and needs to 
1c7c0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78  be.        ** ex
1c7d0 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20  panded. */.     
1c7e0 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e     int tableSeen
1c7f0 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65   = 0;      /* Se
1c800 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c  t to 1 when TABL
1c810 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20  E matches */.   
1c820 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d       char *zTNam
1c830 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1c840 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66   text of name of
1c850 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20   TABLE */.      
1c860 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
1c870 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20  _DOT ){.        
1c880 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c    assert( pE->pL
1c890 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  eft!=0 );.      
1c8a0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1c8b0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d  rHasProperty(pE-
1c8c0 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61  >pLeft, EP_IntVa
1c8d0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
1c8e0 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70    zTName = pE->p
1c8f0 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Left->u.zToken;.
1c900 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1c910 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
1c920 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
1c930 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20         for(i=0, 
1c940 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
1c950 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
1c960 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
1c970 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61  +){.          Ta
1c980 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
1c990 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  m->pTab;.       
1c9a0 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
1c9b0 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  e = pFrom->zAlia
1c9c0 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  s;.          if(
1c9d0 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a   zTabName==0 ){.
1c9e0 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
1c9f0 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
1ca00 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  me;.          }.
1ca10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62            if( db
1ca20 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1ca30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1ca40 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
1ca50 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1ca60 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29  TName, zTabName)
1ca70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
1ca80 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1ca90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1caa0 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31     tableSeen = 1
1cab0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
1cac0 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
1cad0 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
1cae0 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
1caf0 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20  , *pRight;.     
1cb00 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
1cb10 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
1cb20 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
1cb30 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
1cb40 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f  name;  /* The co
1cb50 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
1cb60 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  me */.          
1cb70 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b    char *zToFree;
1cb80 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73     /* Malloced s
1cb90 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73  tring that needs
1cba0 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1cbb0 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65              Toke
1cbc0 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20  n sColname;  /* 
1cbd0 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  Computed column 
1cbe0 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20  name as a token 
1cbf0 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  */..            
1cc00 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69  /* If a column i
1cc10 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64  s marked as 'hid
1cc20 64 65 6e 27 20 28 63 75 72 72 65 6e 74 6c 79 20  den' (currently 
1cc30 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20 20  only possible.  
1cc40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72            ** for
1cc50 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 29   virtual tables)
1cc60 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65  , do not include
1cc70 20 69 74 20 69 6e 20 74 68 65 20 65 78 70 61 6e   it in the expan
1cc80 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ded.            
1cc90 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69  ** result-set li
1cca0 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  st..            
1ccb0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
1ccc0 66 28 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d  f( IsHiddenColum
1ccd0 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  n(&pTab->aCol[j]
1cce0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1ccf0 20 20 20 61 73 73 65 72 74 28 49 73 56 69 72 74     assert(IsVirt
1cd00 75 61 6c 28 70 54 61 62 29 29 3b 0a 20 20 20 20  ual(pTab));.    
1cd10 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1cd20 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
1cd30 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  }..            i
1cd40 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65  f( i>0 && zTName
1cd50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1cd60 20 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d       if( (pFrom-
1cd70 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  >jointype & JT_N
1cd80 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20 20  ATURAL)!=0.     
1cd90 20 20 20 20 20 20 20 20 20 20 20 26 26 20 74 61             && ta
1cda0 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
1cdb0 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a  x(pTabList, i, z
1cdc0 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20 20  Name, 0, 0).    
1cdd0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
1cde0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cdf0 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  In a NATURAL joi
1ce00 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e  n, omit the join
1ce10 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
1ce20 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e .             
1ce30 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74     ** table to t
1ce40 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20  he right of the 
1ce50 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  join */.        
1ce60 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1ce70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1ce80 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1ce90 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73  if( sqlite3IdLis
1cea0 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55  tIndex(pFrom->pU
1ceb0 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  sing, zName)>=0 
1cec0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1ced0 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20     /* In a join 
1cee0 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61  with a USING cla
1cef0 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e  use, omit column
1cf00 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s in the.       
1cf10 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e           ** usin
1cf20 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68  g clause from th
1cf30 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  e table on the r
1cf40 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ight. */.       
1cf50 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1cf60 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
1cf70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
1cf80 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
1cf90 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
1cfa0 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61  r(db, TK_ID, zNa
1cfb0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
1cfc0 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d   zColname = zNam
1cfd0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  e;.            z
1cfe0 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  ToFree = 0;.    
1cff0 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
1d000 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73  Names || pTabLis
1d010 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20  t->nSrc>1 ){.   
1d020 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
1d030 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20  *pLeft;.        
1d040 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71        pLeft = sq
1d050 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
1d060 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a  _ID, zTabName);.
1d070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1d080 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
1d090 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f  pr(pParse, TK_DO
1d0a0 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  T, pLeft, pRight
1d0b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1d0c0 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
1d0d0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
1d0e0 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20       zColname = 
1d0f0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
1d100 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  b, "%s.%s", zTab
1d110 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Name, zName);.  
1d120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
1d130 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65  oFree = zColname
1d140 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d150 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  }.            }e
1d160 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1d170 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68     pExpr = pRigh
1d180 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  t;.            }
1d190 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
1d1a0 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
1d1b0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1d1c0 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a  , pNew, pExpr);.
1d1d0 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c              sCol
1d1e0 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d  name.z = zColnam
1d1f0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e;.            s
1d200 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69  Colname.n = sqli
1d210 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c  te3Strlen30(zCol
1d220 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
1d230 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
1d240 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65  stSetName(pParse
1d250 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d  , pNew, &sColnam
1d260 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 0);.         
1d270 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1d280 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20  (db, zToFree);. 
1d290 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d2a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1d2b0 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20   !tableSeen ){. 
1d2c0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
1d2d0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
1d2e0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1d2f0 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
1d300 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
1d310 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  zTName);.       
1d320 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d330 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1d340 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
1d350 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69  o tables specifi
1d360 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed");.          
1d370 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1d380 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
1d390 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
1d3a0 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b  ete(db, pEList);
1d3b0 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  .    p->pEList =
1d3c0 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53   pNew;.  }.#if S
1d3d0 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
1d3e0 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
1d3f0 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   && p->pEList->n
1d400 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Expr>db->aLimit[
1d410 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
1d420 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  UMN] ){.    sqli
1d430 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1d440 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
1d450 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
1d460 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  set");.  }.#endi
1d470 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  f.  return WRC_C
1d480 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
1d490 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20  * No-op routine 
1d4a0 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72  for the parse-tr
1d4b0 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a  ee walker..**.**
1d4c0 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
1d4d0 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72  ne is the Walker
1d4e0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74  .xExprCallback t
1d4f0 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  hen expression t
1d500 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b  rees.** are walk
1d510 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61  ed without any a
1d520 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b  ctions being tak
1d530 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e  en at each node.
1d540 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a    Presumably,.**
1d550 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
1d560 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 57  ne is used for W
1d570 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
1d580 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c  ack then .** Wal
1d590 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
1d5a0 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f  ack is set to do
1d5b0 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75   something usefu
1d5c0 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20  l for every .** 
1d5d0 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20  subquery in the 
1d5e0 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a  parser tree..*/.
1d5f0 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 57  static int exprW
1d600 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a  alkNoop(Walker *
1d610 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e  NotUsed, Expr *N
1d620 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
1d630 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
1d640 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
1d650 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
1d660 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
1d670 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22  * This routine "
1d680 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43  expands" a SELEC
1d690 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  T statement and 
1d6a0 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75  all of its subqu
1d6b0 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64  eries..** For ad
1d6c0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
1d6d0 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20  tion on what it 
1d6e0 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64  means to "expand
1d6f0 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  " a SELECT.** st
1d700 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65  atement, see the
1d710 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
1d720 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72  selectExpand wor
1d730 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f  ker callback abo
1d740 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64  ve..**.** Expand
1d750 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74 61  ing a SELECT sta
1d760 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  tement is the fi
1d770 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63  rst step in proc
1d780 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45  essing a.** SELE
1d790 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  CT statement.  T
1d7a0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1d7b0 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70 61  ent must be expa
1d7c0 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e  nded before.** n
1d7d0 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69  ame resolution i
1d7e0 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a  s performed..**.
1d7f0 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67  ** If anything g
1d800 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72  oes wrong, an er
1d810 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77  ror message is w
1d820 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72  ritten into pPar
1d830 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  se..** The calli
1d840 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20  ng function can 
1d850 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c  detect the probl
1d860 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  em by looking at
1d870 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a   pParse->nErr.**
1d880 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e   and/or pParse->
1d890 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1d8a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1d8b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
1d8c0 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72  pand(Parse *pPar
1d8d0 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
1d8e0 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  ect){.  Walker w
1d8f0 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
1d900 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78  lback = selectEx
1d910 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 45 78 70  pander;.  w.xExp
1d920 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
1d930 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
1d940 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
1d950 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
1d960 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
1d970 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
1d980 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1d990 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  Y./*.** This is 
1d9a0 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  a Walker.xSelect
1d9b0 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63  Callback callbac
1d9c0 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  k for the sqlite
1d9d0 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28  3SelectTypeInfo(
1d9e0 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a  ).** interface..
1d9f0 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46  **.** For each F
1da00 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
1da10 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e  ery, add Column.
1da20 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e  zType and Column
1da30 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  .zColl.** inform
1da40 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62  ation to the Tab
1da50 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
1da60 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
1da70 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f   result set.** o
1da80 66 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e  f that subquery.
1da90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  .**.** The Table
1daa0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1dab0 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
1dac0 65 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f  esult set was co
1dad0 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20  nstructed.** by 
1dae0 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29  selectExpander()
1daf0 20 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e   but the type an
1db00 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
1db10 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74  rmation was omit
1db20 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70  ted.** at that p
1db30 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65  oint because ide
1db40 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74  ntifiers had not
1db50 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76   yet been resolv
1db60 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ed.  This.** rou
1db70 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
1db80 66 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20  fter identifier 
1db90 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73  resolution..*/.s
1dba0 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
1dbb0 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
1dbc0 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  nfo(Walker *pWal
1dbd0 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
1dbe0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1dbf0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63  ;.  int i;.  Src
1dc00 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
1dc10 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1dc20 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20  _item *pFrom;.. 
1dc30 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46   assert( p->selF
1dc40 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
1dc50 65 64 20 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ed );.  if( (p->
1dc60 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
1dc70 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 7b  sTypeInfo)==0 ){
1dc80 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
1dc90 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e   |= SF_HasTypeIn
1dca0 66 6f 3b 0a 20 20 20 20 70 50 61 72 73 65 20 3d  fo;.    pParse =
1dcb0 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
1dcc0 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  ;.    pTabList =
1dcd0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f   p->pSrc;.    fo
1dce0 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
1dcf0 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
1dd00 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1dd10 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
1dd20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
1dd30 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
1dd40 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61    if( ALWAYS(pTa
1dd50 62 21 3d 30 29 20 26 26 20 28 70 54 61 62 2d 3e  b!=0) && (pTab->
1dd60 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
1dd70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20  hemeral)!=0 ){. 
1dd80 20 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d         /* A sub-
1dd90 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
1dda0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
1ddb0 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 20 20  LECT */.        
1ddc0 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
1ddd0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
1dde0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1ddf0 53 65 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 77  Sel );.        w
1de00 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69  hile( pSel->pPri
1de10 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c  or ) pSel = pSel
1de20 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
1de30 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d    selectAddColum
1de40 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
1de50 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  n(pParse, pTab->
1de60 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  nCol, pTab->aCol
1de70 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d  , pSel);.      }
1de80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1de90 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
1dea0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
1deb0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1dec0 61 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e  adds datatype an
1ded0 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
1dee0 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ence information
1def0 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65   to.** the Table
1df00 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61   structures of a
1df10 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
1df20 75 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a  ubqueries in a.*
1df30 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
1df40 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  nt..**.** Use th
1df50 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72  is routine after
1df60 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
1df70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1df80 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
1df90 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20  dTypeInfo(Parse 
1dfa0 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
1dfb0 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64  *pSelect){.#ifnd
1dfc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1dfd0 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72  UBQUERY.  Walker
1dfe0 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43   w;.  w.xSelectC
1dff0 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
1e000 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
1e010 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  nfo;.  w.xExprCa
1e020 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c  llback = exprWal
1e030 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
1e040 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
1e050 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
1e060 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65  &w, pSelect);.#e
1e070 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ndif.}.../*.** T
1e080 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
1e090 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
1e0a0 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65  tement for proce
1e0b0 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66  ssing.  The.** f
1e0c0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f  ollowing is acco
1e0d0 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20  mplished:.**.** 
1e0e0 20 20 20 20 2a 20 20 56 44 42 45 20 43 75 72 73      *  VDBE Curs
1e0f0 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  or numbers are a
1e100 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46  ssigned to all F
1e110 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM-clause terms
1e120 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65  ..**     *  Ephe
1e130 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65  meral Table obje
1e140 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64 20  cts are created 
1e150 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61  for all FROM-cla
1e160 75 73 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a  use subqueries..
1e170 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64  **     *  ON and
1e180 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61   USING clauses a
1e190 72 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20  re shifted into 
1e1a0 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73  WHERE statements
1e1b0 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63  .**     *  Wildc
1e1c0 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41  ards "*" and "TA
1e1d0 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74  BLE.*" in result
1e1e0 20 73 65 74 73 20 61 72 65 20 65 78 70 61 6e 64   sets are expand
1e1f0 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64  ed..**     *  Id
1e200 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78 70  entifiers in exp
1e210 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63  ression are matc
1e220 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a  hed to tables..*
1e230 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1e240 65 20 61 63 74 73 20 72 65 63 75 72 73 69 76 65  e acts recursive
1e250 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65  ly on all subque
1e260 72 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ries within the 
1e270 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
1e280 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
1e290 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
1e2a0 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
1e2b0 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
1e2c0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
1e2d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1e2e0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
1e2f0 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
1e300 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  d. */.  NameCont
1e310 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f  ext *pOuterNC  /
1e320 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
1e330 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a  or container */.
1e340 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1e350 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ;.  if( NEVER(p=
1e360 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  =0) ) return;.  
1e370 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1e380 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
1e390 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
1e3a0 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  nfo ) return;.  
1e3b0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
1e3c0 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  and(pParse, p);.
1e3d0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1e3e0 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
1e3f0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
1e400 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
1e410 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61  eSelectNames(pPa
1e420 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43  rse, p, pOuterNC
1e430 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
1e440 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
1e450 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
1e460 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  rn;.  sqlite3Sel
1e470 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70  ectAddTypeInfo(p
1e480 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  Parse, p);.}../*
1e490 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67  .** Reset the ag
1e4a0 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
1e4b0 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  tor..**.** The a
1e4c0 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
1e4d0 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66  ator is a set of
1e4e0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68   memory cells th
1e4f0 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72  at hold.** inter
1e500 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20  mediate results 
1e510 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e  while calculatin
1e520 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  g an aggregate. 
1e530 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
1e540 20 73 69 6d 70 6c 79 20 73 74 6f 72 65 73 20 4e   simply stores N
1e550 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74  ULLs in all of t
1e560 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  hose memory cell
1e570 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1e580 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74  d resetAccumulat
1e590 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
1e5a0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
1e5b0 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
1e5c0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1e5d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1e5e0 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
1e5f0 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28 20 70 41  *pFunc;.  if( pA
1e600 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41  ggInfo->nFunc+pA
1e610 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d  ggInfo->nColumn=
1e620 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1e630 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1e640 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   i<pAggInfo->nCo
1e650 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
1e660 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e670 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1e680 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
1e690 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  i].iMem);.  }.  
1e6a0 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e  for(pFunc=pAggIn
1e6b0 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20  fo->aFunc, i=0; 
1e6c0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
1e6d0 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29  c; i++, pFunc++)
1e6e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1e6f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1e700 6c 6c 2c 20 30 2c 20 70 46 75 6e 63 2d 3e 69 4d  ll, 0, pFunc->iM
1e710 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75  em);.    if( pFu
1e720 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  nc->iDistinct>=0
1e730 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
1e740 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70  pE = pFunc->pExp
1e750 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
1e760 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1e770 79 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pE, EP_xIsSele
1e780 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ct) );.      if(
1e790 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20   pE->x.pList==0 
1e7a0 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e  || pE->x.pList->
1e7b0 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
1e7c0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1e7d0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53  Msg(pParse, "DIS
1e7e0 54 49 4e 43 54 20 61 67 67 72 65 67 61 74 65 73  TINCT aggregates
1e7f0 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74   must have exact
1e800 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20  ly one ".       
1e810 20 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b      "argument");
1e820 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e  .        pFunc->
1e830 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
1e840 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e850 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
1e860 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
1e870 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
1e880 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74  rse, pE->x.pList
1e890 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1e8a0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1e8b0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1e8c0 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  , pFunc->iDistin
1e8d0 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
1e8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8f0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
1e900 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
1e910 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
1e920 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
1e930 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
1e940 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f  OP_AggFinalize o
1e950 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  pcode for every 
1e960 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1e970 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67  on.** in the Agg
1e980 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  Info structure..
1e990 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1e9a0 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
1e9b0 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ons(Parse *pPars
1e9c0 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
1e9d0 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
1e9e0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1e9f0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
1ea00 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
1ea10 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   *pF;.  for(i=0,
1ea20 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
1ea30 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
1ea40 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
1ea50 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  +){.    ExprList
1ea60 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
1ea70 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
1ea80 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1ea90 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
1eaa0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1eab0 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ct) );.    sqlit
1eac0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1ead0 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d  OP_AggFinal, pF-
1eae0 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70  >iMem, pList ? p
1eaf0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
1eb00 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1eb10 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
1eb20 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46  )pF->pFunc, P4_F
1eb30 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a  UNCDEF);.  }.}..
1eb40 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
1eb50 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d   accumulator mem
1eb60 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e  ory cells for an
1eb70 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64   aggregate based
1eb80 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65   on.** the curre
1eb90 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
1eba0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
1ebb0 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c  id updateAccumul
1ebc0 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
1ebd0 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
1ebe0 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
1ebf0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1ec00 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
1ec10 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
1ec20 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20  c *pF;.  struct 
1ec30 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b  AggInfo_col *pC;
1ec40 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  ..  pAggInfo->di
1ec50 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
1ec60 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1ec70 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
1ec80 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
1ec90 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
1eca0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
1ecb0 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
1ecc0 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
1ecd0 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b  nt addrNext = 0;
1ece0 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b  .    int regAgg;
1ecf0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1ed00 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
1ed10 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
1ed20 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1ed30 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
1ed40 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1ed50 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
1ed60 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
1ed70 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
1ed80 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73        regAgg = s
1ed90 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
1eda0 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29  ge(pParse, nArg)
1edb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1edc0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
1edd0 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
1ede0 65 67 41 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d  egAgg, 1);.    }
1edf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67  else{.      nArg
1ee00 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41   = 0;.      regA
1ee10 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  gg = 0;.    }.  
1ee20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69    if( pF->iDisti
1ee30 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
1ee40 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
1ee50 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1ee60 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  v);.      assert
1ee70 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20  ( nArg==1 );.   
1ee80 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
1ee90 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73  pParse, pF->iDis
1eea0 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c  tinct, addrNext,
1eeb0 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20   1, regAgg);.   
1eec0 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70   }.    if( pF->p
1eed0 46 75 6e 63 2d 3e 66 6c 61 67 73 20 26 20 53 51  Func->flags & SQ
1eee0 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
1eef0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  LL ){.      Coll
1ef00 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
1ef10 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
1ef20 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1ef30 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  m;.      int j;.
1ef40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
1ef50 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c  ist!=0 );  /* pL
1ef60 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46  ist!=0 if pF->pF
1ef70 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c  unc has NEEDCOLL
1ef80 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   */.      for(j=
1ef90 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
1efa0 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e  a; !pColl && j<n
1efb0 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  Arg; j++, pItem+
1efc0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  +){.        pCol
1efd0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1efe0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1eff0 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
1f000 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1f010 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
1f020 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
1f030 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
1f040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1f050 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1f060 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
1f070 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  0, 0, 0, (char *
1f080 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
1f090 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  EQ);.    }.    s
1f0a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1f0b0 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20  (v, OP_AggStep, 
1f0c0 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69  0, regAgg, pF->i
1f0d0 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Mem,.           
1f0e0 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
1f0f0 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  *)pF->pFunc, P4_
1f100 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71  FUNCDEF);.    sq
1f110 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1f120 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a  5(v, (u8)nArg);.
1f130 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1f140 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
1f150 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67  ge(pParse, regAg
1f160 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  g, nArg);.    sq
1f170 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1f180 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
1f190 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
1f1a0 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b   if( addrNext ){
1f1b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f1c0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1f1d0 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20  , addrNext);.   
1f1e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f1f0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
1f200 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1f210 2a 20 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74  * Before populat
1f220 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
1f230 74 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 63  tor registers, c
1f240 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
1f250 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65  cache..  ** Othe
1f260 72 77 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66  rwise, if any of
1f270 20 74 68 65 20 72 65 71 75 69 72 65 64 20 63 6f   the required co
1f280 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20  lumn values are 
1f290 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 20  already present 
1f2a0 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  .  ** in registe
1f2b0 72 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43  rs, sqlite3ExprC
1f2c0 6f 64 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50  ode() may use OP
1f2d0 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74  _SCopy to copy t
1f2e0 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f  he value.  ** to
1f2f0 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62   pC->iMem. But b
1f300 79 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 76  y the time the v
1f310 61 6c 75 65 20 69 73 20 75 73 65 64 2c 20 74 68  alue is used, th
1f320 65 20 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73  e original regis
1f330 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76  ter.  ** may hav
1f340 65 20 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76  e been used, inv
1f350 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e  alidating the un
1f360 64 65 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20  derlying buffer 
1f370 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a  holding the.  **
1f380 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61   text or blob va
1f390 6c 75 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20  lue. See ticket 
1f3a0 5b 38 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20  [883034dcb5]..  
1f3b0 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20  **.  ** Another 
1f3c0 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62  solution would b
1f3d0 65 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  e to change the 
1f3e0 4f 50 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f  OP_SCopy used to
1f3f0 20 63 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a   copy cached.  *
1f400 2a 20 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f  * values to an O
1f410 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 73  P_Copy..  */.  s
1f420 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
1f430 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
1f440 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67  for(i=0, pC=pAgg
1f450 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41  Info->aCol; i<pA
1f460 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
1f470 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29  ator; i++, pC++)
1f480 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1f490 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43  rCode(pParse, pC
1f4a0 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65  ->pExpr, pC->iMe
1f4b0 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e  m);.  }.  pAggIn
1f4c0 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
1f4d0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
1f4e0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
1f4f0 73 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  se);.}../*.** Ad
1f500 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78  d a single OP_Ex
1f510 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
1f520 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f  n to the VDBE to
1f530 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c   explain a simpl
1f540 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75  e.** count(*) qu
1f550 65 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75  ery ("SELECT cou
1f560 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22  nt(*) FROM pTab"
1f570 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  )..*/.#ifndef SQ
1f580 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
1f590 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  N.static void ex
1f5a0 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
1f5b0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1f5c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1f5d0 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
1f5e0 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
1f5f0 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
1f600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1f610 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
1f620 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
1f630 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
1f640 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75        /* Index u
1f650 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
1f660 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  scan, or NULL */
1f670 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  .){.  if( pParse
1f680 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
1f690 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70 20 3d      char *zEqp =
1f6a0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1f6b0 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43 41  pParse->db, "SCA
1f6c0 4e 20 54 41 42 4c 45 20 25 73 20 25 73 25 73 28  N TABLE %s %s%s(
1f6d0 7e 25 64 20 72 6f 77 73 29 22 2c 0a 20 20 20 20  ~%d rows)",.    
1f6e0 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
1f6f0 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3f   .        pIdx ?
1f700 20 22 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47   "USING COVERING
1f710 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20   INDEX " : "",. 
1f720 20 20 20 20 20 20 20 70 49 64 78 20 3f 20 70 49         pIdx ? pI
1f730 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 2c 0a  dx->zName : "",.
1f740 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52          pTab->nR
1f750 6f 77 45 73 74 0a 20 20 20 20 29 3b 0a 20 20 20  owEst.    );.   
1f760 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f770 70 34 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  p4(.        pPar
1f780 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78  se->pVdbe, OP_Ex
1f790 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
1f7a0 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
1f7b0 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zEqp, P4_DYNAMIC
1f7c0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  .    );.  }.}.#e
1f7d0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70  lse.# define exp
1f7e0 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
1f7f0 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  a,b,c).#endif../
1f800 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1f810 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43  de for the SELEC
1f820 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65  T statement give
1f830 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d  n in the p argum
1f840 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ent.  .**.** The
1f850 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73   results are dis
1f860 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72 69  tributed in vari
1f870 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64 69  ous ways dependi
1f880 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e  ng on the.** con
1f890 74 65 6e 74 73 20 6f 66 20 74 68 65 20 53 65 6c  tents of the Sel
1f8a0 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
1f8b0 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
1f8c0 61 72 67 75 6d 65 6e 74 20 70 44 65 73 74 0a 2a  argument pDest.*
1f8d0 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  * as follows:.**
1f8e0 0a 2a 2a 20 20 20 20 20 70 44 65 73 74 2d 3e 65  .**     pDest->e
1f8f0 44 65 73 74 20 20 20 20 52 65 73 75 6c 74 0a 2a  Dest    Result.*
1f900 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *     ----------
1f910 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
1f920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f940 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4f 75 74  -.**     SRT_Out
1f950 70 75 74 20 20 20 20 20 20 47 65 6e 65 72 61 74  put      Generat
1f960 65 20 61 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  e a row of outpu
1f970 74 20 28 75 73 69 6e 67 20 74 68 65 20 4f 50 5f  t (using the OP_
1f980 52 65 73 75 6c 74 52 6f 77 0a 2a 2a 20 20 20 20  ResultRow.**    
1f990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9a0 20 6f 70 63 6f 64 65 29 20 66 6f 72 20 65 61 63   opcode) for eac
1f9b0 68 20 72 6f 77 20 69 6e 20 74 68 65 20 72 65 73  h row in the res
1f9c0 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20  ult set..**.**  
1f9d0 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20     SRT_Mem      
1f9e0 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69 66     Only valid if
1f9f0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   the result is a
1fa00 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 0a   single column..
1fa10 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1fa20 20 20 20 20 20 20 20 53 74 6f 72 65 20 74 68 65         Store the
1fa30 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66   first column of
1fa40 20 74 68 65 20 66 69 72 73 74 20 72 65 73 75 6c   the first resul
1fa50 74 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  t row.**        
1fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
1fa70 72 65 67 69 73 74 65 72 20 70 44 65 73 74 2d 3e  register pDest->
1fa80 69 50 61 72 6d 20 74 68 65 6e 20 61 62 61 6e 64  iParm then aband
1fa90 6f 6e 20 74 68 65 20 72 65 73 74 0a 2a 2a 20 20  on the rest.**  
1faa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fab0 20 20 20 6f 66 20 74 68 65 20 71 75 65 72 79 2e     of the query.
1fac0 20 20 54 68 69 73 20 64 65 73 74 69 6e 61 74 69    This destinati
1fad0 6f 6e 20 69 6d 70 6c 69 65 73 20 22 4c 49 4d 49  on implies "LIMI
1fae0 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  T 1"..**.**     
1faf0 53 52 54 5f 53 65 74 20 20 20 20 20 20 20 20 20  SRT_Set         
1fb00 54 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20  The result must 
1fb10 62 65 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  be a single colu
1fb20 6d 6e 2e 20 20 53 74 6f 72 65 20 65 61 63 68 0a  mn.  Store each.
1fb30 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1fb40 20 20 20 20 20 20 20 72 6f 77 20 6f 66 20 72 65         row of re
1fb50 73 75 6c 74 20 61 73 20 74 68 65 20 6b 65 79 20  sult as the key 
1fb60 69 6e 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  in table pDest->
1fb70 69 50 61 72 6d 2e 20 0a 2a 2a 20 20 20 20 20 20  iParm. .**      
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
1fb90 70 70 6c 79 20 74 68 65 20 61 66 66 69 6e 69 74  pply the affinit
1fba0 79 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74  y pDest->affinit
1fbb0 79 20 62 65 66 6f 72 65 20 73 74 6f 72 69 6e 67  y before storing
1fbc0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1fbd0 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 73 2e          results.
1fbe0 20 20 55 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d    Used to implem
1fbf0 65 6e 74 20 22 49 4e 20 28 53 45 4c 45 43 54 20  ent "IN (SELECT 
1fc00 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ...)"..**.**    
1fc10 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20   SRT_Union      
1fc20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61   Store results a
1fc30 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d  s a key in a tem
1fc40 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65  porary table pDe
1fc50 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  st->iParm..**.**
1fc60 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74 20       SRT_Except 
1fc70 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75       Remove resu
1fc80 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d  lts from the tem
1fc90 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65  porary table pDe
1fca0 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  st->iParm..**.**
1fcb0 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20       SRT_Table  
1fcc0 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
1fcd0 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  ts in temporary 
1fce0 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61  table pDest->iPa
1fcf0 72 6d 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  rm..**          
1fd00 20 20 20 20 20 20 20 20 20 20 20 54 68 69 73 20             This 
1fd10 69 73 20 6c 69 6b 65 20 53 52 54 5f 45 70 68 65  is like SRT_Ephe
1fd20 6d 54 61 62 20 65 78 63 65 70 74 20 74 68 61 74  mTab except that
1fd30 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20   the table.**   
1fd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd50 20 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20    is assumed to 
1fd60 61 6c 72 65 61 64 79 20 62 65 20 6f 70 65 6e 2e  already be open.
1fd70 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45  .**.**     SRT_E
1fd80 70 68 65 6d 54 61 62 20 20 20 20 43 72 65 61 74  phemTab    Creat
1fd90 65 20 61 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  e an temporary t
1fda0 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72  able pDest->iPar
1fdb0 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 20  m and store.**  
1fdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdd0 20 20 20 74 68 65 20 72 65 73 75 6c 74 20 74 68     the result th
1fde0 65 72 65 2e 20 54 68 65 20 63 75 72 73 6f 72 20  ere. The cursor 
1fdf0 69 73 20 6c 65 66 74 20 6f 70 65 6e 20 61 66 74  is left open aft
1fe00 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  er.**           
1fe10 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1fe20 69 6e 67 2e 20 20 54 68 69 73 20 69 73 20 6c 69  ing.  This is li
1fe30 6b 65 20 53 52 54 5f 54 61 62 6c 65 20 65 78 63  ke SRT_Table exc
1fe40 65 70 74 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  ept that.**     
1fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe60 74 68 69 73 20 64 65 73 74 69 6e 61 74 69 6f 6e  this destination
1fe70 20 75 73 65 73 20 4f 50 5f 4f 70 65 6e 45 70 68   uses OP_OpenEph
1fe80 65 6d 65 72 61 6c 20 74 6f 20 63 72 65 61 74 65  emeral to create
1fe90 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1fea0 20 20 20 20 20 20 20 20 74 68 65 20 74 61 62 6c          the tabl
1feb0 65 20 66 69 72 73 74 2e 0a 2a 2a 0a 2a 2a 20 20  e first..**.**  
1fec0 20 20 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65     SRT_Coroutine
1fed0 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f     Generate a co
1fee0 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 72 65  -routine that re
1fef0 74 75 72 6e 73 20 61 20 6e 65 77 20 72 6f 77 20  turns a new row 
1ff00 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  of.**           
1ff10 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74            result
1ff20 73 20 65 61 63 68 20 74 69 6d 65 20 69 74 20 69  s each time it i
1ff30 73 20 69 6e 76 6f 6b 65 64 2e 20 20 54 68 65 20  s invoked.  The 
1ff40 65 6e 74 72 79 20 70 6f 69 6e 74 0a 2a 2a 20 20  entry point.**  
1ff50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff60 20 20 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75     of the co-rou
1ff70 74 69 6e 65 20 69 73 20 73 74 6f 72 65 64 20 69  tine is stored i
1ff80 6e 20 72 65 67 69 73 74 65 72 20 70 44 65 73 74  n register pDest
1ff90 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  ->iParm..**.**  
1ffa0 20 20 20 53 52 54 5f 45 78 69 73 74 73 20 20 20     SRT_Exists   
1ffb0 20 20 20 53 74 6f 72 65 20 61 20 31 20 69 6e 20     Store a 1 in 
1ffc0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65 73  memory cell pDes
1ffd0 74 2d 3e 69 50 61 72 6d 20 69 66 20 74 68 65 20  t->iParm if the 
1ffe0 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  result.**       
1fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
20000 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2e 0a  t is not empty..
20010 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 44 69  **.**     SRT_Di
20020 73 63 61 72 64 20 20 20 20 20 54 68 72 6f 77 20  scard     Throw 
20030 74 68 65 20 72 65 73 75 6c 74 73 20 61 77 61 79  the results away
20040 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
20050 62 79 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  by SELECT.**    
20060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20070 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68   statements with
20080 69 6e 20 74 72 69 67 67 65 72 73 20 77 68 6f 73  in triggers whos
20090 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20 69  e only purpose i
200a0 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
200b0 20 20 20 20 20 20 20 20 20 74 68 65 20 73 69 64           the sid
200c0 65 2d 65 66 66 65 63 74 73 20 6f 66 20 66 75 6e  e-effects of fun
200d0 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctions..**.** Th
200e0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
200f0 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
20100 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
20110 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
20120 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
20130 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
20140 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
20150 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
20160 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
20170 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20180 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
20190 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
201a0 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
201b0 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
201c0 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
201d0 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20  do that..*/.int 
201e0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20  sqlite3Select(. 
201f0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
20200 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
20210 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
20220 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
20230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20240 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
20250 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
20260 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
20270 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68  pDest      /* Wh
20280 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
20290 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  e query results 
202a0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
202b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
202c0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
202d0 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
202e0 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52  pWInfo;     /* R
202f0 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74  eturn from sqlit
20300 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
20310 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
20320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
20330 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
20340 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
20350 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tion */.  int is
20360 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Agg;            
20370 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c   /* True for sel
20380 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22  ect lists like "
20390 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45  count(*)" */.  E
203a0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
203b0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
203c0 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72   columns to extr
203d0 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  act. */.  SrcLis
203e0 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
203f0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
20400 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f  es to select fro
20410 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  m */.  Expr *pWh
20420 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ere;          /*
20430 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
20440 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
20450 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
20460 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54  OrderBy;    /* T
20470 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
20480 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
20490 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
204a0 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20  pGroupBy;    /* 
204b0 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  The GROUP BY cla
204c0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
204d0 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  L */.  Expr *pHa
204e0 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  ving;         /*
204f0 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   The HAVING clau
20500 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
20510 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74   */.  int isDist
20520 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  inct;        /* 
20530 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
20540 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
20550 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
20560 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20   distinct;      
20570 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
20580 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74  use for the dist
20590 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e  inct set */.  in
205a0 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20  t rc = 1;       
205b0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
205c0 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69   return from thi
205d0 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
205e0 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65  int addrSortInde
205f0 78 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  x;     /* Addres
20600 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45  s of an OP_OpenE
20610 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
20620 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tion */.  int ad
20630 64 72 44 69 73 74 69 6e 63 74 49 6e 64 65 78 3b  drDistinctIndex;
20640 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
20650 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  n OP_OpenEphemer
20660 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a  al instruction *
20670 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67  /.  AggInfo sAgg
20680 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e  Info;      /* In
20690 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62  formation used b
206a0 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  y aggregate quer
206b0 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e  ies */.  int iEn
206c0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
206d0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
206e0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65  e end of the que
206f0 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ry */.  sqlite3 
20700 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *db;           /
20710 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
20720 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69  onnection */..#i
20730 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20740 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
20750 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64  iRestoreSelectId
20760 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65   = pParse->iSele
20770 63 74 49 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e  ctId;.  pParse->
20780 69 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72  iSelectId = pPar
20790 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
207a0 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64  d++;.#endif..  d
207b0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
207c0 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62    if( p==0 || db
207d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
207e0 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
207f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
20800 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
20810 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
20820 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e, SQLITE_SELECT
20830 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74  , 0, 0, 0) ) ret
20840 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28  urn 1;.  memset(
20850 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69  &sAggInfo, 0, si
20860 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b  zeof(sAggInfo));
20870 0a 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c  ..  if( Ignorabl
20880 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
20890 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 44  ){.    assert(pD
208a0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
208b0 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d  Exists || pDest-
208c0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f  >eDest==SRT_Unio
208d0 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  n || .          
208e0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
208f0 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65  RT_Except || pDe
20900 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
20910 69 73 63 61 72 64 29 3b 0a 20 20 20 20 2f 2a 20  iscard);.    /* 
20920 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65  If ORDER BY make
20930 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
20940 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74 68  in the output th
20950 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a  en neither does.
20960 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20      ** DISTINCT 
20970 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d  so it can be rem
20980 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20  oved too. */.   
20990 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
209a0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
209b0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e  rderBy);.    p->
209c0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
209d0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
209e0 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20   ~SF_Distinct;. 
209f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
20a00 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70  ctPrep(pParse, p
20a10 2c 20 30 29 3b 0a 20 20 70 4f 72 64 65 72 42 79  , 0);.  pOrderBy
20a20 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
20a30 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
20a40 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
20a50 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
20a60 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
20a70 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
20a80 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  ed ){.    goto s
20a90 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
20aa0 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c   isAgg = (p->sel
20ab0 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
20ac0 67 61 74 65 29 21 3d 30 3b 0a 20 20 61 73 73 65  gate)!=0;.  asse
20ad0 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
20ae0 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
20af0 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20  erating code..  
20b00 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
20b10 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
20b20 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f  .  if( v==0 ) go
20b30 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
20b40 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20    /* If writing 
20b50 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e  to memory or gen
20b60 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20  erating a set.  
20b70 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ** only a single
20b80 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f   column may be o
20b90 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e  utput..  */.#ifn
20ba0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20bb0 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 63  SUBQUERY.  if( c
20bc0 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
20bd0 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50  mnSelectError(pP
20be0 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c  arse, pDest, pEL
20bf0 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
20c00 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
20c10 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  nd;.  }.#endif..
20c20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
20c30 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71  de for all sub-q
20c40 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
20c50 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23  OM clause.  */.#
20c60 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
20c70 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
20c80 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
20c90 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
20ca0 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70    for(i=0; !p->p
20cb0 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c  Prior && i<pTabL
20cc0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
20cd0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
20ce0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
20cf0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
20d00 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73  ];.    SelectDes
20d10 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65  t dest;.    Sele
20d20 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d  ct *pSub = pItem
20d30 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  ->pSelect;.    i
20d40 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20  nt isAggSub;..  
20d50 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c    if( pSub==0 ||
20d60 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61   pItem->isPopula
20d70 74 65 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ted ) continue;.
20d80 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
20d90 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20  t Parse.nHeight 
20da0 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66  by the height of
20db0 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70   the largest exp
20dc0 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74  ression.    ** t
20dd0 72 65 65 20 72 65 66 65 72 65 64 20 74 6f 20 62  ree refered to b
20de0 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65  y this, the pare
20df0 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63  nt select. The c
20e00 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20  hild select.    
20e10 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65  ** may contain e
20e20 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20  xpression trees 
20e30 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a  of at most.    *
20e40 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  * (SQLITE_MAX_EX
20e50 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e  PR_DEPTH-Parse.n
20e60 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e 20  Height) height. 
20e70 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20 20  This is a bit.  
20e80 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72    ** more conser
20e90 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65  vative than nece
20ea0 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20  ssary, but much 
20eb0 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f  easier than enfo
20ec0 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20  rcing.    ** an 
20ed0 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20  exact limit..   
20ee0 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
20ef0 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74  nHeight += sqlit
20f00 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
20f10 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ht(p);..    /* C
20f20 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
20f30 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e 20  he subquery can 
20f40 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f  be absorbed into
20f50 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a   the parent. */.
20f60 20 20 20 20 69 73 41 67 67 53 75 62 20 3d 20 28      isAggSub = (
20f70 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
20f80 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d   SF_Aggregate)!=
20f90 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74  0;.    if( flatt
20fa0 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73  enSubquery(pPars
20fb0 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20  e, p, i, isAgg, 
20fc0 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20  isAggSub) ){.   
20fd0 20 20 20 69 66 28 20 69 73 41 67 67 53 75 62 20     if( isAggSub 
20fe0 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67 67  ){.        isAgg
20ff0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 1;.        p-
21000 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
21010 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20  Aggregate;.     
21020 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b   }.      i = -1;
21030 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21040 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
21050 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
21060 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74  RT_EphemTab, pIt
21070 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
21080 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
21090 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 3d 3d  m->isPopulated==
210a0 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  0 );.      expla
210b0 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49 74  inSetInteger(pIt
210c0 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28  em->iSelectId, (
210d0 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  u8)pParse->iNext
210e0 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
210f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
21100 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65  Parse, pSub, &de
21110 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  st);.      pItem
21120 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20  ->isPopulated = 
21130 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  1;.      pItem->
21140 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20  pTab->nRowEst = 
21150 28 75 6e 73 69 67 6e 65 64 29 70 53 75 62 2d 3e  (unsigned)pSub->
21160 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
21170 7d 0a 20 20 20 20 69 66 28 20 2f 2a 70 50 61 72  }.    if( /*pPar
21180 73 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64 62  se->nErr ||*/ db
21190 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
211a0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
211b0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
211c0 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
211d0 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht -= sqlite3Sel
211e0 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
211f0 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  ;.    pTabList =
21200 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66   p->pSrc;.    if
21210 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  ( !IgnorableOrde
21220 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
21230 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70      pOrderBy = p
21240 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
21250 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d  }.  }.  pEList =
21260 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64   p->pEList;.#end
21270 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d  if.  pWhere = p-
21280 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75  >pWhere;.  pGrou
21290 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
212a0 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70  y;.  pHaving = p
212b0 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 44  ->pHaving;.  isD
212c0 69 73 74 69 6e 63 74 20 3d 20 28 70 2d 3e 73 65  istinct = (p->se
212d0 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
212e0 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 6e 64  inct)!=0;..#ifnd
212f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
21300 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20  OMPOUND_SELECT. 
21310 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
21320 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f  are a sequence o
21330 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68  f queries, do th
21340 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66  e earlier ones f
21350 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  irst..  */.  if(
21360 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
21370 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d    if( p->pRightm
21380 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ost==0 ){.      
21390 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a  Select *pLoop, *
213a0 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20  pRight = 0;.    
213b0 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
213c0 20 20 20 20 20 69 6e 74 20 6d 78 53 65 6c 65 63       int mxSelec
213d0 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 6f  t;.      for(pLo
213e0 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f  op=p; pLoop; pLo
213f0 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72  op=pLoop->pPrior
21400 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20  , cnt++){.      
21410 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d    pLoop->pRightm
21420 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ost = p;.       
21430 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20   pLoop->pNext = 
21440 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
21450 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a  pRight = pLoop;.
21460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 78        }.      mx
21470 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69  Select = db->aLi
21480 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
21490 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
214a0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78 53  ];.      if( mxS
214b0 65 6c 65 63 74 20 26 26 20 63 6e 74 3e 6d 78 53  elect && cnt>mxS
214c0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
214d0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
214e0 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
214f0 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70  ny terms in comp
21500 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20  ound SELECT");. 
21510 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
21520 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
21530 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
21540 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73  ultiSelect(pPars
21550 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
21560 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
21570 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
21580 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
21590 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 72 65  electId);.    re
215a0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
215b0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
215c0 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f  re is both a GRO
215d0 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44  UP BY and an ORD
215e0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
215f0 20 74 68 65 79 20 61 72 65 0a 20 20 2a 2a 20 69   they are.  ** i
21600 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 64  dentical, then d
21610 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52  isable the ORDER
21620 20 42 59 20 63 6c 61 75 73 65 20 73 69 6e 63 65   BY clause since
21630 20 74 68 65 20 47 52 4f 55 50 20 42 59 0a 20 20   the GROUP BY.  
21640 2a 2a 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c  ** will cause el
21650 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f  ements to come o
21660 75 74 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  ut in the correc
21670 74 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69  t order.  This i
21680 73 0a 20 20 2a 2a 20 61 6e 20 6f 70 74 69 6d 69  s.  ** an optimi
21690 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72  zation - the cor
216a0 72 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75  rect answer shou
216b0 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61 72 64  ld result regard
216c0 6c 65 73 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74  less..  ** Use t
216d0 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42  he SQLITE_GroupB
216e0 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69 74 68  yOrder flag with
216f0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
21700 5f 4f 50 54 49 4d 49 5a 45 52 0a 20 20 2a 2a 20  _OPTIMIZER.  ** 
21710 74 6f 20 64 69 73 61 62 6c 65 20 74 68 69 73 20  to disable this 
21720 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
21730 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
21740 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  s..  */.  if( sq
21750 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
21760 70 61 72 65 28 70 2d 3e 70 47 72 6f 75 70 42 79  pare(p->pGroupBy
21770 2c 20 70 4f 72 64 65 72 42 79 29 3d 3d 30 0a 20  , pOrderBy)==0. 
21780 20 20 20 20 20 20 20 20 26 26 20 28 64 62 2d 3e          && (db->
21790 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 47  flags & SQLITE_G
217a0 72 6f 75 70 42 79 4f 72 64 65 72 29 3d 3d 30 20  roupByOrder)==0 
217b0 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20  ){.    pOrderBy 
217c0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
217d0 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44  f the query is D
217e0 49 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20  ISTINCT with an 
217f0 4f 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20  ORDER BY but is 
21800 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
21810 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74  , and .  ** if t
21820 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69  he select-list i
21830 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
21840 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c  e ORDER BY list,
21850 20 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79   then this query
21860 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77  .  ** can be rew
21870 72 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55  ritten as a GROU
21880 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77  P BY. In other w
21890 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a  ords, this:.  **
218a0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
218b0 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52   DISTINCT xyz FR
218c0 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20  OM ... ORDER BY 
218d0 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73  xyz.  **.  ** is
218e0 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a   transformed to:
218f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
21900 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e  ELECT xyz FROM .
21910 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 0a  .. GROUP BY xyz.
21920 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65    **.  ** The se
21930 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65  cond form is pre
21940 66 65 72 72 65 64 20 61 73 20 61 20 73 69 6e 67  ferred as a sing
21950 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d  le index (or tem
21960 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20  p-table) may be 
21970 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62  .  ** used for b
21980 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  oth the ORDER BY
21990 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72   and DISTINCT pr
219a0 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69  ocessing. As ori
219b0 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72  ginally .  ** wr
219c0 69 74 74 65 6e 20 74 68 65 20 71 75 65 72 79 20  itten the query 
219d0 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d  must use a temp-
219e0 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61  table for at lea
219f0 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52  st one of the OR
21a00 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64  DER .  ** BY and
21a10 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61   DISTINCT, and a
21a20 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72  n index or separ
21a30 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66  ate temp-table f
21a40 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20  or the other..  
21a50 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  */.  if( (p->sel
21a60 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
21a70 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
21a80 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
21a90 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45   .   && sqlite3E
21aa0 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
21ab0 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c 69  OrderBy, p->pELi
21ac0 73 74 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  st)==0.  ){.    
21ad0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
21ae0 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20  SF_Distinct;.   
21af0 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73   p->pGroupBy = s
21b00 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
21b10 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  p(db, p->pEList,
21b20 20 30 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42   0);.    pGroupB
21b30 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
21b40 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20  .    pOrderBy = 
21b50 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
21b60 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
21b70 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
21b80 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20  n this sorting. 
21b90 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20   ** index might 
21ba0 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75  end up being unu
21bb0 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20  sed if the data 
21bc0 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74  can be .  ** ext
21bd0 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f  racted in pre-so
21be0 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20  rted order.  If 
21bf0 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65  that is the case
21c00 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
21c10 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
21c20 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c   instruction wil
21c30 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20  l be changed to 
21c40 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a  an OP_Noop once.
21c50 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f    ** we figure o
21c60 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74  ut that the sort
21c70 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  ing index is not
21c80 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61 64   needed.  The ad
21c90 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a  drSortIndex.  **
21ca0 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
21cb0 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20  d to facilitate 
21cc0 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a  that change..  *
21cd0 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
21ce0 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
21cf0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70  *pKeyInfo;.    p
21d00 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
21d10 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
21d20 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29 3b  arse, pOrderBy);
21d30 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69  .    pOrderBy->i
21d40 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  ECursor = pParse
21d50 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d  ->nTab++;.    p-
21d60 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
21d70 20 3d 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78   = addrSortIndex
21d80 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   =.      sqlite3
21d90 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
21da0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a  _OpenEphemeral,.
21db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21dc0 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65             pOrde
21dd0 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70  rBy->iECursor, p
21de0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32  OrderBy->nExpr+2
21df0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
21e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e10 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
21e20 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
21e30 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OFF);.  }else{. 
21e40 20 20 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78     addrSortIndex
21e50 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
21e60 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
21e70 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
21e80 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
21e90 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
21ea0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  e..  */.  if( pD
21eb0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
21ec0 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
21ed0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21ee0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
21ef0 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 50  meral, pDest->iP
21f00 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  arm, pEList->nEx
21f10 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  pr);.  }..  /* S
21f20 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
21f30 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71    */.  iEnd = sq
21f40 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
21f50 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c  el(v);.  p->nSel
21f60 65 63 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65  ectRow = (double
21f70 29 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a  )LARGEST_INT64;.
21f80 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
21f90 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
21fa0 70 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  p, iEnd);..  /* 
21fb0 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20 69  Open a virtual i
21fc0 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
21fd0 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74  the distinct set
21fe0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
21ff0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
22000 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65  stinct ){.    Ke
22010 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
22020 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20  .    distinct = 
22030 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
22040 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
22050 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
22060 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  st(pParse, p->pE
22070 4c 69 73 74 29 3b 0a 20 20 20 20 61 64 64 72 44  List);.    addrD
22080 69 73 74 69 6e 63 74 49 6e 64 65 78 20 3d 20 73  istinctIndex = s
22090 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
220a0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
220b0 65 72 61 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20  eral, distinct, 
220c0 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 28 63  0, 0,.        (c
220d0 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
220e0 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
220f0 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
22100 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42  dbeChangeP5(v, B
22110 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b  TREE_UNORDERED);
22120 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69  .  }else{.    di
22130 73 74 69 6e 63 74 20 3d 20 61 64 64 72 44 69 73  stinct = addrDis
22140 74 69 6e 63 74 49 6e 64 65 78 20 3d 20 2d 31 3b  tinctIndex = -1;
22150 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65  .  }..  /* Aggre
22160 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67  gate and non-agg
22170 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 61  regate queries a
22180 72 65 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65  re handled diffe
22190 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20  rently */.  if( 
221a0 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70  !isAgg && pGroup
221b0 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70  By==0 ){.    Exp
221c0 72 4c 69 73 74 20 2a 70 44 69 73 74 20 3d 20 28  rList *pDist = (
221d0 69 73 44 69 73 74 69 6e 63 74 20 3f 20 70 2d 3e  isDistinct ? p->
221e0 70 45 4c 69 73 74 20 3a 20 30 29 3b 0a 0a 20 20  pEList : 0);..  
221f0 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64    /* Begin the d
22200 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f  atabase scan. */
22210 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  .    pWInfo = sq
22220 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
22230 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
22240 2c 20 70 57 68 65 72 65 2c 20 26 70 4f 72 64 65  , pWhere, &pOrde
22250 72 42 79 2c 20 70 44 69 73 74 2c 20 30 29 3b 0a  rBy, pDist, 0);.
22260 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
22270 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
22280 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 57 49  end;.    if( pWI
22290 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3c 20 70  nfo->nRowOut < p
222a0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70  ->nSelectRow ) p
222b0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
222c0 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a  WInfo->nRowOut;.
222d0 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69  .    /* If sorti
222e0 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61  ng index that wa
222f0 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
22300 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65  rior OP_OpenEphe
22310 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e  meral .    ** in
22320 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20  struction ended 
22330 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65  up not being nee
22340 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65  ded, then change
22350 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
22360 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74  meral.    ** int
22370 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20  o an OP_Noop..  
22380 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 64 64    */.    if( add
22390 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26  rSortIndex>=0 &&
223a0 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
223b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
223c0 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
223d0 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 2c 20   addrSortIndex, 
223e0 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64  1);.      p->add
223f0 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d  rOpenEphm[2] = -
22400 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  1;.    }..    if
22410 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  ( pWInfo->eDisti
22420 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 56 64 62  nct ){.      Vdb
22430 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20  eOp *pOp;       
22440 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c           /* No l
22450 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 20 4f  onger required O
22460 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
22470 74 72 2e 20 2a 2f 0a 20 20 20 20 20 0a 20 20 20  tr. */.     .   
22480 20 20 20 61 73 73 65 72 74 28 20 61 64 64 72 44     assert( addrD
22490 69 73 74 69 6e 63 74 49 6e 64 65 78 3e 30 20 29  istinctIndex>0 )
224a0 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71  ;.      pOp = sq
224b0 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
224c0 2c 20 61 64 64 72 44 69 73 74 69 6e 63 74 49 6e  , addrDistinctIn
224d0 64 65 78 29 3b 0a 0a 20 20 20 20 20 20 61 73 73  dex);..      ass
224e0 65 72 74 28 20 69 73 44 69 73 74 69 6e 63 74 20  ert( isDistinct 
224f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
22500 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
22510 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e  ct==WHERE_DISTIN
22520 43 54 5f 4f 52 44 45 52 45 44 20 0a 20 20 20 20  CT_ORDERED .    
22530 20 20 20 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f         || pWInfo
22540 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45  ->eDistinct==WHE
22550 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
22560 55 45 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  UE .      );.   
22570 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31     distinct = -1
22580 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
22590 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57  fo->eDistinct==W
225a0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
225b0 44 45 52 45 44 20 29 7b 0a 20 20 20 20 20 20 20  DERED ){.       
225c0 20 69 6e 74 20 69 4a 75 6d 70 3b 0a 20 20 20 20   int iJump;.    
225d0 20 20 20 20 69 6e 74 20 69 45 78 70 72 3b 0a 20      int iExpr;. 
225e0 20 20 20 20 20 20 20 69 6e 74 20 69 46 6c 61 67         int iFlag
225f0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
22600 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  m;.        int i
22610 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Base = pParse->n
22620 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 69  Mem+1;.        i
22630 6e 74 20 69 42 61 73 65 32 20 3d 20 69 42 61 73  nt iBase2 = iBas
22640 65 20 2b 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  e + pEList->nExp
22650 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
22660 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 28 70 45 4c 69  e->nMem += (pELi
22670 73 74 2d 3e 6e 45 78 70 72 2a 32 29 3b 0a 0a 20  st->nExpr*2);.. 
22680 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
22690 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
226a0 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72 6c  meral coded earl
226b0 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 49 6e 74  ier to an OP_Int
226c0 65 67 65 72 2e 20 54 68 65 0a 20 20 20 20 20 20  eger. The.      
226d0 20 20 2a 2a 20 4f 50 5f 49 6e 74 65 67 65 72 20    ** OP_Integer 
226e0 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20  initializes the 
226f0 22 66 69 72 73 74 20 72 6f 77 22 20 66 6c 61 67  "first row" flag
22700 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f  .  */.        pO
22710 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49  p->opcode = OP_I
22720 6e 74 65 67 65 72 3b 0a 20 20 20 20 20 20 20 20  nteger;.        
22730 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20  pOp->p1 = 1;.   
22740 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 69       pOp->p2 = i
22750 46 6c 61 67 3b 0a 0a 20 20 20 20 20 20 20 20 73  Flag;..        s
22760 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
22770 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
22780 45 4c 69 73 74 2c 20 69 42 61 73 65 2c 20 31 29  EList, iBase, 1)
22790 3b 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20  ;.        iJump 
227a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
227b0 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 20  rentAddr(v) + 1 
227c0 2b 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  + pEList->nExpr 
227d0 2b 20 31 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  + 1 + 1;.       
227e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
227f0 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 69 46 6c  p2(v, OP_If, iFl
22800 61 67 2c 20 69 4a 75 6d 70 2d 31 29 3b 0a 20 20  ag, iJump-1);.  
22810 20 20 20 20 20 20 66 6f 72 28 69 45 78 70 72 3d        for(iExpr=
22820 30 3b 20 69 45 78 70 72 3c 70 45 4c 69 73 74 2d  0; iExpr<pEList-
22830 3e 6e 45 78 70 72 3b 20 69 45 78 70 72 2b 2b 29  >nExpr; iExpr++)
22840 7b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c  {.          Coll
22850 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
22860 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
22870 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
22880 61 5b 69 45 78 70 72 5d 2e 70 45 78 70 72 29 3b  a[iExpr].pExpr);
22890 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
228a0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
228b0 4f 50 5f 4e 65 2c 20 69 42 61 73 65 2b 69 45 78  OP_Ne, iBase+iEx
228c0 70 72 2c 20 69 4a 75 6d 70 2c 20 69 42 61 73 65  pr, iJump, iBase
228d0 32 2b 69 45 78 70 72 29 3b 0a 20 20 20 20 20 20  2+iExpr);.      
228e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
228f0 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
22900 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f  const char *)pCo
22910 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
22920 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
22930 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
22940 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  , SQLITE_NULLEQ)
22950 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22960 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22970 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
22980 2c 20 30 2c 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  , 0, pWInfo->iCo
22990 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 20 20 20 20  ntinue);..      
229a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
229b0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
229c0 72 2c 20 30 2c 20 69 46 6c 61 67 29 3b 0a 20 20  r, 0, iFlag);.  
229d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
229e0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
229f0 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20 29  Addr(v)==iJump )
22a00 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
22a10 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
22a20 50 5f 4d 6f 76 65 2c 20 69 42 61 73 65 2c 20 69  P_Move, iBase, i
22a30 42 61 73 65 32 2c 20 70 45 4c 69 73 74 2d 3e 6e  Base2, pEList->n
22a40 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Expr);.      }el
22a50 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  se{.        pOp-
22a60 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f  >opcode = OP_Noo
22a70 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
22a80 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
22a90 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
22aa0 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 73 65 6c  loop. */.    sel
22ab0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
22ac0 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20  rse, p, pEList, 
22ad0 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20  0, 0, pOrderBy, 
22ae0 64 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c  distinct, pDest,
22af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22b00 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f       pWInfo->iCo
22b10 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e  ntinue, pWInfo->
22b20 69 42 72 65 61 6b 29 3b 0a 0a 20 20 20 20 2f 2a  iBreak);..    /*
22b30 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   End the databas
22b40 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
22b50 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57   */.    sqlite3W
22b60 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
22b70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
22b80 20 54 68 69 73 20 69 73 20 74 68 65 20 70 72 6f   This is the pro
22b90 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
22ba0 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f  egate queries */
22bb0 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
22bc0 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65   sNC;    /* Name
22bd0 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f   context for pro
22be0 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74  cessing aggregat
22bf0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
22c00 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20  .    int iAMem; 
22c10 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
22c20 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
22c30 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e  r storing curren
22c40 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  t GROUP BY */.  
22c50 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20    int iBMem;    
22c60 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
22c70 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70  em address for p
22c80 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59  revious GROUP BY
22c90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65   */.    int iUse
22ca0 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d  Flag;       /* M
22cb0 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69  em address holdi
22cc0 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69  ng flag indicati
22cd0 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  ng that at least
22ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22cf0 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20           ** one 
22d00 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74  row of the input
22d10 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74   to the aggregat
22d20 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20  or has been.    
22d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d40 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64      ** processed
22d50 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f   */.    int iAbo
22d60 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d  rtFlag;     /* M
22d70 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68  em address which
22d80 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62   causes query ab
22d90 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20  ort if positive 
22da0 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70  */.    int group
22db0 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f  BySort;    /* Ro
22dc0 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75  ws come from sou
22dd0 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20  rce in GROUP BY 
22de0 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  order */.    int
22df0 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20   addrEnd;       
22e00 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65   /* End of proce
22e10 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53  ssing for this S
22e20 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a  ELECT */..    /*
22e30 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20   Remove any and 
22e40 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77  all aliases betw
22e50 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73  een the result s
22e60 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  et and the.    *
22e70 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  * GROUP BY claus
22e80 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
22e90 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
22ea0 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20      int k;      
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ec0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
22ed0 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  r */.      struc
22ee0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
22ef0 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20  *pItem;  /* For 
22f00 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70  looping over exp
22f10 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73  ression in a lis
22f20 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28  t */..      for(
22f30 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  k=p->pEList->nEx
22f40 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c  pr, pItem=p->pEL
22f50 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  ist->a; k>0; k--
22f60 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
22f70 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61      pItem->iAlia
22f80 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
22f90 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75       for(k=pGrou
22fa0 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  pBy->nExpr, pIte
22fb0 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b  m=pGroupBy->a; k
22fc0 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
22fd0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
22fe0 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->iAlias = 0;.  
22ff0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23000 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28 64  p->nSelectRow>(d
23010 6f 75 62 6c 65 29 31 30 30 20 29 20 70 2d 3e 6e  ouble)100 ) p->n
23020 53 65 6c 65 63 74 52 6f 77 20 3d 20 28 64 6f 75  SelectRow = (dou
23030 62 6c 65 29 31 30 30 3b 0a 20 20 20 20 7d 65 6c  ble)100;.    }el
23040 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65  se{.      p->nSe
23050 6c 65 63 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c  lectRow = (doubl
23060 65 29 31 3b 0a 20 20 20 20 7d 0a 0a 20 0a 20 20  e)1;.    }.. .  
23070 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61    /* Create a la
23080 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77  bel to jump to w
23090 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61  hen we want to a
230a0 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a  bort the query *
230b0 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20  /.    addrEnd = 
230c0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
230d0 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  abel(v);..    /*
230e0 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55   Convert TK_COLU
230f0 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b  MN nodes into TK
23100 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20  _AGG_COLUMN and 
23110 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a  make entries in.
23120 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20      ** sAggInfo 
23130 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46  for all TK_AGG_F
23140 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e  UNCTION nodes in
23150 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   expressions of 
23160 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43  the.    ** SELEC
23170 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  T statement..   
23180 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
23190 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
231a0 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50  NC));.    sNC.pP
231b0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
231c0 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
231d0 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  = pTabList;.    
231e0 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26  sNC.pAggInfo = &
231f0 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41  sAggInfo;.    sA
23200 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
23210 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79  olumn = pGroupBy
23220 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   ? pGroupBy->nEx
23230 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73 41  pr+1 : 0;.    sA
23240 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20  ggInfo.pGroupBy 
23250 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = pGroupBy;.    
23260 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
23270 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
23280 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
23290 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
232a0 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72  ggList(&sNC, pOr
232b0 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
232c0 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
232d0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
232e0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73  yzeAggregates(&s
232f0 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20  NC, pHaving);.  
23300 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
23310 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20  .nAccumulator = 
23320 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
23330 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
23340 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
23350 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
23360 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
23370 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61  perty(sAggInfo.a
23380 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45  Func[i].pExpr, E
23390 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
233a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
233b0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
233c0 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61  &sNC, sAggInfo.a
233d0 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78  Func[i].pExpr->x
233e0 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
233f0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
23400 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
23410 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20  elect_end;..    
23420 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f  /* Processing fo
23430 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74  r aggregates wit
23440 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65  h GROUP BY is ve
23450 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64  ry different and
23460 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72  .    ** much mor
23470 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61  e complex than a
23480 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75  ggregates withou
23490 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20  t a GROUP BY..  
234a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72    */.    if( pGr
234b0 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b  oupBy ){.      K
234c0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
234d0 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66  ;  /* Keying inf
234e0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
234f0 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65   group by clause
23500 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31   */.      int j1
23510 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
23520 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73   A-vs-B comparis
23530 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20  ion jump */.    
23540 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74    int addrOutput
23550 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f  Row;  /* Start o
23560 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  f subroutine tha
23570 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75  t outputs a resu
23580 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  lt row */.      
23590 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77  int regOutputRow
235a0 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64  ;   /* Return ad
235b0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
235c0 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  or output subrou
235d0 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tine */.      in
235e0 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20  t addrSetAbort; 
235f0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f    /* Set the abo
23600 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75  rt flag and retu
23610 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  rn */.      int 
23620 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20  addrTopOfLoop;  
23630 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
23640 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  put loop */.    
23650 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e    int addrSortin
23660 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f  gIdx; /* The OP_
23670 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f  OpenEphemeral fo
23680 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
23690 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  dex */.      int
236a0 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20   addrReset;     
236b0 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66   /* Subroutine f
236c0 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65  or resetting the
236d0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a   accumulator */.
236e0 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73        int regRes
236f0 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74  et;       /* Ret
23700 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
23710 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73  ster for reset s
23720 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20  ubroutine */..  
23730 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
23740 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  is a GROUP BY cl
23750 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65  ause we might ne
23760 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  ed a sorting ind
23770 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69  ex to.      ** i
23780 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c  mplement it.  Al
23790 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74  locate that sort
237a0 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20  ing index now.  
237b0 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a  If it turns out.
237c0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
237d0 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20   do not need it 
237e0 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f  after all, the O
237f0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
23800 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  truction.      *
23810 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  * will be conver
23820 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e  ted into a Noop.
23830 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20    .      */.    
23840 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
23850 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e  ngIdx = pParse->
23860 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b  nTab++;.      pK
23870 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
23880 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
23890 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a  rse, pGroupBy);.
238a0 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e        addrSortin
238b0 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64  gIdx = sqlite3Vd
238c0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
238d0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20  penEphemeral, . 
238e0 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
238f0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41  o.sortingIdx, sA
23900 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
23910 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20  olumn, .        
23920 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79    0, (char*)pKey
23930 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
23940 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20  _HANDOFF);..    
23950 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
23960 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73  memory locations
23970 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42   used by GROUP B
23980 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63  Y aggregate proc
23990 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a  essing.      */.
239a0 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d        iUseFlag =
239b0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
239c0 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61  .      iAbortFla
239d0 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
239e0 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74  em;.      regOut
239f0 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73  putRow = ++pPars
23a00 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
23a10 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
23a20 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
23a30 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65  bel(v);.      re
23a40 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  gReset = ++pPars
23a50 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
23a60 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74  ddrReset = sqlit
23a70 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
23a80 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20  v);.      iAMem 
23a90 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
23aa0 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
23ab0 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
23ac0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
23ad0 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iBMem = pParse-
23ae0 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
23af0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
23b00 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
23b10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
23b20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
23b30 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f  Integer, 0, iAbo
23b40 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
23b50 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
23b60 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67  clear abort flag
23b70 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
23b80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
23b90 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
23ba0 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
23bb0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
23bc0 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75  "indicate accumu
23bd0 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a  lator empty"));.
23be0 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  .      /* Begin 
23bf0 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c  a loop that will
23c00 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75   extract all sou
23c10 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55  rce rows in GROU
23c20 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20  P BY order..    
23c30 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20    ** This might 
23c40 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61  involve two sepa
23c50 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20  rate loops with 
23c60 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65  an OP_Sort in be
23c70 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20  tween, or.      
23c80 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ** it might be a
23c90 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61   single loop tha
23ca0 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20  t uses an index 
23cb0 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72  to extract infor
23cc0 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  mation.      ** 
23cd0 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64  in the right ord
23ce0 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68  er to begin with
23cf0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
23d00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23d10 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
23d20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
23d30 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  set);.      pWIn
23d40 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
23d50 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
23d60 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
23d70 20 26 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 30   &pGroupBy, 0, 0
23d80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
23d90 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
23da0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
23db0 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20  if( pGroupBy==0 
23dc0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
23dd0 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61  e optimizer is a
23de0 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72  ble to deliver r
23df0 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20  ows in group by 
23e00 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20  order so.       
23e10 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61   ** we do not ha
23e20 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65  ve to sort.  The
23e30 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
23e40 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a  l table will be.
23e50 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65          ** cance
23e60 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75  lled later becau
23e70 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  se we still need
23e80 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79   to use the pKey
23e90 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a  Info.        */.
23ea0 20 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79          pGroupBy
23eb0 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
23ec0 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
23ed0 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ort = 0;.      }
23ee0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
23ef0 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67   Rows are coming
23f00 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d   out in undeterm
23f10 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20  ined order.  We 
23f20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20  have to push.   
23f30 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77       ** each row
23f40 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20   into a sorting 
23f50 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65  index, terminate
23f60 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c   the first loop,
23f70 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
23f80 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73   loop over the s
23f90 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20  orting index in 
23fa0 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
23fb0 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20   output.        
23fc0 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ** in sorted ord
23fd0 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  er.        */.  
23fe0 20 20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73        int regBas
23ff0 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e;.        int r
24000 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20  egRecord;.      
24010 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20    int nCol;.    
24020 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79      int nGroupBy
24030 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61  ;..        expla
24040 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72  inTempTable(pPar
24050 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
24060 20 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 21   isDistinct && !
24070 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f  (p->selFlags&SF_
24080 44 69 73 74 69 6e 63 74 29 3f 22 44 49 53 54 49  Distinct)?"DISTI
24090 4e 43 54 22 3a 22 47 52 4f 55 50 20 42 59 22 29  NCT":"GROUP BY")
240a0 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  ;..        group
240b0 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20  BySort = 1;.    
240c0 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70      nGroupBy = p
240d0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
240e0 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e          nCol = n
240f0 47 72 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20 20  GroupBy + 1;.   
24100 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
24110 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  y+1;.        for
24120 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
24130 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
24140 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41            if( sA
24150 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69  ggInfo.aCol[i].i
24160 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
24170 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
24180 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Col++;.         
24190 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     j++;.        
241a0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
241b0 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20        regBase = 
241c0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
241d0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c  nge(pParse, nCol
241e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
241f0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
24200 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
24210 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
24220 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
24230 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42  , pGroupBy, regB
24240 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ase, 0);.       
24250 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24260 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
24270 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  e, sAggInfo.sort
24280 69 6e 67 49 64 78 2c 72 65 67 42 61 73 65 2b 6e  ingIdx,regBase+n
24290 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20  GroupBy);.      
242a0 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31    j = nGroupBy+1
242b0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
242c0 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
242d0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
242e0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
242f0 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
24300 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  = &sAggInfo.aCol
24310 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
24320 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
24330 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20  Column>=j ){.   
24340 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20           int r1 
24350 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20  = j + regBase;. 
24360 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
24370 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  2;..            
24380 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
24390 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
243a0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
243b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243c0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62        pCol->pTab
243d0 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c  , pCol->iColumn,
243e0 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72   pCol->iTable, r
243f0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
24400 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20 20  if( r1!=r2 ){.  
24410 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
24420 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
24430 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72   OP_SCopy, r2, r
24440 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
24450 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  }.            j+
24460 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
24470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24480 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
24490 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
244a0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
244b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
244c0 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
244d0 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  rd, regBase, nCo
244e0 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  l, regRecord);. 
244f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
24500 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
24510 64 78 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e  dxInsert, sAggIn
24520 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72  fo.sortingIdx, r
24530 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
24540 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
24550 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
24560 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
24570 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
24580 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
24590 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  rse, regBase, nC
245a0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
245b0 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
245c0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71  nfo);.        sq
245d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
245e0 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73 41 67 67  v, OP_Sort, sAgg
245f0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
24600 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
24610 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
24620 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72  v, "GROUP BY sor
24630 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41  t"));.        sA
24640 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e  ggInfo.useSortin
24650 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  gIdx = 1;.      
24660 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
24670 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
24680 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
24690 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
246a0 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
246b0 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65   terms and store
246c0 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e   in b0, b1, b2..
246d0 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69  ..      ** (b0 i
246e0 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  s memory locatio
246f0 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73  n iBMem+0, b1 is
24700 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f   iBMem+1, and so
24710 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a   forth).      **
24720 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68   Then compare th
24730 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
24740 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74  BY terms against
24750 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65   the GROUP BY te
24760 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  rms.      ** fro
24770 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  m the previous r
24780 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ow currently sto
24790 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61  red in a0, a1, a
247a0 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  2....      */.  
247b0 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f      addrTopOfLoo
247c0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
247d0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
247e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
247f0 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
24800 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  e);.      for(j=
24810 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; j<pGroupBy->n
24820 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
24830 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
24840 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ort ){.         
24850 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24860 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
24870 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
24880 67 49 64 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a  gIdx, j, iBMem+j
24890 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
248a0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67  {.          sAgg
248b0 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20  Info.directMode 
248c0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 1;.          s
248d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
248e0 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
248f0 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d  >a[j].pExpr, iBM
24900 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d  em+j);.        }
24910 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
24920 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
24930 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
24940 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47  iAMem, iBMem, pG
24950 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20  roupBy->nExpr,. 
24960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24970 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
24980 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
24990 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20  INFO);.      j1 
249a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
249b0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
249c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
249d0 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
249e0 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b   j1+1, 0, j1+1);
249f0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
24a00 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75  ate code that ru
24a10 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ns whenever the 
24a20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73  GROUP BY changes
24a30 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67  ..      ** Chang
24a40 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20  es in the GROUP 
24a50 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20  BY are detected 
24a60 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
24a70 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c  code.      ** bl
24a80 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77  ock.  If there w
24a90 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20  ere no changes, 
24aa0 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b  this block is sk
24ab0 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ipped..      **.
24ac0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f        ** This co
24ad0 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e  de copies curren
24ae0 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73  t group by terms
24af0 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e   in b0,b1,b2,...
24b00 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  .      ** over t
24b10 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20  o a0,a1,a2.  It 
24b20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f  then calls the o
24b30 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
24b40 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
24b50 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61  sets the aggrega
24b60 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  te accumulator r
24b70 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70  egisters in prep
24b80 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  aration.      **
24b90 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52   for the next GR
24ba0 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20  OUP BY batch..  
24bb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
24bc0 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
24bd0 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20  (pParse, iBMem, 
24be0 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d  iAMem, pGroupBy-
24bf0 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73  >nExpr);.      s
24c00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24c10 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
24c20 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
24c30 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
24c40 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
24c50 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  , "output one ro
24c60 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  w"));.      sqli
24c70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
24c80 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72   OP_IfPos, iAbor
24c90 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b  tFlag, addrEnd);
24ca0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
24cb0 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62  nt((v, "check ab
24cc0 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
24cd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
24ce0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
24cf0 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
24d00 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  Reset);.      Vd
24d10 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
24d20 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72  eset accumulator
24d30 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55  "));..      /* U
24d40 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67  pdate the aggreg
24d50 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73  ate accumulators
24d60 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   based on the co
24d70 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a  ntent of.      *
24d80 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  * the current ro
24d90 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  w.      */.     
24da0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
24db0 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
24dc0 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
24dd0 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
24de0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
24df0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24e00 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
24e10 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  1, iUseFlag);.  
24e20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
24e30 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61  (v, "indicate da
24e40 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f  ta in accumulato
24e50 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
24e60 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  End of the loop.
24e70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
24e80 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
24e90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24ea0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
24eb0 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f  P_Next, sAggInfo
24ec0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
24ed0 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20  rTopOfLoop);.   
24ee0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24ef0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
24f00 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
24f10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
24f20 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
24f30 64 72 53 6f 72 74 69 6e 67 49 64 78 2c 20 31 29  drSortingIdx, 1)
24f40 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
24f50 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66   /* Output the f
24f60 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75  inal row of resu
24f70 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  lt.      */.    
24f80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24f90 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
24fa0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
24fb0 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
24fc0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
24fd0 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e  ((v, "output fin
24fe0 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20  al row"));..    
24ff0 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74    /* Jump over t
25000 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20  he subroutines. 
25010 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
25020 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
25030 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
25040 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20  ddrEnd);..      
25050 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
25060 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
25070 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72  tputs a single r
25080 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
25090 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20  .      ** set.  
250a0 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  This subroutine 
250b0 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74  first looks at t
250c0 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66  he iUseFlag.  If
250d0 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20   iUseFlag.      
250e0 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ** is less than 
250f0 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
25100 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
25110 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
25120 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
25130 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66  ocessing calls f
25140 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  or the query to 
25150 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72  abort, this subr
25160 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
25170 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69  increments the i
25180 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79  AbortFlag memory
25190 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65   location before
251a0 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20   returning in.  
251b0 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20      ** order to 
251c0 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65  signal the calle
251d0 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20  r to abort..    
251e0 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53    */.      addrS
251f0 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65  etAbort = sqlite
25200 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
25210 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
25220 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25230 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
25240 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
25250 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
25260 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61  , "set abort fla
25270 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
25280 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
25290 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
252a0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
252b0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
252c0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
252d0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
252e0 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
252f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
25300 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
25310 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25320 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
25330 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72  , iUseFlag, addr
25340 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20  OutputRow+2);.  
25350 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
25360 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73  (v, "Groupby res
25370 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e  ult generator en
25380 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20  try point"));.  
25390 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
253a0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
253b0 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
253c0 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  );.      finaliz
253d0 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
253e0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
253f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
25400 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
25410 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
25420 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c  OutputRow+1, SQL
25430 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
25440 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
25450 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
25460 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20  , p->pEList, 0, 
25470 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20  0, pOrderBy,.   
25480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25490 20 20 20 64 69 73 74 69 6e 63 74 2c 20 70 44 65     distinct, pDe
254a0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
254b0 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75            addrOu
254c0 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53  tputRow+1, addrS
254d0 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20  etAbort);.      
254e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
254f0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
25500 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
25510 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
25520 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62  ((v, "end groupb
25530 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
25540 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
25550 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
25560 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
25570 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70   reset the group
25580 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a  -by accumulator.
25590 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
255a0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
255b0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65  eLabel(v, addrRe
255c0 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65  set);.      rese
255d0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
255e0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
255f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
25600 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
25610 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29  eturn, regReset)
25620 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a  ;.     .    } /*
25630 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e   endif pGroupBy.
25640 20 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74    Begin aggregat
25650 65 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75  e queries withou
25660 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20  t GROUP BY: */. 
25670 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20     else {.      
25680 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d  ExprList *pDel =
25690 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
256a0 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
256b0 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  NT.      Table *
256c0 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
256d0 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65  (pTab = isSimple
256e0 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e  Count(p, &sAggIn
256f0 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  fo))!=0 ){.     
25700 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c     /* If isSimpl
25710 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73  eCount() returns
25720 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
25730 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c  Table structure,
25740 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
25750 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
25760 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
25770 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  m:.        **.  
25780 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
25790 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
257a0 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a  <tbl>.        **
257b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72  .        ** wher
257c0 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
257d0 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 72  cture returned r
257e0 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20  epresents table 
257f0 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a  <tbl>..        *
25800 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
25810 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  s statement is s
25820 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74  o common that it
25830 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70   is optimized sp
25840 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20  ecially. The.   
25850 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74       ** OP_Count
25860 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
25870 65 78 65 63 75 74 65 64 20 65 69 74 68 65 72 20  executed either 
25880 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61  on the intkey ta
25890 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  ble that.       
258a0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
258b0 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20   data for table 
258c0 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20  <tbl> or on one 
258d0 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20  of its indexes. 
258e0 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  It.        ** is
258f0 20 62 65 74 74 65 72 20 74 6f 20 65 78 65 63 75   better to execu
25900 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20  te the op on an 
25910 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65  index, as indexe
25920 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20  s are almost.   
25930 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
25940 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73  pread across les
25950 73 20 70 61 67 65 73 20 74 68 61 6e 20 74 68 65  s pages than the
25960 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ir corresponding
25970 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20   tables..       
25980 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   */.        cons
25990 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69  t int iDb = sqli
259a0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
259b0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
259c0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
259d0 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
259e0 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Csr = pParse->nT
259f0 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72  ab++;     /* Cur
25a00 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72  sor to scan b-tr
25a10 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e  ee */.        In
25a20 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
25a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a40 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
25a50 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ariable */.     
25a60 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
25a70 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Info = 0;       
25a80 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e          /* Keyin
25a90 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69  fo for scanned i
25aa0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
25ab0 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30  Index *pBest = 0
25ac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25ad0 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64       /* Best ind
25ae0 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20  ex found so far 
25af0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
25b00 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75  Root = pTab->tnu
25b10 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
25b20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
25b30 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a  scanned b-tree *
25b40 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  /..        sqlit
25b50 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
25b60 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
25b70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25b80 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
25b90 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
25ba0 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
25bb0 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  e);..        /* 
25bc0 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 69  Search for the i
25bd0 6e 64 65 78 20 74 68 61 74 20 68 61 73 20 74 68  ndex that has th
25be0 65 20 6c 65 61 73 74 20 61 6d 6f 75 6e 74 20 6f  e least amount o
25bf0 66 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 0a 20 20  f columns. If.  
25c00 20 20 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69        ** there i
25c10 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2c  s such an index,
25c20 20 61 6e 64 20 69 74 20 68 61 73 20 6c 65 73 73   and it has less
25c30 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 20 74 68   columns than th
25c40 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  e table.        
25c50 2a 2a 20 64 6f 65 73 2c 20 74 68 65 6e 20 77 65  ** does, then we
25c60 20 63 61 6e 20 61 73 73 75 6d 65 20 74 68 61 74   can assume that
25c70 20 69 74 20 63 6f 6e 73 75 6d 65 73 20 6c 65 73   it consumes les
25c80 73 20 73 70 61 63 65 20 6f 6e 20 64 69 73 6b 20  s space on disk 
25c90 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  and.        ** w
25ca0 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20 62 65  ill therefore be
25cb0 20 63 68 65 61 70 65 72 20 74 6f 20 73 63 61 6e   cheaper to scan
25cc0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
25cd0 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a  e query result..
25ce0 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68          ** In th
25cf0 69 73 20 63 61 73 65 20 73 65 74 20 69 52 6f 6f  is case set iRoo
25d00 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  t to the root pa
25d10 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
25d20 20 69 6e 64 65 78 20 62 2d 74 72 65 65 0a 20 20   index b-tree.  
25d30 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 4b 65        ** and pKe
25d40 79 49 6e 66 6f 20 74 6f 20 74 68 65 20 4b 65 79  yInfo to the Key
25d50 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 72  Info structure r
25d60 65 71 75 69 72 65 64 20 74 6f 20 6e 61 76 69 67  equired to navig
25d70 61 74 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  ate the.        
25d80 2a 2a 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ** index..      
25d90 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
25da0 28 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20  (2011-04-15) Do 
25db0 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63  not do a full sc
25dc0 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72  an of an unorder
25dd0 65 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ed index..      
25de0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
25df0 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20  In practice the 
25e00 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
25e10 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  e will not be us
25e20 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a  ed. It is only .
25e30 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65          ** passe
25e40 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65  d to keep OP_Ope
25e50 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20  nRead happy..   
25e60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
25e70 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
25e80 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
25e90 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
25ea0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
25eb0 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  dx->bUnordered==
25ec0 30 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20  0 && (!pBest || 
25ed0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 42  pIdx->nColumn<pB
25ee0 65 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 7b  est->nColumn) ){
25ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65  .            pBe
25f00 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  st = pIdx;.     
25f10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
25f20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 65  .        if( pBe
25f30 73 74 20 26 26 20 70 42 65 73 74 2d 3e 6e 43 6f  st && pBest->nCo
25f40 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  lumn<pTab->nCol 
25f50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f  ){.          iRo
25f60 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d  ot = pBest->tnum
25f70 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79  ;.          pKey
25f80 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e  Info = sqlite3In
25f90 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
25fa0 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20  e, pBest);.     
25fb0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
25fc0 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c   Open a read-onl
25fd0 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74  y cursor, execut
25fe0 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20  e the OP_Count, 
25ff0 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72  close the cursor
26000 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  . */.        sql
26010 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
26020 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
26030 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 29  Csr, iRoot, iDb)
26040 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b  ;.        if( pK
26050 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
26060 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
26070 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
26080 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c  char *)pKeyInfo,
26090 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
260a0 4f 46 46 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OFF);.        }.
260b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
260c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
260d0 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67  Count, iCsr, sAg
260e0 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69  gInfo.aFunc[0].i
260f0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
26100 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
26110 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73  v, OP_Close, iCs
26120 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c  r);.        expl
26130 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70  ainSimpleCount(p
26140 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65  Parse, pTab, pBe
26150 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
26160 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
26170 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
26180 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20  T */.      {.   
26190 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66       /* Check if
261a0 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66   the query is of
261b0 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c   one of the foll
261c0 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20  owing forms:.   
261d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
261e0 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28  **   SELECT min(
261f0 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20  x) FROM ....    
26200 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
26210 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a  max(x) FROM ....
26220 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
26230 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20     ** If it is, 
26240 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64  then ask the cod
26250 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20  e in where.c to 
26260 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20  attempt to sort 
26270 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20  results.        
26280 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65 20 77  ** as if there w
26290 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20  as an "ORDER ON 
262a0 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20  x" or "ORDER ON 
262b0 78 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20  x DESC" clause. 
262c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77  .        ** If w
262d0 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74  here.c is able t
262e0 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74  o produce result
262f0 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73  s sorted in this
26300 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20   order, then.   
26310 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65       ** add vdbe
26320 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f   code to break o
26330 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73  ut of the proces
26340 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20  sing loop after 
26350 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
26360 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
26370 28 73 69 6e 63 65 20 74 68 65 20 66 69 72 73 74  (since the first
26380 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
26390 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20  e loop is .     
263a0 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64     ** guaranteed
263b0 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
263c0 68 65 20 72 6f 77 20 77 69 74 68 20 74 68 65 20  he row with the 
263d0 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d  minimum or maxim
263e0 75 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  um .        ** v
263f0 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f  alue of x, the o
26400 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65 64  nly row required
26410 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  )..        **.  
26420 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69        ** A speci
26430 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20  al flag must be 
26440 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
26450 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f  3WhereBegin() to
26460 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20   slightly.      
26470 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61    ** modify beha
26480 76 69 6f 75 72 20 61 73 20 66 6f 6c 6c 6f 77 73  viour as follows
26490 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
264a0 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74       **   + If t
264b0 68 65 20 71 75 65 72 79 20 69 73 20 61 20 22 53  he query is a "S
264c0 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74  ELECT min(x)", t
264d0 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64  hen the loop cod
264e0 65 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  ed by.        **
264f0 20 20 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f       where.c sho
26500 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20  uld not iterate 
26510 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20  over any values 
26520 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75  with a NULL valu
26530 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  e.        **    
26540 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 20 20   for x..        
26550 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
26560 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  + The optimizer 
26570 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20  code in where.c 
26580 28 74 68 65 20 74 68 69 6e 67 20 74 68 61 74 20  (the thing that 
26590 64 65 63 69 64 65 73 20 77 68 69 63 68 0a 20 20  decides which.  
265a0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64        **     ind
265b0 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f  ex or indices to
265c0 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61   use) should pla
265d0 63 65 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  ce a different p
265e0 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20  riority on .    
265f0 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73      **     satis
26600 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52  fying the 'ORDER
26610 20 42 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e   BY' clause than
26620 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65   it does in othe
26630 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20 20  r cases..       
26640 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f   **     Refer to
26650 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e   code and commen
26660 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f  ts in where.c fo
26670 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20  r details..     
26680 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78     */.        Ex
26690 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20  prList *pMinMax 
266a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20  = 0;.        u8 
266b0 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65  flag = minMaxQue
266c0 72 79 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  ry(p);.        i
266d0 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20  f( flag ){.     
266e0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
266f0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2d  prHasProperty(p-
26700 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
26710 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
26720 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  t) );.          
26730 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65  pMinMax = sqlite
26740 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
26750 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
26760 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c  .pExpr->x.pList,
26770 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44  0);.          pD
26780 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20  el = pMinMax;.  
26790 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e          if( pMin
267a0 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  Max && !db->mall
267b0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
267c0 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d          pMinMax-
267d0 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
267e0 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52  = flag!=WHERE_OR
267f0 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a  DERBY_MIN ?1:0;.
26800 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e              pMin
26810 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  Max->a[0].pExpr-
26820 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
26830 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26840 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
26850 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72    /* This case r
26860 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65  uns if the aggre
26870 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55  gate has no GROU
26880 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68  P BY clause.  Th
26890 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  e.        ** pro
268a0 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20  cessing is much 
268b0 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68  simpler since th
268c0 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69  ere is only a si
268d0 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20  ngle row.       
268e0 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20   ** of output.. 
268f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
26900 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
26910 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
26920 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  Info);.        p
26930 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
26940 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
26950 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
26960 72 65 2c 20 26 70 4d 69 6e 4d 61 78 2c 20 30 2c  re, &pMinMax, 0,
26970 20 66 6c 61 67 29 3b 0a 20 20 20 20 20 20 20 20   flag);.        
26980 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b  if( pWInfo==0 ){
26990 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
269a0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
269b0 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20  (db, pDel);.    
269c0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
269d0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
269e0 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65 41  .        updateA
269f0 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
26a00 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
26a10 20 20 20 20 20 20 20 69 66 28 20 21 70 4d 69 6e         if( !pMin
26a20 4d 61 78 20 26 26 20 66 6c 61 67 20 29 7b 0a 20  Max && flag ){. 
26a30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
26a40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
26a50 5f 47 6f 74 6f 2c 20 30 2c 20 70 57 49 6e 66 6f  _Goto, 0, pWInfo
26a60 2d 3e 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  ->iBreak);.     
26a70 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
26a80 28 28 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e  ((v, "%s() by in
26a90 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20  dex",.          
26aa0 20 20 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45        (flag==WHE
26ab0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22  RE_ORDERBY_MIN?"
26ac0 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20  min":"max")));. 
26ad0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26ae0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
26af0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
26b00 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e    finalizeAggFun
26b10 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26  ctions(pParse, &
26b20 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
26b30 20 7d 0a 0a 20 20 20 20 20 20 70 4f 72 64 65 72   }..      pOrder
26b40 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  By = 0;.      sq
26b50 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
26b60 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
26b70 2c 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54  , addrEnd, SQLIT
26b80 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
26b90 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
26ba0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
26bb0 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p->pEList, 0, 0,
26bc0 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20   0, -1, .       
26bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
26be0 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61  Dest, addrEnd, a
26bf0 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73  ddrEnd);.      s
26c00 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
26c10 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a  lete(db, pDel);.
26c20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
26c30 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
26c40 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  l(v, addrEnd);. 
26c50 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66     .  } /* endif
26c60 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
26c70 20 2a 2f 0a 0a 20 20 69 66 28 20 64 69 73 74 69   */..  if( disti
26c80 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 65 78  nct>=0 ){.    ex
26c90 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70  plainTempTable(p
26ca0 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54  Parse, "DISTINCT
26cb0 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ");.  }..  /* If
26cc0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
26cd0 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
26ce0 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f  en we need to so
26cf0 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  rt the results. 
26d00 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65   ** and send the
26d10 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  m to the callbac
26d20 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  k one by one..  
26d30 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
26d40 79 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  y ){.    explain
26d50 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65  TempTable(pParse
26d60 2c 20 22 4f 52 44 45 52 20 42 59 22 29 3b 0a 20  , "ORDER BY");. 
26d70 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
26d80 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76  ail(pParse, p, v
26d90 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
26da0 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20   pDest);.  }..  
26db0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
26dc0 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a  skip this query.
26dd0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
26de0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
26df0 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54  , iEnd);..  /* T
26e00 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75  he SELECT was su
26e10 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64  ccessfully coded
26e20 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75  .   Set the retu
26e30 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a  rn code to 0.  *
26e40 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f  * to indicate no
26e50 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20   errors..  */.  
26e60 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  rc = 0;..  /* Co
26e70 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68  ntrol jumps to h
26e80 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ere if an error 
26e90 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  is encountered a
26ea0 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20  bove, or upon.  
26eb0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f  ** successful co
26ec0 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45  ding of the SELE
26ed0 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f  CT..  */.select_
26ee0 65 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65  end:.  explainSe
26ef0 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d  tInteger(pParse-
26f00 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73  >iSelectId, iRes
26f10 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a  toreSelectId);..
26f20 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f    /* Identify co
26f30 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72 65  lumn names if re
26f40 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53 45 4c  sults of the SEL
26f50 45 43 54 20 61 72 65 20 74 6f 20 62 65 20 6f 75  ECT are to be ou
26f60 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tput..  */.  if(
26f70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26f80 26 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  & pDest->eDest==
26f90 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
26fa0 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
26fb0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
26fc0 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
26fd0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44  .  }..  sqlite3D
26fe0 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e  bFree(db, sAggIn
26ff0 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  fo.aCol);.  sqli
27000 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41  te3DbFree(db, sA
27010 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20  ggInfo.aFunc);. 
27020 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
27030 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
27040 45 5f 44 45 42 55 47 29 0a 76 6f 69 64 20 73 71  E_DEBUG).void sq
27050 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 45  lite3PrintExpr(E
27060 78 70 72 20 2a 70 29 3b 0a 76 6f 69 64 20 73 71  xpr *p);.void sq
27070 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69  lite3PrintExprLi
27080 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  st(ExprList *pLi
27090 73 74 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65  st);.void sqlite
270a0 33 50 72 69 6e 74 53 65 6c 65 63 74 28 53 65 6c  3PrintSelect(Sel
270b0 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 6e 64 65  ect *p, int inde
270c0 6e 74 29 3b 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  nt);./*.********
270d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
270e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
270f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27110 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66  *******.** The f
27120 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 69 73  ollowing code is
27130 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
27140 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
27150 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 64 65 0a  only.  The code.
27160 2a 2a 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ** that follows 
27170 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20  does not appear 
27180 69 6e 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  in normal builds
27190 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
271a0 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
271b0 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 74 68 65  to print out the
271c0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6c 6c 20   content of all 
271d0 6f 72 20 70 61 72 74 20 6f 66 20 61 20 0a 2a 2a  or part of a .**
271e0 20 70 61 72 73 65 20 73 74 72 75 63 74 75 72 65   parse structure
271f0 73 20 73 75 63 68 20 61 73 20 53 65 6c 65 63 74  s such as Select
27200 20 6f 72 20 45 78 70 72 2e 20 20 53 75 63 68 20   or Expr.  Such 
27210 70 72 69 6e 74 6f 75 74 73 20 61 72 65 20 75 73  printouts are us
27220 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c 70  eful.** for help
27230 69 6e 67 20 74 6f 20 75 6e 64 65 72 73 74 61 6e  ing to understan
27240 64 20 77 68 61 74 20 69 73 20 68 61 70 70 65 6e  d what is happen
27250 69 6e 67 20 69 6e 73 69 64 65 20 74 68 65 20 63  ing inside the c
27260 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a  ode generator.**
27270 20 64 75 72 69 6e 67 20 74 68 65 20 65 78 65 63   during the exec
27280 75 74 69 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65 78  ution of complex
27290 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
272a0 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ts..**.** These 
272b0 72 6f 75 74 69 6e 65 20 61 72 65 20 6e 6f 74 20  routine are not 
272c0 63 61 6c 6c 65 64 20 61 6e 79 77 68 65 72 65 20  called anywhere 
272d0 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20  from within the 
272e0 6e 6f 72 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20 62  normal.** code b
272f0 61 73 65 2e 20 20 54 68 65 6e 20 61 72 65 20 69  ase.  Then are i
27300 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 63 61  ntended to be ca
27310 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
27320 20 74 68 65 20 64 65 62 75 67 67 65 72 0a 2a 2a   the debugger.**
27330 20 6f 72 20 66 72 6f 6d 20 74 65 6d 70 6f 72 61   or from tempora
27340 72 79 20 22 70 72 69 6e 74 66 22 20 73 74 61 74  ry "printf" stat
27350 65 6d 65 6e 74 73 20 69 6e 73 65 72 74 65 64 20  ements inserted 
27360 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a  for debugging..*
27370 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72  /.void sqlite3Pr
27380 69 6e 74 45 78 70 72 28 45 78 70 72 20 2a 70 29  intExpr(Expr *p)
27390 7b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  {.  if( !ExprHas
273a0 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
273b0 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75  ntValue) && p->u
273c0 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 73  .zToken ){.    s
273d0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
273e0 66 28 22 28 25 73 22 2c 20 70 2d 3e 75 2e 7a 54  f("(%s", p->u.zT
273f0 6f 6b 65 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  oken);.  }else{.
27400 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
27410 50 72 69 6e 74 66 28 22 28 25 64 22 2c 20 70 2d  Printf("(%d", p-
27420 3e 6f 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >op);.  }.  if( 
27430 70 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  p->pLeft ){.    
27440 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
27450 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c  tf(" ");.    sql
27460 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d  ite3PrintExpr(p-
27470 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69  >pLeft);.  }.  i
27480 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a  f( p->pRight ){.
27490 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
274a0 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20  Printf(" ");.   
274b0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
274c0 72 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  r(p->pRight);.  
274d0 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
274e0 50 72 69 6e 74 66 28 22 29 22 29 3b 0a 7d 0a 76  Printf(")");.}.v
274f0 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74  oid sqlite3Print
27500 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73  ExprList(ExprLis
27510 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
27520 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
27530 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
27540 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
27550 50 72 69 6e 74 45 78 70 72 28 70 4c 69 73 74 2d  PrintExpr(pList-
27560 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
27570 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e    if( i<pList->n
27580 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20  Expr-1 ){.      
27590 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
275a0 74 66 28 22 2c 20 22 29 3b 0a 20 20 20 20 7d 0a  tf(", ");.    }.
275b0 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
275c0 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28 53 65  e3PrintSelect(Se
275d0 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 6e 64  lect *p, int ind
275e0 65 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 44  ent){.  sqlite3D
275f0 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 53  ebugPrintf("%*sS
27600 45 4c 45 43 54 28 25 70 29 20 22 2c 20 69 6e 64  ELECT(%p) ", ind
27610 65 6e 74 2c 20 22 22 2c 20 70 29 3b 0a 20 20 73  ent, "", p);.  s
27620 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c  qlite3PrintExprL
27630 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  ist(p->pEList);.
27640 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
27650 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 69 66  intf("\n");.  if
27660 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20  ( p->pSrc ){.   
27670 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78 3b 0a   char *zPrefix;.
27680 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 7a      int i;.    z
27690 50 72 65 66 69 78 20 3d 20 22 46 52 4f 4d 22 3b  Prefix = "FROM";
276a0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
276b0 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69  p->pSrc->nSrc; i
276c0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
276d0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
276e0 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63  pItem = &p->pSrc
276f0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71  ->a[i];.      sq
27700 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
27710 28 22 25 2a 73 20 22 2c 20 69 6e 64 65 6e 74 2b  ("%*s ", indent+
27720 36 2c 20 7a 50 72 65 66 69 78 29 3b 0a 20 20 20  6, zPrefix);.   
27730 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22 22 3b     zPrefix = "";
27740 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
27750 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
27760 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
27770 67 50 72 69 6e 74 66 28 22 28 5c 6e 22 29 3b 0a  gPrintf("(\n");.
27780 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
27790 72 69 6e 74 53 65 6c 65 63 74 28 70 49 74 65 6d  rintSelect(pItem
277a0 2d 3e 70 53 65 6c 65 63 74 2c 20 69 6e 64 65 6e  ->pSelect, inden
277b0 74 2b 31 30 29 3b 0a 20 20 20 20 20 20 20 20 73  t+10);.        s
277c0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
277d0 66 28 22 25 2a 73 29 22 2c 20 69 6e 64 65 6e 74  f("%*s)", indent
277e0 2b 38 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 7d  +8, "");.      }
277f0 65 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e  else if( pItem->
27800 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
27810 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
27820 6e 74 66 28 22 25 73 22 2c 20 70 49 74 65 6d 2d  ntf("%s", pItem-
27830 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
27840 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
27850 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ->pTab ){.      
27860 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
27870 69 6e 74 66 28 22 28 74 61 62 6c 65 3a 20 25 73  intf("(table: %s
27880 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  )", pItem->pTab-
27890 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
278a0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
278b0 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
278c0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
278d0 50 72 69 6e 74 66 28 22 20 41 53 20 25 73 22 2c  Printf(" AS %s",
278e0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
278f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
27900 66 28 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53  f( i<p->pSrc->nS
27910 72 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rc-1 ){.        
27920 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
27930 74 66 28 22 2c 22 29 3b 0a 20 20 20 20 20 20 7d  tf(",");.      }
27940 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
27950 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
27960 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
27970 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20   p->pWhere ){.  
27980 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
27990 69 6e 74 66 28 22 25 2a 73 20 57 48 45 52 45 20  intf("%*s WHERE 
279a0 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a  ", indent, "");.
279b0 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
279c0 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 29 3b  Expr(p->pWhere);
279d0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
279e0 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
279f0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f   }.  if( p->pGro
27a00 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  upBy ){.    sqli
27a10 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
27a20 25 2a 73 20 47 52 4f 55 50 20 42 59 20 22 2c 20  %*s GROUP BY ", 
27a30 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20  indent, "");.   
27a40 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
27a50 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  rList(p->pGroupB
27a60 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  y);.    sqlite3D
27a70 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
27a80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
27a90 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71  Having ){.    sq
27aa0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
27ab0 28 22 25 2a 73 20 48 41 56 49 4e 47 20 22 2c 20  ("%*s HAVING ", 
27ac0 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20  indent, "");.   
27ad0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
27ae0 72 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  r(p->pHaving);. 
27af0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
27b00 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
27b10 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
27b20 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
27b30 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
27b40 73 20 4f 52 44 45 52 20 42 59 20 22 2c 20 69 6e  s ORDER BY ", in
27b50 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
27b60 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c  qlite3PrintExprL
27b70 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 29  ist(p->pOrderBy)
27b80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
27b90 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
27ba0 20 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20    }.}./* End of 
27bb0 74 68 65 20 73 74 72 75 63 74 75 72 65 20 64 65  the structure de
27bc0 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64  bug printing cod
27bd0 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.**************
27be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
27c20 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
27c30 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
27c40 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
27c50 45 5f 44 45 42 55 47 29 20 2a 2f 0a              E_DEBUG) */.