/ Hex Artifact Content
Login

Artifact f38d6bb54dbe42409b66b038be24765f68b5d44b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
0210: 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  l the content of
0220: 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74   a Select struct
0230: 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ure but do not d
0240: 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65  eallocate.** the
0250: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
0260: 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61  e itself..*/.sta
0270: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0280: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0290: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
02a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c  elete(db, p->pEL
02c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
02d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
02e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c   p->pSrc);.  sql
02f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0300: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
0310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0330: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
0340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0350: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0380: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
0390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
03a0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
03b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
03c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
03d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
03e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
03f0: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
0400: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c  Initialize a Sel
0410: 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
0420: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
0430: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
0440: 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65  (SelectDest *pDe
0450: 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  st, int eDest, i
0460: 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65  nt iParm){.  pDe
0470: 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29  st->eDest = (u8)
0480: 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e  eDest;.  pDest->
0490: 69 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20  iParm = iParm;. 
04a0: 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79   pDest->affinity
04b0: 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69   = 0;.  pDest->i
04c0: 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  Mem = 0;.  pDest
04d0: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 7d 0a 0a 0a  ->nMem = 0;.}...
04e0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
04f0: 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75   new Select stru
0500: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
0510: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0520: 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  at.** structure.
0530: 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  .*/.Select *sqli
0540: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
0550: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0560: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0570: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
0580: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
0590: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
05a0: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
05b0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
05c0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
05d0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
05e0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
05f0: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0600: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0610: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0620: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0630: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0640: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0650: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0660: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0670: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
0680: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
0690: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
06a0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
06b0: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
06c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
06d0: 69 73 44 69 73 74 69 6e 63 74 2c 20 20 20 20 20  isDistinct,     
06e0: 20 20 2f 2a 20 74 72 75 65 20 69 66 20 74 68 65    /* true if the
06f0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
0700: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
0710: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
0720: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54          /* LIMIT
0730: 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65   value.  NULL me
0740: 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a  ans not used */.
0750: 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20    Expr *pOffset 
0760: 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45          /* OFFSE
0770: 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d  T value.  NULL m
0780: 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a  eans no offset *
0790: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
07a0: 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74  New;.  Select st
07b0: 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  andin;.  sqlite3
07c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
07d0: 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
07e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
07f0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
0800: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ) );.  assert( d
0810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0820: 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70  || !pOffset || p
0830: 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f 46 46 53  Limit ); /* OFFS
0840: 45 54 20 69 6d 70 6c 69 65 73 20 4c 49 4d 49 54  ET implies LIMIT
0850: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   */.  if( pNew==
0860: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
0870: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0880: 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  d );.    pNew = 
0890: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65  &standin;.    me
08a0: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
08b0: 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
08c0: 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  }.  if( pEList==
08d0: 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20  0 ){.    pEList 
08e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
08f0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
0900: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
0910: 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20  b,TK_ALL,0));.  
0920: 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  }.  pNew->pEList
0930: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65   = pEList;.  pNe
0940: 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  w->pSrc = pSrc;.
0950: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
0960: 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d   pWhere;.  pNew-
0970: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
0980: 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  upBy;.  pNew->pH
0990: 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b  aving = pHaving;
09a0: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
09b0: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
09c0: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
09d0: 20 69 73 44 69 73 74 69 6e 63 74 20 3f 20 53 46   isDistinct ? SF
09e0: 5f 44 69 73 74 69 6e 63 74 20 3a 20 30 3b 0a 20  _Distinct : 0;. 
09f0: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53   pNew->op = TK_S
0a00: 45 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70  ELECT;.  pNew->p
0a10: 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
0a20: 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
0a30: 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73  = pOffset;.  ass
0a40: 65 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20  ert( pOffset==0 
0a50: 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a  || pLimit!=0 );.
0a60: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0a70: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
0a80: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0a90: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
0aa0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0ab0: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  [2] = -1;.  if( 
0ac0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
0ad0: 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65   ) {.    clearSe
0ae0: 6c 65 63 74 28 64 62 2c 20 70 4e 65 77 29 3b 0a  lect(db, pNew);.
0af0: 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 26 73      if( pNew!=&s
0b00: 74 61 6e 64 69 6e 20 29 20 73 71 6c 69 74 65 33  tandin ) sqlite3
0b10: 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29  DbFree(db, pNew)
0b20: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
0b30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
0b40: 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21  ert( pNew->pSrc!
0b50: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
0b60: 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73  rr>0 );.  }.  as
0b70: 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61  sert( pNew!=&sta
0b80: 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e  ndin );.  return
0b90: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
0ba0: 44 65 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e  Delete the given
0bb0: 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
0bc0: 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73  e and all of its
0bd0: 20 73 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a   substructures..
0be0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
0bf0: 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69  electDelete(sqli
0c00: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
0c10: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
0c20: 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28      clearSelect(
0c30: 64 62 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69  db, p);.    sqli
0c40: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
0c50: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
0c60: 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e  iven 1 to 3 iden
0c70: 74 69 66 69 65 72 73 20 70 72 65 63 65 65 64 69  tifiers preceedi
0c80: 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77  ng the JOIN keyw
0c90: 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74  ord, determine t
0ca0: 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f  he.** type of jo
0cb0: 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  in.  Return an i
0cc0: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
0cd0: 74 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74  that expresses t
0ce0: 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74  hat type.** in t
0cf0: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  erms of the foll
0d00: 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73  owing bit values
0d10: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49  :.**.**     JT_I
0d20: 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43  NNER.**     JT_C
0d30: 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f  ROSS.**     JT_O
0d40: 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e  UTER.**     JT_N
0d50: 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54  ATURAL.**     JT
0d60: 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f  _LEFT.**     JT_
0d70: 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75  RIGHT.**.** A fu
0d80: 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73  ll outer join is
0d90: 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e   the combination
0da0: 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20   of JT_LEFT and 
0db0: 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20  JT_RIGHT..**.** 
0dc0: 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72  If an illegal or
0dd0: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
0de0: 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20  n type is seen, 
0df0: 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72  then still retur
0e00: 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65  n.** a join type
0e10: 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72  , but put an err
0e20: 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  or in the pParse
0e30: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
0e40: 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79  nt sqlite3JoinTy
0e50: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
0e60: 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b  , Token *pA, Tok
0e70: 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70  en *pB, Token *p
0e80: 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79  C){.  int jointy
0e90: 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20  pe = 0;.  Token 
0ea0: 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b  *apAll[3];.  Tok
0eb0: 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20  en *p;.         
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ed0: 20 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36      /*   0123456
0ee0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
0ef0: 33 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20  3456789 123 */. 
0f00: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
0f10: 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20  ar zKeyText[] = 
0f20: 22 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72  "naturaleftouter
0f30: 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f  ightfullinnercro
0f40: 73 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  ss";.  static co
0f50: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
0f60: 20 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a   u8 i;        /*
0f70: 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65   Beginning of ke
0f80: 79 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b  yword text in zK
0f90: 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20  eyText[] */.    
0fa0: 75 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20  u8 nChar;    /* 
0fb0: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65  Length of the ke
0fc0: 79 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74  yword in charact
0fd0: 65 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f  ers */.    u8 co
0fe0: 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20  de;     /* Join 
0ff0: 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d  type mask */.  }
1000: 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a   aKeyword[] = {.
1010: 20 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a      /* natural *
1020: 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41  / { 0,  7, JT_NA
1030: 54 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20  TURAL           
1040: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c       },.    /* l
1050: 65 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20  eft    */ { 6,  
1060: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55  4, JT_LEFT|JT_OU
1070: 54 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  TER          },.
1080: 20 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a      /* outer   *
1090: 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55  / { 10, 5, JT_OU
10a0: 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  TER             
10b0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72       },.    /* r
10c0: 69 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20  ight   */ { 14, 
10d0: 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  5, JT_RIGHT|JT_O
10e0: 55 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a  UTER         },.
10f0: 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a      /* full    *
1100: 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45  / { 19, 4, JT_LE
1110: 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  FT|JT_RIGHT|JT_O
1120: 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69  UTER },.    /* i
1130: 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20  nner   */ { 23, 
1140: 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20  5, JT_INNER     
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1160: 20 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a      /* cross   *
1170: 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e  / { 28, 5, JT_IN
1180: 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20  NER|JT_CROSS    
1190: 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69       },.  };.  i
11a0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c  nt i, j;.  apAll
11b0: 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c  [0] = pA;.  apAl
11c0: 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41  l[1] = pB;.  apA
11d0: 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f  ll[2] = pC;.  fo
11e0: 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70  r(i=0; i<3 && ap
11f0: 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  All[i]; i++){.  
1200: 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a    p = apAll[i];.
1210: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41      for(j=0; j<A
1220: 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72  rraySize(aKeywor
1230: 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  d); j++){.      
1240: 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f  if( p->n==aKeywo
1250: 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20  rd[j].nChar .   
1260: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1270: 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a  3StrNICmp((char*
1280: 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74  )p->z, &zKeyText
1290: 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c  [aKeyword[j].i],
12a0: 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   p->n)==0 ){.   
12b0: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
12c0: 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64   aKeyword[j].cod
12d0: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
12e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
1300: 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d  =0 || j==1 || j=
1310: 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d  =2 || j==3 || j=
1320: 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d  =4 || j==5 || j=
1330: 3d 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e  =6 );.    if( j>
1340: 3d 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77  =ArraySize(aKeyw
1350: 6f 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f  ord) ){.      jo
1360: 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52  intype |= JT_ERR
1370: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
1380: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1390: 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20  .     (jointype 
13a0: 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  & (JT_INNER|JT_O
13b0: 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45  UTER))==(JT_INNE
13c0: 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20  R|JT_OUTER) ||. 
13d0: 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20      (jointype & 
13e0: 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29  JT_ERROR)!=0.  )
13f0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
1400: 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20   *zSp = " ";.   
1410: 20 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29   assert( pB!=0 )
1420: 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20  ;.    if( pC==0 
1430: 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20  ){ zSp++; }.    
1440: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1450: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
1460: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
1470: 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20  join type: ".   
1480: 20 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c      "%T %T%s%T",
1490: 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43   pA, pB, zSp, pC
14a0: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
14b0: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65  = JT_INNER;.  }e
14c0: 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70  lse if( (jointyp
14d0: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
14e0: 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a   .         && (j
14f0: 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
1500: 46 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a  FT|JT_RIGHT))!=J
1510: 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71  T_LEFT ){.    sq
1520: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1530: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49  arse, .      "RI
1540: 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54  GHT and FULL OUT
1550: 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74  ER JOINs are not
1560: 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f   currently suppo
1570: 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e  rted");.    join
1580: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
1590: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f  .  }.  return jo
15a0: 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  intype;.}../*.**
15b0: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
15c0: 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  x of a column in
15d0: 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72   a table.  Retur
15e0: 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75  n -1 if the colu
15f0: 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  mn.** is not con
1600: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61  tained in the ta
1610: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
1620: 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54  nt columnIndex(T
1630: 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73  able *pTab, cons
1640: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20  t char *zCol){. 
1650: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1660: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
1670: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
1680: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54  qlite3StrICmp(pT
1690: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
16a0: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65  e, zCol)==0 ) re
16b0: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
16c0: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
16d0: 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72  * Search the fir
16e0: 73 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70  st N tables in p
16f0: 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74  Src, from left t
1700: 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67  o right, looking
1710: 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20   for a.** table 
1720: 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d  that has a colum
1730: 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a  n named zCol.  .
1740: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64  **.** When found
1750: 2c 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64  , set *piTab and
1760: 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74   *piCol to the t
1770: 61 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63  able index and c
1780: 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f  olumn index.** o
1790: 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63  f the matching c
17a0: 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e  olumn and return
17b0: 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   TRUE..**.** If 
17c0: 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72  not found, retur
17d0: 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74  n FALSE..*/.stat
17e0: 69 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43  ic int tableAndC
17f0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72  olumnIndex(.  Sr
1800: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
1810: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74     /* Array of t
1820: 61 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20  ables to search 
1830: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
1840: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1850: 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
1860: 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65   pSrc->a[] to se
1870: 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  arch */.  const 
1880: 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f  char *zCol,    /
1890: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
18a0: 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b  lumn we are look
18b0: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ing for */.  int
18c0: 20 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20   *piTab,        
18d0: 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78    /* Write index
18e0: 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65   of pSrc->a[] he
18f0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43  re */.  int *piC
1900: 6f 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ol           /* 
1910: 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70  Write index of p
1920: 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70  Src->a[*piTab].p
1930: 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65  Tab->aCol[] here
1940: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1960: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1970: 72 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  r tables in pSrc
1980: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20   */.  int iCol; 
1990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
19a0: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61  dex of column ma
19b0: 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a  tching zCol */..
19c0: 20 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62    assert( (piTab
19d0: 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29  ==0)==(piCol==0)
19e0: 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20   );  /* Both or 
19f0: 6e 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c  neither are NULL
1a00: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
1a10: 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43  <N; i++){.    iC
1a20: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
1a30: 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62  (pSrc->a[i].pTab
1a40: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  , zCol);.    if(
1a50: 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
1a60: 20 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20    if( piTab ){. 
1a70: 20 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20         *piTab = 
1a80: 69 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f  i;.        *piCo
1a90: 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  l = iCol;.      
1aa0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  }.      return 1
1ab0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1ac0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1ad0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1ae0: 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65  s used to add te
1af0: 72 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a  rms implied by J
1b00: 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68  OIN syntax to th
1b10: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
1b20: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  e expression of 
1b30: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
1b40: 6e 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d  nt. The new term
1b50: 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e  , which.** is AN
1b60: 44 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69  Ded with the exi
1b70: 73 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75  sting WHERE clau
1b80: 73 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f  se, is of the fo
1b90: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61  rm:.**.**    (ta
1ba0: 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63  b1.col1 = tab2.c
1bb0: 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  ol2).**.** where
1bc0: 20 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72   tab1 is the iSr
1bd0: 63 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72  c'th table in Sr
1be0: 63 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74  cList pSrc and t
1bf0: 61 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28  ab2 is the .** (
1c00: 69 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75  iSrc+1)'th. Colu
1c10: 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d  mn col1 is colum
1c20: 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61  n iColLeft of ta
1c30: 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a  b1, and col2 is.
1c40: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69  ** column iColRi
1c50: 67 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a  ght of tab2..*/.
1c60: 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57  static void addW
1c70: 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73  hereTerm(.  Pars
1c80: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1ca0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1cb0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
1cc0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1cd0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
1ce0: 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c  ables in FROM cl
1cf0: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
1d00: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
1d10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1d20: 65 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c  ex of first tabl
1d30: 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72  e to join in pSr
1d40: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c  c */.  int iColL
1d50: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
1d60: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1d70: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72  of column in fir
1d80: 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  st table */.  in
1d90: 74 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20  t iRight,       
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1db0: 20 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64   Index of second
1dc0: 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a   table in pSrc *
1dd0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68  /.  int iColRigh
1de0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1df0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1e00: 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64  column in second
1e10: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
1e20: 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20  isOuterJoin,    
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e40: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
1e50: 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a  n OUTER join */.
1e60: 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65    Expr **ppWhere
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e80: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65    /* IN/OUT: The
1e90: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
1ea0: 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20   add to */.){.  
1eb0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1ec0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
1ed0: 20 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70   *pE1;.  Expr *p
1ee0: 45 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b  E2;.  Expr *pEq;
1ef0: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66  ..  assert( iLef
1f00: 74 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73  t<iRight );.  as
1f10: 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63  sert( pSrc->nSrc
1f20: 3e 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  >iRight );.  ass
1f30: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65  ert( pSrc->a[iLe
1f40: 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73  ft].pTab );.  as
1f50: 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52  sert( pSrc->a[iR
1f60: 69 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20  ight].pTab );.. 
1f70: 20 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72   pE1 = sqlite3Cr
1f80: 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64  eateColumnExpr(d
1f90: 62 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20  b, pSrc, iLeft, 
1fa0: 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32  iColLeft);.  pE2
1fb0: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
1fc0: 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70  ColumnExpr(db, p
1fd0: 53 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f  Src, iRight, iCo
1fe0: 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20  lRight);..  pEq 
1ff0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2000: 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45  Parse, TK_EQ, pE
2010: 31 2c 20 70 45 32 2c 20 30 29 3b 0a 20 20 69 66  1, pE2, 0);.  if
2020: 28 20 70 45 71 20 26 26 20 69 73 4f 75 74 65 72  ( pEq && isOuter
2030: 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78 70 72  Join ){.    Expr
2040: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 71 2c  SetProperty(pEq,
2050: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
2060: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2070: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
2080: 45 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  Eq, EP_TokenOnly
2090: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
20a0: 20 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64      ExprSetIrred
20b0: 75 63 69 62 6c 65 28 70 45 71 29 3b 0a 20 20 20  ucible(pEq);.   
20c0: 20 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e   pEq->iRightJoin
20d0: 54 61 62 6c 65 20 3d 20 28 69 31 36 29 70 45 32  Table = (i16)pE2
20e0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  ->iTable;.  }.  
20f0: 2a 70 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  *ppWhere = sqlit
2100: 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 2a 70  e3ExprAnd(db, *p
2110: 70 57 68 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a  pWhere, pEq);.}.
2120: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
2130: 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65  P_FromJoin prope
2140: 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  rty on all terms
2150: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
2160: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64  pression..** And
2170: 20 73 65 74 20 74 68 65 20 45 78 70 72 2e 69 52   set the Expr.iR
2180: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f  ightJoinTable to
2190: 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72   iTable for ever
21a0: 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a  y term in the.**
21b0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
21c0: 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f  ** The EP_FromJo
21d0: 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73 20 75  in property is u
21e0: 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20  sed on terms of 
21f0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  an expression to
2200: 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46   tell.** the LEF
2210: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f  T OUTER JOIN pro
2220: 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68  cessing logic th
2230: 61 74 20 74 68 69 73 20 74 65 72 6d 20 69 73 20  at this term is 
2240: 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a  part of the.** j
2250: 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20  oin restriction 
2260: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
2270: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
2280: 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61  use and not a pa
2290: 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72  rt.** of the mor
22a0: 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20  e general WHERE 
22b0: 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65 20 74  clause.  These t
22c0: 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f  erms are moved o
22d0: 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48  ver to the.** WH
22e0: 45 52 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e  ERE clause durin
22f0: 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e  g join processin
2300: 67 20 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f  g but we need to
2310: 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74   remember that t
2320: 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65  hey.** originate
2330: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
2340: 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  SING clause..**.
2350: 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52 69 67  ** The Expr.iRig
2360: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c  htJoinTable tell
2370: 73 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  s the WHERE clau
2380: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  se processing th
2390: 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  at the.** expres
23a0: 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20  sion depends on 
23b0: 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e  table iRightJoin
23c0: 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68  Table even if th
23d0: 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a  at table is not.
23e0: 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65  ** explicitly me
23f0: 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65  ntioned in the e
2400: 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74  xpression.  That
2410: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2420: 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61  needed.** for ca
2430: 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ses like this:.*
2440: 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
2450: 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
2460: 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
2470: 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a  .b AND t1.x=5.**
2480: 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c  .** The where cl
2490: 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65  ause needs to de
24a0: 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67  fer the handling
24b0: 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a   of the t1.x=5.*
24c0: 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74  * term until aft
24d0: 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f  er the t2 loop o
24e0: 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20  f the join.  In 
24f0: 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e  that way, a.** N
2500: 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20  ULL t2 row will 
2510: 62 65 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e  be inserted when
2520: 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49  ever t1.x!=5.  I
2530: 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64  f we do not.** d
2540: 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e  efer the handlin
2550: 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20  g of t1.x=5, it 
2560: 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65  will be processe
2570: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  d immediately.**
2580: 20 61 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f   after the t1 lo
2590: 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68  op and rows with
25a0: 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65   t1.x!=5 will ne
25b0: 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a  ver appear in.**
25c0: 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69   the output, whi
25d0: 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e  ch is incorrect.
25e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25f0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72  setJoinExpr(Expr
2600: 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29   *p, int iTable)
2610: 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  {.  while( p ){.
2620: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
2630: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
2640: 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  in);.    assert(
2650: 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
2660: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
2670: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2680: 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 49   );.    ExprSetI
2690: 72 72 65 64 75 63 69 62 6c 65 28 70 29 3b 0a 20  rreducible(p);. 
26a0: 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e     p->iRightJoin
26b0: 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61  Table = (i16)iTa
26c0: 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e  ble;.    setJoin
26d0: 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69  Expr(p->pLeft, i
26e0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20  Table);.    p = 
26f0: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a  p->pRight;.  } .
2700: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2710: 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20  utine processes 
2720: 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61  the join informa
2730: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
2740: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
2750: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
2760: 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74  uses are convert
2770: 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65  ed into extra te
2780: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
2790: 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55   clause..** NATU
27a0: 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63  RAL joins also c
27b0: 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52  reate extra WHER
27c0: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  E clause terms..
27d0: 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20  **.** The terms 
27e0: 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  of a FROM clause
27f0: 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
2800: 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72  n the Select.pSr
2810: 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  c structure..** 
2820: 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61  The left most ta
2830: 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73 74  ble is the first
2840: 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74   entry in Select
2850: 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67 68  .pSrc.  The righ
2860: 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20  t-most.** table 
2870: 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  is the last entr
2880: 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65  y.  The join ope
2890: 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e  rator is held in
28a0: 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a   the entry to.**
28b0: 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73   the left.  Thus
28c0: 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e   entry 0 contain
28d0: 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  s the join opera
28e0: 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e  tor for the join
28f0: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72   between.** entr
2900: 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e  ies 0 and 1.  An
2910: 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  y ON or USING cl
2920: 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65 64  auses associated
2930: 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61   with the join a
2940: 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63  re.** also attac
2950: 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20  hed to the left 
2960: 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  entry..**.** Thi
2970: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2980: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2990: 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
29a0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
29b0: 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  t sqliteProcessJ
29c0: 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  oin(Parse *pPars
29d0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
29e0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69   /* All tables i
2a10: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2a20: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  e */.  int i, j;
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2a50: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72  ounters */.  str
2a60: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2a70: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20   *pLeft;     /* 
2a80: 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67  Left table being
2a90: 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72   joined */.  str
2aa0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2ab0: 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20   *pRight;    /* 
2ac0: 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e  Right table bein
2ad0: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70  g joined */..  p
2ae0: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
2af0: 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e   pLeft = &pSrc->
2b00: 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d  a[0];.  pRight =
2b10: 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f   &pLeft[1];.  fo
2b20: 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
2b30: 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67  Src-1; i++, pRig
2b40: 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a  ht++, pLeft++){.
2b50: 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74      Table *pLeft
2b60: 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61  Tab = pLeft->pTa
2b70: 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52  b;.    Table *pR
2b80: 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68 74  ightTab = pRight
2b90: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20  ->pTab;.    int 
2ba0: 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66  isOuter;..    if
2bb0: 28 20 4e 45 56 45 52 28 70 4c 65 66 74 54 61 62  ( NEVER(pLeftTab
2bc0: 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62  ==0 || pRightTab
2bd0: 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ==0) ) continue;
2be0: 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28  .    isOuter = (
2bf0: 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65  pRight->jointype
2c00: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b   & JT_OUTER)!=0;
2c10: 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68  ..    /* When th
2c20: 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
2c30: 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64  d is present, ad
2c40: 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  d WHERE clause t
2c50: 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20  erms for.    ** 
2c60: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61  every column tha
2c70: 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  t the two tables
2c80: 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e   have in common.
2c90: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2ca0: 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65  pRight->jointype
2cb0: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b   & JT_NATURAL ){
2cc0: 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68  .      if( pRigh
2cd0: 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74  t->pOn || pRight
2ce0: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
2cf0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2d00: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e  Msg(pParse, "a N
2d10: 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20  ATURAL join may 
2d20: 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20 20  not have ".     
2d30: 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20        "an ON or 
2d40: 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30  USING clause", 0
2d50: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2d60: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
2d70: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52     for(j=0; j<pR
2d80: 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a  ightTab->nCol; j
2d90: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
2da0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e  r *zName;   /* N
2db0: 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  ame of column in
2dc0: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
2dd0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
2de0: 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d 61  iLeft;     /* Ma
2df0: 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61 62 6c  tching left tabl
2e00: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
2e10: 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d   iLeftCol;  /* M
2e20: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 69  atching column i
2e30: 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  n the left table
2e40: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61   */..        zNa
2e50: 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62 2d 3e  me = pRightTab->
2e60: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  aCol[j].zName;. 
2e70: 20 20 20 20 20 20 20 69 66 28 20 74 61 62 6c 65         if( table
2e80: 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
2e90: 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c  Src, i+1, zName,
2ea0: 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43   &iLeft, &iLeftC
2eb0: 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ol) ){.         
2ec0: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50   addWhereTerm(pP
2ed0: 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66  arse, pSrc, iLef
2ee0: 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31  t, iLeftCol, i+1
2ef0: 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , j,.           
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 75              isOu
2f10: 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29  ter, &p->pWhere)
2f20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2f30: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
2f40: 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20  * Disallow both 
2f50: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
2f60: 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65  uses in the same
2f70: 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20   join.    */.   
2f80: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e   if( pRight->pOn
2f90: 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69   && pRight->pUsi
2fa0: 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
2fb0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2fc0: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65  se, "cannot have
2fd0: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
2fe0: 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c  NG ".        "cl
2ff0: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
3000: 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20  e join");.      
3010: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
3020: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
3030: 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  ON clause to the
3040: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
3050: 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63  E clause, connec
3060: 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e  ted by.    ** an
3070: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
3080: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
3090: 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20  ight->pOn ){.   
30a0: 20 20 20 69 66 28 20 69 73 4f 75 74 65 72 20 29     if( isOuter )
30b0: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69   setJoinExpr(pRi
30c0: 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74  ght->pOn, pRight
30d0: 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
30e0: 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71    p->pWhere = sq
30f0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
3100: 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65  rse->db, p->pWhe
3110: 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29  re, pRight->pOn)
3120: 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e  ;.      pRight->
3130: 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  pOn = 0;.    }..
3140: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78      /* Create ex
3150: 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65  tra terms on the
3160: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f   WHERE clause fo
3170: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61  r each column na
3180: 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  med.    ** in th
3190: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20  e USING clause. 
31a0: 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65   Example: If the
31b0: 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62   two tables to b
31c0: 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20  e joined are .  
31d0: 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64    ** A and B and
31e0: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
31f0: 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e  e names X, Y, an
3200: 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68  d Z, then add th
3210: 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  is.    ** to the
3220: 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20   WHERE clause:  
3230: 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e    A.X=B.X AND A.
3240: 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e  Y=B.Y AND A.Z=B.
3250: 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20  Z.    ** Report 
3260: 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20  an error if any 
3270: 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64  column mentioned
3280: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
3290: 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e  ause is.    ** n
32a0: 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
32b0: 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62  both tables to b
32c0: 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f  e joined..    */
32d0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
32e0: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
32f0: 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d   IdList *pList =
3300: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b   pRight->pUsing;
3310: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
3320: 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b  j<pList->nId; j+
3330: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
3340: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20   *zName;     /* 
3350: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 72 6d  Name of the term
3360: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
3370: 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ause */.        
3380: 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 20  int iLeft;      
3390: 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68 65   /* Table on the
33a0: 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74 63 68   left with match
33b0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ing column name 
33c0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
33d0: 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20 43  LeftCol;    /* C
33e0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
33f0: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
3400: 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20  on the left */. 
3410: 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67 68         int iRigh
3420: 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d  tCol;   /* Colum
3430: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  n number of matc
3440: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74  hing column on t
3450: 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20 20  he right */..   
3460: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c 69       zName = pLi
3470: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[j].zName;.
3480: 20 20 20 20 20 20 20 20 69 52 69 67 68 74 43 6f          iRightCo
3490: 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  l = columnIndex(
34a0: 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65  pRightTab, zName
34b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
34c0: 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20 20  RightCol<0.     
34d0: 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e 64      || !tableAnd
34e0: 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63  ColumnIndex(pSrc
34f0: 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69  , i+1, zName, &i
3500: 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29  Left, &iLeftCol)
3510: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
3520: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
3530: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
3540: 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67  annot join using
3550: 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c   column %s - col
3560: 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20  umn ".          
3570: 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69    "not present i
3580: 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20  n both tables", 
3590: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
35a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
35b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64      }.        ad
35c0: 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73  dWhereTerm(pPars
35d0: 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20  e, pSrc, iLeft, 
35e0: 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 69  iLeftCol, i+1, i
35f0: 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20 20  RightCol,.      
3600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
3610: 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65  sOuter, &p->pWhe
3620: 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  re);.      }.   
3630: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3640: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  0;.}../*.** Inse
3650: 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76 22  rt code into "v"
3660: 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20   that will push 
3670: 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74 68  the record on th
3680: 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20  e top of the.** 
3690: 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 73  stack into the s
36a0: 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  orter..*/.static
36b0: 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f   void pushOntoSo
36c0: 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  rter(.  Parse *p
36d0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
36e0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
36f0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
3700: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f 2a 20  pOrderBy,    /* 
3710: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
3720: 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  use */.  Select 
3730: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  *pSelect,       
3740: 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c  /* The whole SEL
3750: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
3760: 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 20 20  .  int regData  
3770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
3780: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61  ister holding da
3790: 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  ta to be sorted 
37a0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
37b0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
37c0: 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70  .  int nExpr = p
37d0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
37e0: 20 20 69 6e 74 20 72 65 67 42 61 73 65 20 3d 20    int regBase = 
37f0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
3800: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70  nge(pParse, nExp
3810: 72 2b 32 29 3b 0a 20 20 69 6e 74 20 72 65 67 52  r+2);.  int regR
3820: 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
3830: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
3840: 29 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 73  );.  int op;.  s
3850: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
3860: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
3870: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
3880: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
3890: 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61 73  pOrderBy, regBas
38a0: 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  e, 0);.  sqlite3
38b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
38c0: 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72 64 65  _Sequence, pOrde
38d0: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  rBy->iECursor, r
38e0: 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20  egBase+nExpr);. 
38f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
3900: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  Move(pParse, reg
3910: 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45  Data, regBase+nE
3920: 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71 6c  xpr+1, 1);.  sql
3930: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
3940: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
3950: 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72 20   regBase, nExpr 
3960: 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  + 2, regRecord);
3970: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e  .  if( pSelect->
3980: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73  selFlags & SF_Us
3990: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f  eSorter ){.    o
39a0: 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  p = OP_SorterIns
39b0: 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ert;.  }else{.  
39c0: 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73    op = OP_IdxIns
39d0: 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ert;.  }.  sqlit
39e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
39f0: 6f 70 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  op, pOrderBy->iE
3a00: 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72  Cursor, regRecor
3a10: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  d);.  sqlite3Rel
3a20: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
3a30: 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
3a40: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
3a50: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
3a60: 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72  , regBase, nExpr
3a70: 2b 32 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 65  +2);.  if( pSele
3a80: 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20  ct->iLimit ){.  
3a90: 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64    int addr1, add
3aa0: 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d  r2;.    int iLim
3ab0: 69 74 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c  it;.    if( pSel
3ac0: 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a  ect->iOffset ){.
3ad0: 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70        iLimit = p
3ae0: 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b  Select->iOffset+
3af0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
3b00: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65      iLimit = pSe
3b10: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  lect->iLimit;.  
3b20: 20 20 7d 0a 20 20 20 20 61 64 64 72 31 20 3d 20    }.    addr1 = 
3b30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3b40: 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  1(v, OP_IfZero, 
3b50: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c  iLimit);.    sql
3b60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3b70: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c 69  , OP_AddImm, iLi
3b80: 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64  mit, -1);.    ad
3b90: 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
3ba0: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
3bb0: 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  to);.    sqlite3
3bc0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
3bd0: 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69  addr1);.    sqli
3be0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
3bf0: 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72   OP_Last, pOrder
3c00: 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  By->iECursor);. 
3c10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3c20: 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74  dOp1(v, OP_Delet
3c30: 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  e, pOrderBy->iEC
3c40: 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69  ursor);.    sqli
3c50: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
3c60: 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a 7d  v, addr2);.  }.}
3c70: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65  ../*.** Add code
3c80: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
3c90: 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74  e OFFSET.*/.stat
3ca0: 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73  ic void codeOffs
3cb0: 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  et(.  Vdbe *v,  
3cc0: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
3cd0: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
3ce0: 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63  is VM */.  Selec
3cf0: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  t *p,        /* 
3d00: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
3d10: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
3d20: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
3d30: 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  nue     /* Jump 
3d40: 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65  here to skip the
3d50: 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20   current record 
3d60: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69  */.){.  if( p->i
3d70: 4f 66 66 73 65 74 20 26 26 20 69 43 6f 6e 74 69  Offset && iConti
3d80: 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  nue!=0 ){.    in
3d90: 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c 69  t addr;.    sqli
3da0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3db0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69   OP_AddImm, p->i
3dc0: 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20  Offset, -1);.   
3dd0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
3de0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
3df0: 49 66 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73 65  IfNeg, p->iOffse
3e00: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
3e10: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3e20: 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e  Goto, 0, iContin
3e30: 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  ue);.    VdbeCom
3e40: 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20 4f  ment((v, "skip O
3e50: 46 46 53 45 54 20 72 65 63 6f 72 64 73 22 29 29  FFSET records"))
3e60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3e70: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
3e80: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
3e90: 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77   Add code that w
3ea0: 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ill check to mak
3eb0: 65 20 73 75 72 65 20 74 68 65 20 4e 20 72 65 67  e sure the N reg
3ec0: 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
3ed0: 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20  at iMem.** form 
3ee0: 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79  a distinct entry
3ef0: 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72  .  iTab is a sor
3f00: 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
3f10: 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79  holds previously
3f20: 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61  .** seen combina
3f30: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76  tions of the N v
3f40: 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e  alues.  A new en
3f50: 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69  try is made in i
3f60: 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75  Tab.** if the cu
3f70: 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61  rrent N values a
3f80: 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20  re new..**.** A 
3f90: 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65  jump to addrRepe
3fa0: 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74  at is made and t
3fb0: 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72  he N+1 values ar
3fc0: 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
3fd0: 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68  e.** stack if th
3fe0: 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73  e top N elements
3ff0: 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63   are not distinc
4000: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
4010: 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a  d codeDistinct(.
4020: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4030: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
4040: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
4050: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
4060: 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20   int iTab,      
4070: 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67      /* A sorting
4080: 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74   index used to t
4090: 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74  est for distinct
40a0: 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ness */.  int ad
40b0: 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20  drRepeat,    /* 
40c0: 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20  Jump to here if 
40d0: 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  not distinct */.
40e0: 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
40f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4100: 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  f elements */.  
4110: 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20  int iMem        
4120: 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d     /* First elem
4130: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ent */.){.  Vdbe
4140: 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a   *v;.  int r1;..
4150: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
4160: 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69  dbe;.  r1 = sqli
4170: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
4180: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
4190: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
41a0: 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c   OP_Found, iTab,
41b0: 20 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65   addrRepeat, iMe
41c0: 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  m, N);.  sqlite3
41d0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
41e0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65  _MakeRecord, iMe
41f0: 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c  m, N, r1);.  sql
4200: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4210: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
4220: 69 54 61 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c  iTab, r1);.  sql
4230: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
4240: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
4250: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
4260: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
4270: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
4280: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
4290: 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69 73  when a SELECT is
42a0: 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 73   used within a s
42b0: 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  ubexpression.** 
42c0: 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e  (example:  "a IN
42d0: 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
42e0: 74 61 62 6c 65 29 22 29 20 62 75 74 20 69 74 20  table)") but it 
42f0: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31 20  has more than 1 
4300: 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e  result.** column
4310: 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20 69 6e  .  We do this in
4320: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65   a subroutine be
4330: 63 61 75 73 65 20 74 68 65 20 65 72 72 6f 72 20  cause the error 
4340: 75 73 65 64 20 74 6f 20 6f 63 63 75 72 0a 2a 2a  used to occur.**
4350: 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61   in multiple pla
4360: 63 65 73 2e 20 20 28 54 68 65 20 65 72 72 6f 72  ces.  (The error
4370: 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 6e 20   only occurs in 
4380: 6f 6e 65 20 70 6c 61 63 65 20 6e 6f 77 2c 20 62  one place now, b
4390: 75 74 20 77 65 0a 2a 2a 20 72 65 74 61 69 6e 20  ut we.** retain 
43a0: 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  the subroutine t
43b0: 6f 20 6d 69 6e 69 6d 69 7a 65 20 63 6f 64 65 20  o minimize code 
43c0: 64 69 73 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f 0a  disruption.).*/.
43d0: 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
43e0: 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65  ForMultiColumnSe
43f0: 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61 72  lectError(.  Par
4400: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4410: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
4420: 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  xt. */.  SelectD
4430: 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a  est *pDest,   /*
4440: 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20   Destination of 
4450: 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a  SELECT results *
4460: 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20 20  /.  int nExpr   
4470: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4480: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
4490: 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
44a0: 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20   SELECT */.){.  
44b0: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
44c0: 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28 20  t->eDest;.  if( 
44d0: 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44 65 73  nExpr>1 && (eDes
44e0: 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44  t==SRT_Mem || eD
44f0: 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b  est==SRT_Set) ){
4500: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
4510: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e  rMsg(pParse, "on
4520: 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75  ly a single resu
4530: 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22  lt allowed for "
4540: 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43  .       "a SELEC
4550: 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  T that is part o
4560: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22  f an expression"
4570: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
4580: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
4590: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65  turn 0;.  }.}.#e
45a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
45b0: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
45c0: 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
45d0: 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68  the inside of th
45e0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
45f0: 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a  of a SELECT..**.
4600: 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61 6e 64  ** If srcTab and
4610: 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74   nColumn are bot
4620: 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  h zero, then the
4630: 20 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69   pEList expressi
4640: 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75  ons.** are evalu
4650: 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
4660: 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f   get the data fo
4670: 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20  r this row.  If 
4680: 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65  nColumn>0.** the
4690: 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64  n data is pulled
46a0: 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64   from srcTab and
46b0: 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64 20   pEList is used 
46c0: 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a  only to get the.
46d0: 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f 72  ** datatypes for
46e0: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f   each column..*/
46f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
4700: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20  ectInnerLoop(.  
4710: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4720: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
4730: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
4740: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
4750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
4760: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63  e complete selec
4770: 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  t statement bein
4780: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70  g coded */.  Exp
4790: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
47a0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
47b0: 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74  values being ext
47c0: 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racted */.  int 
47d0: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
47e0: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
47f0: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
4800: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
4810: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n,            /*
4820: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
4830: 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65  ns in the source
4840: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
4850: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
4860: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55      /* If not NU
4870: 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73  LL, sort results
4880: 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20   using this key 
4890: 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63  */.  int distinc
48a0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
48b0: 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72  If >=0, make sur
48c0: 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
48d0: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 53 65 6c 65  stinct */.  Sele
48e0: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
48f0: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69      /* How to di
4900: 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73  spose of the res
4910: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ults */.  int iC
4920: 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20  ontinue,        
4930: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
4940: 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
4950: 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  next row */.  in
4960: 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
4970: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4980: 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
4990: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
49a0: 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  p */.){.  Vdbe *
49b0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
49c0: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
49d0: 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20  t hasDistinct;  
49e0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
49f0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
4a00: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
4a10: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73   */.  int regRes
4a20: 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ult;            
4a30: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65    /* Start of me
4a40: 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73  mory holding res
4a50: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  ult set */.  int
4a60: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
4a70: 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20  eDest;   /* How 
4a80: 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65  to dispose of re
4a90: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
4aa0: 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 50  Parm = pDest->iP
4ab0: 61 72 6d 3b 20 20 20 2f 2a 20 46 69 72 73 74 20  arm;   /* First 
4ac0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70  argument to disp
4ad0: 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
4ae0: 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b   int nResultCol;
4af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4b00: 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  Number of result
4b10: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61   columns */..  a
4b20: 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 69 66  ssert( v );.  if
4b30: 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
4b40: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
4b50: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
4b60: 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 64   hasDistinct = d
4b70: 69 73 74 69 6e 63 74 3e 3d 30 3b 0a 20 20 69 66  istinct>=0;.  if
4b80: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ( pOrderBy==0 &&
4b90: 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b   !hasDistinct ){
4ba0: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
4bb0: 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29  v, p, iContinue)
4bc0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c  ;.  }..  /* Pull
4bd0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
4be0: 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  olumns..  */.  i
4bf0: 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a  f( nColumn>0 ){.
4c00: 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d      nResultCol =
4c10: 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73   nColumn;.  }els
4c20: 65 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f  e{.    nResultCo
4c30: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
4c40: 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65  r;.  }.  if( pDe
4c50: 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20  st->iMem==0 ){. 
4c60: 20 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d     pDest->iMem =
4c70: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
4c80: 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d  .    pDest->nMem
4c90: 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20   = nResultCol;. 
4ca0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
4cb0: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20  += nResultCol;. 
4cc0: 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61 73 73   }else{ .    ass
4cd0: 65 72 74 28 20 70 44 65 73 74 2d 3e 6e 4d 65 6d  ert( pDest->nMem
4ce0: 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a  ==nResultCol );.
4cf0: 20 20 7d 0a 20 20 72 65 67 52 65 73 75 6c 74 20    }.  regResult 
4d00: 3d 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3b 0a 20  = pDest->iMem;. 
4d10: 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29   if( nColumn>0 )
4d20: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
4d30: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
4d40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4d50: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
4d60: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c  lumn, srcTab, i,
4d70: 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20   regResult+i);. 
4d80: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
4d90: 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73   eDest!=SRT_Exis
4da0: 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ts ){.    /* If 
4db0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
4dc0: 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e  is an EXISTS(...
4dd0: 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  ) expression, th
4de0: 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20  e actual.    ** 
4df0: 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20  values returned 
4e00: 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72  by the SELECT ar
4e10: 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  e not required..
4e20: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
4e30: 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
4e40: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71  (pParse);.    sq
4e50: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
4e60: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
4e70: 4c 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74 2c  List, regResult,
4e80: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
4e90: 75 74 29 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c 75  ut);.  }.  nColu
4ea0: 6d 6e 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  mn = nResultCol;
4eb0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49  ..  /* If the DI
4ec0: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77  STINCT keyword w
4ed0: 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68  as present on th
4ee0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
4ef0: 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73  nt.  ** and this
4f00: 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65   row has been se
4f10: 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20  en before, then 
4f20: 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73  do not make this
4f30: 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f   row.  ** part o
4f40: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  f the result..  
4f50: 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74  */.  if( hasDist
4f60: 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65  inct ){.    asse
4f70: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
4f80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c  .    assert( pEL
4f90: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c  ist->nExpr==nCol
4fa0: 75 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65 44  umn );.    codeD
4fb0: 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
4fc0: 64 69 73 74 69 6e 63 74 2c 20 69 43 6f 6e 74 69  distinct, iConti
4fd0: 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65  nue, nColumn, re
4fe0: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 69 66  gResult);.    if
4ff0: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ( pOrderBy==0 ){
5000: 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65  .      codeOffse
5010: 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75  t(v, p, iContinu
5020: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
5030: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
5040: 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
5050: 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63   mode, write eac
5060: 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74  h query result t
5070: 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  o the key of the
5080: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a   temporary.    *
5090: 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  * table iParm.. 
50a0: 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
50b0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
50c0: 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61  ND_SELECT.    ca
50d0: 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a  se SRT_Union: {.
50e0: 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
50f0: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
5100: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
5110: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
5120: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5130: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
5140: 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e  gResult, nColumn
5150: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
5160: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5170: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
5180: 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20  iParm, r1);.    
5190: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
51a0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
51b0: 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
51c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
51d0: 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f  Construct a reco
51e0: 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72  rd from the quer
51f0: 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e  y result, but in
5200: 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20  stead of.    ** 
5210: 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f  saving that reco
5220: 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20  rd, use it as a 
5230: 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c  key to delete el
5240: 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20  ements from.    
5250: 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ** the temporary
5260: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
5270: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
5280: 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20  T_Except: {.    
5290: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
52a0: 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c  Op3(v, OP_IdxDel
52b0: 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ete, iParm, regR
52c0: 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  esult, nColumn);
52d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
52e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
52f0: 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
5300: 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
5310: 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
5320: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
5330: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
5340: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
5350: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
5360: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
5370: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
5380: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
5390: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
53a0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
53b0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
53c0: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73  emTab );.      s
53d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
53e0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
53f0: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43  d, regResult, nC
5400: 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20  olumn, r1);.    
5410: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
5420: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
5430: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
5440: 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31   pOrderBy, p, r1
5450: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
5460: 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d          int r2 =
5470: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
5480: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
5490: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
54a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
54b0: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29  owid, iParm, r2)
54c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
54d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
54e0: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
54f0: 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20   r1, r2);.      
5500: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
5510: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
5520: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20  APPEND);.       
5530: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5540: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5550: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
5560: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
5570: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5580: 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
5590: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
55a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
55b0: 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
55c0: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
55d0: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
55e0: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
55f0: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
5600: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
5610: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
5620: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
5630: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
5640: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
5650: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
5660: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
5670: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
5680: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
5690: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
56a0: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
56b0: 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  p->affinity = sq
56c0: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
56d0: 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30  nity(pEList->a[0
56e0: 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e  ].pExpr, pDest->
56f0: 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20  affinity);.     
5700: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
5710: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66  .        /* At f
5720: 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20  irst glance you 
5730: 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63  would think we c
5740: 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75  ould optimize ou
5750: 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  t the.        **
5760: 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68 69   ORDER BY in thi
5770: 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68 65  s case since the
5780: 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65   order of entrie
5790: 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20  s in the set.   
57a0: 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74       ** does not
57b0: 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74 68   matter.  But th
57c0: 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c  ere might be a L
57d0: 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20  IMIT clause, in 
57e0: 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a  which.        **
57f0: 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72 20   case the order 
5800: 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20  does matter */. 
5810: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
5820: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
5830: 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65  rderBy, p, regRe
5840: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  sult);.      }el
5850: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
5860: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
5870: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
5880: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5890: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
58a0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
58b0: 65 73 75 6c 74 2c 20 31 2c 20 72 31 2c 20 26 70  esult, 1, r1, &p
58c0: 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a  ->affinity, 1);.
58d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
58e0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
58f0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
5900: 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20  egResult, 1);.  
5910: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5920: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
5930: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
5940: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r1);.        sql
5950: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
5960: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
5970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5980: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
5990: 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78  /* If any row ex
59a0: 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ist in the resul
59b0: 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68  t set, record th
59c0: 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72  at fact and abor
59d0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
59e0: 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b  se SRT_Exists: {
59f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5a00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
5a10: 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d  nteger, 1, iParm
5a20: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
5a30: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
5a40: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
5a50: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
5a60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5a70: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
5a80: 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
5a90: 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
5aa0: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
5ab0: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
5ac0: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
5ad0: 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
5ae0: 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
5af0: 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20   and break out. 
5b00: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61     ** of the sca
5b10: 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
5b20: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
5b30: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
5b40: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
5b50: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
5b60: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
5b70: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
5b80: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c  se, pOrderBy, p,
5b90: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
5ba0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5bb0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
5bc0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
5bd0: 67 52 65 73 75 6c 74 2c 20 69 50 61 72 6d 2c 20  gResult, iParm, 
5be0: 31 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  1);.        /* T
5bf0: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
5c00: 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
5c10: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
5c20: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
5c30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
5c40: 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
5c50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
5c60: 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a  QUERY */..    /*
5c70: 20 53 65 6e 64 20 74 68 65 20 64 61 74 61 20 74   Send the data t
5c80: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  o the callback f
5c90: 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20  unction or to a 
5ca0: 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20  subroutine.  In 
5cb0: 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  the.    ** case 
5cc0: 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2c  of a subroutine,
5cd0: 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
5ce0: 69 74 73 65 6c 66 20 69 73 20 72 65 73 70 6f 6e  itself is respon
5cf0: 73 69 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a  sible for.    **
5d00: 20 70 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74   popping the dat
5d10: 61 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  a from the stack
5d20: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
5d30: 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
5d40: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75  .    case SRT_Ou
5d50: 74 70 75 74 3a 20 7b 0a 20 20 20 20 20 20 74 65  tput: {.      te
5d60: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
5d70: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a  RT_Coroutine );.
5d80: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
5d90: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
5da0: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
5db0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
5dc0: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
5dd0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
5de0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
5df0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5e00: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
5e10: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43  d, regResult, nC
5e20: 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20  olumn, r1);.    
5e30: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
5e40: 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  er(pParse, pOrde
5e50: 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20  rBy, p, r1);.   
5e60: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
5e70: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5e80: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65  e, r1);.      }e
5e90: 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53  lse if( eDest==S
5ea0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
5eb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5ec0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
5ed0: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50  Yield, pDest->iP
5ee0: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  arm);.      }els
5ef0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
5f00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5f10: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65  OP_ResultRow, re
5f20: 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e  gResult, nColumn
5f30: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5f40: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
5f50: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
5f60: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
5f70: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lumn);.      }. 
5f80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5f90: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
5fa0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
5fb0: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
5fc0: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
5fd0: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
5fe0: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
5ff0: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
6000: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
6010: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
6020: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
6030: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
6040: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
6050: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
6060: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
6070: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
6080: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
6090: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
60a0: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
60b0: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
60c0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
60d0: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
60e0: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
60f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6100: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
6110: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
6120: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
6130: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
6140: 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70   reached.  Excep
6150: 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65  t, if.  ** there
6160: 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e   is a sorter, in
6170: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
6180: 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61  sorter has alrea
6190: 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20  dy limited.  ** 
61a0: 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75  the output for u
61b0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  s..  */.  if( pO
61c0: 72 64 65 72 42 79 3d 3d 30 20 26 26 20 70 2d 3e  rderBy==0 && p->
61d0: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  iLimit ){.    sq
61e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
61f0: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
6200: 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c  >iLimit, iBreak,
6210: 20 2d 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   -1);.  }.}../*.
6220: 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72  ** Given an expr
6230: 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e  ession list, gen
6240: 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  erate a KeyInfo 
6250: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
6260: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f  ecords.** the co
6270: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
6280: 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   for each expres
6290: 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70  sion in that exp
62a0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
62b0: 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c  .** If the ExprL
62c0: 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ist is an ORDER 
62d0: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
62e0: 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72  lause then the r
62f0: 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49  esulting.** KeyI
6300: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
6310: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
6320: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
6330: 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
6340: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  .** implement th
6350: 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74  at clause.  If t
6360: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74  he ExprList is t
6370: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
6380: 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65   a SELECT.** the
6390: 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  n the KeyInfo st
63a0: 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f  ructure is appro
63b0: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69  priate for initi
63c0: 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61  alizing a virtua
63d0: 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d  l.** index to im
63e0: 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e  plement a DISTIN
63f0: 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53  CT test..**.** S
6400: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
6410: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
6420: 72 65 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f  re is obtain fro
6430: 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63  m malloc.  The c
6440: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
6450: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
6460: 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61  e for seeing tha
6470: 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
6480: 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
6490: 2a 20 66 72 65 65 64 2e 20 20 41 64 64 20 74 68  * freed.  Add th
64a0: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
64b0: 75 72 65 20 74 6f 20 74 68 65 20 50 34 20 66 69  ure to the P4 fi
64c0: 65 6c 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65  eld of an opcode
64d0: 20 75 73 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59   using.** P4_KEY
64e0: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20  INFO_HANDOFF is 
64f0: 74 68 65 20 75 73 75 61 6c 20 77 61 79 20 6f 66  the usual way of
6500: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68   dealing with th
6510: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65  is..*/.static Ke
6520: 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72  yInfo *keyInfoFr
6530: 6f 6d 45 78 70 72 4c 69 73 74 28 50 61 72 73 65  omExprList(Parse
6540: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
6550: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71  st *pList){.  sq
6560: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
6570: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45  se->db;.  int nE
6580: 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  xpr;.  KeyInfo *
6590: 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  pInfo;.  struct 
65a0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
65b0: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Item;.  int i;..
65c0: 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d    nExpr = pList-
65d0: 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20  >nExpr;.  pInfo 
65e0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
65f0: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
6600: 28 2a 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72  (*pInfo) + nExpr
6610: 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
6620: 2a 29 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70  *)+1) );.  if( p
6630: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66  Info ){.    pInf
6640: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  o->aSortOrder = 
6650: 28 75 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f  (u8*)&pInfo->aCo
6660: 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70  ll[nExpr];.    p
6670: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 28  Info->nField = (
6680: 75 31 36 29 6e 45 78 70 72 3b 0a 20 20 20 20 70  u16)nExpr;.    p
6690: 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  Info->enc = ENC(
66a0: 64 62 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  db);.    pInfo->
66b0: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 66 6f 72  db = db;.    for
66c0: 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (i=0, pItem=pLis
66d0: 74 2d 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69  t->a; i<nExpr; i
66e0: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
66f0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
6700: 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20  ll;.      pColl 
6710: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
6720: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
6730: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
6740: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
6750: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
6760: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
6770: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
6780: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  fo->aColl[i] = p
6790: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66  Coll;.      pInf
67a0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
67b0: 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72   = pItem->sortOr
67c0: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  der;.    }.  }. 
67d0: 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d   return pInfo;.}
67e0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
67f0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
6800: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  ELECT./*.** Name
6810: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
6820: 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65  on operator, use
6830: 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  d for error mess
6840: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
6850: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65  const char *sele
6860: 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29  ctOpName(int id)
6870: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  {.  char *z;.  s
6880: 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20  witch( id ){.   
6890: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
68a0: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41      z = "UNION A
68b0: 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  LL";   break;.  
68c0: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
68d0: 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53  ECT: z = "INTERS
68e0: 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ECT";   break;. 
68f0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
6900: 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50  T:    z = "EXCEP
6910: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
6920: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
6930: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
6940: 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  N";       break;
6950: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
6960: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
6970: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
6980: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66  D_SELECT */..#if
6990: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
69a0: 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55  _EXPLAIN./*.** U
69b0: 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49  nless an "EXPLAI
69c0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f  N QUERY PLAN" co
69d0: 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70  mmand is being p
69e0: 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66  rocessed, this f
69f0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20  unction.** is a 
6a00: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
6a10: 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67  , it adds a sing
6a20: 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  le row of output
6a30: 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75   to the EQP resu
6a40: 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65  lt,.** where the
6a50: 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74   caption is of t
6a60: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
6a70: 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   "USE TEMP B-TRE
6a80: 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a  E FOR xxx".**.**
6a90: 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e   where xxx is on
6aa0: 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c  e of "DISTINCT",
6ab0: 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22   "ORDER BY" or "
6ac0: 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74  GROUP BY". Exact
6ad0: 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ly which.** is d
6ae0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
6af0: 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74   zUsage argument
6b00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6b10: 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
6b20: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
6b30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73   const char *zUs
6b40: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72  age){.  if( pPar
6b50: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
6b60: 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
6b70: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
6b80: 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
6b90: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
6ba0: 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20  Parse->db, "USE 
6bb0: 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20  TEMP B-TREE FOR 
6bc0: 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20  %s", zUsage);.  
6bd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6be0: 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
6bf0: 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
6c00: 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67  ctId, 0, 0, zMsg
6c10: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
6c20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69   }.}../*.** Assi
6c30: 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20  gn expression b 
6c40: 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73  to lvalue a. A s
6c50: 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65  econd, no-op, ve
6c60: 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61  rsion of this ma
6c70: 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64  cro.** is provid
6c80: 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f  ed when SQLITE_O
6c90: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64  MIT_EXPLAIN is d
6ca0: 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c  efined. This all
6cb0: 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20  ows the code.** 
6cc0: 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  in sqlite3Select
6cd0: 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c  () to assign val
6ce0: 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72 65  ues to structure
6cf0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
6d00: 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65  s that.** only e
6d10: 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f  xist if SQLITE_O
6d20: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e  MIT_EXPLAIN is n
6d30: 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f  ot defined witho
6d40: 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65  ut polluting the
6d50: 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69  .** code with #i
6d60: 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65 73  fndef directives
6d70: 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  ..*/.# define ex
6d80: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
6d90: 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c  a, b) a = b..#el
6da0: 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73  se./* No-op vers
6db0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c  ions of the expl
6dc0: 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f  ainXXX() functio
6dd0: 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a  ns and macros. *
6de0: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
6df0: 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29  inTempTable(y,z)
6e00: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
6e10: 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29  nSetInteger(y,z)
6e20: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
6e30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6e40: 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64  T_EXPLAIN) && !d
6e50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6e60: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
6e70: 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  CT)./*.** Unless
6e80: 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45   an "EXPLAIN QUE
6e90: 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64  RY PLAN" command
6ea0: 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73   is being proces
6eb0: 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  sed, this functi
6ec0: 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  on.** is a no-op
6ed0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
6ee0: 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  adds a single ro
6ef0: 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74  w of output to t
6f00: 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a  he EQP result,.*
6f10: 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74  * where the capt
6f20: 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66  ion is of one of
6f30: 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a   the two forms:.
6f40: 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49  **.**   "COMPOSI
6f50: 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53  TE SUBQUERIES iS
6f60: 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f  ub1 and iSub2 (o
6f70: 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  p)".**   "COMPOS
6f80: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
6f90: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 55  Sub1 and iSub2 U
6fa0: 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45  SING TEMP B-TREE
6fb0: 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65   (op)".**.** whe
6fc0: 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53 75  re iSub1 and iSu
6fd0: 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65 67  b2 are the integ
6fe0: 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74 68  ers passed as th
6ff0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
7000: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61  ** function para
7010: 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69  meters, and op i
7020: 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65  s the text repre
7030: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
7040: 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66   parameter.** of
7050: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
7060: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f  The parameter "o
7070: 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  p" must be one o
7080: 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  f TK_UNION, TK_E
7090: 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54  XCEPT,.** TK_INT
70a0: 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c  ERSECT or TK_ALL
70b0: 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  . The first form
70c0: 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67 75   is used if argu
70d0: 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20  ment bUseTmp is 
70e0: 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68  .** false, or th
70f0: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66  e second form if
7100: 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a   it is true..*/.
7110: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
7120: 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20  ainComposite(.  
7130: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7150: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
7160: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7180: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
7190: 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
71a0: 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e  EPT etc. */.  in
71b0: 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20 20  t iSub1,        
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
71d0: 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20 2a   Subquery id 1 *
71e0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20  /.  int iSub2,  
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7200: 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20      /* Subquery 
7210: 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55  id 2 */.  int bU
7220: 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20 20  seTmp           
7230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7240: 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c  e if a temp tabl
7250: 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b  e was used */.){
7260: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
7270: 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54  K_UNION || op==T
7280: 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d  K_EXCEPT || op==
7290: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20  TK_INTERSECT || 
72a0: 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20  op==TK_ALL );.  
72b0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
72c0: 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64  ain==2 ){.    Vd
72d0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
72e0: 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20  pVdbe;.    char 
72f0: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
7300: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
7310: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d  pParse->db, "COM
7320: 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45 53  POUND SUBQUERIES
7330: 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25 73   %d AND %d %s(%s
7340: 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  )", iSub1, iSub2
7350: 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54 6d  ,.        bUseTm
7360: 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  p?"USING TEMP B-
7370: 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63  TREE ":"", selec
7380: 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20  tOpName(op).    
7390: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
73a0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
73b0: 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
73c0: 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
73d0: 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
73e0: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  C);.  }.}.#else.
73f0: 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e  /* No-op version
7400: 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e  s of the explain
7410: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  XXX() functions 
7420: 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23  and macros. */.#
7430: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43   define explainC
7440: 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79  omposite(v,w,x,y
7450: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,z).#endif../*.*
7460: 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  * If the inner l
7470: 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65  oop was generate
7480: 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75  d using a non-nu
7490: 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75  ll pOrderBy argu
74a0: 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ment,.** then th
74b0: 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70  e results were p
74c0: 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65  laced in a sorte
74d0: 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f  r.  After the lo
74e0: 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  op is terminated
74f0: 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72  .** we need to r
7500: 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e  un the sorter an
7510: 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73  d output the res
7520: 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ults.  The follo
7530: 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  wing.** routine 
7540: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
7550: 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20  de needed to do 
7560: 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  that..*/.static 
7570: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72  void generateSor
7580: 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a  tTail(.  Parse *
7590: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
75a0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
75b0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
75c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
75d0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
75e0: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
75f0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
7600: 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56  code into this V
7610: 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  DBE */.  int nCo
7620: 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75  lumn,      /* Nu
7630: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
7640: 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  of data */.  Sel
7650: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f  ectDest *pDest /
7660: 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74  * Write the sort
7670: 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ed results here 
7680: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  */.){.  int addr
7690: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
76a0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
76b0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
76c0: 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a  e to exit loop *
76d0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
76e0: 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
76f0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
7700: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f   /* Jump here fo
7710: 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a  r next cycle */.
7720: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e    int addr;.  in
7730: 74 20 69 54 61 62 3b 0a 20 20 69 6e 74 20 70 73  t iTab;.  int ps
7740: 65 75 64 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45  eudoTab = 0;.  E
7750: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
7760: 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
7770: 0a 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  ..  int eDest = 
7780: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20  pDest->eDest;.  
7790: 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73  int iParm = pDes
77a0: 74 2d 3e 69 50 61 72 6d 3b 0a 0a 20 20 69 6e 74  t->iParm;..  int
77b0: 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72   regRow;.  int r
77c0: 65 67 52 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62  egRowid;..  iTab
77d0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43   = pOrderBy->iEC
77e0: 75 72 73 6f 72 3b 0a 20 20 72 65 67 52 6f 77 20  ursor;.  regRow 
77f0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
7800: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
7810: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
7820: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
7830: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
7840: 20 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20      pseudoTab = 
7850: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
7860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7870: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
7880: 50 73 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61  Pseudo, pseudoTa
7890: 62 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75  b, regRow, nColu
78a0: 6d 6e 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 69  mn);.    regRowi
78b0: 64 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 0;.  }else{.
78c0: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73      regRowid = s
78d0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
78e0: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20  (pParse);.  }.  
78f0: 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
7900: 26 20 53 46 5f 55 73 65 53 6f 72 74 65 72 20 29  & SF_UseSorter )
7910: 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f 72  {.    int regSor
7920: 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tOut = ++pParse-
7930: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 70  >nMem;.    int p
7940: 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
7950: 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Tab++;.    sqlit
7960: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7970: 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70  OP_OpenPseudo, p
7980: 74 61 62 32 2c 20 72 65 67 53 6f 72 74 4f 75 74  tab2, regSortOut
7990: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
79a0: 72 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  r+2);.    addr =
79b0: 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
79c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
79d0: 74 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  terSort, iTab, a
79e0: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 63  ddrBreak);.    c
79f0: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
7a00: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
7a10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7a20: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
7a30: 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65 67  rData, iTab, reg
7a40: 53 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 73 71  SortOut);.    sq
7a50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7a60: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 74  v, OP_Column, pt
7a70: 61 62 32 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  ab2, pOrderBy->n
7a80: 45 78 70 72 2b 31 2c 20 72 65 67 52 6f 77 29 3b  Expr+1, regRow);
7a90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7aa0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
7ab0: 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a  AG_CLEARCACHE);.
7ac0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
7ad0: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
7ae0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7af0: 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Sort, iTab, addr
7b00: 42 72 65 61 6b 29 3b 0a 20 20 20 20 63 6f 64 65  Break);.    code
7b10: 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 61 64 64  Offset(v, p, add
7b20: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  rContinue);.    
7b30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7b40: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
7b50: 69 54 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e  iTab, pOrderBy->
7b60: 6e 45 78 70 72 2b 31 2c 20 72 65 67 52 6f 77 29  nExpr+1, regRow)
7b70: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
7b80: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73  eDest ){.    cas
7b90: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
7ba0: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
7bb0: 61 62 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  ab: {.      test
7bc0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
7bd0: 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  _Table );.      
7be0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
7bf0: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b  =SRT_EphemTab );
7c00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7c10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
7c20: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
7c30: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
7c40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7c50: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
7c60: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20   iParm, regRow, 
7c70: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
7c80: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7c90: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
7ca0: 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72  PPEND);.      br
7cb0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
7cc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
7cd0: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
7ce0: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
7cf0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
7d00: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
7d10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
7d20: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
7d30: 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67  , regRow, 1, reg
7d40: 52 6f 77 69 64 2c 20 26 70 2d 3e 61 66 66 69 6e  Rowid, &p->affin
7d50: 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  ity, 1);.      s
7d60: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
7d70: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
7d80: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31 29  arse, regRow, 1)
7d90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7da0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7db0: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
7dc0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
7dd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7de0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
7df0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
7e00: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
7e10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
7e20: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
7e30: 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c  , regRow, iParm,
7e40: 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68   1);.      /* Th
7e50: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
7e60: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
7e70: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
7e80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7e90: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
7ea0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
7eb0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 61 73 73  int i;.      ass
7ec0: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
7ed0: 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d  Output || eDest=
7ee0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
7ef0: 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ; .      testcas
7f00: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  e( eDest==SRT_Ou
7f10: 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65  tput );.      te
7f20: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
7f30: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a  RT_Coroutine );.
7f40: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
7f50: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
7f60: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7f70: 72 65 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e 69  regRow!=pDest->i
7f80: 4d 65 6d 2b 69 20 29 3b 0a 20 20 20 20 20 20 20  Mem+i );.       
7f90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7fa0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
7fb0: 20 70 73 65 75 64 6f 54 61 62 2c 20 69 2c 20 70   pseudoTab, i, p
7fc0: 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 29 3b 0a 20  Dest->iMem+i);. 
7fd0: 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20         if( i==0 
7fe0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
7ff0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
8000: 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52  (v, OPFLAG_CLEAR
8010: 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20 20  CACHE);.        
8020: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
8030: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
8040: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
8050: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8060: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
8070: 6f 77 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c  ow, pDest->iMem,
8080: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
8090: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
80a0: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
80b0: 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d  e(pParse, pDest-
80c0: 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  >iMem, nColumn);
80d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
80e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
80f0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
8100: 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50 61 72  eld, pDest->iPar
8110: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
8120: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8130: 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
8140: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
8150: 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73 71  e, regRow);.  sq
8160: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
8170: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
8180: 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  owid);..  /* The
8190: 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c   bottom of the l
81a0: 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
81b0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
81c0: 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e  el(v, addrContin
81d0: 75 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65  ue);.  if( p->se
81e0: 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 53  lFlags & SF_UseS
81f0: 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  orter ){.    sql
8200: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8210: 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
8220: 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20   iTab, addr);.  
8230: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
8240: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8250: 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
8260: 64 64 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ddr);.  }.  sqli
8270: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
8280: 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
8290: 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  );.  if( eDest==
82a0: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
82b0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
82c0: 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ne ){.    sqlite
82d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
82e0: 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f 54  P_Close, pseudoT
82f0: 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ab, 0);.  }.}../
8300: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
8310: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
8320: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  g containing the
8330: 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79   'declaration ty
8340: 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78  pe' of the.** ex
8350: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
8360: 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62  The string may b
8370: 65 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61  e treated as sta
8380: 74 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65  tic by the calle
8390: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63  r..**.** The dec
83a0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73  laration type is
83b0: 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74   the exact datat
83c0: 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65  ype definition e
83d0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
83e0: 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52  e.** original CR
83f0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
8400: 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72  ment if the expr
8410: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
8420: 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61  mn. The.** decla
8430: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
8440: 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73  a ROWID field is
8450: 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c   INTEGER. Exactl
8460: 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73  y when an expres
8470: 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  sion.** is consi
8480: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63  dered a column c
8490: 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e  an be complex in
84a0: 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
84b0: 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65   subqueries. The
84c0: 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65  .** result-set e
84d0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c  xpression in all
84e0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
84f0: 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  g SELECT stateme
8500: 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69  nts is .** consi
8510: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62  dered a column b
8520: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
8530: 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
8540: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
8550: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
8560: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
8570: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
8580: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
8590: 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61  );.**   SELECT a
85a0: 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  bc FROM (SELECT 
85b0: 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20  col AS abc FROM 
85c0: 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65  tbl);.** .** The
85d0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
85e0: 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73  e for any expres
85f0: 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  sion other than 
8600: 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c  a column is NULL
8610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
8620: 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79  t char *columnTy
8630: 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  pe(.  NameContex
8640: 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20  t *pNC, .  Expr 
8650: 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20  *pExpr,.  const 
8660: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 44  char **pzOriginD
8670: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
8680: 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a 20  **pzOriginTab,. 
8690: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
86a0: 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63  OriginCol.){.  c
86b0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65  har const *zType
86c0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
86d0: 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d 20  st *zOriginDb = 
86e0: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
86f0: 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 30 3b  *zOriginTab = 0;
8700: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
8710: 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20  OriginCol = 0;. 
8720: 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 4e 45   int j;.  if( NE
8730: 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 7c 7c  VER(pExpr==0) ||
8740: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d   pNC->pSrcList==
8750: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
8760: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
8770: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
8780: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
8790: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
87a0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
87b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
87c0: 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20   column. Locate 
87d0: 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f  the table the co
87e0: 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20  lumn is being.  
87f0: 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64      ** extracted
8800: 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e   from in NameCon
8810: 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54  text.pSrcList. T
8820: 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65  his table may be
8830: 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64   real.      ** d
8840: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
8850: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20   a subquery..   
8860: 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
8870: 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
8880: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
8890: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d   structure colum
88a0: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
88b0: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  rom */.      Sel
88c0: 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20  ect *pS = 0;    
88d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
88e0: 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  ct the column is
88f0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
8900: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  */.      int iCo
8910: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
8920: 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66  mn;  /* Index of
8930: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20   column in pTab 
8940: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
8950: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
8960: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
8970: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
8980: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
8990: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77 68 69  UMN );.      whi
89a0: 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62  le( pNC && !pTab
89b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c   ){.        SrcL
89c0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
89d0: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
89e0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a         for(j=0;j
89f0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
8a00: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
8a10: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72  ].iCursor!=pExpr
8a20: 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20  ->iTable;j++);. 
8a30: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61         if( j<pTa
8a40: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20  bList->nSrc ){. 
8a50: 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20           pTab = 
8a60: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
8a70: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
8a80: 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  S = pTabList->a[
8a90: 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  j].pSelect;.    
8aa0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8ab0: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
8ac0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
8ad0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
8ae0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
8af0: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65         /* At one
8b00: 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68   time, code such
8b10: 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e   as "SELECT new.
8b20: 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  x" within a trig
8b30: 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20  ger would.      
8b40: 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20    ** cause this 
8b50: 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e  condition to run
8b60: 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77  .  Since then, w
8b70: 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75  e have restructu
8b80: 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20  red how.        
8b90: 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20  ** trigger code 
8ba0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64  is generated and
8bb0: 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69   so this conditi
8bc0: 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  on is no longer 
8bd0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
8be0: 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  ible. However, i
8bf0: 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74  t can still be t
8c00: 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e  rue for statemen
8c10: 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20  ts like.        
8c20: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
8c30: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
8c40: 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
8c50: 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e   TABLE t1(col IN
8c60: 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20  TEGER);.        
8c70: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
8c80: 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d  ECT t1.col) FROM
8c90: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
8ca0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
8cb0: 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  when columnType(
8cc0: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
8cd0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74  he expression "t
8ce0: 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20  1.col" in the . 
8cf0: 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65         ** sub-se
8d00: 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61  lect. In this ca
8d10: 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75  se, set the colu
8d20: 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c  mn type to NULL,
8d30: 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   even.        **
8d40: 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c   though it shoul
8d50: 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54  d really be "INT
8d60: 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a  EGER"..        *
8d70: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
8d80: 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  s is not a probl
8d90: 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  em, as the colum
8da0: 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f  n type of "t1.co
8db0: 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20  l" is never.    
8dc0: 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65      ** used. Whe
8dd0: 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69  n columnType() i
8de0: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
8df0: 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20  expression .    
8e00: 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20      ** "(SELECT 
8e10: 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f  t1.col)", the co
8e20: 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65  rrect type is re
8e30: 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20  turned (see the 
8e40: 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20  TK_SELECT.      
8e50: 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f    ** branch belo
8e60: 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  w.  */.        b
8e70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
8e80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
8e90: 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62  b && pExpr->pTab
8ea0: 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ==pTab );.      
8eb0: 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20  if( pS ){.      
8ec0: 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22    /* The "table"
8ed0: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73   is actually a s
8ee0: 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76  ub-select or a v
8ef0: 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  iew in the FROM 
8f00: 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a  clause.        *
8f10: 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  * of the SELECT 
8f20: 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72  statement. Retur
8f30: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
8f40: 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69  n type and origi
8f50: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  n.        ** dat
8f60: 61 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  a for the result
8f70: 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  -set column of t
8f80: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20  he sub-select.. 
8f90: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
8fa0: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
8fb0: 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53 2d   ALWAYS(iCol<pS-
8fc0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  >pEList->nExpr) 
8fd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
8fe0: 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20  If iCol is less 
8ff0: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
9000: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
9010: 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20  equests the.    
9020: 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f        ** rowid o
9030: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
9040: 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65   or view. This e
9050: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67  xpression is leg
9060: 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20  al (see .       
9070: 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20     ** test case 
9080: 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20  misc2.2.2) - it 
9090: 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73  always evaluates
90a0: 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20   to NULL..      
90b0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
90c0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
90d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  ;.          Expr
90e0: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
90f0: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b  ->a[iCol].pExpr;
9100: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
9110: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
9120: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  rc;.          sN
9130: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
9140: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61           sNC.pPa
9150: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
9160: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e;.          zTy
9170: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
9180: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69  &sNC, p, &zOrigi
9190: 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62  nDb, &zOriginTab
91a0: 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20  , &zOriginCol); 
91b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
91c0: 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
91d0: 53 28 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  S(pTab->pSchema)
91e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
91f0: 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20   real table */. 
9200: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
9210: 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pS );.        if
9220: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
9230: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
9240: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
9250: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
9260: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
9270: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
9280: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
9290: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
92a0: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
92b0: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43          zOriginC
92c0: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
92d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
92e0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70         zType = p
92f0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
9300: 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20  zType;.         
9310: 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 70 54   zOriginCol = pT
9320: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
9330: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Name;.        }.
9340: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 54          zOriginT
9350: 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ab = pTab->zName
9360: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
9370: 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20  C->pParse ){.   
9380: 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d         int iDb =
9390: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
93a0: 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73  Index(pNC->pPars
93b0: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
93c0: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20  hema);.         
93d0: 20 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70 4e 43   zOriginDb = pNC
93e0: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  ->pParse->db->aD
93f0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
9400: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9410: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9420: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
9430: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
9440: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
9450: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
9460: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
9470: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52   a sub-select. R
9480: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
9490: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20  ation type and. 
94a0: 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69       ** origin i
94b0: 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67  nfo for the sing
94c0: 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  le column in the
94d0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
94e0: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20  he SELECT.      
94f0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ** statement..  
9500: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d      */.      Nam
9510: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
9520: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
9530: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
9540: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
9550: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
9560: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
9570: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
9580: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
9590: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
95a0: 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  .      sNC.pSrcL
95b0: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
95c0: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
95d0: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43  = pNC;.      sNC
95e0: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
95f0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79  Parse;.      zTy
9600: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
9610: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69  &sNC, p, &zOrigi
9620: 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62  nDb, &zOriginTab
9630: 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20  , &zOriginCol); 
9640: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9650: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
9660: 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69 6e   .  if( pzOrigin
9670: 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Db ){.    assert
9680: 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26 26  ( pzOriginTab &&
9690: 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b 0a   pzOriginCol );.
96a0: 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62 20      *pzOriginDb 
96b0: 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20 20  = zOriginDb;.   
96c0: 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20   *pzOriginTab = 
96d0: 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20 20  zOriginTab;.    
96e0: 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 7a  *pzOriginCol = z
96f0: 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20  OriginCol;.  }. 
9700: 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d   return zType;.}
9710: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
9720: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
9730: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
9740: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
9750: 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  pes of columns.*
9760: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
9770: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  set..*/.static v
9780: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
9790: 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65  mnTypes(.  Parse
97a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
97b0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
97c0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
97d0: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
97e0: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
97f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
9800: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
9810: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
9820: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
9830: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
9840: 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
9850: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
9860: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
9870: 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
9880: 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63   sNC;.  sNC.pSrc
9890: 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
98a0: 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20  .  sNC.pParse = 
98b0: 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d  pParse;.  for(i=
98c0: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
98d0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
98e0: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
98f0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
9900: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
9910: 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
9920: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
9930: 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73  ETADATA.    cons
9940: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20  t char *zOrigDb 
9950: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
9960: 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  har *zOrigTab = 
9970: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
9980: 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  r *zOrigCol = 0;
9990: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
99a0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
99b0: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
99c0: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29  gTab, &zOrigCol)
99d0: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64  ;..    /* The vd
99e0: 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73  be must make its
99f0: 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65   own copy of the
9a00: 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64   column-type and
9a10: 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63   other .    ** c
9a20: 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73  olumn specific s
9a30: 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20  trings, in case 
9a40: 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65  the schema is re
9a50: 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a  set before this.
9a60: 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d      ** virtual m
9a70: 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65  achine is delete
9a80: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
9a90: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
9aa0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
9ab0: 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69  E_DATABASE, zOri
9ac0: 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  gDb, SQLITE_TRAN
9ad0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
9ae0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
9af0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
9b00: 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c  TABLE, zOrigTab,
9b10: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
9b20: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
9b30: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
9b40: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55   i, COLNAME_COLU
9b50: 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51  MN, zOrigCol, SQ
9b60: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
9b70: 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65  .#else.    zType
9b80: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
9b90: 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b  NC, p, 0, 0, 0);
9ba0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
9bb0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
9bc0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
9bd0: 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c  DECLTYPE, zType,
9be0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
9bf0: 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  T);.  }.#endif /
9c00: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  * SQLITE_OMIT_DE
9c10: 43 4c 54 59 50 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  CLTYPE */.}../*.
9c20: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
9c30: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
9c40: 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d  the VDBE the nam
9c50: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
9c60: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
9c70: 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  et.  This inform
9c80: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
9c90: 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20   provide the.** 
9ca0: 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69  azCol[] values i
9cb0: 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  n the callback..
9cc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
9cd0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
9ce0: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
9cf0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
9d00: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
9d10: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
9d20: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
9d30: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
9d40: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
9d50: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
9d60: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
9d70: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56  lt set */.){.  V
9d80: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
9d90: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c  >pVdbe;.  int i,
9da0: 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   j;.  sqlite3 *d
9db0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9dc0: 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c    int fullNames,
9dd0: 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69   shortNames;..#i
9de0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9df0: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49  T_EXPLAIN.  /* I
9e00: 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50  f this is an EXP
9e10: 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20  LAIN, skip this 
9e20: 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50  step */.  if( pP
9e30: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
9e40: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
9e50: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
9e60: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
9e70: 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30  et || NEVER(v==0
9e80: 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ) || db->mallocF
9e90: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
9ea0: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
9eb0: 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c  esSet = 1;.  ful
9ec0: 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  lNames = (db->fl
9ed0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
9ee0: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  lColNames)!=0;. 
9ef0: 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64   shortNames = (d
9f00: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
9f10: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
9f20: 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  !=0;.  sqlite3Vd
9f30: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
9f40: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
9f50: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
9f60: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
9f70: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20  {.    Expr *p;. 
9f80: 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61     p = pEList->a
9f90: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
9fa0: 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
9fb0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
9fc0: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  f( pEList->a[i].
9fd0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63  zName ){.      c
9fe0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
9ff0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
a000: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a010: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
a020: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
a030: 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54   zName, SQLITE_T
a040: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
a050: 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d  else if( (p->op=
a060: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d  =TK_COLUMN || p-
a070: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
a080: 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74 20  MN) && pTabList 
a090: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
a0a0: 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72  pTab;.      char
a0b0: 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e   *zCol;.      in
a0c0: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c  t iCol = p->iCol
a0d0: 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  umn;.      for(j
a0e0: 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54 61  =0; ALWAYS(j<pTa
a0f0: 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b  bList->nSrc); j+
a100: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
a110: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69  pTabList->a[j].i
a120: 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c  Cursor==p->iTabl
a130: 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  e ) break;.     
a140: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
a150: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
a160: 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20  c );.      pTab 
a170: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
a180: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  .pTab;.      if(
a190: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
a1a0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
a1b0: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
a1c0: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
a1d0: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
a1e0: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66  Col) );.      if
a1f0: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
a200: 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69      zCol = "rowi
a210: 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d";.      }else{
a220: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
a230: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
a240: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  .zName;.      }.
a250: 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74        if( !short
a260: 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61  Names && !fullNa
a270: 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  mes ){.        s
a280: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
a290: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
a2a0: 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20  ME_NAME, .      
a2b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53        sqlite3DbS
a2c0: 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  trDup(db, pEList
a2d0: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53  ->a[i].zSpan), S
a2e0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
a2f0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
a300: 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20  fullNames ){.   
a310: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
a320: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e   = 0;.        zN
a330: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
a340: 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
a350: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
a360: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
a370: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
a380: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
a390: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
a3a0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
a3b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a3c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a3d0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
a3e0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
a3f0: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
a400: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a  SIENT);.      }.
a410: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a420: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
a430: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
a440: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20  NAME_NAME, .    
a450: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53        sqlite3DbS
a460: 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  trDup(db, pEList
a470: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53  ->a[i].zSpan), S
a480: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
a490: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65      }.  }.  gene
a4a0: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
a4b0: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
a4c0: 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  , pEList);.}../*
a4d0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 61 6e 20 65  .** Given a an e
a4e0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28  xpression list (
a4f0: 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
a500: 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
a510: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
a520: 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20  form the result 
a530: 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20  set of a SELECT 
a540: 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75  statement) compu
a550: 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  te appropriate.*
a560: 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  * column names f
a570: 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  or a table that 
a580: 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
a590: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
a5a0: 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e  **.** All column
a5b0: 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75   names will be u
a5c0: 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  nique..**.** Onl
a5d0: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
a5e0: 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e  es are computed.
a5f0: 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20    Column.zType, 
a600: 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a  Column.zColl,.**
a610: 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64   and other field
a620: 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20  s of Column are 
a630: 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  zeroed..**.** Re
a640: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
a650: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61  n success.  If a
a660: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
a670: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
a680: 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69  .** store NULL i
a690: 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69  n *paCol and 0 i
a6a0: 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74  n *pnCol and ret
a6b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
a6c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a6d0: 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f  selectColumnsFro
a6e0: 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  mExprList(.  Par
a6f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
a700: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
a710: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
a720: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
a730: 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73       /* Expr lis
a740: 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  t from which to 
a750: 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61  derive column na
a760: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  mes */.  int *pn
a770: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
a780: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
a790: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
a7a0: 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  here */.  Column
a7b0: 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20   **paCol        
a7c0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
a7d0: 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  ew column list h
a7e0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
a7f0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
a800: 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62  ->db;   /* Datab
a810: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
a820: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a840: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
a850: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20   */.  int cnt;  
a860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a870: 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64    /* Index added
a880: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d   to make the nam
a890: 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f  e unique */.  Co
a8a0: 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f  lumn *aCol, *pCo
a8b0: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  l;        /* For
a8c0: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65   looping over re
a8d0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
a8e0: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
a8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a900: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
a910: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
a920: 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a   set */.  Expr *
a930: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
a940: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
a950: 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ion for a single
a960: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a   result column *
a970: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
a980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a990: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  /* Column name *
a9a0: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9c0: 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20  /* Size of name 
a9d0: 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20  in zName[] */.. 
a9e0: 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d   *pnCol = nCol =
a9f0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
aa00: 20 20 61 43 6f 6c 20 3d 20 2a 70 61 43 6f 6c 20    aCol = *paCol 
aa10: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
aa20: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
aa30: 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b  (aCol[0])*nCol);
aa40: 0a 20 20 69 66 28 20 61 43 6f 6c 3d 3d 30 20 29  .  if( aCol==0 )
aa50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
aa60: 4f 4d 45 4d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  OMEM;.  for(i=0,
aa70: 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43   pCol=aCol; i<nC
aa80: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
aa90: 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20  {.    /* Get an 
aaa0: 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65  appropriate name
aab0: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a   for the column.
aac0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70      */.    p = p
aad0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
aae0: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
aaf0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 45  ->pRight==0 || E
ab00: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
ab10: 2d 3e 70 52 69 67 68 74 2c 20 45 50 5f 49 6e 74  ->pRight, EP_Int
ab20: 56 61 6c 75 65 29 0a 20 20 20 20 20 20 20 20 20  Value).         
ab30: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 70 52 69 67        || p->pRig
ab40: 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d 30 20  ht->u.zToken==0 
ab50: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 75 2e  || p->pRight->u.
ab60: 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a  zToken[0]!=0 );.
ab70: 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d      if( (zName =
ab80: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
ab90: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
aba0: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
abb0: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41  n contains an "A
abc0: 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65  S <name>" phrase
abd0: 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20  , use <name> as 
abe0: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
abf0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
ac00: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e  3DbStrDup(db, zN
ac10: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
ac20: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f  .      Expr *pCo
ac30: 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54  lExpr = p;  /* T
ac40: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
ac50: 61 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  at is the result
ac60: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   column name */.
ac70: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
ac80: 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  b;         /* Ta
ac90: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
aca0: 69 74 68 20 74 68 69 73 20 65 78 70 72 65 73 73  ith this express
acb0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  ion */.      whi
acc0: 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  le( pColExpr->op
acd0: 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20  ==TK_DOT ){.    
ace0: 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70      pColExpr = p
acf0: 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ColExpr->pRight;
ad00: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
ad10: 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a   pColExpr!=0 );.
ad20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
ad30: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
ad40: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57  TK_COLUMN && ALW
ad50: 41 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70 54  AYS(pColExpr->pT
ad60: 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ab!=0) ){.      
ad70: 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73    /* For columns
ad80: 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20   use the column 
ad90: 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  name name */.   
ada0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
adb0: 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pColExpr->iColum
adc0: 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  n;.        pTab 
add0: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62  = pColExpr->pTab
ade0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
adf0: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
ae00: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
ae10: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
ae20: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
ae30: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
ae40: 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20 70       iCol>=0 ? p
ae50: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
ae60: 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 29  zName : "rowid")
ae70: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
ae80: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
ae90: 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20  TK_ID ){.       
aea0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
aeb0: 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78  sProperty(pColEx
aec0: 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
aed0: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   );.        zNam
aee0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
aef0: 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70 43 6f  tf(db, "%s", pCo
af00: 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  lExpr->u.zToken)
af10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
af20: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
af30: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
af40: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
af50: 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
af60: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
af70: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
af80: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
af90: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
afa0: 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pan);.      }.  
afb0: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
afc0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
afd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
afe0: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
aff0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b000: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
b010: 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  sure the column 
b020: 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20  name is unique. 
b030: 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   If the name is 
b040: 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20  not unique,.    
b050: 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65  ** append a inte
b060: 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20  ger to the name 
b070: 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d  so that it becom
b080: 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a  es unique..    *
b090: 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71  /.    nName = sq
b0a0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
b0b0: 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  ame);.    for(j=
b0c0: 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29  cnt=0; j<i; j++)
b0d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
b0e0: 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b  te3StrICmp(aCol[
b0f0: 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  j].zName, zName)
b100: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
b110: 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20  har *zNewName;. 
b120: 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61         zName[nNa
b130: 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  me] = 0;.       
b140: 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69   zNewName = sqli
b150: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
b160: 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b  %s:%d", zName, +
b170: 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  +cnt);.        s
b180: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
b190: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
b1a0: 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d   zName = zNewNam
b1b0: 65 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d  e;.        j = -
b1c0: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  1;.        if( z
b1d0: 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Name==0 ) break;
b1e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b1f0: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
b200: 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66   zName;.  }.  if
b210: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
b220: 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  ed ){.    for(j=
b230: 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<i; j++){.  
b240: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
b250: 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e  e(db, aCol[j].zN
b260: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
b270: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
b280: 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61  , aCol);.    *pa
b290: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e  Col = 0;.    *pn
b2a0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Col = 0;.    ret
b2b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
b2c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
b2d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b2e0: 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20  ** Add type and 
b2f0: 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
b300: 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d  ation to a colum
b310: 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a  n list based on.
b320: 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ** a SELECT stat
b330: 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ement..** .** Th
b340: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72  e column list pr
b350: 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72  esumably came fr
b360: 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e  om selectColumnN
b370: 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  amesFromExprList
b380: 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ()..** The colum
b390: 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20  n list has only 
b3a0: 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73  names, not types
b3b0: 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20   or collations. 
b3c0: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
b3d0: 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e   goes through an
b3e0: 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73  d adds the types
b3f0: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e   and collations.
b400: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
b410: 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ine requires tha
b420: 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72  t all identifier
b430: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
b440: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20  ** statement be 
b450: 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61  resolved..*/.sta
b460: 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
b470: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
b480: 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73  ollation(.  Pars
b490: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
b4a0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
b4b0: 74 65 78 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  texts */.  int n
b4c0: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
b4d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
b4e0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 43 6f 6c 75 6d  lumns */.  Colum
b4f0: 6e 20 2a 61 43 6f 6c 2c 20 20 20 20 20 20 20 20  n *aCol,        
b500: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75   /* List of colu
b510: 6d 6e 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  mns */.  Select 
b520: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f  *pSelect       /
b530: 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f  * SELECT used to
b540: 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73   determine types
b550: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20   and collations 
b560: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
b570: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
b580: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
b590: 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  sNC;.  Column *p
b5a0: 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Col;.  CollSeq *
b5b0: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pColl;.  int i;.
b5c0: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72    Expr *p;.  str
b5d0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
b5e0: 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  m *a;..  assert(
b5f0: 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20   pSelect!=0 );. 
b600: 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65 63   assert( (pSelec
b610: 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
b620: 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b  _Resolved)!=0 );
b630: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d  .  assert( nCol=
b640: 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  =pSelect->pEList
b650: 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  ->nExpr || db->m
b660: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
b670: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
b680: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
b690: 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
b6a0: 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
b6b0: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
b6c0: 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
b6d0: 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70    a = pSelect->p
b6e0: 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28  EList->a;.  for(
b6f0: 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20  i=0, pCol=aCol; 
b700: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  i<nCol; i++, pCo
b710: 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b  l++){.    p = a[
b720: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 43  i].pExpr;.    pC
b730: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69  ol->zType = sqli
b740: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
b750: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
b760: 20 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a 20   p, 0, 0, 0));. 
b770: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74     pCol->affinit
b780: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  y = sqlite3ExprA
b790: 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20  ffinity(p);.    
b7a0: 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  if( pCol->affini
b7b0: 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66  ty==0 ) pCol->af
b7c0: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
b7d0: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 70 43  AFF_NONE;.    pC
b7e0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
b7f0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
b800: 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   p);.    if( pCo
b810: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  ll ){.      pCol
b820: 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  ->zColl = sqlite
b830: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43  3DbStrDup(db, pC
b840: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
b850: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
b860: 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
b870: 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
b880: 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
b890: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
b8a0: 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
b8b0: 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
b8c0: 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
b8d0: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
b8e0: 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
b8f0: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
b900: 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
b910: 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
b920: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
b930: 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  >db;.  int saved
b940: 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46  Flags;..  savedF
b950: 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73  lags = db->flags
b960: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
b970: 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c   ~SQLITE_FullCol
b980: 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  Names;.  db->fla
b990: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
b9a0: 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71  rtColNames;.  sq
b9b0: 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
b9c0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
b9d0: 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   0);.  if( pPars
b9e0: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
b9f0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65   0;.  while( pSe
ba00: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  lect->pPrior ) p
ba10: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
ba20: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e  ->pPrior;.  db->
ba30: 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61  flags = savedFla
ba40: 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  gs;.  pTab = sql
ba50: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
ba60: 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
ba70: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
ba80: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
ba90: 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68  n 0;.  }.  /* Th
baa0: 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  e sqlite3ResultS
bab0: 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20  etOfSelect() is 
bac0: 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74  only used n cont
bad0: 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61  exts where looka
bae0: 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73  side.  ** is dis
baf0: 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  abled */.  asser
bb00: 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  t( db->lookaside
bb10: 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a  .bEnabled==0 );.
bb20: 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
bb30: 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20  ;.  pTab->zName 
bb40: 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f  = 0;.  pTab->nRo
bb50: 77 45 73 74 20 3d 20 31 30 30 30 30 30 30 3b 0a  wEst = 1000000;.
bb60: 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46    selectColumnsF
bb70: 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
bb80: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  se, pSelect->pEL
bb90: 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
bba0: 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
bbb0: 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d    selectAddColum
bbc0: 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
bbd0: 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  n(pParse, pTab->
bbe0: 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  nCol, pTab->aCol
bbf0: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54  , pSelect);.  pT
bc00: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
bc10: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
bc20: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
bc30: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
bc40: 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
bc50: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
bc60: 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
bc70: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45  /*.** Get a VDBE
bc80: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
bc90: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20  arser context.  
bca0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
bcb0: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
bcc0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
bcd0: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c  curs, return NUL
bce0: 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65  L and leave a me
bcf0: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
bd00: 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65  .*/.Vdbe *sqlite
bd10: 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a  3GetVdbe(Parse *
bd20: 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
bd30: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
bd40: 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  be;.  if( v==0 )
bd50: 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65  {.    v = pParse
bd60: 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65  ->pVdbe = sqlite
bd70: 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72  3VdbeCreate(pPar
bd80: 73 65 2d 3e 64 62 29 3b 0a 23 69 66 6e 64 65 66  se->db);.#ifndef
bd90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
bda0: 43 45 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a  CE.    if( v ){.
bdb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bdc0: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72  eAddOp0(v, OP_Tr
bdd0: 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ace);.    }.#end
bde0: 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  if.  }.  return 
bdf0: 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  v;.}.../*.** Com
be00: 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20  pute the iLimit 
be10: 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c  and iOffset fiel
be20: 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ds of the SELECT
be30: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
be40: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
be50: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  set expressions.
be60: 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66    pLimit and pOf
be70: 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78  fset hold the ex
be80: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
be90: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
bea0: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
beb0: 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65  tement after the
bec0: 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
bed0: 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20  T.** keywords.  
bee0: 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65  Or NULL if those
bef0: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d   keywords are om
bf00: 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e  itted. iLimit an
bf10: 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72  d iOffset .** ar
bf20: 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65  e the integer me
bf30: 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75  mory register nu
bf40: 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65  mbers for counte
bf50: 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  rs used to compu
bf60: 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74  te .** the limit
bf70: 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66   and offset.  If
bf80: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d   there is no lim
bf90: 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74  it and/or offset
bfa0: 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69  , then .** iLimi
bfb0: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72  t and iOffset ar
bfc0: 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a  e negative..**.*
bfd0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
bfe0: 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65  hanges the value
bff0: 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20  s of iLimit and 
c000: 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a  iOffset only if.
c010: 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66  ** a limit or of
c020: 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20  fset is defined 
c030: 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  by pLimit and pO
c040: 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61  ffset.  iLimit a
c050: 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68  nd.** iOffset sh
c060: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
c070: 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72  reset to appropr
c080: 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c  iate default val
c090: 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20  ues.** (usually 
c0a0: 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d  but not always -
c0b0: 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  1) prior to call
c0c0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
c0d0: 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69  ..** Only if pLi
c0e0: 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65  mit!=0 or pOffse
c0f0: 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69  t!=0 do the limi
c100: 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a  t registers get.
c110: 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54  ** redefined.  T
c120: 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
c130: 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20  rator uses this 
c140: 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63  property to forc
c150: 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f  e.** the reuse o
c160: 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74  f the same limit
c170: 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69   and offset regi
c180: 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c  sters across mul
c190: 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20  tiple.** SELECT 
c1a0: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  statements..*/.s
c1b0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75  tatic void compu
c1c0: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
c1d0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c1e0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
c1f0: 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a  Break){.  Vdbe *
c200: 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69  v = 0;.  int iLi
c210: 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  mit = 0;.  int i
c220: 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64  Offset;.  int ad
c230: 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20 70 2d  dr1, n;.  if( p-
c240: 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >iLimit ) return
c250: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c  ;..  /* .  ** "L
c260: 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20  IMIT -1" always 
c270: 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20  shows all rows. 
c280: 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20   There is some. 
c290: 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73 79 20   ** contraversy 
c2a0: 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63  about what the c
c2b0: 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20  orrect behavior 
c2c0: 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20  should be..  ** 
c2d0: 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  The current impl
c2e0: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72  ementation inter
c2f0: 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20  prets "LIMIT 0" 
c300: 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20  to mean.  ** no 
c310: 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  rows..  */.  sql
c320: 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
c330: 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  ar(pParse);.  as
c340: 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
c350: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74  ==0 || p->pLimit
c360: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
c370: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d  pLimit ){.    p-
c380: 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74  >iLimit = iLimit
c390: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
c3a0: 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  m;.    v = sqlit
c3b0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
c3c0: 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  );.    if( NEVER
c3d0: 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (v==0) ) return;
c3e0: 20 20 2f 2a 20 56 44 42 45 20 73 68 6f 75 6c 64    /* VDBE should
c3f0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
c400: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
c410: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
c420: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
c430: 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20  pLimit, &n) ){. 
c440: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c450: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
c460: 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29  eger, n, iLimit)
c470: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
c480: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
c490: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
c4a0: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
c4b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c4c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
c4d0: 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20  o, 0, iBreak);. 
c4e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c4f0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
c500: 63 74 52 6f 77 20 3e 20 28 64 6f 75 62 6c 65 29  ctRow > (double)
c510: 6e 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  n ) p->nSelectRo
c520: 77 20 3d 20 28 64 6f 75 62 6c 65 29 6e 3b 0a 20  w = (double)n;. 
c530: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
c540: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
c550: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
c560: 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69  p->pLimit, iLimi
c570: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
c580: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
c590: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69  P_MustBeInt, iLi
c5a0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  mit);.      Vdbe
c5b0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
c5c0: 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
c5d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c5e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a  AddOp2(v, OP_IfZ
c5f0: 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72  ero, iLimit, iBr
c600: 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eak);.    }.    
c610: 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29  if( p->pOffset )
c620: 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  {.      p->iOffs
c630: 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b  et = iOffset = +
c640: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
c650: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
c660: 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  m++;   /* Alloca
c670: 74 65 20 61 6e 20 65 78 74 72 61 20 72 65 67 69  te an extra regi
c680: 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f  ster for limit+o
c690: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 73  ffset */.      s
c6a0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
c6b0: 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65  Parse, p->pOffse
c6c0: 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  t, iOffset);.   
c6d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c6e0: 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
c6f0: 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a  eInt, iOffset);.
c700: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
c710: 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f  t((v, "OFFSET co
c720: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
c730: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
c740: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
c750: 49 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 29 3b  IfPos, iOffset);
c760: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c770: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
c780: 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f 66 66 73  nteger, 0, iOffs
c790: 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
c7a0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
c7b0: 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20  , addr1);.      
c7c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c7d0: 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69  3(v, OP_Add, iLi
c7e0: 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f  mit, iOffset, iO
c7f0: 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20  ffset+1);.      
c800: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
c810: 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29  "LIMIT+OFFSET"))
c820: 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20  ;.      addr1 = 
c830: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c840: 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  1(v, OP_IfPos, i
c850: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71  Limit);.      sq
c860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c870: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d  v, OP_Integer, -
c880: 31 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20  1, iOffset+1);. 
c890: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c8a0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
c8b0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
c8c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c8d0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
c8e0: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  LECT./*.** Retur
c8f0: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
c900: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
c910: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f  ence for the iCo
c920: 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  l-th column of.*
c930: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
c940: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
c950: 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d-select stateme
c960: 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20  nt "p".  Return 
c970: 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63  NULL if.** the c
c980: 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66  olumn has no def
c990: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ault collating s
c9a0: 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  equence..**.** T
c9b0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
c9c0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f  uence for the co
c9d0: 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73  mpound select is
c9e0: 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a   taken from the.
c9f0: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  ** left-most ter
ca00: 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  m of the select 
ca10: 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61  that has a colla
ca20: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
ca30: 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71  /.static CollSeq
ca40: 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c   *multiSelectCol
ca50: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
ca60: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
ca70: 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c  nt iCol){.  Coll
ca80: 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  Seq *pRet;.  if(
ca90: 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
caa0: 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65    pRet = multiSe
cab0: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
cac0: 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69  se, p->pPrior, i
cad0: 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Col);.  }else{. 
cae0: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d     pRet = 0;.  }
caf0: 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
cb00: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 65 74  =0 );.  if( pRet
cb10: 3d 3d 30 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 70  ==0 && iCol<p->p
cb20: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
cb30: 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
cb40: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
cb50: 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  arse, p->pEList-
cb60: 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b  >a[iCol].pExpr);
cb70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
cb80: 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  et;.}.#endif /* 
cb90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
cba0: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
cbb0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
cbc0: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
cbd0: 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
cbe0: 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
cbf0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
cc00: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
cc10: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
cc20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
cc30: 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
cc40: 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
cc50: 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
cc60: 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
cc70: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
cc80: 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
cc90: 73 20 2a 2f 0a 29 3b 0a 0a 0a 23 69 66 6e 64 65  s */.);...#ifnde
cca0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
ccb0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
ccc0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ccd0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
cce0: 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ocess a compound
ccf0: 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d   query form from
cd00: 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  .** two or more 
cd10: 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73  separate queries
cd20: 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e   using UNION, UN
cd30: 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c  ION ALL, EXCEPT,
cd40: 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54   or.** INTERSECT
cd50: 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74  .**.** "p" point
cd60: 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
cd70: 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71  ost of the two q
cd80: 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65  ueries.  the que
cd90: 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66  ry on the.** lef
cda0: 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20  t is p->pPrior. 
cdb0: 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20   The left query 
cdc0: 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20  could also be a 
cdd0: 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a  compound query.*
cde0: 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  * in which case 
cdf0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
ce00: 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75  l be called recu
ce10: 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20  rsively. .**.** 
ce20: 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  The results of t
ce30: 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61  he total query a
ce40: 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  re to be written
ce50: 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74   into a destinat
ce60: 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65  ion.** of type e
ce70: 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65  Dest with parame
ce80: 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ter iParm..**.**
ce90: 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e   Example 1:  Con
cea0: 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61  sider a three-wa
ceb0: 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73  y compound SQL s
cec0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
ced0: 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
cee0: 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
cef0: 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T b FROM t2 UNIO
cf00: 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20  N SELECT c FROM 
cf10: 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74  t3.**.** This st
cf20: 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
cf30: 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d up as follows:
cf40: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
cf50: 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20  T c FROM t3.**  
cf60: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d      |.**      `-
cf70: 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20  ---->  SELECT b 
cf80: 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20  FROM t2.**      
cf90: 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20            |.**  
cfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d                `-
cfb0: 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61  ----->  SELECT a
cfc0: 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54   FROM t1.**.** T
cfd0: 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65  he arrows in the
cfe0: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72   diagram above r
cff0: 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c  epresent the Sel
d000: 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74  ect.pPrior point
d010: 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69  er..** So if thi
d020: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
d030: 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c  led with p equal
d040: 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79   to the t3 query
d050: 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72  , then.** pPrior
d060: 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20   will be the t2 
d070: 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69  query.  p->op wi
d080: 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69  ll be TK_UNION i
d090: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
d0a0: 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62  ** Notice that b
d0b0: 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
d0c0: 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20  y SQLite parses 
d0d0: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  compound SELECTs
d0e0: 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  , the.** individ
d0f0: 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61  ual selects alwa
d100: 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65  ys group from le
d110: 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a  ft to right..*/.
d120: 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
d130: 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
d140: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
d150: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
d160: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
d170: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
d180: 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
d190: 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
d1a0: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
d1b0: 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
d1c0: 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
d1d0: 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
d1e0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ts */.){.  int r
d1f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
d200: 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
d210: 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
d220: 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
d230: 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
d240: 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
d250: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
d260: 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
d270: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
d280: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
d290: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
d2a0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
d2b0: 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41   dest;      /* A
d2c0: 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20  lternative data 
d2d0: 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
d2e0: 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65   Select *pDelete
d2f0: 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20   = 0;  /* Chain 
d300: 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  of simple select
d310: 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  s to delete */. 
d320: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
d330: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
d340: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
d350: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d360: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
d370: 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20 20 20  nt iSub1;       
d380: 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
d390: 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72  f left-hand quer
d3a0: 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  y */.  int iSub2
d3b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
d3c0: 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d  EQP id of right-
d3d0: 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65  hand query */.#e
d3e0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ndif..  /* Make 
d3f0: 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
d400: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
d410: 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69  IT clause on pri
d420: 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c  or SELECTs.  Onl
d430: 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20  y.  ** the last 
d440: 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c  (right-most) SEL
d450: 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65  ECT in the serie
d460: 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52  s may have an OR
d470: 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e  DER BY or LIMIT.
d480: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
d490: 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29  p && p->pPrior )
d4a0: 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75  ;  /* Calling fu
d4b0: 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65  nction guarantee
d4c0: 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20  s this much */. 
d4d0: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
d4e0: 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ;.  pPrior = p->
d4f0: 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74  pPrior;.  assert
d500: 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74  ( pPrior->pRight
d510: 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a  most!=pPrior );.
d520: 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
d530: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d  ->pRightmost==p-
d540: 3e 70 52 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20  >pRightmost );. 
d550: 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a   dest = *pDest;.
d560: 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f    if( pPrior->pO
d570: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
d580: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
d590: 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63  arse,"ORDER BY c
d5a0: 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
d5b0: 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
d5c0: 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
d5d0: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
d5e0: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
d5f0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
d600: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
d610: 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
d620: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
d630: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
d640: 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  e,"LIMIT clause 
d650: 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
d660: 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22  r %s not before"
d670: 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
d680: 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
d690: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
d6a0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
d6b0: 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20  end;.  }..  v = 
d6c0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
d6d0: 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
d6e0: 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68  ( v!=0 );  /* Th
d6f0: 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20 63  e VDBE already c
d700: 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e  reated by callin
d710: 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  g function */.. 
d720: 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64   /* Create the d
d730: 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f  estination tempo
d740: 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65  rary table if ne
d750: 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69  cessary.  */.  i
d760: 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
d770: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
d780: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
d790: 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69  List );.    sqli
d7a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d7b0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
d7c0: 6c 2c 20 64 65 73 74 2e 69 50 61 72 6d 2c 20 70  l, dest.iParm, p
d7d0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
d7e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
d7f0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52  eChangeP5(v, BTR
d800: 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20  EE_UNORDERED);. 
d810: 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
d820: 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a  SRT_Table;.  }..
d830: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61    /* Make sure a
d840: 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68  ll SELECTs in th
d850: 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65  e statement have
d860: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
d870: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a   of elements.  *
d880: 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c  * in their resul
d890: 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61  t sets..  */.  a
d8a0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
d8b0: 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69   && pPrior->pELi
d8c0: 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  st );.  if( p->p
d8d0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50  EList->nExpr!=pP
d8e0: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  rior->pEList->nE
d8f0: 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
d900: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
d910: 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74  e, "SELECTs to t
d920: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
d930: 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22  t of %s".      "
d940: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
d950: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
d960: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c  result columns",
d970: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
d980: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
d990: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
d9a0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
d9b0: 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64  }..  /* Compound
d9c0: 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68 61   SELECTs that ha
d9d0: 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  ve an ORDER BY c
d9e0: 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65  lause are handle
d9f0: 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20  d separately..  
da00: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  */.  if( p->pOrd
da10: 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75  erBy ){.    retu
da20: 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  rn multiSelectOr
da30: 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c  derBy(pParse, p,
da40: 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20   pDest);.  }..  
da50: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
da60: 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e   for the left an
da70: 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73  d right SELECT s
da80: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
da90: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
daa0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
dab0: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
dac0: 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  addr = 0;.      
dad0: 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20  int nLimit;.    
dae0: 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
daf0: 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20  r->pLimit );.   
db00: 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69     pPrior->pLimi
db10: 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
db20: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66       pPrior->pOf
db30: 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
db40: 74 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  t;.      explain
db50: 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
db60: 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
db70: 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
db80: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
db90: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
dba0: 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  r, &dest);.     
dbb0: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
dbc0: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
dbd0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
dbe0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
dbf0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
dc00: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
dc10: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
dc20: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69  ;.      p->iLimi
dc30: 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  t = pPrior->iLim
dc40: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66  it;.      p->iOf
dc50: 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  fset = pPrior->i
dc60: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66  Offset;.      if
dc70: 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
dc80: 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
dc90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
dca0: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
dcb0: 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >iLimit);.      
dcc0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
dcd0: 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66  , "Jump ahead if
dce0: 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22 29   LIMIT reached")
dcf0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
dd00: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
dd10: 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
dd20: 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
dd30: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
dd40: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
dd50: 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
dd60: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
dd70: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
dd80: 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
dd90: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
dda0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
ddb0: 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65  or;.      p->nSe
ddc0: 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f  lectRow += pPrio
ddd0: 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
dde0: 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d       if( pPrior-
ddf0: 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 26  >pLimit.       &
de00: 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  & sqlite3ExprIsI
de10: 6e 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70  nteger(pPrior->p
de20: 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a  Limit, &nLimit).
de30: 20 20 20 20 20 20 20 26 26 20 70 2d 3e 6e 53 65         && p->nSe
de40: 6c 65 63 74 52 6f 77 20 3e 20 28 64 6f 75 62 6c  lectRow > (doubl
de50: 65 29 6e 4c 69 6d 69 74 20 0a 20 20 20 20 20 20  e)nLimit .      
de60: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  ){.        p->nS
de70: 65 6c 65 63 74 52 6f 77 20 3d 20 28 64 6f 75 62  electRow = (doub
de80: 6c 65 29 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20  le)nLimit;.     
de90: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64 64   }.      if( add
dea0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
deb0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
dec0: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
ded0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
dee0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
def0: 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61  K_EXCEPT:.    ca
df00: 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
df10: 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61       int unionTa
df20: 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  b;    /* Cursor 
df30: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65  number of the te
df40: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f  mporary table ho
df50: 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a  lding result */.
df60: 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b        u8 op = 0;
df70: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
df80: 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   the SRT_ operat
df90: 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f  ions to apply to
dfa0: 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69   self */.      i
dfb0: 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20  nt priorOp;     
dfc0: 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72  /* The SRT_ oper
dfd0: 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74  ation to apply t
dfe0: 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20  o prior selects 
dff0: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
e000: 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
e010: 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73   /* Saved values
e020: 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e   of p->nLimit an
e030: 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a  d p->nOffset */.
e040: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
e050: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
e060: 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20   uniondest;..   
e070: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
e080: 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b  op==TK_EXCEPT );
e090: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e0a0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
e0b0: 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 4f   );.      priorO
e0c0: 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
e0d0: 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
e0e0: 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20  est==priorOp && 
e0f0: 41 4c 57 41 59 53 28 21 70 2d 3e 70 4c 69 6d 69  ALWAYS(!p->pLimi
e100: 74 20 26 26 21 70 2d 3e 70 4f 66 66 73 65 74 29  t &&!p->pOffset)
e110: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
e120: 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
e130: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
e140: 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
e150: 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
e160: 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
e170: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
e180: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
e190: 74 6d 6f 73 74 21 3d 70 20 29 3b 20 20 2f 2a 20  tmost!=p );  /* 
e1a0: 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  Can only happen 
e1b0: 66 6f 72 20 6c 65 66 74 77 61 72 64 20 65 6c 65  for leftward ele
e1c0: 6d 65 6e 74 73 0a 20 20 20 20 20 20 20 20 20 20  ments.          
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1e0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66             ** of
e1f0: 20 61 20 33 2d 77 61 79 20 6f 72 20 6d 6f 72 65   a 3-way or more
e200: 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 20   compound */.   
e210: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
e220: 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20  pLimit==0 );    
e230: 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64    /* Not allowed
e240: 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65   on leftward ele
e250: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  ments */.       
e260: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
e270: 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a  set==0 );     /*
e280: 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   Not allowed on 
e290: 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
e2a0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69  s */.        uni
e2b0: 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 50 61  onTab = dest.iPa
e2c0: 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  rm;.      }else{
e2d0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77  .        /* We w
e2e0: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61  ill need to crea
e2f0: 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f  te our own tempo
e300: 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f  rary table to ho
e310: 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ld the.        *
e320: 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
e330: 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20  esults..        
e340: 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
e350: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
e360: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ab++;.        as
e370: 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
e380: 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  y==0 );.        
e390: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
e3a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
e3b0: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e  penEphemeral, un
e3c0: 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
e3d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
e3e0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
e3f0: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  = -1 );.        
e400: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
e410: 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
e420: 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74     p->pRightmost
e430: 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
e440: 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
e450: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e460: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
e470: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
e480: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
e490: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
e4a0: 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20   left.      */. 
e4b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
e4c0: 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
e4d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
e4e0: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75  electDestInit(&u
e4f0: 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f  niondest, priorO
e500: 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20  p, unionTab);.  
e510: 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
e520: 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
e530: 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
e540: 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
e550: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
e560: 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75  arse, pPrior, &u
e570: 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
e580: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
e590: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
e5a0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
e5b0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
e5c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
e5d0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
e5e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
e5f0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
e600: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20  T ){.        op 
e610: 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20  = SRT_Except;.  
e620: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e630: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
e640: 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
e650: 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55        op = SRT_U
e660: 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nion;.      }.  
e670: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
e680: 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
e690: 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
e6a0: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
e6b0: 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
e6c0: 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
e6d0: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
e6e0: 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64   0;.      uniond
e6f0: 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a  est.eDest = op;.
e700: 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
e710: 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
e720: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
e730: 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
e740: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
e750: 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f  pParse, p, &unio
e760: 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  ndest);.      te
e770: 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
e780: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f  TE_OK );.      /
e790: 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69  * Query flatteni
e7a0: 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ng in sqlite3Sel
e7b0: 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69  ect() might refi
e7c0: 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a  ll p->pOrderBy..
e7d0: 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65        ** Be sure
e7e0: 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f   to delete p->pO
e7f0: 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72  rderBy, therefor
e800: 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65  e, to avoid a me
e810: 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20  mory leak. */.  
e820: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
e830: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
e840: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
e850: 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
e860: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
e870: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
e880: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
e890: 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  By = 0;.      if
e8a0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
e8b0: 4e 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  N ) p->nSelectRo
e8c0: 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  w += pPrior->nSe
e8d0: 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73  lectRow;.      s
e8e0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
e8f0: 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
e900: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
e910: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
e920: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
e930: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
e940: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
e950: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
e960: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ;..      /* Conv
e970: 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20  ert the data in 
e980: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
e990: 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ble into whateve
e9a0: 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  r form.      ** 
e9b0: 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75  it is that we cu
e9c0: 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20  rrently need..  
e9d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
e9e0: 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64  ert( unionTab==d
e9f0: 65 73 74 2e 69 50 61 72 6d 20 7c 7c 20 64 65 73  est.iParm || des
ea00: 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
ea10: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65   );.      if( de
ea20: 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
ea30: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  p ){.        int
ea40: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
ea50: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20  iStart;.        
ea60: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
ea70: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t );.        if(
ea80: 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
ea90: 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
eaa0: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
eab0: 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
eac0: 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
ead0: 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
eae0: 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
eaf0: 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65  or;.          ge
eb00: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
eb10: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
eb20: 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
eb30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
eb40: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
eb50: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
eb60: 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20  ;.        iCont 
eb70: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
eb80: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
eb90: 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
eba0: 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
ebb0: 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
ebc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ebd0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
ebe0: 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
ebf0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
ec00: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
ec10: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
ec20: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65  v);.        sele
ec30: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
ec40: 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
ec50: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70  , unionTab, p->p
ec60: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec80: 20 20 20 20 20 20 30 2c 20 2d 31 2c 20 26 64 65        0, -1, &de
ec90: 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
eca0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
ecb0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
ecc0: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
ecd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ece0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
ecf0: 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ext, unionTab, i
ed00: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20  Start);.        
ed10: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
ed20: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
ed30: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
ed40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ed50: 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e   OP_Close, union
ed60: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Tab, 0);.      }
ed70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ed80: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
ed90: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
eda0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20  TK_INTERSECT ); 
edb0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31  {.      int tab1
edc0: 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e  , tab2;.      in
edd0: 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
ede0: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45   iStart;.      E
edf0: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
ee00: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74  ffset;.      int
ee10: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
ee20: 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63  ectDest intersec
ee30: 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  tdest;.      int
ee40: 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49   r1;..      /* I
ee50: 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
ee60: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
ee70: 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
ee80: 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
ee90: 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
eea0: 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
eeb0: 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
eec0: 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
eed0: 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
eee0: 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
eef0: 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
ef00: 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20  */.      tab1 = 
ef10: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
ef20: 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
ef30: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
ef40: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
ef50: 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20  rderBy==0 );..  
ef60: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
ef70: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ef80: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
ef90: 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
efa0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
efb0: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
efc0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
efd0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
efe0: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
eff0: 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46  pRightmost->selF
f000: 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
f010: 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
f020: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
f030: 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  t );..      /* C
f040: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
f050: 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
f060: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
f070: 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
f080: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  /.      sqlite3S
f090: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69  electDestInit(&i
f0a0: 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52  ntersectdest, SR
f0b0: 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a  T_Union, tab1);.
f0c0: 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
f0d0: 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
f0e0: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
f0f0: 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
f100: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
f110: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
f120: 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
f130: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
f140: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
f150: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
f160: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
f170: 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
f180: 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
f190: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
f1a0: 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
f1b0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
f1c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f1d0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
f1e0: 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  l, tab2, 0);.   
f1f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
f200: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d  drOpenEphm[1] ==
f210: 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
f220: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
f230: 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d  = addr;.      p-
f240: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
f250: 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
f260: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
f270: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
f280: 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
f290: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
f2a0: 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
f2b0: 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73      intersectdes
f2c0: 74 2e 69 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a  t.iParm = tab2;.
f2d0: 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
f2e0: 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
f2f0: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
f300: 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
f310: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
f320: 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65  pParse, p, &inte
f330: 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20  rsectdest);.    
f340: 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
f350: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
f360: 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
f370: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
f380: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
f390: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
f3a0: 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72  SelectRow>pPrior
f3b0: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70  ->nSelectRow ) p
f3c0: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
f3d0: 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
f3e0: 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  w;.      sqlite3
f3f0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
f400: 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
f410: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
f420: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  mit;.      p->pO
f430: 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
f440: 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
f450: 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65  ate code to take
f460: 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f   the intersectio
f470: 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d  n of the two tem
f480: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20  porary.      ** 
f490: 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f  tables..      */
f4a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f4b0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
f4c0: 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
f4d0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
f4e0: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
f4f0: 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
f500: 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
f510: 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
f520: 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
f530: 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e  ior;.        gen
f540: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
f550: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
f560: 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  st->pEList);.   
f570: 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61     }.      iBrea
f580: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
f590: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
f5a0: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
f5b0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
f5c0: 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74  v);.      comput
f5d0: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
f5e0: 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
f5f0: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
f600: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f610: 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20  P_Rewind, tab1, 
f620: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 72  iBreak);.      r
f630: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
f640: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
f650: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
f660: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f670: 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61  v, OP_RowKey, ta
f680: 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  b1, r1);.      s
f690: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
f6a0: 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
f6b0: 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c  nd, tab2, iCont,
f6c0: 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73   r1, 0);.      s
f6d0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
f6e0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
f6f0: 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
f700: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
f710: 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61  p, p->pEList, ta
f720: 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  b1, p->pEList->n
f730: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
f740: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 2d              0, -
f750: 31 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c  1, &dest, iCont,
f760: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
f770: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
f780: 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
f790: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f7a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f7b0: 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74  _Next, tab1, iSt
f7c0: 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  art);.      sqli
f7d0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
f7e0: 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
f7f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f800: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
f810: 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ose, tab2, 0);. 
f820: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f830: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
f840: 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  se, tab1, 0);.  
f850: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f860: 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43  .  }..  explainC
f870: 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c  omposite(pParse,
f880: 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69   p->op, iSub1, i
f890: 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f  Sub2, p->op!=TK_
f8a0: 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ALL);..  /* Comp
f8b0: 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ute collating se
f8c0: 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20  quences used by 
f8d0: 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
f8e0: 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f  tables needed to
f8f0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
f900: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
f910: 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20    ** Attach the 
f920: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
f930: 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61  e to all tempora
f940: 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ry tables..  **.
f950: 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f    ** This sectio
f960: 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20  n is run by the 
f970: 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43  right-most SELEC
f980: 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79  T statement only
f990: 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74  ..  ** SELECT st
f9a0: 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  atements to the 
f9b0: 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70  left always skip
f9c0: 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65   this part.  The
f9d0: 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
f9e0: 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c   SELECT might al
f9f0: 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  so skip this par
fa00: 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f  t if it has no O
fa10: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
fa20: 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20  nd.  ** no temp 
fa30: 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69  tables are requi
fa40: 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  red..  */.  if( 
fa50: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
fa60: 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29  _UsesEphemeral )
fa70: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  {.    int i;    
fa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa90: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
faa0: 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e  ter */.    KeyIn
fab0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20  fo *pKeyInfo;   
fac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
fad0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
fae0: 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  or the result se
faf0: 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20  t */.    Select 
fb00: 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
fb10: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
fb20: 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45  oping through SE
fb30: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
fb40: 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  */.    CollSeq *
fb50: 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20  *apColl;        
fb60: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
fb70: 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79  ing through pKey
fb80: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f  Info->aColl[] */
fb90: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
fba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbb0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
fbc0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
fbd0: 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73  t set */..    as
fbe0: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d  sert( p->pRightm
fbf0: 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 43  ost==p );.    nC
fc00: 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
fc10: 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49  nExpr;.    pKeyI
fc20: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
fc30: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20  allocZero(db,.  
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc50: 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65       sizeof(*pKe
fc60: 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 28 73 69 7a  yInfo)+nCol*(siz
fc70: 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20  eof(CollSeq*) + 
fc80: 31 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b  1));.    if( !pK
fc90: 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
fca0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
fcb0: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  M;.      goto mu
fcc0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
fcd0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49      }..    pKeyI
fce0: 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64  nfo->enc = ENC(d
fcf0: 62 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  b);.    pKeyInfo
fd00: 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  ->nField = (u16)
fd10: 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  nCol;..    for(i
fd20: 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49  =0, apColl=pKeyI
fd30: 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43  nfo->aColl; i<nC
fd40: 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  ol; i++, apColl+
fd50: 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c  +){.      *apCol
fd60: 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
fd70: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
fd80: 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
fd90: 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20  0==*apColl ){.  
fda0: 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
fdb0: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
fdc0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
fdd0: 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
fde0: 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
fdf0: 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
fe00: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
fe10: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
fe20: 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e  t addr = pLoop->
fe30: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b  addrOpenEphm[i];
fe40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
fe50: 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r<0 ){.         
fe60: 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e   /* If [0] is un
fe70: 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73  used then [1] is
fe80: 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53   also unused.  S
fe90: 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20  o we can.       
fea0: 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66     ** always saf
feb0: 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f  ely abort as soo
fec0: 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75  n as the first u
fed0: 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f  nused slot is fo
fee0: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
fef0: 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
ff00: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c  addrOpenEphm[1]<
ff10: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  0 );.          b
ff20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
ff30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ff40: 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
ff50: 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ddr, nCol);.    
ff60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
ff70: 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
ff80: 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
ff90: 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
ffa0: 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64         pLoop->ad
ffb0: 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20  drOpenEphm[i] = 
ffc0: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
ffd0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
ffe0: 72 65 65 28 64 62 2c 20 70 4b 65 79 49 6e 66 6f  ree(db, pKeyInfo
fff0: 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65  );.  }..multi_se
10000 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73  lect_end:.  pDes
10010 74 2d 3e 69 4d 65 6d 20 3d 20 64 65 73 74 2e 69  t->iMem = dest.i
10020 4d 65 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 4d  Mem;.  pDest->nM
10030 65 6d 20 3d 20 64 65 73 74 2e 6e 4d 65 6d 3b 0a  em = dest.nMem;.
10040 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
10050 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74  elete(db, pDelet
10060 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
10070 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
10080 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
10090 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a  D_SELECT */../*.
100a0 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75  ** Code an outpu
100b0 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72  t subroutine for
100c0 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70   a coroutine imp
100d0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
100e0 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d  .** SELECT statm
100f0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ent..**.** The d
10100 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74  ata to be output
10110 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
10120 20 70 49 6e 2d 3e 69 4d 65 6d 2e 20 20 54 68 65   pIn->iMem.  The
10130 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e  re are.** pIn->n
10140 4d 65 6d 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62  Mem columns to b
10150 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74  e output.  pDest
10160 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75   is where the ou
10170 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  tput should.** b
10180 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65  e sent..**.** re
10190 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e  gReturn is the n
101a0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67  umber of the reg
101b0 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  ister holding th
101c0 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20  e subroutine.** 
101d0 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a  return address..
101e0 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76  **.** If regPrev
101f0 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  >0 then it is th
10200 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
10210 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61   in a vector tha
10220 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65  t.** records the
10230 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
10240 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20  .  mem[regPrev] 
10250 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  is a flag that i
10260 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68  s false.** if th
10270 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20  ere has been no 
10280 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e  previous output.
10290 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74    If regPrev>0 t
102a0 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67  hen code is.** g
102b0 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70 70  enerated to supp
102c0 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e  ress duplicates.
102d0 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73    pKeyInfo is us
102e0 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67  ed for comparing
102f0 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20  .** keys..**.** 
10300 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75  If the LIMIT fou
10310 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20  nd in p->iLimit 
10320 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70  is reached, jump
10330 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a   immediately to.
10340 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74  ** iBreak..*/.st
10350 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74  atic int generat
10360 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
10370 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
10380 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
10390 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
103a0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
103b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
103c0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
103d0 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ment */.  Select
103e0 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20  Dest *pIn,      
103f0 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73    /* Coroutine s
10400 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f  upplying data */
10410 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
10420 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68  Dest,      /* Wh
10430 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20  ere to send the 
10440 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65  data */.  int re
10450 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20  gReturn,        
10460 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
10470 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
10480 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65   */.  int regPre
10490 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v,            /*
104a0 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74   Previous result
104b0 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75   register.  No u
104c0 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a  niqueness if 0 *
104d0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
104e0 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46  yInfo,      /* F
104f0 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74  or comparing wit
10500 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  h previous entry
10510 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65   */.  int p4type
10520 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
10530 20 54 68 65 20 70 34 20 74 79 70 65 20 66 6f 72   The p4 type for
10540 20 70 4b 65 79 49 6e 66 6f 20 2a 2f 0a 20 20 69   pKeyInfo */.  i
10550 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20  nt iBreak       
10560 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
10570 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68  ere if we hit th
10580 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20  e LIMIT */.){.  
10590 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
105a0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
105b0 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20  Continue;.  int 
105c0 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20  addr;..  addr = 
105d0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
105e0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f  ntAddr(v);.  iCo
105f0 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
10600 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
10610 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
10620 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20   duplicates for 
10630 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61  UNION, EXCEPT, a
10640 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20  nd INTERSECT .  
10650 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76  */.  if( regPrev
10660 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20   ){.    int j1, 
10670 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c  j2;.    j1 = sql
10680 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10690 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50  , OP_IfNot, regP
106a0 72 65 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73  rev);.    j2 = s
106b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
106c0 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
106d0 70 49 6e 2d 3e 69 4d 65 6d 2c 20 72 65 67 50 72  pIn->iMem, regPr
106e0 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c  ev+1, pIn->nMem,
106f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
10710 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
10720 70 34 74 79 70 65 29 3b 0a 20 20 20 20 73 71 6c  p4type);.    sql
10730 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
10740 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c  , OP_Jump, j2+2,
10750 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b 32   iContinue, j2+2
10760 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
10770 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
10780 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
10790 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73  prCodeCopy(pPars
107a0 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 72 65  e, pIn->iMem, re
107b0 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 4d  gPrev+1, pIn->nM
107c0 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  em);.    sqlite3
107d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
107e0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67  _Integer, 1, reg
107f0 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Prev);.  }.  if(
10800 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
10810 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
10820 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  rn 0;..  /* Supp
10830 72 65 73 73 20 74 68 65 20 74 68 65 20 66 69 72  ress the the fir
10840 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65  st OFFSET entrie
10850 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  s if there is an
10860 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20   OFFSET clause. 
10870 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74   */.  codeOffset
10880 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
10890 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 44  );..  switch( pD
108a0 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20  est->eDest ){.  
108b0 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
108c0 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73  esult as data us
108d0 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79  ing a unique key
108e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
108f0 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
10900 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
10910 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab: {.      int 
10920 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
10930 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
10940 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73        int r2 = s
10950 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
10960 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
10970 74 65 73 74 63 61 73 65 28 20 70 44 65 73 74 2d  testcase( pDest-
10980 3e 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c  >eDest==SRT_Tabl
10990 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
109a0 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ase( pDest->eDes
109b0 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
109c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
109d0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
109e0 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e  _MakeRecord, pIn
109f0 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65  ->iMem, pIn->nMe
10a00 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  m, r1);.      sq
10a10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10a20 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
10a30 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72 32  pDest->iParm, r2
10a40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10a50 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
10a60 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e  _Insert, pDest->
10a70 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a  iParm, r1, r2);.
10a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10a90 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
10aa0 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
10ab0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
10ac0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
10ad0 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
10ae0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
10af0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
10b00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10b10 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
10b20 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
10b30 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
10b40 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
10b50 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
10b60 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
10b70 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
10b80 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
10b90 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
10ba0 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
10bb0 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
10bc0 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
10bd0 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
10be0 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
10bf0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
10c00 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _Set: {.      in
10c10 74 20 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65  t r1;.      asse
10c20 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31  rt( pIn->nMem==1
10c30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66   );.      p->aff
10c40 69 6e 69 74 79 20 3d 20 0a 20 20 20 20 20 20 20  inity = .       
10c50 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65    sqlite3Compare
10c60 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69  Affinity(p->pELi
10c70 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
10c80 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 29  pDest->affinity)
10c90 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
10ca0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
10cb0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
10cc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
10cd0 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
10ce0 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 2c 20  , pIn->iMem, 1, 
10cf0 72 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79  r1, &p->affinity
10d00 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
10d10 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
10d20 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
10d30 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 29  e, pIn->iMem, 1)
10d40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10d50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10d60 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74  IdxInsert, pDest
10d70 2d 3e 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20  ->iParm, r1);.  
10d80 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
10d90 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
10da0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
10db0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30  ak;.    }..#if 0
10dc0 20 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63 75 72    /* Never occur
10dd0 73 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20 42 59  s on an ORDER BY
10de0 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a   query */.    /*
10df0 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73   If any row exis
10e00 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  t in the result 
10e10 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74  set, record that
10e20 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e   fact and abort.
10e30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
10e40 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20   SRT_Exists: {. 
10e50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10e60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
10e70 65 67 65 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e  eger, 1, pDest->
10e80 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a  iParm);.      /*
10e90 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
10ea0 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
10eb0 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
10ec0 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
10ed0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
10ee0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
10ef0 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
10f00 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
10f10 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
10f20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
10f30 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
10f40 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
10f50 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
10f60 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a   break out.    *
10f70 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
10f80 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
10f90 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
10fa0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
10fb0 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20  ->nMem==1 );.   
10fc0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
10fd0 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
10fe0 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d  In->iMem, pDest-
10ff0 3e 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20  >iParm, 1);.    
11000 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
11010 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20  lause will jump 
11020 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
11030 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
11040 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
11050 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
11060 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
11070 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54  ERY */..    /* T
11080 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  he results are s
11090 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65  tored in a seque
110a0 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
110b0 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
110c0 20 61 74 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2e   at pDest->iMem.
110d0 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f    Then the co-ro
110e0 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20  utine yields..  
110f0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
11100 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20  T_Coroutine: {. 
11110 20 20 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e       if( pDest->
11120 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iMem==0 ){.     
11130 20 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d     pDest->iMem =
11140 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
11150 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
11160 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  ->nMem);.       
11170 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 70   pDest->nMem = p
11180 49 6e 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  In->nMem;.      
11190 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
111a0 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
111b0 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70  se, pIn->iMem, p
111c0 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 70 44 65 73  Dest->iMem, pDes
111d0 74 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20  t->nMem);.      
111e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
111f0 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
11200 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20  Dest->iParm);.  
11210 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11220 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65  ..    /* If none
11230 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74   of the above, t
11240 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64  hen the result d
11250 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20  estination must 
11260 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75  be.    ** SRT_Ou
11270 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74  tput.  This rout
11280 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
11290 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68  led with any oth
112a0 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e  er.    ** destin
112b0 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ation other than
112c0 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65   the ones handle
112d0 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f  d above or SRT_O
112e0 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  utput..    **.  
112f0 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74    ** For SRT_Out
11300 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65  put, results are
11310 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
11320 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
11330 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65  rs.  .    ** The
11340 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52  n the OP_ResultR
11350 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  ow opcode is use
11360 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74  d to cause sqlit
11370 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20  e3_step() to.   
11380 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e   ** return the n
11390 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  ext row of resul
113a0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  t..    */.    de
113b0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
113c0 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
113d0 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
113e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
113f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11400 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d  _ResultRow, pIn-
11410 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d  >iMem, pIn->nMem
11420 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11430 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
11440 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
11450 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e  pIn->iMem, pIn->
11460 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 62 72 65  nMem);.      bre
11470 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
11480 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
11490 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
114a0 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
114b0 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20  reached..  */.  
114c0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b  if( p->iLimit ){
114d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
114e0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a  AddOp3(v, OP_IfZ
114f0 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
11500 69 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d  iBreak, -1);.  }
11510 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
11520 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72  the subroutine r
11530 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c  eturn.  */.  sql
11540 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
11550 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75  abel(v, iContinu
11560 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
11570 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
11580 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29  turn, regReturn)
11590 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  ;..  return addr
115a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72  ;.}../*.** Alter
115b0 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20  native compound 
115c0 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65  select code gene
115d0 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20  rator for cases 
115e0 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73  when there.** is
115f0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
11600 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73  use..**.** We as
11610 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20  sume a query of 
11620 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
11630 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c  rm:.**.**      <
11640 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61  selectA>  <opera
11650 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20  tor>  <selectB> 
11660 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72   ORDER BY <order
11670 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f  bylist>.**.** <o
11680 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20  perator> is one 
11690 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e  of UNION ALL, UN
116a0 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20  ION, EXCEPT, or 
116b0 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65 20  INTERSECT.  The 
116c0 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f  idea.** is to co
116d0 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41  de both <selectA
116e0 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20  > and <selectB> 
116f0 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42  with the ORDER B
11700 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63  Y clause as.** c
11710 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65  o-routines.  The
11720 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75  n run the co-rou
11730 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65  tines in paralle
11740 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20  l and merge the 
11750 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20  results.** into 
11760 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20  the output.  In 
11770 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20  addition to the 
11780 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28  two coroutines (
11790 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61  called selectA a
117a0 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74  nd.** selectB) t
117b0 68 65 72 65 20 61 72 65 20 37 20 73 75 62 72 6f  here are 7 subro
117c0 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  utines:.**.**   
117d0 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74   outA:    Move t
117e0 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
117f0 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69   selectA corouti
11800 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ne into the outp
11810 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
11820 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e    of the compoun
11830 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  d query..**.**  
11840 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20    outB:    Move 
11850 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
11860 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74  e selectB corout
11870 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ine into the out
11880 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
11890 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75     of the compou
118a0 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79  nd query.  (Only
118b0 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55   generated for U
118c0 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20  NION and.**     
118d0 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
118e0 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20 49  L.  EXCEPT and I
118f0 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65 72 20  NSERTSECT never 
11900 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74 68 61  output a row tha
11910 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
11920 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e   appears only in
11930 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c   B.).**.**    Al
11940 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  tB:    Called wh
11950 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
11960 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
11970 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a  tines and A<B..*
11980 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20  *.**    AeqB:   
11990 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
119a0 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
119b0 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
119c0 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20  and A==B..**.** 
119d0 20 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c     AgtB:    Call
119e0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
119f0 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
11a00 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
11a10 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66  >B..**.**    Eof
11a20 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  A:    Called whe
11a30 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  n data is exhaus
11a40 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  ted from selectA
11a50 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a  ..**.**    EofB:
11a60 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
11a70 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
11a80 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a  d from selectB..
11a90 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  **.** The implem
11aa0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
11ab0 6c 61 74 74 65 72 20 66 69 76 65 20 73 75 62 72  latter five subr
11ac0 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f  outines depend o
11ad0 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65  n which .** <ope
11ae0 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a  rator> is used:.
11af0 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  **.**.**        
11b00 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20       UNION ALL  
11b10 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20         UNION    
11b20 20 20 20 20 20 20 20 20 45 58 43 45 50 54 20 20          EXCEPT  
11b30 20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45 43          INTERSEC
11b40 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d  T.**          --
11b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
11b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
11b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
11b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b90 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f  -.**   AltB:   o
11ba0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
11bb0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
11bc0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
11bd0 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a        nextA.**.*
11be0 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41  *   AeqB:   outA
11bf0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
11c00 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20 20  nextA           
11c10 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20    nextA         
11c20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a  outA, nextA.**.*
11c30 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42  *   AgtB:   outB
11c40 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74  , nextB      out
11c50 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20  B, nextB        
11c60 20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20    nextB         
11c70 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20     nextB.**.**  
11c80 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e   EofA:   outB, n
11c90 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20  extB      outB, 
11ca0 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 68  nextB          h
11cb0 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  alt             
11cc0 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66  halt.**.**   Eof
11cd0 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
11ce0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
11cf0 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  A       outA, ne
11d00 78 74 41 20 20 20 20 20 20 20 20 20 68 61 6c 74  xtA         halt
11d10 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c  .**.** In the Al
11d20 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67  tB, AeqB, and Ag
11d30 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20  tB subroutines, 
11d40 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c  an EOF on A foll
11d50 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63  owing nextA.** c
11d60 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61  auses an immedia
11d70 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20  te jump to EofA 
11d80 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20  and an EOF on B 
11d90 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20  following nextB 
11da0 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d  causes.** an imm
11db0 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45  ediate jump to E
11dc0 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66  ofB.  Within Eof
11dd0 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20  A and EofB, and 
11de0 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a  EOF on entry or.
11df0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78  ** following nex
11e00 74 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70  tX causes a jump
11e10 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
11e20 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73  he select proces
11e30 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c  sing..**.** Dupl
11e40 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e  icate removal in
11e50 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45   the UNION, EXCE
11e60 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43  PT, and INTERSEC
11e70 54 20 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c  T cases is handl
11e80 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ed.** within the
11e90 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
11ea0 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72 65 76  ne.  The regPrev
11eb0 20 72 65 67 69 73 74 65 72 20 73 65 74 20 68 6f   register set ho
11ec0 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  lds the previous
11ed0 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c  ly.** output val
11ee0 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f  ue.  A compariso
11ef0 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73  n is made agains
11f00 74 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64  t this value and
11f10 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69   the output.** i
11f20 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
11f30 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f   next results wo
11f40 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20  uld be the same 
11f50 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e  as the previous.
11f60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  .**.** The imple
11f70 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69  mentation plan i
11f80 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  s to implement t
11f90 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65  he two coroutine
11fa0 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73  s and seven.** s
11fb0 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74  ubroutines first
11fc0 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65 20 63  , then put the c
11fd0 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20  ontrol logic at 
11fe0 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b  the bottom.  Lik
11ff0 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
12000 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74         goto Init
12010 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72  .**     coA: cor
12020 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20  outine for left 
12030 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20  query (A).**    
12040 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20   coB: coroutine 
12050 66 6f 72 20 72 69 67 68 74 20 71 75 65 72 79 20  for right query 
12060 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20  (B).**    outA: 
12070 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f  output one row o
12080 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20  f A.**    outB: 
12090 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f  output one row o
120a0 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55  f B (UNION and U
120b0 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a  NION ALL only).*
120c0 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a  *    EofA: ....*
120d0 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a  *    EofB: ....*
120e0 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a  *    AltB: ....*
120f0 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a  *    AeqB: ....*
12100 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a  *    AgtB: ....*
12110 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69  *    Init: initi
12120 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20  alize coroutine 
12130 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20  registers.**    
12140 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a        yield coA.
12150 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
12160 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a  of(A) goto EofA.
12170 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  **          yiel
12180 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20  d coB.**        
12190 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f    if eof(B) goto
121a0 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72   EofB.**    Cmpr
121b0 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a  : Compare A, B.*
121c0 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20  *          Jump 
121d0 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42  AltB, AeqB, AgtB
121e0 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e  .**     End: ...
121f0 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41  .**.** We call A
12200 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c  ltB, AeqB, AgtB,
12210 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20   EofA, and EofB 
12220 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75  "subroutines" bu
12230 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a  t they are not.*
12240 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65  * actually calle
12250 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e  d using Gosub an
12260 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65  d they do not Re
12270 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20  turn.  EofA and 
12280 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74  EofB loop.** unt
12290 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65  il all data is e
122a0 78 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75  xhausted then ju
122b0 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20  mp to the "end" 
122c0 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71  labe.  AltB, Aeq
122d0 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a  B,.** and AgtB j
122e0 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32  ump to either L2
122f0 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f   or to one of Eo
12300 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23  fA or EofB..*/.#
12310 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12320 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
12330 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  CT.static int mu
12340 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
12350 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
12360 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
12370 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
12380 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
12390 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
123a0 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
123b0 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
123c0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
123d0 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
123e0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
123f0 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
12400 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
12410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
12420 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
12430 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
12440 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
12450 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
12460 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
12470 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
12480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
12490 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
124a0 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53  this VDBE */.  S
124b0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 41 3b  electDest destA;
124c0 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74       /* Destinat
124d0 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e  ion for coroutin
124e0 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  e A */.  SelectD
124f0 65 73 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f  est destB;     /
12500 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
12510 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f  r coroutine B */
12520 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b  .  int regAddrA;
12530 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
12540 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
12550 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
12560 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
12570 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 20 2f  EofA;          /
12580 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61  * Flag to indica
12590 74 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 41  te when select-A
125a0 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a   is complete */.
125b0 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20    int regAddrB; 
125c0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
125d0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
125e0 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69  select-B corouti
125f0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45  ne */.  int regE
12600 6f 66 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ofB;          /*
12610 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74   Flag to indicat
12620 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 42 20  e when select-B 
12630 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20  is complete */. 
12640 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41   int addrSelectA
12650 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
12660 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
12670 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
12680 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42   int addrSelectB
12690 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
126a0 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
126b0 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
126c0 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20   int regOutA;   
126d0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
126e0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
126f0 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
12700 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
12710 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20  regOutB;        
12720 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
12730 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
12740 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  tput-B subroutin
12750 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
12760 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  utA;         /* 
12770 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
12780 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
12790 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
127a0 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a  OutB = 0;     /*
127b0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
127c0 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
127d0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
127e0 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f  rEofA;         /
127f0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
12800 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73   select-A-exhaus
12810 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ted subroutine *
12820 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42  /.  int addrEofB
12830 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
12840 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
12850 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73  ct-B-exhausted s
12860 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
12870 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20  nt addrAltB;    
12880 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
12890 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f  of the A<B subro
128a0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
128b0 64 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20  ddrAeqB;        
128c0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
128d0 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69  he A==B subrouti
128e0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
128f0 41 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AgtB;         /*
12900 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
12910 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A>B subroutine *
12920 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
12930 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  A;        /* Lim
12940 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
12950 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
12960 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20  t regLimitB;    
12970 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67      /* Limit reg
12980 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
12990 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  -A */.  int regP
129a0 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  rev;          /*
129b0 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69   A range of regi
129c0 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72  sters to hold pr
129d0 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f  evious output */
129e0 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69  .  int savedLimi
129f0 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65  t;       /* Save
12a00 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c  d value of p->iL
12a10 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  imit */.  int sa
12a20 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20  vedOffset;      
12a30 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
12a40 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a  f p->iOffset */.
12a50 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b    int labelCmpr;
12a60 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
12a70 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f   for the start o
12a80 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f  f the merge algo
12a90 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c  rithm */.  int l
12aa0 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20  abelEnd;        
12ab0 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
12ac0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65  e end of the ove
12ad0 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74  rall SELECT stmt
12ae0 20 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20   */.  int j1;   
12af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
12b00 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ump instructions
12b10 20 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67   that get retarg
12b20 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  etted */.  int o
12b30 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
12b40 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c   /* One of TK_AL
12b50 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  L, TK_UNION, TK_
12b60 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52  EXCEPT, TK_INTER
12b70 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  SECT */.  KeyInf
12b80 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20  o *pKeyDup = 0; 
12b90 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  /* Comparison in
12ba0 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75  formation for du
12bb0 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
12bc0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
12bd0 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f  eyMerge;   /* Co
12be0 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61  mparison informa
12bf0 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67  tion for merging
12c00 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74   rows */.  sqlit
12c10 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
12c20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
12c30 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
12c40 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
12c50 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
12c60 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
12c70 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  nt nOrderBy;    
12c80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12c90 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  f terms in the O
12ca0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
12cb0 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74  /.  int *aPermut
12cc0 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70  e;        /* Map
12cd0 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20  ping from ORDER 
12ce0 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75  BY terms to resu
12cf0 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a  lt set columns *
12d00 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
12d10 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
12d20 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20 20  int iSub1;      
12d30 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
12d40 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65  of left-hand que
12d50 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  ry */.  int iSub
12d60 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  2;            /*
12d70 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74   EQP id of right
12d80 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23  -hand query */.#
12d90 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
12da0 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20   p->pOrderBy!=0 
12db0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
12dc0 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d  yDup==0 ); /* "M
12dd0 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65  anaged" code nee
12de0 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74  ds this.  Ticket
12df0 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20   #3382. */.  db 
12e00 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
12e10 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
12e20 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
12e30 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c  0 );       /* Al
12e40 72 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65  ready thrown the
12e50 20 65 72 72 6f 72 20 69 66 20 56 44 42 45 20 61   error if VDBE a
12e60 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20  lloc failed */. 
12e70 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69   labelEnd = sqli
12e80 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
12e90 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72  (v);.  labelCmpr
12ea0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
12eb0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20  keLabel(v);...  
12ec0 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68 65 20  /* Patch up the 
12ed0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
12ee0 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f    */.  op = p->o
12ef0 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20  p;  .  pPrior = 
12f00 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73  p->pPrior;.  ass
12f10 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72  ert( pPrior->pOr
12f20 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f  derBy==0 );.  pO
12f30 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
12f40 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20  erBy;.  assert( 
12f50 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f  pOrderBy );.  nO
12f60 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
12f70 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20  y->nExpr;..  /* 
12f80 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74  For operators ot
12f90 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41  her than UNION A
12fa0 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61  LL we have to ma
12fb0 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a  ke sure that.  *
12fc0 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  * the ORDER BY c
12fd0 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65 76 65  lause covers eve
12fe0 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72  ry term of the r
12ff0 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a  esult set.  Add.
13000 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68    ** terms to th
13010 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
13020 65 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  e as necessary..
13030 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54    */.  if( op!=T
13040 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72  K_ALL ){.    for
13050 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63  (i=1; db->malloc
13060 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d  Failed==0 && i<=
13070 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
13080 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
13090 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
130a0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
130b0 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
130c0 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e  pOrderBy->a; j<n
130d0 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49  OrderBy; j++, pI
130e0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
130f0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69  assert( pItem->i
13100 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
13110 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
13120 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  m->iOrderByCol==
13130 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  i ) break;.     
13140 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
13150 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
13160 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
13170 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
13180 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b   TK_INTEGER, 0);
13190 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
131a0 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
131b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
131c0 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
131d0 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
131e0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
131f0 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20  iValue = i;.    
13200 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73      pOrderBy = s
13210 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
13220 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72  pend(pParse, pOr
13230 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20  derBy, pNew);.  
13240 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
13250 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 69 4f  a[nOrderBy++].iO
13260 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36  rderByCol = (u16
13270 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )i;.      }.    
13280 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  }.  }..  /* Comp
13290 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ute the comparis
132a0 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61  on permutation a
132b0 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20  nd keyinfo that 
132c0 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a  is used with.  *
132d0 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f  * the permutatio
132e0 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  n used to determ
132f0 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a  ine if the next.
13300 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75    ** row of resu
13310 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73  lts comes from s
13320 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74  electA or select
13330 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70  B.  Also add exp
13340 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  licit.  ** colla
13350 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44  tions to the ORD
13360 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
13370 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20  ms so that when 
13380 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20  the subqueries. 
13390 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74   ** to the right
133a0 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72   and the left ar
133b0 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65  e evaluated, the
133c0 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63  y use the correc
133d0 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e  t.  ** collation
133e0 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74  ..  */.  aPermut
133f0 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
13400 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
13410 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29  f(int)*nOrderBy)
13420 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65  ;.  if( aPermute
13430 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
13440 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
13450 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  tem;.    for(i=0
13460 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79  , pItem=pOrderBy
13470 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  ->a; i<nOrderBy;
13480 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
13490 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
134a0 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c  tem->iOrderByCol
134b0 3e 30 20 20 26 26 20 70 49 74 65 6d 2d 3e 69 4f  >0  && pItem->iO
134c0 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45  rderByCol<=p->pE
134d0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
134e0 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d       aPermute[i]
134f0 20 3d 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72   = pItem->iOrder
13500 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d  ByCol - 1;.    }
13510 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d  .    pKeyMerge =
13520 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
13530 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
13540 7a 65 6f 66 28 2a 70 4b 65 79 4d 65 72 67 65 29  zeof(*pKeyMerge)
13550 2b 6e 4f 72 64 65 72 42 79 2a 28 73 69 7a 65 6f  +nOrderBy*(sizeo
13560 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b  f(CollSeq*)+1));
13570 0a 20 20 20 20 69 66 28 20 70 4b 65 79 4d 65 72  .    if( pKeyMer
13580 67 65 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79  ge ){.      pKey
13590 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65  Merge->aSortOrde
135a0 72 20 3d 20 28 75 38 2a 29 26 70 4b 65 79 4d 65  r = (u8*)&pKeyMe
135b0 72 67 65 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65  rge->aColl[nOrde
135c0 72 42 79 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79  rBy];.      pKey
135d0 4d 65 72 67 65 2d 3e 6e 46 69 65 6c 64 20 3d 20  Merge->nField = 
135e0 28 75 31 36 29 6e 4f 72 64 65 72 42 79 3b 0a 20  (u16)nOrderBy;. 
135f0 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e       pKeyMerge->
13600 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
13610 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
13620 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
13630 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
13640 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pColl;.        
13650 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 4f  Expr *pTerm = pO
13660 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
13670 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
13680 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45  pTerm->flags & E
13690 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a  P_ExpCollate ){.
136a0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
136b0 3d 20 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c 3b 0a  = pTerm->pColl;.
136c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
136d0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
136e0 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
136f0 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 61  Seq(pParse, p, a
13700 50 65 72 6d 75 74 65 5b 69 5d 29 3b 0a 20 20 20  Permute[i]);.   
13710 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c         pTerm->fl
13720 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c  ags |= EP_ExpCol
13730 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20  late;.          
13740 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c 20 3d 20 70  pTerm->pColl = p
13750 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Coll;.        }.
13760 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67          pKeyMerg
13770 65 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43  e->aColl[i] = pC
13780 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4b 65  oll;.        pKe
13790 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64  yMerge->aSortOrd
137a0 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79  er[i] = pOrderBy
137b0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
137c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
137d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65    }else{.    pKe
137e0 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  yMerge = 0;.  }.
137f0 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74  .  /* Reattach t
13800 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
13810 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e  se to the query.
13820 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  .  */.  p->pOrde
13830 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
13840 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72    pPrior->pOrder
13850 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
13860 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e  ListDup(pParse->
13870 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29  db, pOrderBy, 0)
13880 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
13890 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70   a range of temp
138a0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20  orary registers 
138b0 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  and the KeyInfo 
138c0 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20  needed.  ** for 
138d0 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72  the logic that r
138e0 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65  emoves duplicate
138f0 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65   result rows whe
13900 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61  n the.  ** opera
13910 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58  tor is UNION, EX
13920 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45  CEPT, or INTERSE
13930 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f  CT (but not UNIO
13940 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69  N ALL)..  */.  i
13950 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op==TK_ALL ){
13960 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30  .    regPrev = 0
13970 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
13980 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45  nt nExpr = p->pE
13990 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
139a0 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42   assert( nOrderB
139b0 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  y>=nExpr || db->
139c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
139d0 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 73 71      regPrev = sq
139e0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
139f0 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b  e(pParse, nExpr+
13a00 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
13a10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13a20 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50  Integer, 0, regP
13a30 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75  rev);.    pKeyDu
13a40 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
13a50 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20  locZero(db,.    
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
13a70 7a 65 6f 66 28 2a 70 4b 65 79 44 75 70 29 20 2b  zeof(*pKeyDup) +
13a80 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43   nExpr*(sizeof(C
13a90 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20  ollSeq*)+1) );. 
13aa0 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29     if( pKeyDup )
13ab0 7b 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d  {.      pKeyDup-
13ac0 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
13ad0 38 2a 29 26 70 4b 65 79 44 75 70 2d 3e 61 43 6f  8*)&pKeyDup->aCo
13ae0 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 20  ll[nExpr];.     
13af0 20 70 4b 65 79 44 75 70 2d 3e 6e 46 69 65 6c 64   pKeyDup->nField
13b00 20 3d 20 28 75 31 36 29 6e 45 78 70 72 3b 0a 20   = (u16)nExpr;. 
13b10 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 65 6e       pKeyDup->en
13b20 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
13b30 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
13b40 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
13b50 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c     pKeyDup->aCol
13b60 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65  l[i] = multiSele
13b70 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
13b80 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  , p, i);.       
13b90 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f   pKeyDup->aSortO
13ba0 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  rder[i] = 0;.   
13bb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
13bc0 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74  .  /* Separate t
13bd0 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20  he left and the 
13be0 72 69 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d  right query from
13bf0 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a   one another.  *
13c00 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  /.  p->pPrior = 
13c10 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f  0;.  sqlite3Reso
13c20 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
13c30 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f  pParse, p, p->pO
13c40 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29  rderBy, "ORDER")
13c50 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
13c60 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
13c70 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f   sqlite3ResolveO
13c80 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72  rderGroupBy(pPar
13c90 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69  se, pPrior, pPri
13ca0 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f  or->pOrderBy, "O
13cb0 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  RDER");.  }..  /
13cc0 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69  * Compute the li
13cd0 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f  mit registers */
13ce0 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
13cf0 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
13d00 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20   p, labelEnd);. 
13d10 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26   if( p->iLimit &
13d20 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  & op==TK_ALL ){.
13d30 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20      regLimitA = 
13d40 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
13d50 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20      regLimitB = 
13d60 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
13d70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13d80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
13d90 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70  , p->iOffset ? p
13da0 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d  ->iOffset+1 : p-
13db0 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20  >iLimit,.       
13dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13dd0 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69             regLi
13de0 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  mitA);.    sqlit
13df0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13e00 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69  OP_Copy, regLimi
13e10 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a  tA, regLimitB);.
13e20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67    }else{.    reg
13e30 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69  LimitA = regLimi
13e40 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  tB = 0;.  }.  sq
13e50 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
13e60 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
13e70 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
13e80 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
13e90 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66  lete(db, p->pOff
13ea0 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73  set);.  p->pOffs
13eb0 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64  et = 0;..  regAd
13ec0 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  drA = ++pParse->
13ed0 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 41 20  nMem;.  regEofA 
13ee0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
13ef0 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b  ;.  regAddrB = +
13f00 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
13f10 20 72 65 67 45 6f 66 42 20 3d 20 2b 2b 70 50 61   regEofB = ++pPa
13f20 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
13f30 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutA = ++pParse-
13f40 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42  >nMem;.  regOutB
13f50 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
13f60 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  m;.  sqlite3Sele
13f70 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
13f80 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  A, SRT_Coroutine
13f90 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73  , regAddrA);.  s
13fa0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
13fb0 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54  Init(&destB, SRT
13fc0 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
13fd0 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  ddrB);..  /* Jum
13fe0 70 20 70 61 73 74 20 74 68 65 20 76 61 72 69 6f  p past the vario
13ff0 75 73 20 73 75 62 72 6f 75 74 69 6e 65 73 20 61  us subroutines a
14000 6e 64 20 63 6f 72 6f 75 74 69 6e 65 73 20 74 6f  nd coroutines to
14010 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d   the main.  ** m
14020 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20  erge loop.  */. 
14030 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
14040 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
14050 74 6f 29 3b 0a 20 20 61 64 64 72 53 65 6c 65 63  to);.  addrSelec
14060 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tA = sqlite3Vdbe
14070 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
14080 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
14090 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
140a0 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
140b0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
140c0 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66  the.  ** left of
140d0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70   the compound op
140e0 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22  erator - the "A"
140f0 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
14100 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
14110 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75  (v, "Begin corou
14120 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45  tine for left SE
14130 4c 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f  LECT"));.  pPrio
14140 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c  r->iLimit = regL
14150 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e  imitA;.  explain
14160 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
14170 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
14180 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69  electId);.  sqli
14190 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
141a0 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41  , pPrior, &destA
141b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
141c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
141d0 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 41  eger, 1, regEofA
141e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
141f0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
14200 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ld, regAddrA);. 
14210 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
14220 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74  ((v, "End corout
14230 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c  ine for left SEL
14240 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65  ECT"));..  /* Ge
14250 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69  nerate a corouti
14260 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  ne to evaluate t
14270 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
14280 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65  ent on .  ** the
14290 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42 22   right - the "B"
142a0 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61   select.  */.  a
142b0 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c  ddrSelectB = sql
142c0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
142d0 64 64 72 28 76 29 3b 0a 20 20 56 64 62 65 4e 6f  ddr(v);.  VdbeNo
142e0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42  opComment((v, "B
142f0 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66  egin coroutine f
14300 6f 72 20 72 69 67 68 74 20 53 45 4c 45 43 54 22  or right SELECT"
14310 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74  ));.  savedLimit
14320 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
14330 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d  savedOffset = p-
14340 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69  >iOffset;.  p->i
14350 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74  Limit = regLimit
14360 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20  B;.  p->iOffset 
14370 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e  = 0;  .  explain
14380 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
14390 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
143a0 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69  electId);.  sqli
143b0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
143c0 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20  , p, &destB);.  
143d0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65  p->iLimit = save
143e0 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66  dLimit;.  p->iOf
143f0 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73  fset = savedOffs
14400 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  et;.  sqlite3Vdb
14410 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
14420 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66  teger, 1, regEof
14430 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  B);.  sqlite3Vdb
14440 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
14450 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  eld, regAddrB);.
14460 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
14470 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75  t((v, "End corou
14480 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53  tine for right S
14490 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20  ELECT"));..  /* 
144a0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
144b0 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
144c0 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
144d0 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a  ow of the A.  **
144e0 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
144f0 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
14500 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
14510 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64  elect..  */.  Vd
14520 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
14530 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e  , "Output routin
14540 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64  e for A"));.  ad
14550 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74  drOutA = generat
14560 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
14570 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
14580 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
14590 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67  estA, pDest, reg
145a0 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20  OutA,.          
145b0 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
145c0 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49  pKeyDup, P4_KEYI
145d0 4e 46 4f 5f 48 41 4e 44 4f 46 46 2c 20 6c 61 62  NFO_HANDOFF, lab
145e0 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20  elEnd);.  .  /* 
145f0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
14600 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
14610 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
14620 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a  ow of the B.  **
14630 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
14640 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
14650 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
14660 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elect..  */.  if
14670 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
14680 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
14690 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
146a0 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
146b0 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29  routine for B"))
146c0 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d  ;.    addrOutB =
146d0 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
146e0 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
146f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14700 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44     p, &destB, pD
14710 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20  est, regOutB,.  
14720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
14730 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
14740 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54   P4_KEYINFO_STAT
14750 49 43 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  IC, labelEnd);. 
14760 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
14770 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
14780 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
14790 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
147a0 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct A.  ** are ex
147b0 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
147c0 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
147d0 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  B remains..  */.
147e0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
147f0 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62  t((v, "eof-A sub
14800 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 69 66  routine"));.  if
14810 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ( op==TK_EXCEPT 
14820 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  || op==TK_INTERS
14830 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45  ECT ){.    addrE
14840 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofA = sqlite3Vdb
14850 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
14860 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 45 6e 64 29  to, 0, labelEnd)
14870 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
14880 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69   addrEofA = sqli
14890 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
148a0 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c   OP_If, regEofB,
148b0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20   labelEnd);.    
148c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
148d0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
148e0 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
148f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14900 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
14910 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b  ield, regAddrB);
14920 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14930 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
14940 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b  o, 0, addrEofA);
14950 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  .    p->nSelectR
14960 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  ow += pPrior->nS
14970 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20  electRow;.  }.. 
14980 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
14990 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e  ubroutine to run
149a0 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
149b0 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a  s from select B.
149c0 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74    ** are exhaust
149d0 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61  ed and only data
149e0 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d   in select A rem
149f0 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ains..  */.  if(
14a00 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
14a10 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
14a20 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20  B = addrEofA;.  
14a30 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74    if( p->nSelect
14a40 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53  Row > pPrior->nS
14a50 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53  electRow ) p->nS
14a60 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f  electRow = pPrio
14a70 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
14a80 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64   }else{  .    Vd
14a90 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
14aa0 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74  , "eof-B subrout
14ab0 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ine"));.    addr
14ac0 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64  EofB = sqlite3Vd
14ad0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
14ae0 66 2c 20 72 65 67 45 6f 66 41 2c 20 6c 61 62 65  f, regEofA, labe
14af0 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  lEnd);.    sqlit
14b00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14b10 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
14b20 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20  A, addrOutA);.  
14b30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14b40 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
14b50 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20   regAddrA);.    
14b60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14b70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
14b80 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a   addrEofB);.  }.
14b90 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
14ba0 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
14bb0 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20  e case of A<B.  
14bc0 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
14bd0 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42  ment((v, "A-lt-B
14be0 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
14bf0 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c    addrAltB = sql
14c00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14c10 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
14c20 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a  utA, addrOutA);.
14c30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14c40 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
14c50 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
14c60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14c70 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
14c80 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  A, addrEofA);.  
14c90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14ca0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
14cb0 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20   labelCmpr);..  
14cc0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
14cd0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
14ce0 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f  ase of A==B.  */
14cf0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
14d00 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  L ){.    addrAeq
14d10 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
14d20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
14d30 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
14d40 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64    addrAeqB = add
14d50 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41  rAltB;.    addrA
14d60 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ltB++;.  }else{.
14d70 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
14d80 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20  ent((v, "A-eq-B 
14d90 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
14da0 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20     addrAeqB =.  
14db0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14dc0 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
14dd0 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20   regAddrA);.    
14de0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14df0 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
14e00 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  ofA, addrEofA);.
14e10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14e20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
14e30 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  , 0, labelCmpr);
14e40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
14e50 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
14e60 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
14e70 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  >B.  */.  VdbeNo
14e80 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
14e90 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -gt-B subroutine
14ea0 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20  "));.  addrAgtB 
14eb0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
14ec0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
14ed0 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  f( op==TK_ALL ||
14ee0 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b   op==TK_UNION ){
14ef0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14f00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
14f10 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
14f20 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71  rOutB);.  }.  sq
14f30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
14f40 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
14f50 41 64 64 72 42 29 3b 0a 20 20 73 71 6c 69 74 65  AddrB);.  sqlite
14f60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14f70 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61  P_If, regEofB, a
14f80 64 64 72 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69  ddrEofB);.  sqli
14f90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14fa0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
14fb0 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54  elCmpr);..  /* T
14fc0 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e  his code runs on
14fd0 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ce to initialize
14fe0 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a   everything..  *
14ff0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
15000 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
15010 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15020 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
15030 72 2c 20 30 2c 20 72 65 67 45 6f 66 41 29 3b 0a  r, 0, regEofA);.
15040 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15050 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
15060 72 2c 20 30 2c 20 72 65 67 45 6f 66 42 29 3b 0a  r, 0, regEofB);.
15070 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15080 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
15090 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 53   regAddrA, addrS
150a0 65 6c 65 63 74 41 29 3b 0a 20 20 73 71 6c 69 74  electA);.  sqlit
150b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
150c0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64  OP_Gosub, regAdd
150d0 72 42 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29  rB, addrSelectB)
150e0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
150f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
15100 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66  regEofA, addrEof
15110 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
15120 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
15130 2c 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45  , regEofB, addrE
15140 6f 66 42 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c  ofB);..  /* Impl
15150 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d  ement the main m
15160 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20  erge loop.  */. 
15170 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
15180 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
15190 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  lCmpr);.  sqlite
151a0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
151b0 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30  P_Permutation, 0
151c0 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61  , 0, 0, (char*)a
151d0 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41  Permute, P4_INTA
151e0 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33  RRAY);.  sqlite3
151f0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
15200 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e  _Compare, destA.
15210 69 4d 65 6d 2c 20 64 65 73 74 42 2e 69 4d 65 6d  iMem, destB.iMem
15220 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  , nOrderBy,.    
15230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15240 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
15250 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46  Merge, P4_KEYINF
15260 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 73 71  O_HANDOFF);.  sq
15270 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15280 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
15290 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20  AltB, addrAeqB, 
152a0 61 64 64 72 41 67 74 42 29 3b 0a 0a 20 20 2f 2a  addrAgtB);..  /*
152b0 20 52 65 6c 65 61 73 65 20 74 65 6d 70 6f 72 61   Release tempora
152c0 72 79 20 72 65 67 69 73 74 65 72 73 0a 20 20 2a  ry registers.  *
152d0 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20  /.  if( regPrev 
152e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
152f0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
15300 50 61 72 73 65 2c 20 72 65 67 50 72 65 76 2c 20  Parse, regPrev, 
15310 6e 4f 72 64 65 72 42 79 2b 31 29 3b 0a 20 20 7d  nOrderBy+1);.  }
15320 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
15330 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  he this point in
15340 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e   order to termin
15350 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20  ate the query.. 
15360 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
15370 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
15380 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f   labelEnd);..  /
15390 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
153a0 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d   of output colum
153b0 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  ns.  */.  if( pD
153c0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
153d0 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 53 65  Output ){.    Se
153e0 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
153f0 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65  Prior;.    while
15400 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
15410 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
15420 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
15430 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
15440 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
15450 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
15460 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65    }..  /* Reasse
15470 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e  mbly the compoun
15480 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74 20  d query so that 
15490 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  it will be freed
154a0 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20   correctly.  ** 
154b0 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
154c0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28  unction */.  if(
154d0 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
154e0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
154f0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72  elete(db, p->pPr
15500 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  ior);.  }.  p->p
15510 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
15520 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e  .  /*** TBD:  In
15530 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20  sert subroutine 
15540 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63  calls to close c
15550 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70  ursors on incomp
15560 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71  lete.  **** subq
15570 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65  ueries ****/.  e
15580 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
15590 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69  pParse, p->op, i
155a0 53 75 62 31 2c 20 69 53 75 62 32 2c 20 30 29 3b  Sub1, iSub2, 0);
155b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
155c0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
155d0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
155e0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
155f0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
15600 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
15610 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61  /* Forward Decla
15620 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  rations */.stati
15630 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
15640 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45  List(sqlite3*, E
15650 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45  xprList*, int, E
15660 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69  xprList*);.stati
15670 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65  c void substSele
15680 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c  ct(sqlite3*, Sel
15690 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72  ect *, int, Expr
156a0 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  List *);../*.** 
156b0 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  Scan through the
156c0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
156d0 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72  r.  Replace ever
156e0 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a  y reference to.*
156f0 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  * a column in ta
15700 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c  ble number iTabl
15710 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  e with a copy of
15720 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a   the iColumn-th.
15730 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69  ** entry in pELi
15740 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20  st.  (But leave 
15750 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
15760 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a  e ROWID column .
15770 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a  ** unchanged.).*
15780 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15790 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
157a0 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63   flattening proc
157b0 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65  edure.  A subque
157c0 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75  ry.** whose resu
157d0 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65  lt set is define
157e0 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65  d by pEList appe
157f0 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20  ars as entry in 
15800 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  the.** FROM clau
15810 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
15820 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42  uch that the VDB
15830 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65  E cursor assigne
15840 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52  d to that.** FOR
15850 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69  M clause entry i
15860 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20  s iTable.  This 
15870 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65  routine make the
15880 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63   necessary .** c
15890 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20  hanges to pExpr 
158a0 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72  so that it refer
158b0 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  s directly to th
158c0 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a  e source table.*
158d0 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
158e0 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73  y rather the res
158f0 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73  ult set of the s
15900 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  ubquery..*/.stat
15910 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45 78  ic Expr *substEx
15920 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr(.  sqlite3 *d
15930 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  b,        /* Rep
15940 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
15950 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63  s to this connec
15960 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tion */.  Expr *
15970 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a  pExpr,        /*
15980 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73   Expr in which s
15990 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75  ubstitution occu
159a0 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  rs */.  int iTab
159b0 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  le,         /* T
159c0 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74  able to be subst
159d0 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  ituted */.  Expr
159e0 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
159f0 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 65 78  /* Substitute ex
15a00 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  pressions */.){.
15a10 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
15a20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
15a30 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
15a40 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e  OLUMN && pExpr->
15a50 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29  iTable==iTable )
15a60 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
15a70 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
15a80 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
15a90 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TK_NULL;.    }el
15aa0 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
15ab0 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65  pNew;.      asse
15ac0 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26  rt( pEList!=0 &&
15ad0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
15ae0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
15af0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15b00 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26  Expr->pLeft==0 &
15b10 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  & pExpr->pRight=
15b20 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
15b30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
15b40 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  p(db, pEList->a[
15b50 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
15b60 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
15b70 20 69 66 28 20 70 4e 65 77 20 26 26 20 70 45 78   if( pNew && pEx
15b80 70 72 2d 3e 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  pr->pColl ){.   
15b90 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c       pNew->pColl
15ba0 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b   = pExpr->pColl;
15bb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
15bc0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
15bd0 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  (db, pExpr);.   
15be0 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b     pExpr = pNew;
15bf0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
15c00 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
15c10 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
15c20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69   pExpr->pLeft, i
15c30 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
15c40 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
15c50 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  t = substExpr(db
15c60 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
15c70 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
15c80 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
15c90 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
15ca0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
15cb0 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  {.      substSel
15cc0 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78  ect(db, pExpr->x
15cd0 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65  .pSelect, iTable
15ce0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  , pEList);.    }
15cf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73  else{.      subs
15d00 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45  tExprList(db, pE
15d10 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54  xpr->x.pList, iT
15d20 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
15d30 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
15d40 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69  n pExpr;.}.stati
15d50 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
15d60 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20  List(.  sqlite3 
15d70 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
15d80 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
15d90 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45  rors here */.  E
15da0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
15db0 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
15dc0 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
15dd0 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
15de0 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  utes */.  int iT
15df0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
15e00 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
15e10 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
15e20 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
15e30 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
15e40 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
15e50 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
15e60 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
15e70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
15e80 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
15e90 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69  {.    pList->a[i
15ea0 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45  ].pExpr = substE
15eb0 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  xpr(db, pList->a
15ec0 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
15ed0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
15ee0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
15ef0 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c  bstSelect(.  sql
15f00 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
15f10 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
15f20 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
15f30 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
15f40 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
15f50 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
15f60 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
15f70 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20  bstitutions */. 
15f80 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
15f90 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
15fa0 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f  o be replaced */
15fb0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
15fc0 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74  ist     /* Subst
15fd0 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a  itute values */.
15fe0 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
15ff0 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  rc;.  struct Src
16000 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
16010 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
16020 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
16030 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
16040 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61  , p->pEList, iTa
16050 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
16060 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
16070 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  , p->pGroupBy, i
16080 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
16090 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
160a0 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
160b0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
160c0 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d  ;.  p->pHaving =
160d0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
160e0 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c  ->pHaving, iTabl
160f0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d  e, pEList);.  p-
16100 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45  >pWhere = substE
16110 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  xpr(db, p->pWher
16120 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  e, iTable, pELis
16130 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63  t);.  substSelec
16140 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  t(db, p->pPrior,
16150 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
16160 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
16170 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
16180 72 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66  rc );  /* Even f
16190 6f 72 20 28 53 45 4c 45 43 54 20 31 29 20 77 65  or (SELECT 1) we
161a0 20 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62   have: pSrc!=0 b
161b0 75 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  ut pSrc->nSrc==0
161c0 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53   */.  if( ALWAYS
161d0 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f  (pSrc) ){.    fo
161e0 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20  r(i=pSrc->nSrc, 
161f0 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69  pItem=pSrc->a; i
16200 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
16210 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
16220 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lect(db, pItem->
16230 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c  pSelect, iTable,
16240 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a   pEList);.    }.
16250 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
16260 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
16270 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
16280 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
16290 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
162a0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
162b0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
162c0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
162d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
162e0 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  )./*.** This rou
162f0 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
16300 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72   flatten subquer
16310 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ies in order to 
16320 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69  speed.** executi
16330 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20  on.  It returns 
16340 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68  1 if it makes ch
16350 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e  anges and 0 if n
16360 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20  o flattening.** 
16370 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  occurs..**.** To
16380 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
16390 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74  concept of flatt
163a0 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20  ening, consider 
163b0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
163c0 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
163d0 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
163e0 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61  (SELECT x+y AS a
163f0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
16400 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a  <100) WHERE a>5.
16410 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
16420 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65  t way of impleme
16430 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79  nting this query
16440 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74   is to execute t
16450 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66  he.** subquery f
16460 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74  irst and store t
16470 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  he results in a 
16480 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
16490 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65   then.** run the
164a0 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20   outer query on 
164b0 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74  that temporary t
164c0 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75  able.  This requ
164d0 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73  ires two.** pass
164e0 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61  es over the data
164f0 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  .  Furthermore, 
16500 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70  because the temp
16510 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68  orary table.** h
16520 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74  as no indices, t
16530 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
16540 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  on the outer que
16550 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ry cannot be.** 
16560 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a  optimized..**.**
16570 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
16580 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74  tempts to rewrit
16590 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61  e queries such a
165a0 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f  s the above into
165b0 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  .** a single fla
165c0 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74  t select, like t
165d0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  his:.**.**     S
165e0 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
165f0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
16600 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a  00 AND a>5.**.**
16610 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
16620 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d  ted for this sim
16630 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73  pification gives
16640 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
16650 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73  .** but only has
16660 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74   to scan the dat
16670 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63  a once.  And bec
16680 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67  ause indices mig
16690 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20  ht .** exist on 
166a0 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20  the table t1, a 
166b0 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66  complete scan of
166c0 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   the data might 
166d0 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a  be.** avoided..*
166e0 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20  *.** Flattening 
166f0 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  is only attempte
16700 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  d if all of the 
16710 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
16720 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  ue:.**.**   (1) 
16730 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
16740 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
16750 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
16760 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  e aggregates..**
16770 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73  .**   (2)  The s
16780 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
16790 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74  n aggregate or t
167a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
167b0 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
167c0 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73  .**   (3)  The s
167d0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
167e0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
167f0 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
16800 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20   join.**        
16810 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b  (Originally tick
16820 65 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e 67  et #306.  Streng
16830 74 68 65 6e 65 64 20 62 79 20 74 69 63 6b 65 74  thened by ticket
16840 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20   #3300).**.**   
16850 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
16860 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
16870 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  T..**.**  (**)  
16880 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73  At one point res
16890 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e  trictions (4) an
168a0 64 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20  d (5) defined a 
168b0 73 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e  subset of DISTIN
168c0 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  CT.**        sub
168d0 2d 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65  -queries that we
168e0 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d  re excluded from
168f0 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
16900 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20  on. Restriction 
16910 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68  .**        (4) h
16920 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78  as since been ex
16930 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64  panded to exclud
16940 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73  e all DISTINCT s
16950 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a  ubqueries..**.**
16960 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71     (6)  The subq
16970 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
16980 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
16990 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
169a0 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
169b0 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
169c0 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
169d0 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20  uery has a FROM 
169e0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
169f0 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (8)  The subquer
16a00 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
16a10 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
16a20 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
16a30 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
16a40 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  9)  The subquery
16a50 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
16a60 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
16a70 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
16a80 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
16a90 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
16aa0 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75   (10)  The subqu
16ab0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
16ac0 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
16ad0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
16ae0 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  oes not.**      
16af0 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a    use LIMIT..**.
16b00 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75  **  (11)  The su
16b10 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
16b20 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
16b30 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45  t both have ORDE
16b40 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  R BY clauses..**
16b50 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69  .**  (**)  Not i
16b60 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62  mplemented.  Sub
16b70 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72  sumed into restr
16b80 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73  iction (3).  Was
16b90 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20   previously.**  
16ba0 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74 65        a separate
16bb0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72   restriction der
16bc0 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65  iving from ticke
16bd0 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28  t #350..**.**  (
16be0 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  13)  The subquer
16bf0 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72  y and outer quer
16c00 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
16c10 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20  e LIMIT..**.**  
16c20 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65  (14)  The subque
16c30 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
16c40 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28  OFFSET..**.**  (
16c50 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71  15)  The outer q
16c60 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74  uery is not part
16c70 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
16c80 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20  elect or the.** 
16c90 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20         subquery 
16ca0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20  does not have a 
16cb0 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a  LIMIT clause..**
16cc0 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63          (See tic
16cd0 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69  ket #2339 and ti
16ce0 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34  cket [02a8e81d44
16cf0 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20  ])..**.**  (16) 
16d00 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
16d10 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
16d20 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62 71  gate or the subq
16d30 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20  uery does.**    
16d40 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20      not contain 
16d50 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b  ORDER BY.  (Tick
16d60 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20  et #2942)  This 
16d70 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74  used to not matt
16d80 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74  er.**        unt
16d90 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64  il we introduced
16da0 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61   the group_conca
16db0 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a  t() function.  .
16dc0 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65  **.**  (17)  The
16dd0 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f   sub-query is no
16de0 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  t a compound sel
16df0 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20  ect, or it is a 
16e00 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20  UNION ALL .**   
16e10 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c       compound cl
16e20 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74  ause made up ent
16e30 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67  irely of non-agg
16e40 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c 20  regate queries, 
16e50 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74  and .**        t
16e60 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a  he parent query:
16e70 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
16e80 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20  * is not itself 
16e90 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
16ea0 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20  nd select,.**   
16eb0 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
16ec0 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
16ed0 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20  DISTINCT query, 
16ee0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
16ef0 2a 20 68 61 73 20 6e 6f 20 6f 74 68 65 72 20 74  * has no other t
16f00 61 62 6c 65 73 20 6f 72 20 73 75 62 2d 73 65 6c  ables or sub-sel
16f10 65 63 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ects in the FROM
16f20 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
16f30 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e 74        The parent
16f40 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20 6d   and sub-query m
16f50 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45  ay contain WHERE
16f60 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65 63   clauses. Subjec
16f70 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72  t to.**        r
16f80 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29 20  ules (11), (13) 
16f90 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20 6d  and (14), they m
16fa0 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20  ay also contain 
16fb0 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20  ORDER BY,.**    
16fc0 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46      LIMIT and OF
16fd0 46 53 45 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  FSET clauses..**
16fe0 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74 68  .**  (18)  If th
16ff0 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
17000 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
17010 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73  , then all terms
17020 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   of the.**      
17030 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73    ORDER by claus
17040 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  e of the parent 
17050 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72  must be simple r
17060 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a  eferences to .**
17070 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20          columns 
17080 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
17090 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54  ..**.**  (19)  T
170a0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
170b0 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
170c0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
170d0 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20  y does not.**   
170e0 20 20 20 20 20 68 61 76 65 20 61 20 57 48 45 52       have a WHER
170f0 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  E clause..**.** 
17100 20 28 32 30 29 20 20 49 66 20 74 68 65 20 73 75   (20)  If the su
17110 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
17120 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68  pound select, th
17130 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75  en it must not u
17140 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20  se.**        an 
17150 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
17160 20 20 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20    Ticket #3773. 
17170 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20   We could relax 
17180 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a  this constraint.
17190 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68  **        somewh
171a0 61 74 20 62 79 20 73 61 79 69 6e 67 20 74 68 61  at by saying tha
171b0 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  t the terms of t
171c0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
171d0 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20  se must.**      
171e0 20 20 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f    appear as unmo
171f0 64 69 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f  dified result co
17200 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74  lumns in the out
17210 65 72 20 71 75 65 72 79 2e 20 20 42 75 74 0a 2a  er query.  But.*
17220 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 6f 74  *        have ot
17230 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  her optimization
17240 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61  s in mind to dea
17250 6c 20 77 69 74 68 20 74 68 61 74 20 63 61 73 65  l with that case
17260 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54  ..**.**  (21)  T
17270 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
17280 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
17290 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
172a0 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  y is not.**     
172b0 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53     DISTINCT.  (S
172c0 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31  ee ticket [752e1
172d0 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 49  646fc])..**.** I
172e0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  n this routine, 
172f0 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  the "p" paramete
17300 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
17310 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
17320 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65  y..** The subque
17330 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61  ry is p->pSrc->a
17340 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20  [iFrom].  isAgg 
17350 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
17360 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73  uter query.** us
17370 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e  es aggregates an
17380 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  d subqueryIsAgg 
17390 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73  is true if the s
173a0 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
173b0 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  regates..**.** I
173c0 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
173d0 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74  not attempted, t
173e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
173f0 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72   no-op and retur
17400 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74  ns 0..** If flat
17410 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70  tening is attemp
17420 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ted this routine
17430 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a   returns 1..**.*
17440 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70  * All of the exp
17450 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
17460 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62   must occur on b
17470 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75  oth the outer qu
17480 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ery and.** the s
17490 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74  ubquery before t
174a0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
174b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
174c0 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
174d0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
174e0 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
174f0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
17500 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
17510 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65       /* The pare
17520 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45  nt or outer SELE
17530 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
17540 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20    int iFrom,    
17550 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
17560 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20  in p->pSrc->a[] 
17570 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62  of the inner sub
17580 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
17590 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20  sAgg,           
175a0 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72  /* True if outer
175b0 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67   SELECT uses agg
175c0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
175d0 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65   */.  int subque
175e0 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72  ryIsAgg    /* Tr
175f0 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
17600 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
17610 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
17620 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
17630 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
17640 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
17650 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65  hContext;.  Sele
17660 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53  ct *pParent;.  S
17670 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20  elect *pSub;    
17680 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20     /* The inner 
17690 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65  query or "subque
176a0 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ry" */.  Select 
176b0 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20  *pSub1;      /* 
176c0 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  Pointer to the r
176d0 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20  ightmost select 
176e0 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a  in sub-query */.
176f0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
17700 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
17710 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
17720 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
17730 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72   SrcList *pSubSr
17740 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
17750 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
17760 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70  ubquery */.  Exp
17770 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
17780 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
17790 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  et of the outer 
177a0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
177b0 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f  Parent;        /
177c0 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  * VDBE cursor nu
177d0 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62  mber of the pSub
177e0 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70   result set temp
177f0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
17800 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
17810 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
17820 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
17830 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
17840 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
17850 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
17860 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
17870 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20  em *pSubitem;   
17880 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
17890 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
178a0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
178b0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
178c0 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  e if flattening 
178d0 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52  is permitted.  R
178e0 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a  eturn 0 if not..
178f0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
17900 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
17910 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
17920 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66    /* Unable to f
17930 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20  latten compound 
17940 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 66 28  queries */.  if(
17950 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
17960 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e  ITE_QueryFlatten
17970 65 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  er ) return 0;. 
17980 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
17990 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
179a0 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69  && iFrom>=0 && i
179b0 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20  From<pSrc->nSrc 
179c0 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20  );.  pSubitem = 
179d0 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b  &pSrc->a[iFrom];
179e0 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75  .  iParent = pSu
179f0 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bitem->iCursor;.
17a00 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65    pSub = pSubite
17a10 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73  m->pSelect;.  as
17a20 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b  sert( pSub!=0 );
17a30 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20  .  if( isAgg && 
17a40 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20  subqueryIsAgg ) 
17a50 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
17a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
17a70 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f  triction (1)  */
17a80 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49  .  if( subqueryI
17a90 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53  sAgg && pSrc->nS
17aa0 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  rc>1 ) return 0;
17ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
17ac0 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f  triction (2)  */
17ad0 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75  .  pSubSrc = pSu
17ae0 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  b->pSrc;.  asser
17af0 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20  t( pSubSrc );.  
17b00 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73  /* Prior to vers
17b10 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20  ion 3.1.2, when 
17b20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
17b30 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c   had to be simpl
17b40 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a  e constants,.  *
17b50 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20  * not arbitrary 
17b60 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77 65  expresssions, we
17b70 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f   allowed some co
17b80 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54  mbining of LIMIT
17b90 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
17ba0 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f   because they co
17bb0 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
17bc0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
17bd0 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54    But when LIMIT
17be0 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
17bf0 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72   became arbitrar
17c00 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
17c10 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f  e were forced to
17c20 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e   add restriction
17c30 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20  s (13).  ** and 
17c40 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70  (14). */.  if( p
17c50 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
17c60 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
17c70 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
17c80 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
17c90 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70   (13) */.  if( p
17ca0 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72  Sub->pOffset ) r
17cb0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
17cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cd0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
17ce0 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 70   (14) */.  if( p
17cf0 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26 20  ->pRightmost && 
17d00 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  pSub->pLimit ){.
17d10 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
17d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d40 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
17d50 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a  riction (15) */.
17d60 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72    }.  if( pSubSr
17d70 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74  c->nSrc==0 ) ret
17d80 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
17d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17da0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20  Restriction (7) 
17db0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
17dc0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
17dd0 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
17de0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
17df0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20  Restriction (5) 
17e00 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
17e10 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d  pLimit && (pSrc-
17e20 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67  >nSrc>1 || isAgg
17e30 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  ) ){.     return
17e40 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
17e50 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28  estrictions (8)(
17e60 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  9) */.  }.  if( 
17e70 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
17e80 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 26  F_Distinct)!=0 &
17e90 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
17ea0 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
17eb0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
17ec0 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f  triction (6)  */
17ed0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f  .  }.  if( p->pO
17ee0 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e  rderBy && pSub->
17ef0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
17f00 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
17f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f30 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
17f40 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a  ion (11) */.  }.
17f50 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 70    if( isAgg && p
17f60 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20  Sub->pOrderBy ) 
17f70 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
17f80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
17f90 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a  riction (16) */.
17fa0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
17fb0 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20  it && p->pWhere 
17fc0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
17fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
17fe0 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a  riction (19) */.
17ff0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
18000 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61  it && (p->selFla
18010 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
18020 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74  )!=0 ){.     ret
18030 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f  urn 0;         /
18040 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
18050 31 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  1) */.  }..  /* 
18060 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54  OBSOLETE COMMENT
18070 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63   1:.  ** Restric
18080 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20  tion 3:  If the 
18090 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f  subquery is a jo
180a0 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
180b0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20  e subquery is . 
180c0 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20   ** not used as 
180d0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
180e0 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f  d of an outer jo
180f0 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66  in.  Examples of
18100 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69   why this.  ** i
18110 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
18120 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
18130 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
18140 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29  OIN (t2 JOIN t3)
18150 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
18160 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
18170 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
18180 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
18190 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
181a0 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20  R JOIN t2) JOIN 
181b0 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69  t3.  **.  ** whi
181c0 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  ch is not at all
181d0 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e   the same thing.
181e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c  .  **.  ** OBSOL
181f0 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20  ETE COMMENT 2:. 
18200 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   ** Restriction 
18210 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71  12:  If the subq
18220 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
18230 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
18240 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a  eft outer.  ** j
18250 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
18260 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
18270 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
18280 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65  .  ** An example
18290 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73  s of why this is
182a0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
182b0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
182c0 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
182d0 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN (SELECT * FRO
182e0 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e  M t2 WHERE t2.x>
182f0 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  0).  **.  ** If 
18300 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
18310 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
18320 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
18330 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
18340 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45  TER JOIN t2) WHE
18350 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20  RE t2.x>0.  **. 
18360 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78   ** But the t2.x
18370 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77  >0 test will alw
18380 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55  ays fail on a NU
18390 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68  LL row of t2, wh
183a0 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69  ich.  ** effecti
183b0 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68  vely converts th
183c0 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74  e OUTER JOIN int
183d0 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e  o an INNER JOIN.
183e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20  .  **.  ** THIS 
183f0 4f 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45  OVERRIDES OBSOLE
18400 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e  TE COMMENTS 1 AN
18410 44 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20  D 2 ABOVE:.  ** 
18420 54 69 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f  Ticket #3300 sho
18430 77 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69  ws that flatteni
18440 6e 67 20 74 68 65 20 72 69 67 68 74 20 74 65 72  ng the right ter
18450 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  m of a LEFT JOIN
18460 0a 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74  .  ** is fraught
18470 20 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42   with danger.  B
18480 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65  est to avoid the
18490 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49   whole thing.  I
184a0 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  f the.  ** subqu
184b0 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
184c0 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20   term of a LEFT 
184d0 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  JOIN, then do no
184e0 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a  t flatten..  */.
184f0 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d    if( (pSubitem-
18500 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  >jointype & JT_O
18510 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20  UTER)!=0 ){.    
18520 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
18530 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
18540 31 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71  17: If the sub-q
18550 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
18560 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20  nd SELECT, then 
18570 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65  it must.  ** use
18580 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20   only the UNION 
18590 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e  ALL operator. An
185a0 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69  d none of the si
185b0 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72  mple select quer
185c0 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61  ies.  ** that ma
185d0 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75  ke up the compou
185e0 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c  nd SELECT are al
185f0 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72  lowed to be aggr
18600 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63  egate or distinc
18610 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a  t.  ** queries..
18620 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
18630 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
18640 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
18650 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
18660 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63  n 0;  /* Restric
18670 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d  tion 20 */.    }
18680 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c  .    if( isAgg |
18690 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
186a0 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
186b0 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d   || pSrc->nSrc!=
186c0 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  1 ){.      retur
186d0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  n 0;.    }.    f
186e0 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70  or(pSub1=pSub; p
186f0 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62  Sub1; pSub1=pSub
18700 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  1->pPrior){.    
18710 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
18720 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
18730 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
18740 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
18750 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
18760 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
18770 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
18780 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
18790 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
187a0 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20  gregate );.     
187b0 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
187c0 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Src!=0 );.      
187d0 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  if( (pSub1->selF
187e0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
187f0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
18800 29 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ))!=0.       || 
18810 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26  (pSub1->pPrior &
18820 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f  & pSub1->op!=TK_
18830 41 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20  ALL) .       || 
18840 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72  pSub1->pSrc->nSr
18850 63 3c 31 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  c<1.      ){.   
18860 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
18870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
18880 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53  tcase( pSub1->pS
18890 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20  rc->nSrc>1 );.  
188a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74    }..    /* Rest
188b0 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20  riction 18. */. 
188c0 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
188d0 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
188e0 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  ii;.      for(ii
188f0 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72  =0; ii<p->pOrder
18900 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  By->nExpr; ii++)
18910 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
18920 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d  >pOrderBy->a[ii]
18930 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20  .iOrderByCol==0 
18940 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
18950 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
18960 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65   /***** If we re
18970 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
18980 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
18990 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a  rmitted. *****/.
189a0 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20  .  /* Authorize 
189b0 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
189c0 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
189d0 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74 65  ontext = pSubite
189e0 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69  m->zName;.  sqli
189f0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
18a00 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
18a10 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  CT, 0, 0, 0);.  
18a20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
18a30 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74  text = zSavedAut
18a40 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20  hContext;..  /* 
18a50 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
18a60 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
18a70 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
18a80 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72 69   then (by restri
18a90 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61  ctions.  ** 17 a
18aa0 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74 20  nd 18 above) it 
18ab0 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20  must be a UNION 
18ac0 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65  ALL and the pare
18ad0 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20  nt query must . 
18ae0 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f   ** be of the fo
18af0 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  rm:.  **.  **   
18b00 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c    SELECT <expr-l
18b10 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d  ist> FROM (<sub-
18b20 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63  query>) <where-c
18b30 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a  lause> .  **.  *
18b40 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e  * followed by an
18b50 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49  y ORDER BY, LIMI
18b60 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20  T and/or OFFSET 
18b70 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c  clauses. This bl
18b80 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73  ock.  ** creates
18b90 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74   N-1 copies of t
18ba0 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
18bb0 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45  without any ORDE
18bc0 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a  R BY, LIMIT or .
18bd0 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75    ** OFFSET clau
18be0 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68  ses and joins th
18bf0 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68  em to the left-h
18c00 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20  and-side of the 
18c10 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73  original.  ** us
18c20 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  ing UNION ALL op
18c30 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73  erators. In this
18c40 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e   case N is the n
18c50 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a  umber of simple.
18c60 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74    ** select stat
18c70 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f  ements in the co
18c80 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
18c90 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
18ca0 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
18cb0 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52     SELECT a+1 FR
18cc0 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20  OM (.  **       
18cd0 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
18ce0 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
18cf0 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
18d00 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46 52       SELECT y FR
18d10 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20  OM tab.  **     
18d20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
18d30 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
18d40 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61  abs(z*2) FROM ta
18d50 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48  b2.  **     ) WH
18d60 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42  ERE a!=5 ORDER B
18d70 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72  Y 1.  **.  ** Tr
18d80 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a  ansformed into:.
18d90 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
18da0 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61  LECT x+1 FROM ta
18db0 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20  b WHERE x+1!=5. 
18dc0 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c   **     UNION AL
18dd0 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  L.  **     SELEC
18de0 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T y+1 FROM tab W
18df0 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a  HERE y+1!=5.  **
18e00 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
18e10 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
18e20 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74  bs(z*2)+1 FROM t
18e30 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a  ab2 WHERE abs(z*
18e40 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20  2)+1!=5.  **    
18e50 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
18e60 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68  .  ** We call th
18e70 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64  is the "compound
18e80 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
18e90 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ning"..  */.  fo
18ea0 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  r(pSub=pSub->pPr
18eb0 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ior; pSub; pSub=
18ec0 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
18ed0 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b     Select *pNew;
18ee0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
18ef0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
18f00 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20  derBy;.    Expr 
18f10 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  *pLimit = p->pLi
18f20 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  mit;.    Select 
18f30 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72  *pPrior = p->pPr
18f40 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  ior;.    p->pOrd
18f50 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
18f60 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70  >pSrc = 0;.    p
18f70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
18f80 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
18f90 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
18fa0 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
18fb0 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70   p, 0);.    p->p
18fc0 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
18fd0 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
18fe0 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
18ff0 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
19000 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41      p->op = TK_A
19010 4c 4c 3b 0a 20 20 20 20 70 2d 3e 70 52 69 67 68  LL;.    p->pRigh
19020 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 69  tmost = 0;.    i
19030 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
19040 20 20 20 20 70 4e 65 77 20 3d 20 70 50 72 69 6f      pNew = pPrio
19050 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
19060 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72      pNew->pPrior
19070 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
19080 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73   pNew->pRightmos
19090 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
190a0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65   p->pPrior = pNe
190b0 77 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  w;.    if( db->m
190c0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
190d0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
190e0 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69  * Begin flatteni
190f0 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20  ng the iFrom-th 
19100 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
19110 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69  M clause .  ** i
19120 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
19130 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d  y..  */.  pSub =
19140 20 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65   pSub1 = pSubite
19150 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f  m->pSelect;..  /
19160 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61  * Delete the tra
19170 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72  nsient table str
19180 75 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65  ucture associate
19190 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
191a0 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20  subquery.  */.  
191b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
191c0 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74  , pSubitem->zDat
191d0 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  abase);.  sqlite
191e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
191f0 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  item->zName);.  
19200 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
19210 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69  , pSubitem->zAli
19220 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  as);.  pSubitem-
19230 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a  >zDatabase = 0;.
19240 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d    pSubitem->zNam
19250 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  e = 0;.  pSubite
19260 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20  m->zAlias = 0;. 
19270 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
19280 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65  ct = 0;..  /* De
19290 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65  fer deleting the
192a0 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73   Table object as
192b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
192c0 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
192d0 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72  until code gener
192e0 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ation is.  ** co
192f0 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68  mplete, since th
19300 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78  ere may still ex
19310 69 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e  ist Expr.pTab en
19320 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  tries that.  ** 
19330 72 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62  refer to the sub
19340 71 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72  query even after
19350 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69   flattening.  Ti
19360 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a  cket #3346..  **
19370 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e  .  ** pSubitem->
19380 70 54 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e  pTab is always n
19390 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20  on-NULL by test 
193a0 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64  restrictions and
193b0 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20   tests above..  
193c0 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  */.  if( ALWAYS(
193d0 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d  pSubitem->pTab!=
193e0 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  0) ){.    Table 
193f0 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75  *pTabToDel = pSu
19400 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bitem->pTab;.   
19410 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e   if( pTabToDel->
19420 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nRef==1 ){.     
19430 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
19440 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
19450 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
19460 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65  ;.      pTabToDe
19470 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d  l->pNextZombie =
19480 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d   pToplevel->pZom
19490 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54  bieTab;.      pT
194a0 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
194b0 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b  Tab = pTabToDel;
194c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
194d0 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65    pTabToDel->nRe
194e0 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  f--;.    }.    p
194f0 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20  Subitem->pTab = 
19500 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  0;.  }..  /* The
19510 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20   following loop 
19520 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
19530 63 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d  ch term in a com
19540 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20  pound-subquery. 
19550 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28   ** flattening (
19560 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
19570 76 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20  ve).  If we are 
19580 64 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  doing a differen
19590 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66  t kind.  ** of f
195a0 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c  lattening - a fl
195b0 61 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74  attening other t
195c0 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73  han a compound-s
195d0 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69  ubquery flatteni
195e0 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ng -.  ** then t
195f0 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75  his loop only ru
19600 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20  ns once..  **.  
19610 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76  ** This loop mov
19620 65 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52  es all of the FR
19630 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  OM elements of t
19640 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
19650 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52   the.  ** the FR
19660 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
19670 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
19680 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73  efore doing this
19690 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  , remember.  ** 
196a0 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
196b0 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  r for the origin
196c0 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46  al outer query F
196d0 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20  ROM element in. 
196e0 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68   ** iParent.  Th
196f0 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72  e iParent cursor
19700 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
19710 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74  sed.  Subsequent
19720 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   code.  ** will 
19730 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  scan expressions
19740 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61   looking for iPa
19750 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  rent references 
19760 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a  and replace.  **
19770 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65   those reference
19780 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f  s with expressio
19790 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20  ns that resolve 
197a0 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
197b0 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e  FROM.  ** elemen
197c0 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f  ts we are now co
197d0 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20  pying in..  */. 
197e0 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20   for(pParent=p; 
197f0 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74  pParent; pParent
19800 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72  =pParent->pPrior
19810 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  , pSub=pSub->pPr
19820 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  ior){.    int nS
19830 75 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f  ubSrc;.    u8 jo
19840 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  intype = 0;.    
19850 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
19860 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f  pSrc;     /* FRO
19870 4d 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71  M clause of subq
19880 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62  uery */.    nSub
19890 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e  Src = pSubSrc->n
198a0 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  Src;  /* Number 
198b0 6f 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71  of terms in subq
198c0 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65  uery FROM clause
198d0 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70   */.    pSrc = p
198e0 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20  Parent->pSrc;   
198f0 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
19900 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
19910 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  ery */..    if( 
19920 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73  pSrc ){.      as
19930 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70  sert( pParent==p
19940 20 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69   );  /* First ti
19950 6d 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  me through the l
19960 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69  oop */.      joi
19970 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d  ntype = pSubitem
19980 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  ->jointype;.    
19990 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
199a0 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20  ert( pParent!=p 
199b0 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73  );  /* 2nd and s
199c0 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20  ubsequent times 
199d0 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
199e0 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d   */.      pSrc =
199f0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
19a00 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
19a10 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20  ppend(db, 0, 0, 
19a20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  0);.      if( pS
19a30 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc==0 ){.       
19a40 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
19a50 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
19a60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19a70 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
19a80 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75  * The subquery u
19a90 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f  ses a single slo
19aa0 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
19ab0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
19ac0 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20  r.    ** query. 
19ad0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
19ae0 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
19af0 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74  ne element in it
19b00 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20  s FROM clause,. 
19b10 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e     ** then expan
19b20 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
19b30 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20  y to make space 
19b40 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61  for it to hold a
19b50 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20  ll elements.    
19b60 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
19b70 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry..    **.    *
19b80 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
19b90 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45  *.    **    SELE
19ba0 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20  CT * FROM tabA, 
19bb0 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  (SELECT * FROM s
19bc0 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42  ub1, sub2), tabB
19bd0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
19be0 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
19bf0 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69  has 3 slots in i
19c00 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ts FROM clause. 
19c10 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65   One slot of the
19c20 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
19c30 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20  ery (the middle 
19c40 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79  slot) is used by
19c50 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
19c60 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  The next.    ** 
19c70 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69  block of code wi
19c80 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75  ll expand the ou
19c90 74 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f  t query to 4 slo
19ca0 74 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a  ts.  The middle.
19cb0 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65      ** slot is e
19cc0 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73  xpanded to two s
19cd0 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  lots in order to
19ce0 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20   make space for 
19cf0 74 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65  the.    ** two e
19d00 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46  lements in the F
19d10 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
19d20 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  e subquery..    
19d30 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53  */.    if( nSubS
19d40 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50  rc>1 ){.      pP
19d50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53  arent->pSrc = pS
19d60 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
19d70 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
19d80 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69  Src, nSubSrc-1,i
19d90 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69  From+1);.      i
19da0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
19db0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62  led ){.        b
19dc0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
19dd0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e    }..    /* Tran
19de0 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c  sfer the FROM cl
19df0 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20  ause terms from 
19e00 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
19e10 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  o the.    ** out
19e20 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f  er query..    */
19e30 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
19e40 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
19e50 20 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69       sqlite3IdLi
19e60 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72  stDelete(db, pSr
19e70 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55  c->a[i+iFrom].pU
19e80 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72  sing);.      pSr
19e90 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20  c->a[i+iFrom] = 
19ea0 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  pSubSrc->a[i];. 
19eb0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75       memset(&pSu
19ec0 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73  bSrc->a[i], 0, s
19ed0 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61  izeof(pSubSrc->a
19ee0 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  [i]));.    }.   
19ef0 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
19f00 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74  jointype = joint
19f10 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e  ype;.  .    /* N
19f20 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74  ow begin substit
19f30 75 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72  uting subquery r
19f40 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73  esult set expres
19f50 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a  sions for .    *
19f60 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * references to 
19f70 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74  the iParent in t
19f80 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
19f90 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45      ** .    ** E
19fa0 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
19fb0 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61     **   SELECT a
19fc0 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53  +5, b*10 FROM (S
19fd0 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20  ELECT x*3 AS a, 
19fe0 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74  y+10 AS b FROM t
19ff0 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20  1) WHERE a>b;.  
1a000 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20    **   \        
1a010 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
1a020 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71  ___________ subq
1a030 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  uery __________/
1a040 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20            /.    
1a050 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  **    \_________
1a060 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74  ____________ out
1a070 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  er query _______
1a080 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1a090 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a  _______/.    **.
1a0a0 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61      ** We look a
1a0b0 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  t every expressi
1a0c0 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  on in the outer 
1a0d0 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20  query and every 
1a0e0 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20  place we see.   
1a0f0 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74   ** "a" we subst
1a100 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20  itute "x*3" and 
1a110 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
1a120 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69  ee "b" we substi
1a130 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20  tute "y+10"..   
1a140 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   */.    pList = 
1a150 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b  pParent->pEList;
1a160 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1a170 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1a180 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  +){.      if( pL
1a190 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d  ist->a[i].zName=
1a1a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
1a1b0 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 61 6e 20  nst char *zSpan 
1a1c0 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53  = pList->a[i].zS
1a1d0 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pan;.        if(
1a1e0 20 41 4c 57 41 59 53 28 7a 53 70 61 6e 29 20 29   ALWAYS(zSpan) )
1a1f0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 69 73  {.          pLis
1a200 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
1a210 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
1a220 64 62 2c 20 7a 53 70 61 6e 29 3b 0a 20 20 20 20  db, zSpan);.    
1a230 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1a240 20 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70    }.    substExp
1a250 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e  rList(db, pParen
1a260 74 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65  t->pEList, iPare
1a270 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1a280 29 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67  );.    if( isAgg
1a290 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45   ){.      substE
1a2a0 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
1a2b0 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  ent->pGroupBy, i
1a2c0 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1a2d0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61  List);.      pPa
1a2e0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
1a2f0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50  substExpr(db, pP
1a300 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20  arent->pHaving, 
1a310 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
1a320 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
1a330 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64    if( pSub->pOrd
1a340 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 61 73  erBy ){.      as
1a350 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
1a360 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
1a370 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72      pParent->pOr
1a380 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f  derBy = pSub->pO
1a390 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53  rderBy;.      pS
1a3a0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ub->pOrderBy = 0
1a3b0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1a3c0 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
1a3d0 79 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  y ){.      subst
1a3e0 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61  ExprList(db, pPa
1a3f0 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20  rent->pOrderBy, 
1a400 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
1a410 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
1a420 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65    if( pSub->pWhe
1a430 72 65 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65  re ){.      pWhe
1a440 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
1a450 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57  Dup(db, pSub->pW
1a460 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65  here, 0);.    }e
1a470 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72  lse{.      pWher
1a480 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 0;.    }.   
1a490 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
1a4a0 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  gg ){.      asse
1a4b0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  rt( pParent->pHa
1a4c0 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ving==0 );.     
1a4d0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1a4e0 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  g = pParent->pWh
1a4f0 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65  ere;.      pPare
1a500 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  nt->pWhere = pWh
1a510 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65  ere;.      pPare
1a520 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75  nt->pHaving = su
1a530 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72  bstExpr(db, pPar
1a540 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  ent->pHaving, iP
1a550 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1a560 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
1a570 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
1a580 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
1a590 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  , pParent->pHavi
1a5a0 6e 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ng, .           
1a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1a5d0 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  prDup(db, pSub->
1a5e0 70 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20  pHaving, 0));.  
1a5f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1a600 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ent->pGroupBy==0
1a610 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
1a620 74 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  t->pGroupBy = sq
1a630 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
1a640 28 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75  (db, pSub->pGrou
1a650 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  pBy, 0);.    }el
1a660 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  se{.      pParen
1a670 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73  t->pWhere = subs
1a680 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e  tExpr(db, pParen
1a690 74 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65  t->pWhere, iPare
1a6a0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1a6b0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1a6c0 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
1a6d0 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50  e3ExprAnd(db, pP
1a6e0 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70  arent->pWhere, p
1a6f0 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Where);.    }.  
1a700 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74  .    /* The flat
1a710 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64  tened query is d
1a720 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65  istinct if eithe
1a730 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74  r the inner or t
1a740 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
1a750 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
1a760 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  t. .    */.    p
1a770 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73  Parent->selFlags
1a780 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61   |= pSub->selFla
1a790 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
1a7a0 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ;.  .    /*.    
1a7b0 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  ** SELECT ... FR
1a7c0 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c  OM (SELECT ... L
1a7d0 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29  IMIT a OFFSET b)
1a7e0 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20   LIMIT x OFFSET 
1a7f0 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y;.    **.    **
1a800 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20   One is tempted 
1a810 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20  to try to add a 
1a820 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65  and b to combine
1a830 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75   the limits.  Bu
1a840 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f  t this.    ** do
1a850 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65  es not work if e
1a860 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e  ither limit is n
1a870 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a  egative..    */.
1a880 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c      if( pSub->pL
1a890 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50  imit ){.      pP
1a8a0 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20  arent->pLimit = 
1a8b0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20  pSub->pLimit;.  
1a8c0 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74      pSub->pLimit
1a8d0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1a8e0 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20  .  /* Finially, 
1a8f0 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c  delete what is l
1a900 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  eft of the subqu
1a910 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ery and return. 
1a920 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a   ** success..  *
1a930 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  /.  sqlite3Selec
1a940 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
1a950 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b  1);..  return 1;
1a960 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
1a970 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1a980 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1a990 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1a9a0 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a  MIT_VIEW) */../*
1a9b0 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
1a9c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1a9d0 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
1a9e0 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66  gument to see if
1a9f0 20 69 74 0a 2a 2a 20 69 73 20 61 20 6d 69 6e 28   it.** is a min(
1aa00 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
1aa10 2e 20 52 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 49 4e 20 6f 72 20 57 48  RDERBY_MIN or WH
1aa30 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 20  ERE_ORDERBY_MAX 
1aa40 69 66 20 0a 2a 2a 20 69 74 20 69 73 2c 20 6f 72  if .** it is, or
1aa50 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20 41 74   0 otherwise. At
1aa60 20 70 72 65 73 65 6e 74 2c 20 61 20 71 75 65 72   present, a quer
1aa70 79 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  y is considered 
1aa80 74 6f 20 62 65 0a 2a 2a 20 61 20 6d 69 6e 28 29  to be.** a min()
1aa90 2f 6d 61 78 28 29 20 71 75 65 72 79 20 69 66 3a  /max() query if:
1aaa0 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54 68 65 72  .**.**   1. Ther
1aab0 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20 6f 62  e is a single ob
1aac0 6a 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d  ject in the FROM
1aad0 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
1aae0 20 32 2e 20 54 68 65 72 65 20 69 73 20 61 20 73   2. There is a s
1aaf0 69 6e 67 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  ingle expression
1ab00 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
1ab10 65 74 2c 20 61 6e 64 20 69 74 20 69 73 0a 2a 2a  et, and it is.**
1ab20 20 20 20 20 20 20 65 69 74 68 65 72 20 6d 69 6e        either min
1ab30 28 78 29 20 6f 72 20 6d 61 78 28 78 29 2c 20 77  (x) or max(x), w
1ab40 68 65 72 65 20 78 20 69 73 20 61 20 63 6f 6c 75  here x is a colu
1ab50 6d 6e 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2f  mn reference..*/
1ab60 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61  .static u8 minMa
1ab70 78 51 75 65 72 79 28 53 65 6c 65 63 74 20 2a 70  xQuery(Select *p
1ab80 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  ){.  Expr *pExpr
1ab90 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
1aba0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
1abb0 3b 0a 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d  ;..  if( pEList-
1abc0 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
1abd0 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  rn WHERE_ORDERBY
1abe0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70 45 78 70 72  _NORMAL;.  pExpr
1abf0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e   = pEList->a[0].
1ac00 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78  pExpr;.  if( pEx
1ac10 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
1ac20 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
1ac30 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   0;.  if( NEVER(
1ac40 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1ac50 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1ac60 65 63 74 29 29 20 29 20 72 65 74 75 72 6e 20 30  ect)) ) return 0
1ac70 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78  ;.  pEList = pEx
1ac80 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69  pr->x.pList;.  i
1ac90 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20  f( pEList==0 || 
1aca0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
1acb0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1acc0 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  f( pEList->a[0].
1acd0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
1ace0 47 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  G_COLUMN ) retur
1acf0 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  n WHERE_ORDERBY_
1ad00 4e 4f 52 4d 41 4c 3b 0a 20 20 61 73 73 65 72 74  NORMAL;.  assert
1ad10 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1ad20 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1ad30 56 61 6c 75 65 29 20 29 3b 0a 20 20 69 66 28 20  Value) );.  if( 
1ad40 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1ad50 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22  Expr->u.zToken,"
1ad60 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  min")==0 ){.    
1ad70 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44  return WHERE_ORD
1ad80 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d 65 6c 73  ERBY_MIN;.  }els
1ad90 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
1ada0 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
1adb0 6f 6b 65 6e 2c 22 6d 61 78 22 29 3d 3d 30 20 29  oken,"max")==0 )
1adc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 48 45  {.    return WHE
1add0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a  RE_ORDERBY_MAX;.
1ade0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 48 45    }.  return WHE
1adf0 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
1ae00 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  L;.}../*.** The 
1ae10 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
1ae20 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
1ae30 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
1ae40 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75   an aggregate qu
1ae50 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ery..** The seco
1ae60 6e 64 20 61 72 67 6d 65 6e 74 20 69 73 20 74 68  nd argment is th
1ae70 65 20 61 73 73 6f 63 69 61 74 65 64 20 61 67 67  e associated agg
1ae80 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65  regate-info obje
1ae90 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  ct. This .** fun
1aea0 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74  ction tests if t
1aeb0 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20  he SELECT is of 
1aec0 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
1aed0 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
1aee0 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a  ) FROM <tbl>.**.
1aef0 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20 69  ** where table i
1af00 73 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  s a database tab
1af10 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65  le, not a sub-se
1af20 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66  lect or view. If
1af30 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f   the query.** do
1af40 65 73 20 6d 61 74 63 68 20 74 68 69 73 20 70 61  es match this pa
1af50 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f  ttern, then a po
1af60 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62  inter to the Tab
1af70 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73  le object repres
1af80 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20  enting.** <tbl> 
1af90 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
1afa0 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74  erwise, 0 is ret
1afb0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1afc0 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65   Table *isSimple
1afd0 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c  Count(Select *p,
1afe0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
1aff0 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  fo){.  Table *pT
1b000 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  ab;.  Expr *pExp
1b010 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  r;..  assert( !p
1b020 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20  ->pGroupBy );.. 
1b030 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c   if( p->pWhere |
1b040 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  | p->pEList->nEx
1b050 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e  pr!=1 .   || p->
1b060 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c  pSrc->nSrc!=1 ||
1b070 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
1b080 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20  Select.  ){.    
1b090 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1b0a0 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pTab = p->pSrc->
1b0b0 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78  a[0].pTab;.  pEx
1b0c0 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
1b0d0 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73  a[0].pExpr;.  as
1b0e0 73 65 72 74 28 20 70 54 61 62 20 26 26 20 21 70  sert( pTab && !p
1b0f0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20  Tab->pSelect && 
1b100 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20  pExpr );..  if( 
1b110 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
1b120 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1b130 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1b140 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72  AGG_FUNCTION ) r
1b150 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
1b160 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
1b170 30 5d 2e 70 46 75 6e 63 2d 3e 66 6c 61 67 73 26  0].pFunc->flags&
1b180 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e  SQLITE_FUNC_COUN
1b190 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  T)==0 ) return 0
1b1a0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66  ;.  if( pExpr->f
1b1b0 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74  lags&EP_Distinct
1b1c0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
1b1d0 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
1b1e0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75  /*.** If the sou
1b1f0 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61  rce-list item pa
1b200 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
1b210 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65  ent was augmente
1b220 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44  d with an.** IND
1b230 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
1b240 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61  then try to loca
1b250 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  te the specified
1b260 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65   index. If there
1b270 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20 63  .** was such a c
1b280 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61  lause and the na
1b290 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74  med index cannot
1b2a0 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
1b2b0 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  n .** SQLITE_ERR
1b2c0 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20  OR and leave an 
1b2d0 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
1b2e0 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75   Otherwise, popu
1b2f0 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e  late .** pFrom->
1b300 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72  pIndex and retur
1b310 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
1b320 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78  int sqlite3Index
1b330 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65  edByLookup(Parse
1b340 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74   *pParse, struct
1b350 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1b360 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72  From){.  if( pFr
1b370 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f  om->pTab && pFro
1b380 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a 20 20 20  m->zIndex ){.   
1b390 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
1b3a0 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
1b3b0 63 68 61 72 20 2a 7a 49 6e 64 65 78 20 3d 20 70  char *zIndex = p
1b3c0 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20  From->zIndex;.  
1b3d0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
1b3e0 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
1b3f0 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20  ->pIndex; .     
1b400 20 20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74     pIdx && sqlit
1b410 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e  e3StrICmp(pIdx->
1b420 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 29 3b 20  zName, zIndex); 
1b430 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d 70 49  .        pIdx=pI
1b440 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b  dx->pNext.    );
1b450 0a 20 20 20 20 69 66 28 20 21 70 49 64 78 20 29  .    if( !pIdx )
1b460 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1b470 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1b480 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
1b490 25 73 22 2c 20 7a 49 6e 64 65 78 2c 20 30 29 3b  %s", zIndex, 0);
1b4a0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
1b4b0 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
1b4c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b4d0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
1b4e0 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 6e 64  .    pFrom->pInd
1b4f0 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20  ex = pIdx;.  }. 
1b500 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b510 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
1b520 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61   routine is a Wa
1b530 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f  lker callback fo
1b540 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20  r "expanding" a 
1b550 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1b560 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22  ..** "Expanding"
1b570 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65   means to do the
1b580 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
1b590 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73  *    (1)  Make s
1b5a0 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  ure VDBE cursor 
1b5b0 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
1b5c0 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76  n assigned to ev
1b5d0 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  ery.**         e
1b5e0 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52  lement of the FR
1b5f0 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
1b600 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e      (2)  Fill in
1b610 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61   the pTabList->a
1b620 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69  [].pTab fields i
1b630 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  n the SrcList th
1b640 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  at .**         d
1b650 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75  efines FROM clau
1b660 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20  se.  When views 
1b670 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
1b680 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20  OM clause,.**   
1b690 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c        fill pTabL
1b6a0 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74  ist->a[].pSelect
1b6b0 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
1b6c0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
1b6d0 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
1b6e0 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
1b6f0 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70  the view.  A cop
1b700 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
1b710 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a   view's SELECT.*
1b720 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d  *         statem
1b730 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  ent so that we c
1b740 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79  an freely modify
1b750 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20   or delete that 
1b760 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
1b770 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72       without wor
1b780 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73  rying about mess
1b790 69 6e 67 20 75 70 20 74 68 65 20 70 72 65 73 69  ing up the presi
1b7a0 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61  stent representa
1b7b0 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tion.**         
1b7c0 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a  of the view..**.
1b7d0 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74  **    (3)  Add t
1b7e0 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52  erms to the WHER
1b7f0 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f  E clause to acco
1b800 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52  modate the NATUR
1b810 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20  AL keyword.**   
1b820 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61        on joins a
1b830 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53  nd the ON and US
1b840 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f  ING clause of jo
1b850 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34  ins..**.**    (4
1b860 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74  )  Scan the list
1b870 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
1b880 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70  he result set (p
1b890 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a  EList) looking.*
1b8a0 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e  *         for in
1b8b0 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22  stances of the "
1b8c0 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74  *" operator or t
1b8d0 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61  he TABLE.* opera
1b8e0 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tor..**         
1b8f0 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64  If found, expand
1b900 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20   each "*" to be 
1b910 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
1b920 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20  every table.**  
1b930 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45         and TABLE
1b940 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  .* to be every c
1b950 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a  olumn in TABLE..
1b960 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
1b970 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28   selectExpander(
1b980 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
1b990 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
1b9a0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
1b9b0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
1b9c0 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20    int i, j, k;. 
1b9d0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
1b9e0 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  st;.  ExprList *
1b9f0 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  pEList;.  struct
1ba00 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1ba10 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  From;.  sqlite3 
1ba20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1ba30 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  ;..  if( db->mal
1ba40 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20  locFailed  ){.  
1ba50 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
1ba60 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45  rt;.  }.  if( NE
1ba70 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20  VER(p->pSrc==0) 
1ba80 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  || (p->selFlags 
1ba90 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d  & SF_Expanded)!=
1baa0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1bab0 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20  WRC_Prune;.  }. 
1bac0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
1bad0 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 70  SF_Expanded;.  p
1bae0 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
1baf0 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
1bb00 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d  >pEList;..  /* M
1bb10 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20  ake sure cursor 
1bb20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
1bb30 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  n assigned to al
1bb40 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a  l entries in.  *
1bb50 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
1bb60 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
1bb70 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
1bb80 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1bb90 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
1bba0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b  arse, pTabList);
1bbb0 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
1bbc0 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64  very table named
1bbd0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1bbe0 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63  use of the selec
1bbf0 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  t.  If.  ** an e
1bc00 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
1bc10 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62   clause is a sub
1bc20 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66  query instead of
1bc30 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
1bc40 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61  ,.  ** then crea
1bc50 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  te a transient t
1bc60 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
1bc70 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73  o describe the s
1bc80 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  ubquery..  */.  
1bc90 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
1bca0 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
1bcb0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
1bcc0 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
1bcd0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
1bce0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61    if( pFrom->pTa
1bcf0 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  b!=0 ){.      /*
1bd00 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
1bd10 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1bd20 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72   prepared.  Ther
1bd30 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
1bd40 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74     ** to go furt
1bd50 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  her. */.      as
1bd60 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20  sert( i==0 );.  
1bd70 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
1bd80 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rune;.    }.    
1bd90 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  if( pFrom->zName
1bda0 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
1bdb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1bdc0 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74  ERY.      Select
1bdd0 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
1bde0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f  pSelect;.      /
1bdf0 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
1be00 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1be10 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
1be20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
1be30 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  el!=0 );.      a
1be40 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
1be50 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ab==0 );.      s
1be60 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
1be70 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b  (pWalker, pSel);
1be80 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
1be90 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
1bea0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
1beb0 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
1bec0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ));.      if( pT
1bed0 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
1bee0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
1bef0 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pTab->nRef = 1;.
1bf00 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
1bf10 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
1bf20 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73  tf(db, "sqlite_s
1bf30 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76  ubquery_%p_", (v
1bf40 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20  oid*)pTab);.    
1bf50 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70    while( pSel->p
1bf60 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20  Prior ){ pSel = 
1bf70 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a  pSel->pPrior; }.
1bf80 20 20 20 20 20 20 73 65 6c 65 63 74 43 6f 6c 75        selectColu
1bf90 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
1bfa0 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45  pParse, pSel->pE
1bfb0 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f  List, &pTab->nCo
1bfc0 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b  l, &pTab->aCol);
1bfd0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  .      pTab->iPK
1bfe0 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  ey = -1;.      p
1bff0 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31  Tab->nRowEst = 1
1c000 30 30 30 30 30 30 3b 0a 20 20 20 20 20 20 70 54  000000;.      pT
1c010 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
1c020 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65  TF_Ephemeral;.#e
1c030 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
1c040 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69        /* An ordi
1c050 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69  nary table or vi
1c060 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46  ew name in the F
1c070 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
1c080 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
1c090 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
1c0a0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
1c0b0 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20  = pTab = .      
1c0c0 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54    sqlite3LocateT
1c0d0 61 62 6c 65 28 70 50 61 72 73 65 2c 30 2c 70 46  able(pParse,0,pF
1c0e0 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d  rom->zName,pFrom
1c0f0 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
1c100 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
1c110 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
1c120 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  rt;.      pTab->
1c130 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66  nRef++;.#if !def
1c140 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1c150 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
1c160 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ed (SQLITE_OMIT_
1c170 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
1c180 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
1c190 65 6c 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75  elect || IsVirtu
1c1a0 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
1c1b0 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20      /* We reach 
1c1c0 68 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65  here if the name
1c1d0 64 20 74 61 62 6c 65 20 69 73 20 61 20 72 65 61  d table is a rea
1c1e0 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20  lly a view */.  
1c1f0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1c200 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
1c210 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
1c220 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
1c230 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  bort;.        as
1c240 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
1c250 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lect==0 );.     
1c260 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63     pFrom->pSelec
1c270 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
1c280 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70  tDup(db, pTab->p
1c290 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
1c2a0 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
1c2b0 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
1c2c0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  From->pSelect);.
1c2d0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1c2e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63     }..    /* Loc
1c2f0 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61  ate the index na
1c300 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58  med by the INDEX
1c310 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66  ED BY clause, if
1c320 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28   any. */.    if(
1c330 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42   sqlite3IndexedB
1c340 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  yLookup(pParse, 
1c350 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20  pFrom) ){.      
1c360 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1c370 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1c380 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41  * Process NATURA
1c390 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20  L keywords, and 
1c3a0 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
1c3b0 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20  uses of joins.. 
1c3c0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
1c3d0 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71  llocFailed || sq
1c3e0 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
1c3f0 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20  pParse, p) ){.  
1c400 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
1c410 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f  rt;.  }..  /* Fo
1c420 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74  r every "*" that
1c430 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63   occurs in the c
1c440 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65  olumn list, inse
1c450 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  rt the names of.
1c460 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73    ** all columns
1c470 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20   in all tables. 
1c480 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54   And for every T
1c490 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68  ABLE.* insert th
1c4a0 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20  e names.  ** of 
1c4b0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54  all columns in T
1c4c0 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65  ABLE.  The parse
1c4d0 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65  r inserted a spe
1c4e0 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a  cial expression.
1c4f0 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b    ** with the TK
1c500 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f  _ALL operator fo
1c510 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20  r each "*" that 
1c520 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  it found in the 
1c530 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a  column list..  *
1c540 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1c550 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f  code just has to
1c560 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41   locate the TK_A
1c570 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  LL expressions a
1c580 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65  nd expand.  ** e
1c590 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c  ach one to the l
1c5a0 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d  ist of all colum
1c5b0 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
1c5c0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
1c5d0 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20  first loop just 
1c5e0 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
1c5f0 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22   there are any "
1c600 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a  *" operators.  *
1c610 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61  * that need expa
1c620 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  nding..  */.  fo
1c630 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
1c640 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
1c650 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c    Expr *pE = pEL
1c660 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b  ist->a[k].pExpr;
1c670 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
1c680 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b  =TK_ALL ) break;
1c690 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d  .    assert( pE-
1c6a0 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
1c6b0 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  E->pRight!=0 );.
1c6c0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
1c6d0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70  op!=TK_DOT || (p
1c6e0 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70  E->pLeft!=0 && p
1c6f0 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  E->pLeft->op==TK
1c700 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20  _ID) );.    if( 
1c710 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
1c720 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  & pE->pRight->op
1c730 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b  ==TK_ALL ) break
1c740 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45  ;.  }.  if( k<pE
1c750 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
1c760 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
1c770 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d  we get here it m
1c780 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  eans the result 
1c790 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  set contains one
1c7a0 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20   or more "*".   
1c7b0 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68   ** operators th
1c7c0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  at need to be ex
1c7d0 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68  panded.  Loop th
1c7e0 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
1c7f0 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20  ssion.    ** in 
1c800 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
1c810 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f  nd expand them o
1c820 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ne by one..    *
1c830 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  /.    struct Exp
1c840 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20  rList_item *a = 
1c850 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45  pEList->a;.    E
1c860 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  xprList *pNew = 
1c870 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  0;.    int flags
1c880 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66   = pParse->db->f
1c890 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f  lags;.    int lo
1c8a0 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73  ngNames = (flags
1c8b0 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
1c8c0 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20  lNames)!=0.     
1c8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8e0 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c   && (flags & SQL
1c8f0 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
1c900 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28  s)==0;..    for(
1c910 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
1c920 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
1c930 20 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b    Expr *pE = a[k
1c940 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ].pExpr;.      a
1c950 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
1c960 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69  K_DOT || pE->pRi
1c970 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght!=0 );.      
1c980 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41  if( pE->op!=TK_A
1c990 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54  LL && (pE->op!=T
1c9a0 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69  K_DOT || pE->pRi
1c9b0 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ght->op!=TK_ALL)
1c9c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1c9d0 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65  his particular e
1c9e0 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e  xpression does n
1c9f0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  ot need to be ex
1ca00 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20  panded..        
1ca10 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  */.        pNew 
1ca20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1ca30 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
1ca40 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
1ca50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1ca60 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
1ca70 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
1ca80 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20  Expr-1].zName = 
1ca90 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[k].zName;.    
1caa0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
1cab0 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70  ew->nExpr-1].zSp
1cac0 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b  an = a[k].zSpan;
1cad0 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  .          a[k].
1cae0 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
1caf0 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20       a[k].zSpan 
1cb00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
1cb10 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70         a[k].pExp
1cb20 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  r = 0;.      }el
1cb30 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
1cb40 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
1cb50 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41  s a "*" or a "TA
1cb60 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73  BLE.*" and needs
1cb70 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a   to be.        *
1cb80 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20  * expanded. */. 
1cb90 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65         int table
1cba0 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f  Seen = 0;      /
1cbb0 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20  * Set to 1 when 
1cbc0 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f  TABLE matches */
1cbd0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
1cbe0 54 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  TName;          
1cbf0 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d    /* text of nam
1cc00 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20  e of TABLE */.  
1cc10 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
1cc20 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20  ==TK_DOT ){.    
1cc30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1cc40 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20  ->pLeft!=0 );.  
1cc50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1cc60 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1cc70 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49  (pE->pLeft, EP_I
1cc80 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1cc90 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70        zTName = p
1cca0 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  E->pLeft->u.zTok
1ccb0 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  en;.        }els
1ccc0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  e{.          zTN
1ccd0 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
1cce0 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69   }.        for(i
1ccf0 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
1cd00 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
1cd10 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
1cd20 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  rom++){.        
1cd30 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
1cd40 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
1cd50 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
1cd60 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a  bName = pFrom->z
1cd70 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
1cd80 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30   if( zTabName==0
1cd90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1cda0 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d  zTabName = pTab-
1cdb0 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
1cdc0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
1cdd0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1cde0 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ed ) break;.    
1cdf0 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
1ce00 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
1ce10 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e  mp(zTName, zTabN
1ce20 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
1ce30 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1ce40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1ce50 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e         tableSeen
1ce60 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1ce70 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
1ce80 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
1ce90 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
1cea0 45 78 70 72 2c 20 2a 70 52 69 67 68 74 3b 0a 20  Expr, *pRight;. 
1ceb0 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
1cec0 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61  *zName = pTab->a
1ced0 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col[j].zName;.  
1cee0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1cef0 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68  zColname;  /* Th
1cf00 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d  e computed colum
1cf10 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
1cf20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46        char *zToF
1cf30 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ree;   /* Malloc
1cf40 65 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e  ed string that n
1cf50 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
1cf60 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1cf70 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20  Token sColname; 
1cf80 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c   /* Computed col
1cf90 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f  umn name as a to
1cfa0 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ken */..        
1cfb0 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75      /* If a colu
1cfc0 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  mn is marked as 
1cfd0 27 68 69 64 64 65 6e 27 20 28 63 75 72 72 65 6e  'hidden' (curren
1cfe0 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c  tly only possibl
1cff0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
1d000 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62   for virtual tab
1d010 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63  les), do not inc
1d020 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65 20 65  lude it in the e
1d030 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20  xpanded.        
1d040 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65      ** result-se
1d050 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20  t list..        
1d060 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1d070 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e 43     if( IsHiddenC
1d080 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f  olumn(&pTab->aCo
1d090 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  l[j]) ){.       
1d0a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 49 73         assert(Is
1d0b0 56 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b 0a  Virtual(pTab));.
1d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
1d0d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1d0e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
1d0f0 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54     if( i>0 && zT
1d100 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
1d110 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46           if( (pF
1d120 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  rom->jointype & 
1d130 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20  JT_NATURAL)!=0. 
1d140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1d150 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e  & tableAndColumn
1d160 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20  Index(pTabList, 
1d170 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a  i, zName, 0, 0).
1d180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b                ){
1d190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d1a0 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c   /* In a NATURAL
1d1b0 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20   join, omit the 
1d1c0 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  join columns fro
1d1d0 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  m the .         
1d1e0 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
1d1f0 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20  to the right of 
1d200 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20  the join */.    
1d210 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
1d220 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1d230 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d240 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1d250 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d  dListIndex(pFrom
1d260 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29  ->pUsing, zName)
1d270 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
1d280 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a         /* In a j
1d290 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47  oin with a USING
1d2a0 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f   clause, omit co
1d2b0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  lumns in the.   
1d2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1d2d0 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f  using clause fro
1d2e0 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  m the table on t
1d2f0 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  he right. */.   
1d300 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
1d310 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1d320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d330 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1d340 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   pRight = sqlite
1d350 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
1d360 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
1d370 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20       zColname = 
1d380 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
1d390 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a     zToFree = 0;.
1d3a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1d3b0 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61  longNames || pTa
1d3c0 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b  bList->nSrc>1 ){
1d3d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  .              E
1d3e0 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20  xpr *pLeft;.    
1d3f0 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
1d400 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
1d410 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d  , TK_ID, zTabNam
1d420 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1d430 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
1d440 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
1d450 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52  K_DOT, pLeft, pR
1d460 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
1d470 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
1d480 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
1d490 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
1d4a0 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
1d4b0 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  tf(db, "%s.%s", 
1d4c0 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  zTabName, zName)
1d4d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d4e0 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c    zToFree = zCol
1d4f0 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  name;.          
1d500 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d510 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d520 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70         pExpr = p
1d530 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
1d540 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1d550 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
1d560 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
1d570 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70  arse, pNew, pExp
1d580 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
1d590 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f  sColname.z = zCo
1d5a0 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  lname;.         
1d5b0 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20     sColname.n = 
1d5c0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1d5d0 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  zColname);.     
1d5e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1d5f0 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50  prListSetName(pP
1d600 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f  arse, pNew, &sCo
1d610 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  lname, 0);.     
1d620 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
1d630 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65  Free(db, zToFree
1d640 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1d650 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d660 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
1d670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1d680 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20   zTName ){.     
1d690 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1d6a0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1d6b0 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
1d6c0 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20  s", zTName);.   
1d6d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1d6e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1d6f0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1d700 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65  , "no tables spe
1d710 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20  cified");.      
1d720 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1d730 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d740 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
1d750 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69  tDelete(db, pELi
1d760 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69  st);.    p->pELi
1d770 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23  st = pNew;.  }.#
1d780 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
1d790 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45  LUMN.  if( p->pE
1d7a0 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73  List && p->pELis
1d7b0 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69  t->nExpr>db->aLi
1d7c0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
1d7d0 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
1d7e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1d7f0 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
1d800 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73  y columns in res
1d810 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 7d 0a 23  ult set");.  }.#
1d820 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 57  endif.  return W
1d830 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
1d840 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74  /*.** No-op rout
1d850 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72 73  ine for the pars
1d860 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a  e-tree walker..*
1d870 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
1d880 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 57 61  outine is the Wa
1d890 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61  lker.xExprCallba
1d8a0 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73 69  ck then expressi
1d8b0 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20  on trees.** are 
1d8c0 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61  walked without a
1d8d0 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67  ny actions being
1d8e0 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e   taken at each n
1d8f0 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79  ode.  Presumably
1d900 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72  ,.** when this r
1d910 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
1d920 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43  or Walker.xExprC
1d930 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a  allback then .**
1d940 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43   Walker.xSelectC
1d950 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74  allback is set t
1d960 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75  o do something u
1d970 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20  seful for every 
1d980 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20  .** subquery in 
1d990 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65 2e  the parser tree.
1d9a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
1d9b0 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b  xprWalkNoop(Walk
1d9c0 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70  er *NotUsed, Exp
1d9d0 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  r *NotUsed2){.  
1d9e0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1d9f0 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
1da00 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57  ed2);.  return W
1da10 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
1da20 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1da30 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20 53  ne "expands" a S
1da40 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1da50 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
1da60 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f  ubqueries..** Fo
1da70 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
1da80 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74  ormation on what
1da90 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78   it means to "ex
1daa0 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a  pand" a SELECT.*
1dab0 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65  * statement, see
1dac0 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
1dad0 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64  the selectExpand
1dae0 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b   worker callback
1daf0 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78   above..**.** Ex
1db00 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54  panding a SELECT
1db10 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68   statement is th
1db20 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e 20  e first step in 
1db30 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20  processing a.** 
1db40 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1db50 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  .  The SELECT st
1db60 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  atement must be 
1db70 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a  expanded before.
1db80 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  ** name resoluti
1db90 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  on is performed.
1dba0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69  .**.** If anythi
1dbb0 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61  ng goes wrong, a
1dbc0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
1dbd0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
1dbe0 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63  pParse..** The c
1dbf0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
1dc00 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20 70  can detect the p
1dc10 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e  roblem by lookin
1dc20 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72  g at pParse->nEr
1dc30 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72  r.** and/or pPar
1dc40 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1dc50 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iled..*/.static 
1dc60 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
1dc70 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a  ctExpand(Parse *
1dc80 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
1dc90 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b  pSelect){.  Walk
1dca0 65 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63  er w;.  w.xSelec
1dcb0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65  tCallback = sele
1dcc0 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e  ctExpander;.  w.
1dcd0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
1dce0 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  exprWalkNoop;.  
1dcf0 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
1dd00 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  e;.  sqlite3Walk
1dd10 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
1dd20 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  ct);.}...#ifndef
1dd30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1dd40 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73  QUERY./*.** This
1dd50 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65   is a Walker.xSe
1dd60 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c  lectCallback cal
1dd70 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71  lback for the sq
1dd80 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70 65 49  lite3SelectTypeI
1dd90 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61  nfo().** interfa
1dda0 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61  ce..**.** For ea
1ddb0 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ch FROM-clause s
1ddc0 75 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c  ubquery, add Col
1ddd0 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f  umn.zType and Co
1dde0 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e  lumn.zColl.** in
1ddf0 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65  formation to the
1de00 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
1de10 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73   that represents
1de20 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a   the result set.
1de30 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71 75  ** of that subqu
1de40 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54  ery..**.** The T
1de50 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
1de60 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  hat represents t
1de70 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 77 61  he result set wa
1de80 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a  s constructed.**
1de90 20 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64   by selectExpand
1dea0 65 72 28 29 20 62 75 74 20 74 68 65 20 74 79 70  er() but the typ
1deb0 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
1dec0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20  information was 
1ded0 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68  omitted.** at th
1dee0 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65  at point because
1def0 20 69 64 65 6e 74 69 66 69 65 72 73 20 68 61 64   identifiers had
1df00 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65   not yet been re
1df10 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a  solved.  This.**
1df20 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1df30 65 64 20 61 66 74 65 72 20 69 64 65 6e 74 69 66  ed after identif
1df40 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a  ier resolution..
1df50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1df60 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54  lectAddSubqueryT
1df70 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a  ypeInfo(Walker *
1df80 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
1df90 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
1dfa0 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  arse;.  int i;. 
1dfb0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
1dfc0 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
1dfd0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
1dfe0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
1dff0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
1e000 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20  solved );.  if( 
1e010 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1e020 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d  F_HasTypeInfo)==
1e030 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46  0 ){.    p->selF
1e040 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79  lags |= SF_HasTy
1e050 70 65 49 6e 66 6f 3b 0a 20 20 20 20 70 50 61 72  peInfo;.    pPar
1e060 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
1e070 61 72 73 65 3b 0a 20 20 20 20 70 54 61 62 4c 69  arse;.    pTabLi
1e080 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
1e090 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
1e0a0 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
1e0b0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
1e0c0 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
1e0d0 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
1e0e0 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
1e0f0 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
1e100 28 70 54 61 62 21 3d 30 29 20 26 26 20 28 70 54  (pTab!=0) && (pT
1e110 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
1e120 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20  F_Ephemeral)!=0 
1e130 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
1e140 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
1e150 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1e160 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
1e170 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
1e180 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
1e190 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
1e1a0 74 28 20 70 53 65 6c 20 29 3b 0a 20 20 20 20 20  t( pSel );.     
1e1b0 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e     while( pSel->
1e1c0 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20  pPrior ) pSel = 
1e1d0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  pSel->pPrior;.  
1e1e0 20 20 20 20 20 20 73 65 6c 65 63 74 41 64 64 43        selectAddC
1e1f0 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c  olumnTypeAndColl
1e200 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54  ation(pParse, pT
1e210 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e  ab->nCol, pTab->
1e220 61 43 6f 6c 2c 20 70 53 65 6c 29 3b 0a 20 20 20  aCol, pSel);.   
1e230 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1e240 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1e250 69 6e 75 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  inue;.}.#endif..
1e260 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1e270 69 6e 65 20 61 64 64 73 20 64 61 74 61 74 79 70  ine adds datatyp
1e280 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  e and collating 
1e290 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61  sequence informa
1e2a0 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54  tion to.** the T
1e2b0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 73 20  able structures 
1e2c0 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  of all FROM-clau
1e2d0 73 65 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  se subqueries in
1e2e0 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
1e2f0 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73  tement..**.** Us
1e300 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  e this routine a
1e310 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75  fter name resolu
1e320 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1e330 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
1e340 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61  ctAddTypeInfo(Pa
1e350 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
1e360 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23  ect *pSelect){.#
1e370 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e380 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61  IT_SUBQUERY.  Wa
1e390 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c  lker w;.  w.xSel
1e3a0 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
1e3b0 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54  lectAddSubqueryT
1e3c0 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78  ypeInfo;.  w.xEx
1e3d0 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
1e3e0 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
1e3f0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
1e400 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
1e410 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
1e420 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
1e430 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1e440 73 65 74 73 20 6f 66 20 61 20 53 45 4c 45 43 54  sets of a SELECT
1e450 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70   statement for p
1e460 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a  rocessing.  The.
1e470 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
1e480 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a  accomplished:.**
1e490 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20  .**     *  VDBE 
1e4a0 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61  Cursor numbers a
1e4b0 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  re assigned to a
1e4c0 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74  ll FROM-clause t
1e4d0 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  erms..**     *  
1e4e0 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  Ephemeral Table 
1e4f0 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
1e500 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d  ted for all FROM
1e510 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
1e520 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e  es..**     *  ON
1e530 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
1e540 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69  es are shifted i
1e550 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d  nto WHERE statem
1e560 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57  ents.**     *  W
1e570 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64  ildcards "*" and
1e580 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65   "TABLE.*" in re
1e590 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78  sult sets are ex
1e5a0 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a  panded..**     *
1e5b0 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e    Identifiers in
1e5c0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20   expression are 
1e5d0 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65  matched to table
1e5e0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
1e5f0 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72  utine acts recur
1e600 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75  sively on all su
1e610 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20  bqueries within 
1e620 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
1e630 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
1e640 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a  tPrep(.  Parse *
1e650 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
1e660 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
1e670 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
1e680 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1e690 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
1e6a0 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
1e6b0 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65  coded. */.  Name
1e6c0 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e  Context *pOuterN
1e6d0 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65  C  /* Name conte
1e6e0 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72  xt for container
1e6f0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
1e700 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45   *db;.  if( NEVE
1e710 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(p==0) ) return
1e720 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
1e730 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65  >db;.  if( p->se
1e740 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
1e750 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e  ypeInfo ) return
1e760 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1e770 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20  tExpand(pParse, 
1e780 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p);.  if( pParse
1e790 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
1e7a0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1e7b0 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  urn;.  sqlite3Re
1e7c0 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73  solveSelectNames
1e7d0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74  (pParse, p, pOut
1e7e0 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61  erNC);.  if( pPa
1e7f0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
1e800 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1e810 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
1e820 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e  3SelectAddTypeIn
1e830 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d  fo(pParse, p);.}
1e840 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
1e850 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
1e860 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  mulator..**.** T
1e870 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
1e880 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65  umulator is a se
1e890 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t of memory cell
1e8a0 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69  s that hold.** i
1e8b0 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
1e8c0 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c  lts while calcul
1e8d0 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61  ating an aggrega
1e8e0 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  te.  This.** rou
1e8f0 74 69 6e 65 20 73 69 6d 70 6c 79 20 73 74 6f 72  tine simply stor
1e900 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20  es NULLs in all 
1e910 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20  of those memory 
1e920 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
1e930 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d   void resetAccum
1e940 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
1e950 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
1e960 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
1e970 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1e980 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
1e990 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
1e9a0 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66  unc *pFunc;.  if
1e9b0 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  ( pAggInfo->nFun
1e9c0 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  c+pAggInfo->nCol
1e9d0 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  umn==0 ){.    re
1e9e0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  turn;.  }.  for(
1e9f0 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
1ea00 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
1ea10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ea20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1ea30 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61  , 0, pAggInfo->a
1ea40 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20  Col[i].iMem);.  
1ea50 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41  }.  for(pFunc=pA
1ea60 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69  ggInfo->aFunc, i
1ea70 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
1ea80 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e  nFunc; i++, pFun
1ea90 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  c++){.    sqlite
1eaa0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1eab0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46 75 6e 63  P_Null, 0, pFunc
1eac0 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28  ->iMem);.    if(
1ead0 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
1eae0 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  t>=0 ){.      Ex
1eaf0 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e  pr *pE = pFunc->
1eb00 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
1eb10 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1eb20 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73  perty(pE, EP_xIs
1eb30 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
1eb40 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74   if( pE->x.pList
1eb50 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69  ==0 || pE->x.pLi
1eb60 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  st->nExpr!=1 ){.
1eb70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1eb80 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1eb90 22 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67  "DISTINCT aggreg
1eba0 61 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65  ates must have e
1ebb0 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20  xactly one ".   
1ebc0 20 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e          "argumen
1ebd0 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75  t");.        pFu
1ebe0 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  nc->iDistinct = 
1ebf0 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
1ec00 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
1ec10 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79   *pKeyInfo = key
1ec20 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
1ec30 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70  (pParse, pE->x.p
1ec40 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73  List);.        s
1ec50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1ec60 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
1ec70 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69  eral, pFunc->iDi
1ec80 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  stinct, 0, 0,.  
1ec90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eca0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1ecb0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
1ecc0 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
1ecd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1ece0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
1ecf0 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69  the OP_AggFinali
1ed00 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76  ze opcode for ev
1ed10 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75  ery aggregate fu
1ed20 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65  nction.** in the
1ed30 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75   AggInfo structu
1ed40 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
1ed50 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75  id finalizeAggFu
1ed60 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70  nctions(Parse *p
1ed70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
1ed80 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
1ed90 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1eda0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
1edb0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
1edc0 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28  func *pF;.  for(
1edd0 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
1ede0 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
1edf0 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
1ee00 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72   pF++){.    Expr
1ee10 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
1ee20 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ->pExpr->x.pList
1ee30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
1ee40 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1ee50 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  F->pExpr, EP_xIs
1ee60 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73  Select) );.    s
1ee70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1ee80 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c  (v, OP_AggFinal,
1ee90 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74   pF->iMem, pList
1eea0 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
1eeb0 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  : 0, 0,.        
1eec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
1eed0 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
1eee0 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d  P4_FUNCDEF);.  }
1eef0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65  .}../*.** Update
1ef00 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
1ef10 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f   memory cells fo
1ef20 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62  r an aggregate b
1ef30 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  ased on.** the c
1ef40 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f  urrent cursor po
1ef50 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  sition..*/.stati
1ef60 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63  c void updateAcc
1ef70 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
1ef80 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
1ef90 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
1efa0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1efb0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
1efc0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
1efd0 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72  _func *pF;.  str
1efe0 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
1eff0 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f  *pC;..  pAggInfo
1f000 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  ->directMode = 1
1f010 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
1f020 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
1f030 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  );.  for(i=0, pF
1f040 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
1f050 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
1f060 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
1f070 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20  .    int nArg;. 
1f080 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20     int addrNext 
1f090 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  = 0;.    int reg
1f0a0 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  Agg;.    ExprLis
1f0b0 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
1f0c0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
1f0d0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1f0e0 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
1f0f0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1f100 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ect) );.    if( 
1f110 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
1f120 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  Arg = pList->nEx
1f130 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67  pr;.      regAgg
1f140 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1f150 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
1f160 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Arg);.      sqli
1f170 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
1f180 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
1f190 74 2c 20 72 65 67 41 67 67 2c 20 31 29 3b 0a 20  t, regAgg, 1);. 
1f1a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f1b0 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  nArg = 0;.      
1f1c0 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20  regAgg = 0;.    
1f1d0 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44  }.    if( pF->iD
1f1e0 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
1f1f0 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73      addrNext = s
1f200 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1f210 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73  bel(v);.      as
1f220 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b  sert( nArg==1 );
1f230 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69  .      codeDisti
1f240 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e  nct(pParse, pF->
1f250 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e  iDistinct, addrN
1f260 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b  ext, 1, regAgg);
1f270 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1f280 46 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61 67 73 20  F->pFunc->flags 
1f290 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
1f2a0 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
1f2b0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
1f2c0 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74   0;.      struct
1f2d0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1f2e0 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74  pItem;.      int
1f2f0 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   j;.      assert
1f300 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f  ( pList!=0 );  /
1f310 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46  * pList!=0 if pF
1f320 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44  ->pFunc has NEED
1f330 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f  COLL */.      fo
1f340 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(j=0, pItem=pLi
1f350 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26  st->a; !pColl &&
1f360 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49   j<nArg; j++, pI
1f370 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
1f380 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1f390 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
1f3a0 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
1f3b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f3c0 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
1f3d0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50        pColl = pP
1f3e0 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
1f3f0 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
1f400 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f410 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
1f420 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68  eq, 0, 0, 0, (ch
1f430 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
1f440 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20  OLLSEQ);.    }. 
1f450 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f460 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74  dOp4(v, OP_AggSt
1f470 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70  ep, 0, regAgg, p
1f480 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20  F->iMem,.       
1f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1f4a0 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c  void*)pF->pFunc,
1f4b0 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
1f4c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1f4d0 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72  ngeP5(v, (u8)nAr
1f4e0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
1f4f0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
1f500 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
1f510 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20  egAgg, nArg);.  
1f520 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1f530 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
1f540 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b  , regAgg, nArg);
1f550 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78  .    if( addrNex
1f560 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
1f570 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1f580 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b  el(v, addrNext);
1f590 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f5a0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
1f5b0 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rse);.    }.  }.
1f5c0 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70  .  /* Before pop
1f5d0 75 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63 75  ulating the accu
1f5e0 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72  mulator register
1f5f0 73 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c  s, clear the col
1f600 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20  umn cache..  ** 
1f610 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e  Otherwise, if an
1f620 79 20 6f 66 20 74 68 65 20 72 65 71 75 69 72 65  y of the require
1f630 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20  d column values 
1f640 61 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73  are already pres
1f650 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67  ent .  ** in reg
1f660 69 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45  isters, sqlite3E
1f670 78 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73  xprCode() may us
1f680 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f  e OP_SCopy to co
1f690 70 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a  py the value.  *
1f6a0 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42  * to pC->iMem. B
1f6b0 75 74 20 62 79 20 74 68 65 20 74 69 6d 65 20 74  ut by the time t
1f6c0 68 65 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  he value is used
1f6d0 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72  , the original r
1f6e0 65 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79  egister.  ** may
1f6f0 20 68 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c   have been used,
1f700 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68   invalidating th
1f710 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66  e underlying buf
1f720 66 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a  fer holding the.
1f730 20 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f    ** text or blo
1f740 62 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63  b value. See tic
1f750 6b 65 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d  ket [883034dcb5]
1f760 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74  ..  **.  ** Anot
1f770 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75  her solution wou
1f780 6c 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20  ld be to change 
1f790 74 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65  the OP_SCopy use
1f7a0 64 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64  d to copy cached
1f7b0 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20  .  ** values to 
1f7c0 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f  an OP_Copy..  */
1f7d0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
1f7e0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
1f7f0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d  ;.  for(i=0, pC=
1f800 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20  pAggInfo->aCol; 
1f810 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63  i<pAggInfo->nAcc
1f820 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70  umulator; i++, p
1f830 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  C++){.    sqlite
1f840 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1f850 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d  , pC->pExpr, pC-
1f860 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41  >iMem);.  }.  pA
1f870 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
1f880 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  de = 0;.  sqlite
1f890 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
1f8a0 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pParse);.}../*.*
1f8b0 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f  * Add a single O
1f8c0 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
1f8d0 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42  ction to the VDB
1f8e0 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73  E to explain a s
1f8f0 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a  imple.** count(*
1f900 29 20 71 75 65 72 79 20 28 22 53 45 4c 45 43 54  ) query ("SELECT
1f910 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70   count(*) FROM p
1f920 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  Tab")..*/.#ifnde
1f930 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
1f940 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69  PLAIN.static voi
1f950 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43  d explainSimpleC
1f960 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  ount(.  Parse *p
1f970 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
1f980 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
1f990 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
1f9a0 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
1f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f9c0 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   Table being que
1f9d0 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ried */.  Index 
1f9e0 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
1f9f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1fa00 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d  ex used to optim
1fa10 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c  ize scan, or NUL
1fa20 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50  L */.){.  if( pP
1fa30 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
1fa40 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   ){.    char *zE
1fa50 71 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  qp = sqlite3MPri
1fa60 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
1fa70 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73 20 25  "SCAN TABLE %s %
1fa80 73 25 73 28 7e 25 64 20 72 6f 77 73 29 22 2c 0a  s%s(~%d rows)",.
1fa90 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
1faa0 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 49  ame, .        pI
1fab0 64 78 20 3f 20 22 55 53 49 4e 47 20 43 4f 56 45  dx ? "USING COVE
1fac0 52 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22  RING INDEX " : "
1fad0 22 2c 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  ",.        pIdx 
1fae0 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20  ? pIdx->zName : 
1faf0 22 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  "",.        pTab
1fb00 2d 3e 6e 52 6f 77 45 73 74 0a 20 20 20 20 29 3b  ->nRowEst.    );
1fb10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1fb20 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20  AddOp4(.        
1fb30 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
1fb40 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
1fb50 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
1fb60 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e   0, zEqp, P4_DYN
1fb70 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  AMIC.    );.  }.
1fb80 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
1fb90 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f   explainSimpleCo
1fba0 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69  unt(a,b,c).#endi
1fbb0 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
1fbc0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53  e code for the S
1fbd0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1fbe0 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61  given in the p a
1fbf0 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  rgument.  .**.**
1fc00 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
1fc10 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
1fc20 76 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70  various ways dep
1fc30 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a  ending on the.**
1fc40 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1fc50 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75   SelectDest stru
1fc60 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
1fc70 20 62 79 20 61 72 67 75 6d 65 6e 74 20 70 44 65   by argument pDe
1fc80 73 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73  st.** as follows
1fc90 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73  :.**.**     pDes
1fca0 74 2d 3e 65 44 65 73 74 20 20 20 20 52 65 73 75  t->eDest    Resu
1fcb0 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d  lt.**     ------
1fcc0 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
1fcd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fcf0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54  -----.**     SRT
1fd00 5f 4f 75 74 70 75 74 20 20 20 20 20 20 47 65 6e  _Output      Gen
1fd10 65 72 61 74 65 20 61 20 72 6f 77 20 6f 66 20 6f  erate a row of o
1fd20 75 74 70 75 74 20 28 75 73 69 6e 67 20 74 68 65  utput (using the
1fd30 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 0a 2a 2a   OP_ResultRow.**
1fd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd50 20 20 20 20 20 6f 70 63 6f 64 65 29 20 66 6f 72       opcode) for
1fd60 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65   each row in the
1fd70 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a   result set..**.
1fd80 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20  **     SRT_Mem  
1fd90 20 20 20 20 20 20 20 4f 6e 6c 79 20 76 61 6c 69         Only vali
1fda0 64 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20  d if the result 
1fdb0 69 73 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  is a single colu
1fdc0 6d 6e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  mn..**          
1fdd0 20 20 20 20 20 20 20 20 20 20 20 53 74 6f 72 65             Store
1fde0 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d   the first colum
1fdf0 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  n of the first r
1fe00 65 73 75 6c 74 20 72 6f 77 0a 2a 2a 20 20 20 20  esult row.**    
1fe10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe20 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 44 65   in register pDe
1fe30 73 74 2d 3e 69 50 61 72 6d 20 74 68 65 6e 20 61  st->iParm then a
1fe40 62 61 6e 64 6f 6e 20 74 68 65 20 72 65 73 74 0a  bandon the rest.
1fe50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1fe60 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 71 75         of the qu
1fe70 65 72 79 2e 20 20 54 68 69 73 20 64 65 73 74 69  ery.  This desti
1fe80 6e 61 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 22  nation implies "
1fe90 4c 49 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20  LIMIT 1"..**.** 
1fea0 20 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20      SRT_Set     
1feb0 20 20 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d      The result m
1fec0 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ust be a single 
1fed0 63 6f 6c 75 6d 6e 2e 20 20 53 74 6f 72 65 20 65  column.  Store e
1fee0 61 63 68 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ach.**          
1fef0 20 20 20 20 20 20 20 20 20 20 20 72 6f 77 20 6f             row o
1ff00 66 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20  f result as the 
1ff10 6b 65 79 20 69 6e 20 74 61 62 6c 65 20 70 44 65  key in table pDe
1ff20 73 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20 20  st->iParm. .**  
1ff30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff40 20 20 20 41 70 70 6c 79 20 74 68 65 20 61 66 66     Apply the aff
1ff50 69 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66 66  inity pDest->aff
1ff60 69 6e 69 74 79 20 62 65 66 6f 72 65 20 73 74 6f  inity before sto
1ff70 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  ring.**         
1ff80 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75              resu
1ff90 6c 74 73 2e 20 20 55 73 65 64 20 74 6f 20 69 6d  lts.  Used to im
1ffa0 70 6c 65 6d 65 6e 74 20 22 49 4e 20 28 53 45 4c  plement "IN (SEL
1ffb0 45 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a  ECT ...)"..**.**
1ffc0 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20       SRT_Union  
1ffd0 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
1ffe0 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61  ts as a key in a
1fff0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
20000 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a   pDest->iParm..*
20010 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63  *.**     SRT_Exc
20020 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20  ept      Remove 
20030 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65  results from the
20040 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
20050 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a   pDest->iParm..*
20060 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62  *.**     SRT_Tab
20070 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72  le       Store r
20080 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72  esults in tempor
20090 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d  ary table pDest-
200a0 3e 69 50 61 72 6d 2e 0a 2a 2a 20 20 20 20 20 20  >iParm..**      
200b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
200c0 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54 5f  his is like SRT_
200d0 45 70 68 65 6d 54 61 62 20 65 78 63 65 70 74 20  EphemTab except 
200e0 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 0a 2a  that the table.*
200f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
20100 20 20 20 20 20 20 69 73 20 61 73 73 75 6d 65 64        is assumed
20110 20 74 6f 20 61 6c 72 65 61 64 79 20 62 65 20 6f   to already be o
20120 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  pen..**.**     S
20130 52 54 5f 45 70 68 65 6d 54 61 62 20 20 20 20 43  RT_EphemTab    C
20140 72 65 61 74 65 20 61 6e 20 74 65 6d 70 6f 72 61  reate an tempora
20150 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  ry table pDest->
20160 69 50 61 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a  iParm and store.
20170 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
20180 20 20 20 20 20 20 20 74 68 65 20 72 65 73 75 6c         the resul
20190 74 20 74 68 65 72 65 2e 20 54 68 65 20 63 75 72  t there. The cur
201a0 73 6f 72 20 69 73 20 6c 65 66 74 20 6f 70 65 6e  sor is left open
201b0 20 61 66 74 65 72 0a 2a 2a 20 20 20 20 20 20 20   after.**       
201c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
201d0 74 75 72 6e 69 6e 67 2e 20 20 54 68 69 73 20 69  turning.  This i
201e0 73 20 6c 69 6b 65 20 53 52 54 5f 54 61 62 6c 65  s like SRT_Table
201f0 20 65 78 63 65 70 74 20 74 68 61 74 0a 2a 2a 20   except that.** 
20200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20210 20 20 20 20 74 68 69 73 20 64 65 73 74 69 6e 61      this destina
20220 74 69 6f 6e 20 75 73 65 73 20 4f 50 5f 4f 70 65  tion uses OP_Ope
20230 6e 45 70 68 65 6d 65 72 61 6c 20 74 6f 20 63 72  nEphemeral to cr
20240 65 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  eate.**         
20250 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
20260 74 61 62 6c 65 20 66 69 72 73 74 2e 0a 2a 2a 0a  table first..**.
20270 2a 2a 20 20 20 20 20 53 52 54 5f 43 6f 72 6f 75  **     SRT_Corou
20280 74 69 6e 65 20 20 20 47 65 6e 65 72 61 74 65 20  tine   Generate 
20290 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61  a co-routine tha
202a0 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20  t returns a new 
202b0 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  row of.**       
202c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
202d0 73 75 6c 74 73 20 65 61 63 68 20 74 69 6d 65 20  sults each time 
202e0 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20  it is invoked.  
202f0 54 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74 0a  The entry point.
20300 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
20310 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
20320 2d 72 6f 75 74 69 6e 65 20 69 73 20 73 74 6f 72  -routine is stor
20330 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 70  ed in register p
20340 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a  Dest->iParm..**.
20350 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 69 73 74  **     SRT_Exist
20360 73 20 20 20 20 20 20 53 74 6f 72 65 20 61 20 31  s      Store a 1
20370 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
20380 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 69 66 20  pDest->iParm if 
20390 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20  the result.**   
203a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203b0 20 20 73 65 74 20 69 73 20 6e 6f 74 20 65 6d 70    set is not emp
203c0 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  ty..**.**     SR
203d0 54 5f 44 69 73 63 61 72 64 20 20 20 20 20 54 68  T_Discard     Th
203e0 72 6f 77 20 74 68 65 20 72 65 73 75 6c 74 73 20  row the results 
203f0 61 77 61 79 2e 20 20 54 68 69 73 20 69 73 20 75  away.  This is u
20400 73 65 64 20 62 79 20 53 45 4c 45 43 54 0a 2a 2a  sed by SELECT.**
20410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20420 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 73 20       statements 
20430 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73 20  within triggers 
20440 77 68 6f 73 65 20 6f 6e 6c 79 20 70 75 72 70 6f  whose only purpo
20450 73 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20  se is.**        
20460 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
20470 20 73 69 64 65 2d 65 66 66 65 63 74 73 20 6f 66   side-effects of
20480 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a   functions..**.*
20490 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
204a0 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
204b0 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
204c0 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a   any errors are.
204d0 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
204e0 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  then an appropri
204f0 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ate error messag
20500 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20  e is left in.** 
20510 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
20520 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
20530 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65  ine does NOT fre
20540 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  e the Select str
20550 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e  ucture passed in
20560 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
20570 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73  g function needs
20580 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
20590 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
205a0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
205b0 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
205c0 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
205d0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
205e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
205f0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
20600 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
20610 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  d. */.  SelectDe
20620 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f  st *pDest      /
20630 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
20640 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  h the query resu
20650 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
20660 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
20670 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
20680 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ers */.  WhereIn
20690 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
206a0 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73  /* Return from s
206b0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
206c0 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  () */.  Vdbe *v;
206d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
206e0 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
206f0 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73  chine under cons
20700 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
20710 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20  t isAgg;        
20720 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
20730 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69   select lists li
20740 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f  ke "count(*)" */
20750 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
20760 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ist;      /* Lis
20770 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
20780 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72  extract. */.  Sr
20790 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
207a0 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
207b0 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74  tables to select
207c0 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20   from */.  Expr 
207d0 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
207e0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
207f0 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
20800 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
20810 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
20820 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
20830 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
20840 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
20850 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20  st *pGroupBy;   
20860 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59   /* The GROUP BY
20870 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
20880 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
20890 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20  *pHaving;       
208a0 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20    /* The HAVING 
208b0 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
208c0 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73  NULL */.  int is
208d0 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
208e0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
208f0 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
20900 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
20910 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20   int distinct;  
20920 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
20930 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
20940 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a  distinct set */.
20950 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20    int rc = 1;   
20960 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
20970 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d  e to return from
20980 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
20990 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74  /.  int addrSort
209a0 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41 64  Index;     /* Ad
209b0 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f  dress of an OP_O
209c0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
209d0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
209e0 74 20 61 64 64 72 44 69 73 74 69 6e 63 74 49 6e  t addrDistinctIn
209f0 64 65 78 3b 20 2f 2a 20 41 64 64 72 65 73 73 20  dex; /* Address 
20a00 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68  of an OP_OpenEph
20a10 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
20a20 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20  on */.  AggInfo 
20a30 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f  sAggInfo;      /
20a40 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73  * Information us
20a50 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20  ed by aggregate 
20a60 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74  queries */.  int
20a70 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20   iEnd;          
20a80 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
20a90 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
20aa0 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69   query */.  sqli
20ab0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
20ac0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
20ad0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
20ae0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20af0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
20b00 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65  int iRestoreSele
20b10 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69  ctId = pParse->i
20b20 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72  SelectId;.  pPar
20b30 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20  se->iSelectId = 
20b40 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
20b50 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a  ectId++;.#endif.
20b60 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
20b70 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  db;.  if( p==0 |
20b80 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
20b90 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
20ba0 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rr ){.    return
20bb0 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   1;.  }.  if( sq
20bc0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
20bd0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
20be0 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29  LECT, 0, 0, 0) )
20bf0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d   return 1;.  mem
20c00 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30  set(&sAggInfo, 0
20c10 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66  , sizeof(sAggInf
20c20 6f 29 29 3b 0a 0a 20 20 69 66 28 20 49 67 6e 6f  o));..  if( Igno
20c30 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65  rableOrderby(pDe
20c40 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  st) ){.    asser
20c50 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  t(pDest->eDest==
20c60 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44  SRT_Exists || pD
20c70 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
20c80 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20  Union || .      
20c90 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
20ca0 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c  t==SRT_Except ||
20cb0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
20cc0 52 54 5f 44 69 73 63 61 72 64 29 3b 0a 20 20 20  RT_Discard);.   
20cd0 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20   /* If ORDER BY 
20ce0 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65  makes no differe
20cf0 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75  nce in the outpu
20d00 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64  t then neither d
20d10 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49  oes.    ** DISTI
20d20 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65  NCT so it can be
20d30 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f   removed too. */
20d40 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
20d50 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
20d60 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
20d70 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
20d80 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
20d90 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63  s &= ~SF_Distinc
20da0 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  t;.  }.  sqlite3
20db0 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73  SelectPrep(pPars
20dc0 65 2c 20 70 2c 20 30 29 3b 0a 20 20 70 4f 72 64  e, p, 0);.  pOrd
20dd0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
20de0 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  By;.  pTabList =
20df0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
20e00 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
20e10 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
20e20 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
20e30 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
20e40 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
20e50 20 7d 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d   }.  isAgg = (p-
20e60 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
20e70 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20  ggregate)!=0;.  
20e80 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
20e90 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  0 );..  /* Begin
20ea0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65   generating code
20eb0 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
20ec0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
20ed0 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
20ee0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
20ef0 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74  d;..  /* If writ
20f00 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72  ing to memory or
20f10 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65   generating a se
20f20 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69  t.  ** only a si
20f30 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20  ngle column may 
20f40 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
20f50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20f60 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69  MIT_SUBQUERY.  i
20f70 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69  f( checkForMulti
20f80 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f  ColumnSelectErro
20f90 72 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c  r(pParse, pDest,
20fa0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20   pEList->nExpr) 
20fb0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
20fc0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
20fd0 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
20fe0 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73  e code for all s
20ff0 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68  ub-queries in th
21000 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
21010 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
21020 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
21030 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
21040 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
21050 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21  EW).  for(i=0; !
21060 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70  p->pPrior && i<p
21070 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
21080 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
21090 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
210a0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
210b0 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
210c0 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
210d0 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
210e0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Item->pSelect;. 
210f0 20 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b     int isAggSub;
21100 0a 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d  ..    if( pSub==
21110 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
21120 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64    if( pItem->add
21130 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20  rFillSub ){.    
21140 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21150 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
21160 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
21170 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  n, pItem->addrFi
21180 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 63 6f  llSub);.      co
21190 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20  ntinue;.    }.. 
211a0 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
211b0 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79  Parse.nHeight by
211c0 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74   the height of t
211d0 68 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65  he largest expre
211e0 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65  ssion.    ** tre
211f0 65 20 72 65 66 65 72 65 64 20 74 6f 20 62 79 20  e refered to by 
21200 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74  this, the parent
21210 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69   select. The chi
21220 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a  ld select.    **
21230 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70   may contain exp
21240 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66  ression trees of
21250 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20   at most.    ** 
21260 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52  (SQLITE_MAX_EXPR
21270 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65  _DEPTH-Parse.nHe
21280 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68  ight) height. Th
21290 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20  is is a bit.    
212a0 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61  ** more conserva
212b0 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73  tive than necess
212c0 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61  ary, but much ea
212d0 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63  sier than enforc
212e0 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78  ing.    ** an ex
212f0 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a  act limit..    *
21300 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48  /.    pParse->nH
21310 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33  eight += sqlite3
21320 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
21330 28 70 29 3b 0a 0a 20 20 20 20 69 73 41 67 67 53  (p);..    isAggS
21340 75 62 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46  ub = (pSub->selF
21350 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
21360 61 74 65 29 21 3d 30 3b 0a 20 20 20 20 69 66 28  ate)!=0;.    if(
21370 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
21380 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69  (pParse, p, i, i
21390 73 41 67 67 2c 20 69 73 41 67 67 53 75 62 29 20  sAgg, isAggSub) 
213a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
213b0 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65   subquery can be
213c0 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69   absorbed into i
213d0 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  ts parent. */.  
213e0 20 20 20 20 69 66 28 20 69 73 41 67 67 53 75 62      if( isAggSub
213f0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67   ){.        isAg
21400 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  g = 1;.        p
21410 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
21420 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20  _Aggregate;.    
21430 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31    }.      i = -1
21440 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21450 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
21460 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
21470 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70   will fill an ep
21480 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
21490 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  th.      ** the 
214a0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20  content of this 
214b0 73 75 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d  subquery.  pItem
214c0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69  ->addrFillSub wi
214d0 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a  ll point.      *
214e0 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73  * to the address
214f0 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65   of the generate
21500 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70  d subroutine.  p
21510 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a  Item->regReturn.
21520 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65        ** is a re
21530 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64  gister allocated
21540 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62   to hold the sub
21550 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61  routine return a
21560 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a  ddress.      */.
21570 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64        int topAdd
21580 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63  r;.      int onc
21590 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  eAddr = 0;.     
215a0 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20   int retAddr;.  
215b0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
215c0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d  m->addrFillSub==
215d0 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  0 );.      pItem
215e0 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
215f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
21600 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71      topAddr = sq
21610 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21620 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
21630 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
21640 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  rn);.      pItem
21650 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
21660 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20  topAddr+1;.     
21670 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
21680 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a  ((v, "materializ
21690 65 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54  e %s", pItem->pT
216a0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
216b0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 73     if( pItem->is
216c0 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b  Correlated==0 ){
216d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
216e0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
216f0 6f 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64  o correlated and
21700 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69   if we are not i
21710 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20  nside of.       
21720 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74   ** a trigger, t
21730 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64  hen we only need
21740 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
21750 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62  value of the sub
21760 71 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  query.        **
21770 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20   once. */.      
21780 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c    onceAddr = sql
21790 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
217a0 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rse);.      }.  
217b0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
217c0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
217d0 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70   SRT_EphemTab, p
217e0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
217f0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
21800 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69  Integer(pItem->i
21810 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50  SelectId, (u8)pP
21820 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
21830 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tId);.      sqli
21840 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
21850 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
21860 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
21870 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 28 75 6e  b->nRowEst = (un
21880 73 69 67 6e 65 64 29 70 53 75 62 2d 3e 6e 53 65  signed)pSub->nSe
21890 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69  lectRow;.      i
218a0 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20 73 71  f( onceAddr ) sq
218b0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
218c0 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a  e(v, onceAddr);.
218d0 20 20 20 20 20 20 72 65 74 41 64 64 72 20 3d 20        retAddr = 
218e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
218f0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
21900 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
21910 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
21920 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73  ment((v, "end %s
21930 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
21940 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
21950 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
21960 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c 20 72  P1(v, topAddr, r
21970 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20 73  etAddr);.      s
21980 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
21990 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b  egCache(pParse);
219a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2f  .    }.    if( /
219b0 2a 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c  *pParse->nErr ||
219c0 2a 2f 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  */ db->mallocFai
219d0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  led ){.      got
219e0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
219f0 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
21a00 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74  nHeight -= sqlit
21a10 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
21a20 68 74 28 70 29 3b 0a 20 20 20 20 70 54 61 62 4c  ht(p);.    pTabL
21a30 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
21a40 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c     if( !Ignorabl
21a50 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
21a60 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  ){.      pOrderB
21a70 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
21a80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c  .    }.  }.  pEL
21a90 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
21aa0 0a 23 65 6e 64 69 66 0a 20 20 70 57 68 65 72 65  .#endif.  pWhere
21ab0 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
21ac0 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
21ad0 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
21ae0 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
21af0 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 28    isDistinct = (
21b00 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
21b10 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a  _Distinct)!=0;..
21b20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21b30 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
21b40 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  ECT.  /* If ther
21b50 65 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65  e is are a seque
21b60 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20  nce of queries, 
21b70 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f  do the earlier o
21b80 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a  nes first..  */.
21b90 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
21ba0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52  ){.    if( p->pR
21bb0 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20  ightmost==0 ){. 
21bc0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f       Select *pLo
21bd0 6f 70 2c 20 2a 70 52 69 67 68 74 20 3d 20 30 3b  op, *pRight = 0;
21be0 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
21bf0 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78   0;.      int mx
21c00 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 66 6f  Select;.      fo
21c10 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
21c20 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
21c30 50 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20  Prior, cnt++){. 
21c40 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52         pLoop->pR
21c50 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20  ightmost = p;.  
21c60 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65        pLoop->pNe
21c70 78 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  xt = pRight;.   
21c80 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c       pRight = pL
21c90 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oop;.      }.   
21ca0 20 20 20 6d 78 53 65 6c 65 63 74 20 3d 20 64 62     mxSelect = db
21cb0 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
21cc0 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
21cd0 45 4c 45 43 54 5d 3b 0a 20 20 20 20 20 20 69 66  ELECT];.      if
21ce0 28 20 6d 78 53 65 6c 65 63 74 20 26 26 20 63 6e  ( mxSelect && cn
21cf0 74 3e 6d 78 53 65 6c 65 63 74 20 29 7b 0a 20 20  t>mxSelect ){.  
21d00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
21d10 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
21d20 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e  oo many terms in
21d30 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
21d40 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  ");.        goto
21d50 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
21d60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
21d70 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  c = multiSelect(
21d80 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
21d90 29 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 53 65  );.    explainSe
21da0 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d  tInteger(pParse-
21db0 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73  >iSelectId, iRes
21dc0 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 20  toreSelectId);. 
21dd0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
21de0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
21df0 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20  f there is both 
21e00 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61  a GROUP BY and a
21e10 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
21e20 65 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20  e and they are. 
21e30 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74   ** identical, t
21e40 68 65 6e 20 64 69 73 61 62 6c 65 20 74 68 65 20  hen disable the 
21e50 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
21e60 73 69 6e 63 65 20 74 68 65 20 47 52 4f 55 50 20  since the GROUP 
21e70 42 59 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 61 75  BY.  ** will cau
21e80 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63  se elements to c
21e90 6f 6d 65 20 6f 75 74 20 69 6e 20 74 68 65 20 63  ome out in the c
21ea0 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20 20 54  orrect order.  T
21eb0 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 6e 20 6f  his is.  ** an o
21ec0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68  ptimization - th
21ed0 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
21ee0 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72   should result r
21ef0 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 2a 2a 20  egardless..  ** 
21f00 55 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47  Use the SQLITE_G
21f10 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67  roupByOrder flag
21f20 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53   with SQLITE_TES
21f30 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 0a  TCTRL_OPTIMIZER.
21f40 20 20 2a 2a 20 74 6f 20 64 69 73 61 62 6c 65 20    ** to disable 
21f50 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
21f60 6e 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  n for testing pu
21f70 72 70 6f 73 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  rposes..  */.  i
21f80 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
21f90 73 74 43 6f 6d 70 61 72 65 28 70 2d 3e 70 47 72  stCompare(p->pGr
21fa0 6f 75 70 42 79 2c 20 70 4f 72 64 65 72 42 79 29  oupBy, pOrderBy)
21fb0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
21fc0 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
21fd0 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72  ITE_GroupByOrder
21fe0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 72 64  )==0 ){.    pOrd
21ff0 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erBy = 0;.  }.. 
22000 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
22010 20 69 73 20 44 49 53 54 49 4e 43 54 20 77 69 74   is DISTINCT wit
22020 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75  h an ORDER BY bu
22030 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  t is not an aggr
22040 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a  egate, and .  **
22050 20 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c   if the select-l
22060 69 73 74 20 69 73 20 74 68 65 20 73 61 6d 65 20  ist is the same 
22070 61 73 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  as the ORDER BY 
22080 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20  list, then this 
22090 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62  query.  ** can b
220a0 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61  e rewritten as a
220b0 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74   GROUP BY. In ot
220c0 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a  her words, this:
220d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
220e0 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78  ELECT DISTINCT x
220f0 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45  yz FROM ... ORDE
22100 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20  R BY xyz.  **.  
22110 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65  ** is transforme
22120 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d to:.  **.  ** 
22130 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46      SELECT xyz F
22140 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59  ROM ... GROUP BY
22150 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   xyz.  **.  ** T
22160 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
22170 73 20 70 72 65 66 65 72 72 65 64 20 61 73 20 61  s preferred as a
22180 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f   single index (o
22190 72 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61  r temp-table) ma
221a0 79 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20  y be .  ** used 
221b0 66 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44  for both the ORD
221c0 45 52 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  ER BY and DISTIN
221d0 43 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41  CT processing. A
221e0 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20  s originally .  
221f0 2a 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20 71  ** written the q
22200 75 65 72 79 20 6d 75 73 74 20 75 73 65 20 61 20  uery must use a 
22210 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61  temp-table for a
22220 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74  t least one of t
22230 68 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42  he ORDER .  ** B
22240 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20  Y and DISTINCT, 
22250 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20  and an index or 
22260 73 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61  separate temp-ta
22270 62 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65  ble for the othe
22280 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  r..  */.  if( (p
22290 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
222a0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
222b0 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
222c0 74 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c  tinct .   && sql
222d0 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
222e0 61 72 65 28 70 4f 72 64 65 72 42 79 2c 20 70 2d  are(pOrderBy, p-
222f0 3e 70 45 4c 69 73 74 29 3d 3d 30 0a 20 20 29 7b  >pEList)==0.  ){
22300 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
22310 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
22320 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42  ;.    p->pGroupB
22330 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
22340 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
22350 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 70 47  List, 0);.    pG
22360 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
22370 75 70 42 79 3b 0a 20 20 20 20 70 4f 72 64 65 72  upBy;.    pOrder
22380 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  By = 0;.  }..  /
22390 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
223a0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
223b0 2c 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74  , then this sort
223c0 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d  ing.  ** index m
223d0 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e  ight end up bein
223e0 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20  g unused if the 
223f0 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a  data can be .  *
22400 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70  * extracted in p
22410 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e  re-sorted order.
22420 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65    If that is the
22430 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a   case, then the.
22440 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65    ** OP_OpenEphe
22450 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
22460 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  n will be change
22470 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20  d to an OP_Noop 
22480 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67  once.  ** we fig
22490 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65  ure out that the
224a0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
224b0 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54  s not needed.  T
224c0 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  he addrSortIndex
224d0 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69  .  ** variable i
224e0 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69  s used to facili
224f0 74 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65  tate that change
22500 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
22510 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79  derBy ){.    Key
22520 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
22530 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
22540 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
22550 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
22560 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72  rBy);.    pOrder
22570 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70  By->iECursor = p
22580 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
22590 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
225a0 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74  hm[2] = addrSort
225b0 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71  Index =.      sq
225c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
225d0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
225e0 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ral,.           
225f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22600 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
22610 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  or, pOrderBy->nE
22620 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20  xpr+2, 0,.      
22630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22640 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
22650 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
22660 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c  _HANDOFF);.  }el
22670 73 65 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74  se{.    addrSort
22680 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a  Index = -1;.  }.
22690 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74  .  /* If the out
226a0 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20  put is destined 
226b0 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  for a temporary 
226c0 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74  table, open that
226d0 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
226e0 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
226f0 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
22700 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
22710 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
22720 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73  nEphemeral, pDes
22730 74 2d 3e 69 50 61 72 6d 2c 20 70 45 4c 69 73 74  t->iParm, pEList
22740 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20  ->nExpr);.  }.. 
22750 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69   /* Set the limi
22760 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64  ter..  */.  iEnd
22770 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
22780 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d  keLabel(v);.  p-
22790 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 28 64  >nSelectRow = (d
227a0 6f 75 62 6c 65 29 4c 41 52 47 45 53 54 5f 49 4e  ouble)LARGEST_IN
227b0 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69  T64;.  computeLi
227c0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
227d0 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20  rse, p, iEnd);. 
227e0 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d   if( p->iLimit==
227f0 30 20 26 26 20 61 64 64 72 53 6f 72 74 49 6e 64  0 && addrSortInd
22800 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ex>=0 ){.    sql
22810 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
22820 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 2d   addrSortIndex)-
22830 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72  >opcode = OP_Sor
22840 74 65 72 4f 70 65 6e 3b 0a 20 20 20 20 70 2d 3e  terOpen;.    p->
22850 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
22860 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20  seSorter;.  }.. 
22870 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75   /* Open a virtu
22880 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  al index to use 
22890 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
228a0 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   set..  */.  if(
228b0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
228c0 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  F_Distinct ){.  
228d0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
228e0 6e 66 6f 3b 0a 20 20 20 20 64 69 73 74 69 6e 63  nfo;.    distinc
228f0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
22900 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  ++;.    pKeyInfo
22910 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
22920 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
22930 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 61  ->pEList);.    a
22940 64 64 72 44 69 73 74 69 6e 63 74 49 6e 64 65 78  ddrDistinctIndex
22950 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
22960 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
22970 70 68 65 6d 65 72 61 6c 2c 20 64 69 73 74 69 6e  phemeral, distin
22980 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
22990 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
229a0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
229b0 4e 44 4f 46 46 29 3b 0a 20 20 20 20 73 71 6c 69  NDOFF);.    sqli
229c0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
229d0 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  v, BTREE_UNORDER
229e0 45 44 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ED);.  }else{.  
229f0 20 20 64 69 73 74 69 6e 63 74 20 3d 20 61 64 64    distinct = add
22a00 72 44 69 73 74 69 6e 63 74 49 6e 64 65 78 20 3d  rDistinctIndex =
22a10 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41   -1;.  }..  /* A
22a20 67 67 72 65 67 61 74 65 20 61 6e 64 20 6e 6f 6e  ggregate and non
22a30 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69  -aggregate queri
22a40 65 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 64  es are handled d
22a50 69 66 66 65 72 65 6e 74 6c 79 20 2a 2f 0a 20 20  ifferently */.  
22a60 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47  if( !isAgg && pG
22a70 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20  roupBy==0 ){.   
22a80 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74   ExprList *pDist
22a90 20 3d 20 28 69 73 44 69 73 74 69 6e 63 74 20 3f   = (isDistinct ?
22aa0 20 70 2d 3e 70 45 4c 69 73 74 20 3a 20 30 29 3b   p->pEList : 0);
22ab0 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74  ..    /* Begin t
22ac0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
22ad0 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20  . */.    pWInfo 
22ae0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
22af0 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
22b00 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70  List, pWhere, &p
22b10 4f 72 64 65 72 42 79 2c 20 70 44 69 73 74 2c 20  OrderBy, pDist, 
22b20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  0);.    if( pWIn
22b30 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
22b40 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
22b50 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
22b60 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   < p->nSelectRow
22b70 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
22b80 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f   = pWInfo->nRowO
22b90 75 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73  ut;..    /* If s
22ba0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
22bb0 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  t was created by
22bc0 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e   a prior OP_Open
22bd0 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a  Ephemeral .    *
22be0 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e  * instruction en
22bf0 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67  ded up not being
22c00 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68   needed, then ch
22c10 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
22c20 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a  Ephemeral.    **
22c30 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70   into an OP_Noop
22c40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
22c50 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d   addrSortIndex>=
22c60 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30  0 && pOrderBy==0
22c70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22c80 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
22c90 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64  p(v, addrSortInd
22ca0 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  ex);.      p->ad
22cb0 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
22cc0 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  -1;.    }..    i
22cd0 66 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  f( pWInfo->eDist
22ce0 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 56 64  inct ){.      Vd
22cf0 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20  beOp *pOp;      
22d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
22d10 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 20  longer required 
22d20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
22d30 73 74 72 2e 20 2a 2f 0a 20 20 20 20 20 0a 20 20  str. */.     .  
22d40 20 20 20 20 61 73 73 65 72 74 28 20 61 64 64 72      assert( addr
22d50 44 69 73 74 69 6e 63 74 49 6e 64 65 78 3e 3d 30  DistinctIndex>=0
22d60 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20   );.      pOp = 
22d70 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
22d80 28 76 2c 20 61 64 64 72 44 69 73 74 69 6e 63 74  (v, addrDistinct
22d90 49 6e 64 65 78 29 3b 0a 0a 20 20 20 20 20 20 61  Index);..      a
22da0 73 73 65 72 74 28 20 69 73 44 69 73 74 69 6e 63  ssert( isDistinc
22db0 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
22dc0 74 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  t( pWInfo->eDist
22dd0 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54  inct==WHERE_DIST
22de0 49 4e 43 54 5f 4f 52 44 45 52 45 44 20 0a 20 20  INCT_ORDERED .  
22df0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57 49 6e           || pWIn
22e00 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57  fo->eDistinct==W
22e10 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
22e20 49 51 55 45 20 0a 20 20 20 20 20 20 29 3b 0a 20  IQUE .      );. 
22e30 20 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20       distinct = 
22e40 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  -1;.      if( pW
22e50 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d  Info->eDistinct=
22e60 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
22e70 4f 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20 20  ORDERED ){.     
22e80 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b 0a 20 20     int iJump;.  
22e90 20 20 20 20 20 20 69 6e 74 20 69 45 78 70 72 3b        int iExpr;
22ea0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 46 6c  .        int iFl
22eb0 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
22ec0 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Mem;.        int
22ed0 20 69 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d   iBase = pParse-
22ee0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
22ef0 20 69 6e 74 20 69 42 61 73 65 32 20 3d 20 69 42   int iBase2 = iB
22f00 61 73 65 20 2b 20 70 45 4c 69 73 74 2d 3e 6e 45  ase + pEList->nE
22f10 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61  xpr;.        pPa
22f20 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 28 70 45  rse->nMem += (pE
22f30 4c 69 73 74 2d 3e 6e 45 78 70 72 2a 32 29 3b 0a  List->nExpr*2);.
22f40 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  .        /* Chan
22f50 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
22f60 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61  hemeral coded ea
22f70 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 49  rlier to an OP_I
22f80 6e 74 65 67 65 72 2e 20 54 68 65 0a 20 20 20 20  nteger. The.    
22f90 20 20 20 20 2a 2a 20 4f 50 5f 49 6e 74 65 67 65      ** OP_Intege
22fa0 72 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  r initializes th
22fb0 65 20 22 66 69 72 73 74 20 72 6f 77 22 20 66 6c  e "first row" fl
22fc0 61 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ag.  */.        
22fd0 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
22fe0 5f 49 6e 74 65 67 65 72 3b 0a 20 20 20 20 20 20  _Integer;.      
22ff0 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20    pOp->p1 = 1;. 
23000 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
23010 20 69 46 6c 61 67 3b 0a 0a 20 20 20 20 20 20 20   iFlag;..       
23020 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23030 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
23040 20 70 45 4c 69 73 74 2c 20 69 42 61 73 65 2c 20   pEList, iBase, 
23050 31 29 3b 0a 20 20 20 20 20 20 20 20 69 4a 75 6d  1);.        iJum
23060 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
23070 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
23080 31 20 2b 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  1 + pEList->nExp
23090 72 20 2b 20 31 20 2b 20 31 3b 0a 20 20 20 20 20  r + 1 + 1;.     
230a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
230b0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 69  dOp2(v, OP_If, i
230c0 46 6c 61 67 2c 20 69 4a 75 6d 70 2d 31 29 3b 0a  Flag, iJump-1);.
230d0 20 20 20 20 20 20 20 20 66 6f 72 28 69 45 78 70          for(iExp
230e0 72 3d 30 3b 20 69 45 78 70 72 3c 70 45 4c 69 73  r=0; iExpr<pELis
230f0 74 2d 3e 6e 45 78 70 72 3b 20 69 45 78 70 72 2b  t->nExpr; iExpr+
23100 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43 6f  +){.          Co
23110 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
23120 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
23130 71 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  q(pParse, pEList
23140 2d 3e 61 5b 69 45 78 70 72 5d 2e 70 45 78 70 72  ->a[iExpr].pExpr
23150 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
23160 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
23170 2c 20 4f 50 5f 4e 65 2c 20 69 42 61 73 65 2b 69  , OP_Ne, iBase+i
23180 45 78 70 72 2c 20 69 4a 75 6d 70 2c 20 69 42 61  Expr, iJump, iBa
23190 73 65 32 2b 69 45 78 70 72 29 3b 0a 20 20 20 20  se2+iExpr);.    
231a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
231b0 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
231c0 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
231d0 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
231e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
231f0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
23200 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  (v, SQLITE_NULLE
23210 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  Q);.        }.  
23220 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23230 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
23240 74 6f 2c 20 30 2c 20 70 57 49 6e 66 6f 2d 3e 69  to, 0, pWInfo->i
23250 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 20 20  Continue);..    
23260 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23270 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
23280 67 65 72 2c 20 30 2c 20 69 46 6c 61 67 29 3b 0a  ger, 0, iFlag);.
23290 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
232a0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
232b0 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70  ntAddr(v)==iJump
232c0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
232d0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
232e0 20 4f 50 5f 4d 6f 76 65 2c 20 69 42 61 73 65 2c   OP_Move, iBase,
232f0 20 69 42 61 73 65 32 2c 20 70 45 4c 69 73 74 2d   iBase2, pEList-
23300 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >nExpr);.      }
23310 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4f  else{.        pO
23320 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
23330 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oop;.      }.   
23340 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74   }..    /* Use t
23350 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65  he standard inne
23360 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 73  r loop. */.    s
23370 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
23380 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
23390 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
233a0 2c 20 64 69 73 74 69 6e 63 74 2c 20 70 44 65 73  , distinct, pDes
233b0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
233c0 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69         pWInfo->i
233d0 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f  Continue, pWInfo
233e0 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 20 20  ->iBreak);..    
233f0 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
23400 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  ase scan loop.. 
23410 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
23420 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
23430 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
23440 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 70  /* This is the p
23450 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67  rocessing for ag
23460 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
23470 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
23480 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  xt sNC;    /* Na
23490 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
234a0 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
234b0 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
234c0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d  */.    int iAMem
234d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
234e0 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
234f0 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72  for storing curr
23500 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ent GROUP BY */.
23510 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20      int iBMem;  
23520 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
23530 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
23540 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20   previous GROUP 
23550 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55  BY */.    int iU
23560 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  seFlag;       /*
23570 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c   Mem address hol
23580 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61  ding flag indica
23590 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61  ting that at lea
235a0 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
235b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
235c0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70  e row of the inp
235d0 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ut to the aggreg
235e0 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20  ator has been.  
235f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23600 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
23610 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  ed */.    int iA
23620 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a  bortFlag;     /*
23630 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69   Mem address whi
23640 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20  ch causes query 
23650 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76  abort if positiv
23660 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f  e */.    int gro
23670 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20  upBySort;    /* 
23680 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73  Rows come from s
23690 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42  ource in GROUP B
236a0 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69  Y order */.    i
236b0 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20  nt addrEnd;     
236c0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f     /* End of pro
236d0 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73  cessing for this
236e0 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69   SELECT */.    i
236f0 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b  nt sortPTab = 0;
23700 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c     /* Pseudotabl
23710 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65  e used to decode
23720 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73   sorting results
23730 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74   */.    int sort
23740 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f  Out = 0;    /* O
23750 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66  utput register f
23760 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a  rom the sorter *
23770 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  /..    /* Remove
23780 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69   any and all ali
23790 61 73 65 73 20 62 65 74 77 65 65 6e 20 74 68 65  ases between the
237a0 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
237b0 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50  the.    ** GROUP
237c0 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
237d0 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  */.    if( pGrou
237e0 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  pBy ){.      int
237f0 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   k;             
23800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
23810 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
23820 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
23830 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
23840 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
23850 20 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e   over expression
23860 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20   in a list */.. 
23870 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45       for(k=p->pE
23880 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
23890 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  em=p->pEList->a;
238a0 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d   k>0; k--, pItem
238b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  ++){.        pIt
238c0 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  em->iAlias = 0;.
238d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
238e0 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45  r(k=pGroupBy->nE
238f0 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75  xpr, pItem=pGrou
23900 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  pBy->a; k>0; k--
23910 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
23920 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61      pItem->iAlia
23930 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
23940 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c       if( p->nSel
23950 65 63 74 52 6f 77 3e 28 64 6f 75 62 6c 65 29 31  ectRow>(double)1
23960 30 30 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  00 ) p->nSelectR
23970 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 31 30 30  ow = (double)100
23980 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
23990 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
239a0 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20   = (double)1;.  
239b0 20 20 7d 0a 0a 20 0a 20 20 20 20 2f 2a 20 43 72    }.. .    /* Cr
239c0 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20  eate a label to 
239d0 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20  jump to when we 
239e0 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68  want to abort th
239f0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61  e query */.    a
23a00 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  ddrEnd = sqlite3
23a10 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
23a20 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  ;..    /* Conver
23a30 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  t TK_COLUMN node
23a40 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  s into TK_AGG_CO
23a50 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e  LUMN and make en
23a60 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20  tries in.    ** 
23a70 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c  sAggInfo for all
23a80 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
23a90 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73   nodes in expres
23aa0 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20  sions of the.   
23ab0 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
23ac0 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ment..    */.   
23ad0 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
23ae0 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
23af0 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
23b00 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e  pParse;.    sNC.
23b10 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
23b20 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67  ist;.    sNC.pAg
23b30 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66  gInfo = &sAggInf
23b40 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  o;.    sAggInfo.
23b50 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d  nSortingColumn =
23b60 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f   pGroupBy ? pGro
23b70 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20  upBy->nExpr+1 : 
23b80 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  0;.    sAggInfo.
23b90 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
23ba0 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBy;.    sqlite3
23bb0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
23bc0 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29  st(&sNC, pEList)
23bd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
23be0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
23bf0 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 29 3b  &sNC, pOrderBy);
23c00 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67  .    if( pHaving
23c10 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
23c20 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
23c30 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61  egates(&sNC, pHa
23c40 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ving);.    }.   
23c50 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d   sAggInfo.nAccum
23c60 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66  ulator = sAggInf
23c70 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66  o.nColumn;.    f
23c80 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
23c90 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  fo.nFunc; i++){.
23ca0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
23cb0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 73  xprHasProperty(s
23cc0 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d  AggInfo.aFunc[i]
23cd0 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  .pExpr, EP_xIsSe
23ce0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73  lect) );.      s
23cf0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
23d00 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73  eAggList(&sNC, s
23d10 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d  AggInfo.aFunc[i]
23d20 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29  .pExpr->x.pList)
23d30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
23d40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
23d50 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
23d60 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63  nd;..    /* Proc
23d70 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
23d80 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50  gates with GROUP
23d90 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66   BY is very diff
23da0 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a  erent and.    **
23db0 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c   much more compl
23dc0 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74  ex than aggregat
23dd0 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f  es without a GRO
23de0 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  UP BY..    */.  
23df0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
23e00 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  {.      KeyInfo 
23e10 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b  *pKeyInfo;  /* K
23e20 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  eying informatio
23e30 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20  n for the group 
23e40 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  by clause */.   
23e50 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20     int j1;      
23e60 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42         /* A-vs-B
23e70 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d   comparision jum
23e80 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  p */.      int a
23e90 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f  ddrOutputRow;  /
23ea0 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f  * Start of subro
23eb0 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
23ec0 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20  ts a result row 
23ed0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
23ee0 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20  OutputRow;   /* 
23ef0 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  Return address r
23f00 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70  egister for outp
23f10 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ut subroutine */
23f20 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
23f30 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65  etAbort;   /* Se
23f40 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67  t the abort flag
23f50 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
23f60 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
23f70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20  OfLoop;  /* Top 
23f80 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  of the input loo
23f90 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  p */.      int a
23fa0 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f  ddrSortingIdx; /
23fb0 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  * The OP_OpenEph
23fc0 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73  emeral for the s
23fd0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  orting index */.
23fe0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52 65        int addrRe
23ff0 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62  set;      /* Sub
24000 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65  routine for rese
24010 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75  tting the accumu
24020 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69  lator */.      i
24030 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20 20  nt regReset;    
24040 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
24050 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
24060 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69  r reset subrouti
24070 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  ne */..      /* 
24080 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52  If there is a GR
24090 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65  OUP BY clause we
240a0 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f   might need a so
240b0 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20  rting index to. 
240c0 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e       ** implemen
240d0 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20  t it.  Allocate 
240e0 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64  that sorting ind
240f0 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74  ex now.  If it t
24100 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a  urns out.      *
24110 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
24120 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61   need it after a
24130 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65  ll, the OP_Sorte
24140 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f  rOpen instructio
24150 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  n.      ** will 
24160 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
24170 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20  o a Noop.  .    
24180 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49    */.      sAggI
24190 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d  nfo.sortingIdx =
241a0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
241b0 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  .      pKeyInfo 
241c0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
241d0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47  rList(pParse, pG
241e0 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 61  roupBy);.      a
241f0 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  ddrSortingIdx = 
24200 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24210 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  4(v, OP_SorterOp
24220 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  en, .          s
24230 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
24240 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f  dx, sAggInfo.nSo
24250 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20  rtingColumn, .  
24260 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61 72          0, (char
24270 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
24280 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
24290 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69  ..      /* Initi
242a0 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63  alize memory loc
242b0 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47  ations used by G
242c0 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74  ROUP BY aggregat
242d0 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20  e processing.   
242e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65     */.      iUse
242f0 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
24300 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62  >nMem;.      iAb
24310 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  ortFlag = ++pPar
24320 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
24330 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b  regOutputRow = +
24340 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
24350 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
24360 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
24370 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
24380 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b      regReset = +
24390 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
243a0 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d       addrReset =
243b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
243c0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
243d0 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iAMem = pParse->
243e0 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
243f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
24400 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
24410 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70  .      iBMem = p
24420 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
24430 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
24440 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
24450 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >nExpr;.      sq
24460 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24470 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
24480 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
24490 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
244a0 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72  ((v, "clear abor
244b0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
244c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
244d0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
244e0 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 0, iUseFlag);.
244f0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
24500 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
24510 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74  accumulator empt
24520 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  y"));.      sqli
24530 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
24540 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d   OP_Null, 0, iAM
24550 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70  em, iAMem+pGroup
24560 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20  By->nExpr-1);.. 
24570 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20       /* Begin a 
24580 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65  loop that will e
24590 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63  xtract all sourc
245a0 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20  e rows in GROUP 
245b0 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20  BY order..      
245c0 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e  ** This might in
245d0 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61  volve two separa
245e0 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e  te loops with an
245f0 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77   OP_Sort in betw
24600 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a  een, or.      **
24610 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73   it might be a s
24620 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20  ingle loop that 
24630 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f  uses an index to
24640 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61   extract informa
24650 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tion.      ** in
24660 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72   the right order
24670 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a   to begin with..
24680 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
24690 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
246a0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
246b0 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
246c0 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  t);.      pWInfo
246d0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
246e0 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
246f0 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26  bList, pWhere, &
24700 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 30 29 3b  pGroupBy, 0, 0);
24710 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
24720 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
24730 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66  ct_end;.      if
24740 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  ( pGroupBy==0 ){
24750 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
24760 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c  optimizer is abl
24770 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77  e to deliver row
24780 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72  s in group by or
24790 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a  der so.        *
247a0 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65  * we do not have
247b0 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f   to sort.  The O
247c0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
247d0 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20  table will be.  
247e0 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c        ** cancell
247f0 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65  ed later because
24800 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
24810 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e  o use the pKeyIn
24820 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  fo.        */.  
24830 20 20 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d        pGroupBy =
24840 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
24850 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
24860 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  t = 0;.      }el
24870 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52  se{.        /* R
24880 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f  ows are coming o
24890 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e  ut in undetermin
248a0 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61  ed order.  We ha
248b0 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20  ve to push.     
248c0 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69     ** each row i
248d0 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  nto a sorting in
248e0 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74  dex, terminate t
248f0 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20  he first loop,. 
24900 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c         ** then l
24910 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72  oop over the sor
24920 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72  ting index in or
24930 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f  der to get the o
24940 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a  utput.        **
24950 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
24960 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
24970 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b      int regBase;
24980 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
24990 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20  Record;.        
249a0 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  int nCol;.      
249b0 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a    int nGroupBy;.
249c0 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e  .        explain
249d0 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65  TempTable(pParse
249e0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  , .            i
249f0 73 44 69 73 74 69 6e 63 74 20 26 26 20 21 28 70  sDistinct && !(p
24a00 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69  ->selFlags&SF_Di
24a10 73 74 69 6e 63 74 29 3f 22 44 49 53 54 49 4e 43  stinct)?"DISTINC
24a20 54 22 3a 22 47 52 4f 55 50 20 42 59 22 29 3b 0a  T":"GROUP BY");.
24a30 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
24a40 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sort = 1;.      
24a50 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72    nGroupBy = pGr
24a60 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
24a70 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72        nCol = nGr
24a80 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20 20  oupBy + 1;.     
24a90 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b     j = nGroupBy+
24aa0 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  1;.        for(i
24ab0 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
24ac0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
24ad0 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67          if( sAgg
24ae0 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f  Info.aCol[i].iSo
24af0 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
24b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f  .            nCo
24b10 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  l++;.           
24b20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
24b30 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
24b40 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71      regBase = sq
24b50 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
24b60 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b  e(pParse, nCol);
24b70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24b80 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
24b90 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
24ba0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
24bb0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
24bc0 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73  pGroupBy, regBas
24bd0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  e, 0);.        s
24be0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24bf0 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
24c00 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
24c10 67 49 64 78 2c 72 65 67 42 61 73 65 2b 6e 47 72  gIdx,regBase+nGr
24c20 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20  oupBy);.        
24c30 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a  j = nGroupBy+1;.
24c40 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
24c50 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
24c60 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
24c70 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
24c80 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
24c90 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69  &sAggInfo.aCol[i
24ca0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
24cb0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
24cc0 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
24cd0 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
24ce0 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20  j + regBase;.   
24cf0 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b           int r2;
24d00 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 32  ..            r2
24d10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
24d20 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
24d30 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
24d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d50 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20      pCol->pTab, 
24d60 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  pCol->iColumn, p
24d70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 29  Col->iTable, r1)
24d80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
24d90 28 20 72 31 21 3d 72 32 20 29 7b 0a 20 20 20 20  ( r1!=r2 ){.    
24da0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24db0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
24dc0 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72 31 29  P_SCopy, r2, r1)
24dd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
24de0 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b              j++;
24df0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24e00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
24e10 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
24e20 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
24e30 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
24e40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
24e50 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
24e60 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c  , regBase, nCol,
24e70 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
24e80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24e90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
24ea0 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67 49  terInsert, sAggI
24eb0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
24ec0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
24ed0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
24ee0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
24ef0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
24f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
24f10 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
24f20 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
24f30 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
24f40 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
24f50 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
24f60 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
24f70 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54 61  dxPTab = sortPTa
24f80 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
24f90 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72 74  ++;.        sort
24fa0 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Out = sqlite3Get
24fb0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
24fc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24fd0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
24fe0 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72  _OpenPseudo, sor
24ff0 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20  tPTab, sortOut, 
25000 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
25010 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
25020 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
25030 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
25040 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29  ingIdx, addrEnd)
25050 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
25060 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50  mment((v, "GROUP
25070 20 42 59 20 73 6f 72 74 22 29 29 3b 0a 20 20 20   BY sort"));.   
25080 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73       sAggInfo.us
25090 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b  eSortingIdx = 1;
250a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
250b0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
250c0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
250d0 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61  .      /* Evalua
250e0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  te the current G
250f0 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e  ROUP BY terms an
25100 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62  d store in b0, b
25110 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, b2....      *
25120 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20  * (b0 is memory 
25130 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30  location iBMem+0
25140 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c  , b1 is iBMem+1,
25150 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20   and so forth). 
25160 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d       ** Then com
25170 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  pare the current
25180 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
25190 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55  against the GROU
251a0 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20  P BY terms.     
251b0 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65   ** from the pre
251c0 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e  vious row curren
251d0 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30  tly stored in a0
251e0 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20  , a1, a2....    
251f0 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54    */.      addrT
25200 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  opOfLoop = sqlit
25210 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
25220 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
25230 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
25240 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
25250 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
25260 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
25270 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
25280 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20   OP_SorterData, 
25290 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
252a0 49 64 78 2c 20 73 6f 72 74 4f 75 74 29 3b 0a 20  Idx, sortOut);. 
252b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
252c0 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79  (j=0; j<pGroupBy
252d0 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
252e0 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70         if( group
252f0 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
25300 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25310 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
25320 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c  mn, sortPTab, j,
25330 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
25340 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20       if( j==0 ) 
25350 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
25360 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c  eP5(v, OPFLAG_CL
25370 45 41 52 43 41 43 48 45 29 3b 0a 20 20 20 20 20  EARCACHE);.     
25380 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25390 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72      sAggInfo.dir
253a0 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ectMode = 1;.   
253b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
253c0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
253d0 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45  GroupBy->a[j].pE
253e0 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  xpr, iBMem+j);. 
253f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
25400 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
25410 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
25420 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69  ompare, iAMem, i
25430 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  BMem, pGroupBy->
25440 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
25450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25460 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
25470 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
25480 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65       j1 = sqlite
25490 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
254a0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
254b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
254c0 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30  OP_Jump, j1+1, 0
254d0 2c 20 6a 31 2b 31 29 3b 0a 0a 20 20 20 20 20 20  , j1+1);..      
254e0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
254f0 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65   that runs whene
25500 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59  ver the GROUP BY
25510 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20   changes..      
25520 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68  ** Changes in th
25530 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64  e GROUP BY are d
25540 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70  etected by the p
25550 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20  revious code.   
25560 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66     ** block.  If
25570 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63   there were no c
25580 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f  hanges, this blo
25590 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20  ck is skipped.. 
255a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
255b0 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65   This code copie
255c0 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20  s current group 
255d0 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62  by terms in b0,b
255e0 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a  1,b2,....      *
255f0 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c  * over to a0,a1,
25600 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c  a2.  It then cal
25610 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  ls the output su
25620 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
25630 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65  * and resets the
25640 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
25650 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
25660 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a   in preparation.
25670 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
25680 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62   next GROUP BY b
25690 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  atch..      */. 
256a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
256b0 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
256c0 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70   iBMem, iAMem, p
256d0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b  GroupBy->nExpr);
256e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
256f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
25700 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52  osub, regOutputR
25710 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ow, addrOutputRo
25720 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
25730 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75  mment((v, "outpu
25740 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20  t one row"));.  
25750 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25760 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp2(v, OP_IfPo
25770 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61  s, iAbortFlag, a
25780 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 56  ddrEnd);.      V
25790 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
257a0 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67  check abort flag
257b0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
257c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
257d0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
257e0 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
257f0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
25800 74 28 28 76 2c 20 22 72 65 73 65 74 20 61 63 63  t((v, "reset acc
25810 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
25820 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
25830 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
25840 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f  mulators based o
25850 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
25860 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
25870 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20  rrent row.      
25880 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
25890 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
258a0 6a 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74  j1);.      updat
258b0 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
258c0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
258d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
258e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
258f0 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46  nteger, 1, iUseF
25900 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
25910 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
25920 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63  icate data in ac
25930 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
25940 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74       /* End of t
25950 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f  he loop.      */
25960 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70  .      if( group
25970 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
25980 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25990 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
259a0 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Next, sAggInfo.s
259b0 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54  ortingIdx, addrT
259c0 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  opOfLoop);.     
259d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
259e0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
259f0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
25a00 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
25a10 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
25a20 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20  SortingIdx);.   
25a30 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f     }..      /* O
25a40 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20  utput the final 
25a50 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20  row of result.  
25a60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
25a70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
25a80 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
25a90 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
25aa0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
25ab0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
25ac0 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f  "output final ro
25ad0 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  w"));..      /* 
25ae0 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75  Jump over the su
25af0 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20  broutines.      
25b00 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
25b10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
25b20 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6e  _Goto, 0, addrEn
25b30 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  d);..      /* Ge
25b40 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
25b50 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
25b60 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
25b70 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
25b80 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20    ** set.  This 
25b90 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74  subroutine first
25ba0 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55   looks at the iU
25bb0 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65  seFlag.  If iUse
25bc0 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  Flag.      ** is
25bd0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
25be0 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ual to zero, the
25bf0 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61   subroutine is a
25c00 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20   no-op.  If.    
25c10 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
25c20 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  ing calls for th
25c30 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74  e query to abort
25c40 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  , this subroutin
25c50 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65  e.      ** incre
25c60 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74  ments the iAbort
25c70 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  Flag memory loca
25c80 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75  tion before retu
25c90 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a  rning in.      *
25ca0 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61  * order to signa
25cb0 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  l the caller to 
25cc0 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  abort..      */.
25cd0 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f        addrSetAbo
25ce0 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
25cf0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
25d00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25d10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
25d20 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74  teger, 1, iAbort
25d30 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
25d40 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
25d50 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  t abort flag"));
25d60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
25d70 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
25d80 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74  eturn, regOutput
25d90 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Row);.      sqli
25da0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
25db0 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75  bel(v, addrOutpu
25dc0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64  tRow);.      add
25dd0 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
25de0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
25df0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
25e00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
25e10 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73  v, OP_IfPos, iUs
25e20 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75  eFlag, addrOutpu
25e30 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56  tRow+2);.      V
25e40 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
25e50 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  Groupby result g
25e60 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70  enerator entry p
25e70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73  oint"));.      s
25e80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
25e90 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
25ea0 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
25eb0 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
25ec0 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
25ed0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
25ee0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
25ef0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
25f00 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75  aving, addrOutpu
25f10 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a  tRow+1, SQLITE_J
25f20 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
25f30 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
25f40 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
25f50 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
25f60 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
25f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
25f80 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20  stinct, pDest,. 
25f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fa0 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
25fb0 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f  ow+1, addrSetAbo
25fc0 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
25fd0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
25fe0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
25ff0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
26000 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
26010 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73  "end groupby res
26020 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29  ult generator"))
26030 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
26040 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
26050 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65  e that will rese
26060 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61  t the group-by a
26070 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20  ccumulator.     
26080 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
26090 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
260a0 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b  l(v, addrReset);
260b0 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75  .      resetAccu
260c0 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
260d0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
260e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
260f0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
26100 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20  , regReset);.   
26110 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69    .    } /* endi
26120 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67  f pGroupBy.  Beg
26130 69 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  in aggregate que
26140 72 69 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f  ries without GRO
26150 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c  UP BY: */.    el
26160 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  se {.      ExprL
26170 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23  ist *pDel = 0;.#
26180 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26190 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20  IT_BTREECOUNT.  
261a0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
261b0 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62  .      if( (pTab
261c0 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74   = isSimpleCount
261d0 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21  (p, &sAggInfo))!
261e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
261f0 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e   If isSimpleCoun
26200 74 28 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f  t() returns a po
26210 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65  inter to a Table
26220 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e   structure, then
26230 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
26240 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73  SQL statement is
26250 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
26260 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
26270 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75   **   SELECT cou
26280 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e  nt(*) FROM <tbl>
26290 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
262a0 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65      ** where the
262b0 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
262c0 20 72 65 74 75 72 6e 65 64 20 72 65 70 72 65 73   returned repres
262d0 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e  ents table <tbl>
262e0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
262f0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61       ** This sta
26300 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d  tement is so com
26310 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f  mon that it is o
26320 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c  ptimized special
26330 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20  ly. The.        
26340 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74  ** OP_Count inst
26350 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75  ruction is execu
26360 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68  ted either on th
26370 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74  e intkey table t
26380 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  hat.        ** c
26390 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
263a0 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e   for table <tbl>
263b0 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74   or on one of it
263c0 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20  s indexes. It.  
263d0 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74        ** is bett
263e0 65 72 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  er to execute th
263f0 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78  e op on an index
26400 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61 72 65  , as indexes are
26410 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20   almost.        
26420 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61 64  ** always spread
26430 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67   across less pag
26440 65 73 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f  es than their co
26450 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c  rresponding tabl
26460 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
26470 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
26480 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
26490 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
264a0 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
264b0 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
264c0 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d  const int iCsr =
264d0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
264e0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74       /* Cursor t
264f0 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f  o scan b-tree */
26500 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
26510 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
26520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26530 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
26540 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65  le */.        Ke
26550 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
26560 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
26570 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f     /* Keyinfo fo
26580 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20  r scanned index 
26590 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  */.        Index
265a0 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20   *pBest = 0;    
265b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265c0 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f  /* Best index fo
265d0 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  und so far */.  
265e0 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20        int iRoot 
265f0 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20  = pTab->tnum;   
26600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
26610 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e  ot page of scann
26620 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20  ed b-tree */..  
26630 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
26640 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
26650 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
26660 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
26670 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
26680 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
26690 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
266a0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
266b0 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  h for the index 
266c0 74 68 61 74 20 68 61 73 20 74 68 65 20 6c 65 61  that has the lea
266d0 73 74 20 61 6d 6f 75 6e 74 20 6f 66 20 63 6f 6c  st amount of col
266e0 75 6d 6e 73 2e 20 49 66 0a 20 20 20 20 20 20 20  umns. If.       
266f0 20 2a 2a 20 74 68 65 72 65 20 69 73 20 73 75 63   ** there is suc
26700 68 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20  h an index, and 
26710 69 74 20 68 61 73 20 6c 65 73 73 20 63 6f 6c 75  it has less colu
26720 6d 6e 73 20 74 68 61 6e 20 74 68 65 20 74 61 62  mns than the tab
26730 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f  le.        ** do
26740 65 73 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  es, then we can 
26750 61 73 73 75 6d 65 20 74 68 61 74 20 69 74 20 63  assume that it c
26760 6f 6e 73 75 6d 65 73 20 6c 65 73 73 20 73 70 61  onsumes less spa
26770 63 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64 0a 20  ce on disk and. 
26780 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 74         ** will t
26790 68 65 72 65 66 6f 72 65 20 62 65 20 63 68 65 61  herefore be chea
267a0 70 65 72 20 74 6f 20 73 63 61 6e 20 74 6f 20 64  per to scan to d
267b0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 71 75 65  etermine the que
267c0 72 79 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20  ry result..     
267d0 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
267e0 73 65 20 73 65 74 20 69 52 6f 6f 74 20 74 6f 20  se set iRoot to 
267f0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
26800 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
26810 78 20 62 2d 74 72 65 65 0a 20 20 20 20 20 20 20  x b-tree.       
26820 20 2a 2a 20 61 6e 64 20 70 4b 65 79 49 6e 66 6f   ** and pKeyInfo
26830 20 74 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20   to the KeyInfo 
26840 73 74 72 75 63 74 75 72 65 20 72 65 71 75 69 72  structure requir
26850 65 64 20 74 6f 20 6e 61 76 69 67 61 74 65 20 74  ed to navigate t
26860 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  he.        ** in
26870 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  dex..        **.
26880 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 31          ** (2011
26890 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64  -04-15) Do not d
268a0 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66  o a full scan of
268b0 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20 69 6e   an unordered in
268c0 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  dex..        **.
268d0 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70 72          ** In pr
268e0 61 63 74 69 63 65 20 74 68 65 20 4b 65 79 49 6e  actice the KeyIn
268f0 66 6f 20 73 74 72 75 63 74 75 72 65 20 77 69 6c  fo structure wil
26900 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 49  l not be used. I
26910 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20  t is only .     
26920 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20     ** passed to 
26930 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64  keep OP_OpenRead
26940 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20 20   happy..        
26950 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  */.        for(p
26960 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
26970 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
26980 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
26990 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62       if( pIdx->b
269a0 55 6e 6f 72 64 65 72 65 64 3d 3d 30 20 26 26 20  Unordered==0 && 
269b0 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78 2d  (!pBest || pIdx-
269c0 3e 6e 43 6f 6c 75 6d 6e 3c 70 42 65 73 74 2d 3e  >nColumn<pBest->
269d0 6e 43 6f 6c 75 6d 6e 29 20 29 7b 0a 20 20 20 20  nColumn) ){.    
269e0 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20          pBest = 
269f0 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  pIdx;.          
26a00 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
26a10 20 20 20 20 69 66 28 20 70 42 65 73 74 20 26 26      if( pBest &&
26a20 20 70 42 65 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 3c   pBest->nColumn<
26a30 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
26a40 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20          iRoot = 
26a50 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20  pBest->tnum;.   
26a60 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20         pKeyInfo 
26a70 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
26a80 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 42  yinfo(pParse, pB
26a90 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  est);.        }.
26aa0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  .        /* Open
26ab0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
26ac0 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74 68 65  sor, execute the
26ad0 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65   OP_Count, close
26ae0 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a   the cursor. */.
26af0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
26b00 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
26b10 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20  OpenRead, iCsr, 
26b20 69 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20  iRoot, iDb);.   
26b30 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
26b40 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  o ){.          s
26b50 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
26b60 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20  P4(v, -1, (char 
26b70 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
26b80 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
26b90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26ba0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
26bb0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74  dOp2(v, OP_Count
26bc0 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f  , iCsr, sAggInfo
26bd0 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b  .aFunc[0].iMem);
26be0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26bf0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
26c00 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20  _Close, iCsr);. 
26c10 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 69         explainSi
26c20 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72 73 65  mpleCount(pParse
26c30 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29 3b 0a  , pTab, pBest);.
26c40 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
26c50 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
26c60 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a  T_BTREECOUNT */.
26c70 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
26c80 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
26c90 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20  query is of one 
26ca0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
26cb0 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20 20   forms:.        
26cc0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
26cd0 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52  SELECT min(x) FR
26ce0 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a  OM ....        *
26cf0 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78  *   SELECT max(x
26d00 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
26d10 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
26d20 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   If it is, then 
26d30 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20  ask the code in 
26d40 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d  where.c to attem
26d50 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c  pt to sort resul
26d60 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  ts.        ** as
26d70 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   if there was an
26d80 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72   "ORDER ON x" or
26d90 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53   "ORDER ON x DES
26da0 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20  C" clause. .    
26db0 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e      ** If where.
26dc0 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f  c is able to pro
26dd0 64 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72  duce results sor
26de0 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65  ted in this orde
26df0 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  r, then.        
26e00 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64 65  ** add vdbe code
26e10 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
26e20 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
26e30 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a  loop after the .
26e40 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74          ** first
26e50 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63   iteration (sinc
26e60 65 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  e the first iter
26e70 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
26e80 70 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  p is .        **
26e90 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f   guaranteed to o
26ea0 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f  perate on the ro
26eb0 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d  w with the minim
26ec0 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20  um or maximum . 
26ed0 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
26ee0 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72  of x, the only r
26ef0 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20  ow required)..  
26f00 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
26f10 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c   ** A special fl
26f20 61 67 20 6d 75 73 74 20 62 65 20 70 61 73 73 65  ag must be passe
26f30 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
26f40 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67  eBegin() to slig
26f50 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  htly.        ** 
26f60 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f 75 72  modify behaviour
26f70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
26f80 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
26f90 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71 75  **   + If the qu
26fa0 65 72 79 20 69 73 20 61 20 22 53 45 4c 45 43 54  ery is a "SELECT
26fb0 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74   min(x)", then t
26fc0 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79  he loop coded by
26fd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
26fe0 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e  where.c should n
26ff0 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  ot iterate over 
27000 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20  any values with 
27010 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20  a NULL value.   
27020 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20       **     for 
27030 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  x..        **.  
27040 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65        **   + The
27050 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20   optimizer code 
27060 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20  in where.c (the 
27070 74 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64  thing that decid
27080 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  es which.       
27090 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72   **     index or
270a0 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29   indices to use)
270b0 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20   should place a 
270c0 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69  different priori
270d0 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a  ty on .        *
270e0 2a 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67  *     satisfying
270f0 20 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20   the 'ORDER BY' 
27100 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64  clause than it d
27110 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73  oes in other cas
27120 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  es..        **  
27130 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65     Refer to code
27140 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e   and comments in
27150 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74   where.c for det
27160 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ails..        */
27170 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
27180 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a  t *pMinMax = 0;.
27190 20 20 20 20 20 20 20 20 75 38 20 66 6c 61 67 20          u8 flag 
271a0 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 70 29  = minMaxQuery(p)
271b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c  ;.        if( fl
271c0 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
271d0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
271e0 50 72 6f 70 65 72 74 79 28 70 2d 3e 70 45 4c 69  Property(p->pELi
271f0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
27200 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
27210 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d  .          pMinM
27220 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ax = sqlite3Expr
27230 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
27240 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
27250 72 2d 3e 78 2e 70 4c 69 73 74 2c 30 29 3b 0a 20  r->x.pList,0);. 
27260 20 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20           pDel = 
27270 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20  pMinMax;.       
27280 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26     if( pMinMax &
27290 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
272a0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
272b0 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
272c0 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61  .sortOrder = fla
272d0 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g!=WHERE_ORDERBY
272e0 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20  _MIN ?1:0;.     
272f0 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e         pMinMax->
27300 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d  a[0].pExpr->op =
27310 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
27320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27330 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  }.  .        /* 
27340 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69  This case runs i
27350 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
27360 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  has no GROUP BY 
27370 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20  clause.  The.   
27380 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
27390 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c  ng is much simpl
273a0 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  er since there i
273b0 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
273c0 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  row.        ** o
273d0 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20  f output..      
273e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73    */.        res
273f0 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
27400 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
27410 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  ;.        pWInfo
27420 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
27430 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
27440 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26  bList, pWhere, &
27450 70 4d 69 6e 4d 61 78 2c 20 30 2c 20 66 6c 61 67  pMinMax, 0, flag
27460 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
27470 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  WInfo==0 ){.    
27480 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27490 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
274a0 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  pDel);.         
274b0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
274c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
274d0 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
274e0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
274f0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
27500 20 20 69 66 28 20 21 70 4d 69 6e 4d 61 78 20 26    if( !pMinMax &
27510 26 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  & flag ){.      
27520 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27530 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
27540 2c 20 30 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  , 0, pWInfo->iBr
27550 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eak);.          
27560 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
27570 22 25 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c  "%s() by index",
27580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27590 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52   (flag==WHERE_OR
275a0 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a  DERBY_MIN?"min":
275b0 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20  "max")));.      
275c0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
275d0 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
275e0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66 69 6e  fo);.        fin
275f0 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
27600 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
27610 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  nfo);.      }.. 
27620 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
27630 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
27640 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
27650 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
27660 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  rEnd, SQLITE_JUM
27670 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
27680 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
27690 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
276a0 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d  List, 0, 0, 0, -
276b0 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  1, .            
276c0 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2c            pDest,
276d0 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e   addrEnd, addrEn
276e0 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
276f0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
27700 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d  db, pDel);.    }
27710 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
27720 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
27730 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20  addrEnd);.    . 
27740 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72   } /* endif aggr
27750 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a  egate query */..
27760 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 3e 3d    if( distinct>=
27770 30 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  0 ){.    explain
27780 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65  TempTable(pParse
27790 2c 20 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20  , "DISTINCT");. 
277a0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
277b0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
277c0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65   clause, then we
277d0 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68   need to sort th
277e0 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61  e results.  ** a
277f0 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20  nd send them to 
27800 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65  the callback one
27810 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20   by one..  */.  
27820 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
27830 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54      explainTempT
27840 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 4f 52  able(pParse, "OR
27850 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65  DER BY");.    ge
27860 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70  nerateSortTail(p
27870 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c  Parse, p, v, pEL
27880 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73  ist->nExpr, pDes
27890 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  t);.  }..  /* Ju
278a0 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  mp here to skip 
278b0 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a  this query.  */.
278c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
278d0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e  olveLabel(v, iEn
278e0 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45  d);..  /* The SE
278f0 4c 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73  LECT was success
27900 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53  fully coded.   S
27910 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  et the return co
27920 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20  de to 0.  ** to 
27930 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f  indicate no erro
27940 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  rs..  */.  rc = 
27950 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c  0;..  /* Control
27960 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69   jumps to here i
27970 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
27980 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c  countered above,
27990 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75   or upon.  ** su
279a0 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20  ccessful coding 
279b0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20  of the SELECT.. 
279c0 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a   */.select_end:.
279d0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
279e0 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
279f0 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
27a00 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20  electId);..  /* 
27a10 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
27a20 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73  names if results
27a30 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 61   of the SELECT a
27a40 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e  re to be output.
27a50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
27a60 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65  SQLITE_OK && pDe
27a70 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
27a80 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e  utput ){.    gen
27a90 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
27aa0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
27ab0 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t, pEList);.  }.
27ac0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
27ad0 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43  (db, sAggInfo.aC
27ae0 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ol);.  sqlite3Db
27af0 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66  Free(db, sAggInf
27b00 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75  o.aFunc);.  retu
27b10 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65  rn rc;.}..#if de
27b20 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
27b30 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e  BLE_TREE_EXPLAIN
27b40 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  )./*.** Generate
27b50 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
27b60 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  e description of
27b70 20 61 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62   a the Select ob
27b80 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
27b90 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53  void explainOneS
27ba0 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56 64 62  elect(Vdbe *pVdb
27bb0 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
27bc0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
27bd0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 53 45  rintf(pVdbe, "SE
27be0 4c 45 43 54 20 22 29 3b 0a 20 20 69 66 28 20 70  LECT ");.  if( p
27bf0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
27c00 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
27c10 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 69  regate) ){.    i
27c20 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
27c30 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   SF_Distinct ){.
27c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27c50 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
27c60 2c 20 22 44 49 53 54 49 4e 43 54 20 22 29 3b 0a  , "DISTINCT ");.
27c70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
27c80 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
27c90 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20  ggregate ){.    
27ca0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
27cb0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 61  Printf(pVdbe, "a
27cc0 67 67 5f 66 6c 61 67 20 22 29 3b 0a 20 20 20 20  gg_flag ");.    
27cd0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
27ce0 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
27cf0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
27d00 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
27d10 20 20 20 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c     ");.  }.  sql
27d20 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c  ite3ExplainExprL
27d30 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 45  ist(pVdbe, p->pE
27d40 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
27d50 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
27d60 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20  ;.  if( p->pSrc 
27d70 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  && p->pSrc->nSrc
27d80 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
27d90 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
27da0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
27db0 46 52 4f 4d 20 22 29 3b 0a 20 20 20 20 73 71 6c  FROM ");.    sql
27dc0 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28  ite3ExplainPush(
27dd0 70 56 64 62 65 29 3b 0a 20 20 20 20 66 6f 72 28  pVdbe);.    for(
27de0 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e  i=0; i<p->pSrc->
27df0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
27e00 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
27e10 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
27e20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  p->pSrc->a[i];. 
27e30 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
27e40 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
27e50 20 22 7b 25 64 2c 2a 7d 20 3d 20 22 2c 20 70 49   "{%d,*} = ", pI
27e60 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
27e70 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
27e80 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
27e90 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
27ea0 6e 53 65 6c 65 63 74 28 70 56 64 62 65 2c 20 70  nSelect(pVdbe, p
27eb0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Item->pSelect);.
27ec0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
27ed0 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20  m->pTab ){.     
27ee0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
27ef0 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
27f00 20 22 20 28 74 61 62 6e 61 6d 65 3d 25 73 29 22   " (tabname=%s)"
27f10 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
27f20 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Name);.        }
27f30 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
27f40 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b   pItem->zName ){
27f50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27f60 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
27f70 64 62 65 2c 20 22 25 73 22 2c 20 70 49 74 65 6d  dbe, "%s", pItem
27f80 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
27f90 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  }.      if( pIte
27fa0 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
27fb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
27fc0 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
27fd0 20 22 20 28 41 53 20 25 73 29 22 2c 20 70 49 74   " (AS %s)", pIt
27fe0 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
27ff0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
28000 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  Item->jointype &
28010 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20   JT_LEFT ){.    
28020 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
28030 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
28040 22 20 4c 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20  " LEFT-JOIN");. 
28050 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
28060 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
28070 64 62 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  dbe);.    }.    
28080 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f  sqlite3ExplainPo
28090 70 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20  p(pVdbe);.  }.  
280a0 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b  if( p->pWhere ){
280b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
280c0 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
280d0 20 22 57 48 45 52 45 20 22 29 3b 0a 20 20 20 20   "WHERE ");.    
280e0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
280f0 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 57 68  pr(pVdbe, p->pWh
28100 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ere);.    sqlite
28110 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
28120 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
28130 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
28140 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
28150 69 6e 74 66 28 70 56 64 62 65 2c 20 22 47 52 4f  intf(pVdbe, "GRO
28160 55 50 42 59 20 22 29 3b 0a 20 20 20 20 73 71 6c  UPBY ");.    sql
28170 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c  ite3ExplainExprL
28180 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 47  ist(pVdbe, p->pG
28190 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c  roupBy);.    sql
281a0 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
281b0 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  dbe);.  }.  if( 
281c0 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  p->pHaving ){.  
281d0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
281e0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 48  Printf(pVdbe, "H
281f0 41 56 49 4e 47 20 22 29 3b 0a 20 20 20 20 73 71  AVING ");.    sq
28200 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
28210 28 70 56 64 62 65 2c 20 70 2d 3e 70 48 61 76 69  (pVdbe, p->pHavi
28220 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ng);.    sqlite3
28230 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
28240 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
28250 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
28260 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
28270 6e 74 66 28 70 56 64 62 65 2c 20 22 4f 52 44 45  ntf(pVdbe, "ORDE
28280 52 42 59 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  RBY ");.    sqli
28290 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69  te3ExplainExprLi
282a0 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 4f 72  st(pVdbe, p->pOr
282b0 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  derBy);.    sqli
282c0 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
282d0 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  be);.  }.  if( p
282e0 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
282f0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
28300 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4c 49 4d  intf(pVdbe, "LIM
28310 49 54 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  IT ");.    sqlit
28320 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56  e3ExplainExpr(pV
28330 64 62 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  dbe, p->pLimit);
28340 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
28350 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
28360 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73  }.  if( p->pOffs
28370 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  et ){.    sqlite
28380 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
28390 56 64 62 65 2c 20 22 4f 46 46 53 45 54 20 22 29  Vdbe, "OFFSET ")
283a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
283b0 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20  lainExpr(pVdbe, 
283c0 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20  p->pOffset);.   
283d0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
283e0 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 7d 0a  L(pVdbe);.  }.}.
283f0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c  void sqlite3Expl
28400 61 69 6e 53 65 6c 65 63 74 28 56 64 62 65 20 2a  ainSelect(Vdbe *
28410 70 56 64 62 65 2c 20 53 65 6c 65 63 74 20 2a 70  pVdbe, Select *p
28420 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  ){.  if( p==0 ){
28430 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
28440 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
28450 20 22 28 6e 75 6c 6c 2d 73 65 6c 65 63 74 29 22   "(null-select)"
28460 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
28470 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70   }.  while( p->p
28480 50 72 69 6f 72 20 29 20 70 20 3d 20 70 2d 3e 70  Prior ) p = p->p
28490 50 72 69 6f 72 3b 0a 20 20 73 71 6c 69 74 65 33  Prior;.  sqlite3
284a0 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64 62  ExplainPush(pVdb
284b0 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  e);.  while( p )
284c0 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65  {.    explainOne
284d0 53 65 6c 65 63 74 28 70 56 64 62 65 2c 20 70 29  Select(pVdbe, p)
284e0 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  ;.    p = p->pNe
284f0 78 74 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  xt;.    if( p==0
28500 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71   ) break;.    sq
28510 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
28520 56 64 62 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Vdbe);.    sqlit
28530 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
28540 70 56 64 62 65 2c 20 22 25 73 5c 6e 22 2c 20 73  pVdbe, "%s\n", s
28550 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
28560 70 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  p));.  }.  sqlit
28570 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
28580 70 56 64 62 65 2c 20 22 45 4e 44 22 29 3b 0a 20  pVdbe, "END");. 
28590 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
285a0 6f 70 28 70 56 64 62 65 29 3b 0a 7d 0a 0a 2f 2a  op(pVdbe);.}../*
285b0 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75   End of the stru
285c0 63 74 75 72 65 20 64 65 62 75 67 20 70 72 69 6e  cture debug prin
285d0 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a  ting code.******
285e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
285f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28620 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20  *******/.#endif 
28630 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
28640 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
28650 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
28660 20 2a 2f 0a                                       */.