/ Hex Artifact Content
Login

Artifact 2769d297c877e66ce780663867fdcffdeaa8302e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
0210: 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  l the content of
0220: 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74   a Select struct
0230: 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ure but do not d
0240: 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65  eallocate.** the
0250: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
0260: 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61  e itself..*/.sta
0270: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0280: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0290: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
02a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c  elete(db, p->pEL
02c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
02d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
02e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c   p->pSrc);.  sql
02f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0300: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
0310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0330: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
0340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0350: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0380: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
0390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
03a0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
03b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
03c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
03d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
03e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
03f0: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
0400: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c  Initialize a Sel
0410: 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
0420: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
0430: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
0440: 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65  (SelectDest *pDe
0450: 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  st, int eDest, i
0460: 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65  nt iParm){.  pDe
0470: 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29  st->eDest = (u8)
0480: 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e  eDest;.  pDest->
0490: 69 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20  iParm = iParm;. 
04a0: 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79   pDest->affinity
04b0: 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69   = 0;.  pDest->i
04c0: 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  Mem = 0;.  pDest
04d0: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 7d 0a 0a 0a  ->nMem = 0;.}...
04e0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
04f0: 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75   new Select stru
0500: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
0510: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0520: 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  at.** structure.
0530: 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  .*/.Select *sqli
0540: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
0550: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0560: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0570: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
0580: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
0590: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
05a0: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
05b0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
05c0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
05d0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
05e0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
05f0: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0600: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0610: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0620: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0630: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0640: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0650: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0660: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0670: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
0680: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
0690: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
06a0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
06b0: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
06c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
06d0: 69 73 44 69 73 74 69 6e 63 74 2c 20 20 20 20 20  isDistinct,     
06e0: 20 20 2f 2a 20 74 72 75 65 20 69 66 20 74 68 65    /* true if the
06f0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
0700: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
0710: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
0720: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54          /* LIMIT
0730: 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65   value.  NULL me
0740: 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a  ans not used */.
0750: 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20    Expr *pOffset 
0760: 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45          /* OFFSE
0770: 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d  T value.  NULL m
0780: 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a  eans no offset *
0790: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
07a0: 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74  New;.  Select st
07b0: 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  andin;.  sqlite3
07c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
07d0: 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
07e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
07f0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
0800: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ) );.  assert( d
0810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0820: 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70  || !pOffset || p
0830: 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f 46 46 53  Limit ); /* OFFS
0840: 45 54 20 69 6d 70 6c 69 65 73 20 4c 49 4d 49 54  ET implies LIMIT
0850: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   */.  if( pNew==
0860: 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  0 ){.    pNew = 
0870: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65  &standin;.    me
0880: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
0890: 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
08a0: 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  }.  if( pEList==
08b0: 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20  0 ){.    pEList 
08c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
08d0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
08e0: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
08f0: 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20  b,TK_ALL,0));.  
0900: 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  }.  pNew->pEList
0910: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65   = pEList;.  pNe
0920: 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  w->pSrc = pSrc;.
0930: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
0940: 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d   pWhere;.  pNew-
0950: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
0960: 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  upBy;.  pNew->pH
0970: 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b  aving = pHaving;
0980: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
0990: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
09a0: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
09b0: 20 69 73 44 69 73 74 69 6e 63 74 20 3f 20 53 46   isDistinct ? SF
09c0: 5f 44 69 73 74 69 6e 63 74 20 3a 20 30 3b 0a 20  _Distinct : 0;. 
09d0: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53   pNew->op = TK_S
09e0: 45 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70  ELECT;.  pNew->p
09f0: 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
0a00: 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
0a10: 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73  = pOffset;.  ass
0a20: 65 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20  ert( pOffset==0 
0a30: 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a  || pLimit!=0 );.
0a40: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0a50: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
0a60: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0a70: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
0a80: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0a90: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  [2] = -1;.  if( 
0aa0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
0ab0: 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65   ) {.    clearSe
0ac0: 6c 65 63 74 28 64 62 2c 20 70 4e 65 77 29 3b 0a  lect(db, pNew);.
0ad0: 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 26 73      if( pNew!=&s
0ae0: 74 61 6e 64 69 6e 20 29 20 73 71 6c 69 74 65 33  tandin ) sqlite3
0af0: 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29  DbFree(db, pNew)
0b00: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
0b10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
0b20: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  w;.}../*.** Dele
0b30: 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c  te the given Sel
0b40: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e  ect structure an
0b50: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
0b60: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
0b70: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0b80: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
0b90: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  *db, Select *p){
0ba0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
0bb0: 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20  clearSelect(db, 
0bc0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
0bd0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
0be0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
0bf0: 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69   1 to 3 identifi
0c00: 65 72 73 20 70 72 65 63 65 65 64 69 6e 67 20 74  ers preceeding t
0c10: 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c  he JOIN keyword,
0c20: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a   determine the.*
0c30: 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20  * type of join. 
0c40: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
0c50: 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74  er constant that
0c60: 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20   expresses that 
0c70: 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73  type.** in terms
0c80: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0c90: 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a  g bit values:.**
0ca0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52  .**     JT_INNER
0cb0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53  .**     JT_CROSS
0cc0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52  .**     JT_OUTER
0cd0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52  .**     JT_NATUR
0ce0: 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46  AL.**     JT_LEF
0cf0: 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48  T.**     JT_RIGH
0d00: 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f  T.**.** A full o
0d10: 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65  uter join is the
0d20: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
0d30: 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52  JT_LEFT and JT_R
0d40: 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  IGHT..**.** If a
0d50: 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73  n illegal or uns
0d60: 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79  upported join ty
0d70: 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e  pe is seen, then
0d80: 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a   still return.**
0d90: 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75   a join type, bu
0da0: 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69  t put an error i
0db0: 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
0dc0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
0dd0: 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50  qlite3JoinType(P
0de0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
0df0: 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a  ken *pA, Token *
0e00: 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a  pB, Token *pC){.
0e10: 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d    int jointype =
0e20: 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41   0;.  Token *apA
0e30: 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a  ll[3];.  Token *
0e40: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p;.             
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e60: 2f 2a 20 20 20 30 31 32 33 34 35 36 37 38 39 20  /*   0123456789 
0e70: 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36  123456789 123456
0e80: 37 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61  789 123 */.  sta
0e90: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
0ea0: 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74  KeyText[] = "nat
0eb0: 75 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74  uraleftouteright
0ec0: 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b  fullinnercross";
0ed0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
0ee0: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20  struct {.    u8 
0ef0: 69 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67  i;        /* Beg
0f00: 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72  inning of keywor
0f10: 64 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65  d text in zKeyTe
0f20: 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e  xt[] */.    u8 n
0f30: 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67  Char;    /* Leng
0f40: 74 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72  th of the keywor
0f50: 64 20 69 6e 20 63 68 61 72 61 63 74 65 72 73 20  d in characters 
0f60: 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20  */.    u8 code; 
0f70: 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65      /* Join type
0f80: 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65   mask */.  } aKe
0f90: 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  yword[] = {.    
0fa0: 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20  /* natural */ { 
0fb0: 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41  0,  7, JT_NATURA
0fc0: 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L               
0fd0: 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20   },.    /* left 
0fe0: 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a     */ { 6,  4, J
0ff0: 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20  T_LEFT|JT_OUTER 
1000: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1010: 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20  /* outer   */ { 
1020: 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20  10, 5, JT_OUTER 
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1040: 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74   },.    /* right
1050: 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a     */ { 14, 5, J
1060: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
1070: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1080: 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20  /* full    */ { 
1090: 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a  19, 4, JT_LEFT|J
10a0: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
10b0: 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72   },.    /* inner
10c0: 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a     */ { 23, 5, J
10d0: 54 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20  T_INNER         
10e0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
10f0: 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20  /* cross   */ { 
1100: 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c  28, 5, JT_INNER|
1110: 4a 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20  JT_CROSS        
1120: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
1130: 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20  , j;.  apAll[0] 
1140: 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d  = pA;.  apAll[1]
1150: 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32   = pB;.  apAll[2
1160: 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d  ] = pC;.  for(i=
1170: 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b  0; i<3 && apAll[
1180: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  i]; i++){.    p 
1190: 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20  = apAll[i];.    
11a0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79  for(j=0; j<Array
11b0: 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20  Size(aKeyword); 
11c0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
11d0: 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a  p->n==aKeyword[j
11e0: 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20  ].nChar .       
11f0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
1200: 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e  NICmp((char*)p->
1210: 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65  z, &zKeyText[aKe
1220: 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e  yword[j].i], p->
1230: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  n)==0 ){.       
1240: 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65   jointype |= aKe
1250: 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20  yword[j].code;. 
1260: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1270: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1280: 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c  testcase( j==0 |
1290: 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c  | j==1 || j==2 |
12a0: 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c  | j==3 || j==4 |
12b0: 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29  | j==5 || j==6 )
12c0: 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72  ;.    if( j>=Arr
12d0: 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29  aySize(aKeyword)
12e0: 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   ){.      jointy
12f0: 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a  pe |= JT_ERROR;.
1300: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1310: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20   }.  }.  if(.   
1320: 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a    (jointype & (J
1330: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
1340: 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54  ))==(JT_INNER|JT
1350: 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20  _OUTER) ||.     
1360: 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45  (jointype & JT_E
1370: 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20  RROR)!=0.  ){.  
1380: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1390: 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73  p = " ";.    ass
13a0: 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20  ert( pB!=0 );.  
13b0: 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a    if( pC==0 ){ z
13c0: 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69  Sp++; }.    sqli
13d0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13e0: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20  se, "unknown or 
13f0: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
1400: 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20   type: ".       
1410: 22 25 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c  "%T %T%s%T", pA,
1420: 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20   pB, zSp, pC);. 
1430: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
1440: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20  _INNER;.  }else 
1450: 69 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20  if( (jointype & 
1460: 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20  JT_OUTER)!=0 .  
1470: 20 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74         && (joint
1480: 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  ype & (JT_LEFT|J
1490: 54 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45  T_RIGHT))!=JT_LE
14a0: 46 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  FT ){.    sqlite
14b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14c0: 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48 54 20  , .      "RIGHT 
14d0: 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a  and FULL OUTER J
14e0: 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72  OINs are not cur
14f0: 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64  rently supported
1500: 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65  ");.    jointype
1510: 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d   = JT_INNER;.  }
1520: 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79  .  return jointy
1530: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  pe;.}../*.** Ret
1540: 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
1550: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74   a column in a t
1560: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31  able.  Return -1
1570: 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a   if the column.*
1580: 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  * is not contain
1590: 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ed in the table.
15a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
15b0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65  olumnIndex(Table
15c0: 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68   *pTab, const ch
15d0: 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74  ar *zCol){.  int
15e0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
15f0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
1600: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1610: 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e  e3StrICmp(pTab->
1620: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  aCol[i].zName, z
1630: 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Col)==0 ) return
1640: 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
1650: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   -1;.}../*.** Se
1660: 61 72 63 68 20 74 68 65 20 66 69 72 73 74 20 4e  arch the first N
1670: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c   tables in pSrc,
1680: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
1690: 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ght, looking for
16a0: 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74   a.** table that
16b0: 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61   has a column na
16c0: 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a  med zCol.  .**.*
16d0: 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65  * When found, se
16e0: 74 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69  t *piTab and *pi
16f0: 43 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65  Col to the table
1700: 20 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d   index and colum
1710: 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68  n index.** of th
1720: 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  e matching colum
1730: 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55  n and return TRU
1740: 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20  E..**.** If not 
1750: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41  found, return FA
1760: 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LSE..*/.static i
1770: 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  nt tableAndColum
1780: 6e 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73  nIndex(.  SrcLis
1790: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f  t *pSrc,       /
17a0: 2a 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65  * Array of table
17b0: 73 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  s to search */. 
17c0: 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
17d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17e0: 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72  of tables in pSr
17f0: 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68  c->a[] to search
1800: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1810: 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61   *zCol,    /* Na
1820: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
1830: 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20   we are looking 
1840: 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  for */.  int *pi
1850: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Tab,          /*
1860: 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20   Write index of 
1870: 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a  pSrc->a[] here *
1880: 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20  /.  int *piCol  
1890: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
18a0: 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d  e index of pSrc-
18b0: 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d  >a[*piTab].pTab-
18c0: 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a  >aCol[] here */.
18d0: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
18e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
18f0: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61   looping over ta
1900: 62 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a  bles in pSrc */.
1910: 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
1920: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1930: 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69  of column matchi
1940: 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73  ng zCol */..  as
1950: 73 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29  sert( (piTab==0)
1960: 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20  ==(piCol==0) ); 
1970: 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74   /* Both or neit
1980: 68 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a  her are NULL */.
1990: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20    for(i=0; i<N; 
19a0: 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  i++){.    iCol =
19b0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72   columnIndex(pSr
19c0: 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43  c->a[i].pTab, zC
19d0: 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  ol);.    if( iCo
19e0: 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  l>=0 ){.      if
19f0: 28 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20  ( piTab ){.     
1a00: 20 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20     *piTab = i;. 
1a10: 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20         *piCol = 
1a20: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iCol;.      }.  
1a30: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1a40: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1a50: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
1a60: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
1a70: 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20  ed to add terms 
1a80: 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20  implied by JOIN 
1a90: 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a  syntax to the.**
1aa0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78   WHERE clause ex
1ab0: 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45  pression of a SE
1ac0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
1ad0: 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68  The new term, wh
1ae0: 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20  ich.** is ANDed 
1af0: 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69 6e  with the existin
1b00: 67 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  g WHERE clause, 
1b10: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
1b20: 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63  **.**    (tab1.c
1b30: 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29  ol1 = tab2.col2)
1b40: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62  .**.** where tab
1b50: 31 20 69 73 20 74 68 65 20 69 53 72 63 27 74 68  1 is the iSrc'th
1b60: 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73   table in SrcLis
1b70: 74 20 70 53 72 63 20 61 6e 64 20 74 61 62 32 20  t pSrc and tab2 
1b80: 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63  is the .** (iSrc
1b90: 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63  +1)'th. Column c
1ba0: 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43  ol1 is column iC
1bb0: 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20  olLeft of tab1, 
1bc0: 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63  and col2 is.** c
1bd0: 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20  olumn iColRight 
1be0: 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74  of tab2..*/.stat
1bf0: 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72 65  ic void addWhere
1c00: 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
1c10: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
1c20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1c30: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1c40: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
1c70: 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65  s in FROM clause
1c80: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c   */.  int iLeft,
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1cb0: 66 20 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f  f first table to
1cc0: 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f   join in pSrc */
1cd0: 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c  .  int iColLeft,
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
1d00: 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74  olumn in first t
1d10: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
1d20: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
1d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1d40: 65 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62  ex of second tab
1d50: 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  le in pSrc */.  
1d60: 69 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20  int iColRight,  
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
1d90: 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62  mn in second tab
1da0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75  le */.  int isOu
1db0: 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20  terJoin,        
1dc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1dd0: 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55  if this is an OU
1de0: 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78  TER join */.  Ex
1df0: 70 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20  pr **ppWhere    
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e10: 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45   IN/OUT: The WHE
1e20: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64  RE clause to add
1e30: 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69   to */.){.  sqli
1e40: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1e50: 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  ->db;.  Expr *pE
1e60: 31 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a  1;.  Expr *pE2;.
1e70: 20 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20    Expr *pEq;..  
1e80: 61 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52  assert( iLeft<iR
1e90: 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74  ight );.  assert
1ea0: 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69  ( pSrc->nSrc>iRi
1eb0: 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ght );.  assert(
1ec0: 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e   pSrc->a[iLeft].
1ed0: 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74  pTab );.  assert
1ee0: 28 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74  ( pSrc->a[iRight
1ef0: 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31  ].pTab );..  pE1
1f00: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
1f10: 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70  ColumnExpr(db, p
1f20: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c  Src, iLeft, iCol
1f30: 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73  Left);.  pE2 = s
1f40: 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75  qlite3CreateColu
1f50: 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c  mnExpr(db, pSrc,
1f60: 20 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67   iRight, iColRig
1f70: 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71  ht);..  pEq = sq
1f80: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1f90: 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70  e, TK_EQ, pE1, p
1fa0: 45 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45  E2, 0);.  if( pE
1fb0: 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e  q && isOuterJoin
1fc0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
1fd0: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
1fe0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
1ff0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41  ssert( !ExprHasA
2000: 6e 79 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  nyProperty(pEq, 
2010: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
2020: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
2030: 45 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62  ExprSetIrreducib
2040: 6c 65 28 70 45 71 29 3b 0a 20 20 20 20 70 45 71  le(pEq);.    pEq
2050: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2060: 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69 54  e = (i16)pE2->iT
2070: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 57  able;.  }.  *ppW
2080: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
2090: 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68 65  prAnd(db, *ppWhe
20a0: 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a  re, pEq);.}../*.
20b0: 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72  ** Set the EP_Fr
20c0: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
20d0: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  on all terms of 
20e0: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
20f0: 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74  sion..** And set
2100: 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   the Expr.iRight
2110: 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61  JoinTable to iTa
2120: 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65  ble for every te
2130: 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70  rm in the.** exp
2140: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ression..**.** T
2150: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
2160: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
2170: 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65  on terms of an e
2180: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c  xpression to tel
2190: 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55  l.** the LEFT OU
21a0: 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73  TER JOIN process
21b0: 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74  ing logic that t
21c0: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
21d0: 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20   of the.** join 
21e0: 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63  restriction spec
21f0: 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  ified in the ON 
2200: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
2210: 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a  and not a part.*
2220: 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65  * of the more ge
2230: 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75  neral WHERE clau
2240: 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73  se.  These terms
2250: 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20   are moved over 
2260: 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  to the.** WHERE 
2270: 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f  clause during jo
2280: 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75  in processing bu
2290: 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d  t we need to rem
22a0: 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a  ember that they.
22b0: 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e  ** originated in
22c0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
22d0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54   clause..**.** T
22e0: 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  he Expr.iRightJo
22f0: 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68  inTable tells th
2300: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
2310: 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74  rocessing that t
2320: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
2330: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c   depends on tabl
2340: 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  e iRightJoinTabl
2350: 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74  e even if that t
2360: 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65  able is not.** e
2370: 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f  xplicitly mentio
2380: 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65  ned in the expre
2390: 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66  ssion.  That inf
23a0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64  ormation is need
23b0: 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20  ed.** for cases 
23c0: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
23d0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
23e0: 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
23f0: 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41  2 ON t1.a=t2.b A
2400: 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20  ND t1.x=5.**.** 
2410: 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  The where clause
2420: 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20   needs to defer 
2430: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
2440: 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65  the t1.x=5.** te
2450: 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74  rm until after t
2460: 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68  he t2 loop of th
2470: 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74  e join.  In that
2480: 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20   way, a.** NULL 
2490: 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69  t2 row will be i
24a0: 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72  nserted whenever
24b0: 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65   t1.x!=5.  If we
24c0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72   do not.** defer
24d0: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
24e0: 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c   t1.x=5, it will
24f0: 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d   be processed im
2500: 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74  mediately.** aft
2510: 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61  er the t1 loop a
2520: 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e  nd rows with t1.
2530: 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20  x!=5 will never 
2540: 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65  appear in.** the
2550: 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69   output, which i
2560: 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a  s incorrect..*/.
2570: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a  static void setJ
2580: 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c  oinExpr(Expr *p,
2590: 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
25a0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
25b0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
25c0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  p, EP_FromJoin);
25d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
25e0: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
25f0: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
2600: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
2610: 20 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64      ExprSetIrred
2620: 75 63 69 62 6c 65 28 70 29 3b 0a 20 20 20 20 70  ucible(p);.    p
2630: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2640: 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b  e = (i16)iTable;
2650: 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72  .    setJoinExpr
2660: 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  (p->pLeft, iTabl
2670: 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  e);.    p = p->p
2680: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
2690: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26a0: 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  e processes the 
26b0: 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  join information
26c0: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
26d0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61  atement..** ON a
26e0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
26f0: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
2700: 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20  nto extra terms 
2710: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
2720: 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20  use..** NATURAL 
2730: 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74  joins also creat
2740: 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  e extra WHERE cl
2750: 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a  ause terms..**.*
2760: 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61  * The terms of a
2770: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65   FROM clause are
2780: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
2790: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74  e Select.pSrc st
27a0: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20  ructure..** The 
27b0: 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20  left most table 
27c0: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  is the first ent
27d0: 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72  ry in Select.pSr
27e0: 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  c.  The right-mo
27f0: 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74  st.** table is t
2800: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20  he last entry.  
2810: 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  The join operato
2820: 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65  r is held in the
2830: 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65   entry to.** the
2840: 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74   left.  Thus ent
2850: 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68  ry 0 contains th
2860: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
2870: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74  for the join bet
2880: 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ween.** entries 
2890: 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e  0 and 1.  Any ON
28a0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
28b0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
28c0: 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a  h the join are.*
28d0: 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20  * also attached 
28e0: 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72  to the left entr
28f0: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
2900: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
2910: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
2920: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  rs encountered..
2930: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
2940: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
2950: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
2960: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
2970: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2990: 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  All tables in th
29a0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
29b0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
29e0: 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ers */.  struct 
29f0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
2a00: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74  eft;     /* Left
2a10: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
2a20: 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
2a30: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52  SrcList_item *pR
2a40: 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68  ight;    /* Righ
2a50: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
2a60: 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20  ined */..  pSrc 
2a70: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65  = p->pSrc;.  pLe
2a80: 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d  ft = &pSrc->a[0]
2a90: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c  ;.  pRight = &pL
2aa0: 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  eft[1];.  for(i=
2ab0: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
2ac0: 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b  1; i++, pRight++
2ad0: 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20  , pLeft++){.    
2ae0: 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20  Table *pLeftTab 
2af0: 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20  = pLeft->pTab;. 
2b00: 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74     Table *pRight
2b10: 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54  Tab = pRight->pT
2b20: 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75  ab;.    int isOu
2b30: 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45  ter;..    if( NE
2b40: 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d 30 20  VER(pLeftTab==0 
2b50: 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29  || pRightTab==0)
2b60: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2b70: 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67   isOuter = (pRig
2b80: 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ht->jointype & J
2b90: 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20  T_OUTER)!=0;..  
2ba0: 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41    /* When the NA
2bb0: 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73  TURAL keyword is
2bc0: 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48   present, add WH
2bd0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
2be0: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72   for.    ** ever
2bf0: 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68  y column that th
2c00: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76  e two tables hav
2c10: 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20  e in common..   
2c20: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
2c30: 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ht->jointype & J
2c40: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
2c50: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
2c60: 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55  On || pRight->pU
2c70: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  sing ){.        
2c80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2c90: 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52  pParse, "a NATUR
2ca0: 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20  AL join may not 
2cb0: 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20  have ".         
2cc0: 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e    "an ON or USIN
2cd0: 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20  G clause", 0);. 
2ce0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
2cf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2d00: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74  or(j=0; j<pRight
2d10: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
2d20: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
2d30: 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
2d40: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  of column in the
2d50: 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a   right table */.
2d60: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
2d70: 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69  t;     /* Matchi
2d80: 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f  ng left table */
2d90: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
2da0: 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68  ftCol;  /* Match
2db0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ing column in th
2dc0: 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  e left table */.
2dd0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
2de0: 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c   pRightTab->aCol
2df0: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
2e00: 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43     if( tableAndC
2e10: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c  olumnIndex(pSrc,
2e20: 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c   i+1, zName, &iL
2e30: 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20  eft, &iLeftCol) 
2e40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
2e50: 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65  WhereTerm(pParse
2e60: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
2e70: 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c  LeftCol, i+1, j,
2e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e90: 20 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c          isOuter,
2ea0: 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   &p->pWhere);.  
2eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2ec0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
2ed0: 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61  sallow both ON a
2ee0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
2ef0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
2f00: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  n.    */.    if(
2f10: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20   pRight->pOn && 
2f20: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
2f30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2f40: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2f50: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
2f60: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
2f70: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
2f80: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
2f90: 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  in");.      retu
2fa0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
2fb0: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
2fc0: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
2fd0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2fe0: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
2ff0: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44  by.    ** an AND
3000: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
3010: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3020: 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  ->pOn ){.      i
3030: 66 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74  f( isOuter ) set
3040: 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d  JoinExpr(pRight-
3050: 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43  >pOn, pRight->iC
3060: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d  ursor);.      p-
3070: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
3080: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
3090: 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  >db, p->pWhere, 
30a0: 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20  pRight->pOn);.  
30b0: 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20      pRight->pOn 
30c0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
30d0: 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20  /* Create extra 
30e0: 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45  terms on the WHE
30f0: 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61  RE clause for ea
3100: 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a  ch column named.
3110: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53      ** in the US
3120: 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61  ING clause.  Exa
3130: 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f  mple: If the two
3140: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3150: 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a  ined are .    **
3160: 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65   A and B and the
3170: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61   USING clause na
3180: 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c  mes X, Y, and Z,
3190: 20 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20   then add this. 
31a0: 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45     ** to the WHE
31b0: 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e  RE clause:    A.
31c0: 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e  X=B.X AND A.Y=B.
31d0: 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20  Y AND A.Z=B.Z.  
31e0: 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65    ** Report an e
31f0: 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75  rror if any colu
3200: 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  mn mentioned in 
3210: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3220: 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63   is.    ** not c
3230: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68  ontained in both
3240: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3250: 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ined..    */.   
3260: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73   if( pRight->pUs
3270: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c  ing ){.      IdL
3280: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69  ist *pList = pRi
3290: 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20  ght->pUsing;.   
32a0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
32b0: 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a  ist->nId; j++){.
32c0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
32d0: 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame;     /* Name
32e0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20   of the term in 
32f0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3300: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3310: 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20  iLeft;       /* 
3320: 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66  Table on the lef
3330: 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20  t with matching 
3340: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
3350: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
3360: 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col;    /* Colum
3370: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  n number of matc
3380: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74  hing column on t
3390: 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20  he left */.     
33a0: 20 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c     int iRightCol
33b0: 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75  ;   /* Column nu
33c0: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67  mber of matching
33d0: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72   column on the r
33e0: 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ight */..       
33f0: 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e   zName = pList->
3400: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
3410: 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20      iRightCol = 
3420: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67  columnIndex(pRig
3430: 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  htTab, zName);. 
3440: 20 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68         if( iRigh
3450: 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20  tCol<0.         
3460: 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75  || !tableAndColu
3470: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b  mnIndex(pSrc, i+
3480: 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74  1, zName, &iLeft
3490: 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20  , &iLeftCol).   
34a0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
34b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
34c0: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
34d0: 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c  t join using col
34e0: 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20  umn %s - column 
34f0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e  ".            "n
3500: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f  ot present in bo
3510: 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d  th tables", zNam
3520: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
3530: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
3540: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65  }.        addWhe
3550: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  reTerm(pParse, p
3560: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66  Src, iLeft, iLef
3570: 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68  tCol, i+1, iRigh
3580: 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tCol,.          
3590: 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74             isOut
35a0: 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b  er, &p->pWhere);
35b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
35c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
35d0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63  ../*.** Insert c
35e0: 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61  ode into "v" tha
35f0: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
3600: 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f  record on the to
3610: 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63  p of the.** stac
3620: 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65  k into the sorte
3630: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
3640: 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72  d pushOntoSorter
3650: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3660: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
3670: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
3680: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
3690: 65 72 42 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  erBy,    /* The 
36a0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
36b0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
36c0: 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  lect,       /* T
36d0: 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20  he whole SELECT 
36e0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
36f0: 6e 74 20 72 65 67 44 61 74 61 20 20 20 20 20 20  nt regData      
3700: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
3710: 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 74  r holding data t
3720: 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 29  o be sorted */.)
3730: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
3740: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
3750: 6e 74 20 6e 45 78 70 72 20 3d 20 70 4f 72 64 65  nt nExpr = pOrde
3760: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e  rBy->nExpr;.  in
3770: 74 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69  t regBase = sqli
3780: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
3790: 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 32 29  pParse, nExpr+2)
37a0: 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  ;.  int regRecor
37b0: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
37c0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
37d0: 20 69 6e 74 20 6f 70 3b 0a 20 20 73 71 6c 69 74   int op;.  sqlit
37e0: 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
37f0: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
3800: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
3810: 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ist(pParse, pOrd
3820: 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30  erBy, regBase, 0
3830: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3840: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
3850: 75 65 6e 63 65 2c 20 70 4f 72 64 65 72 42 79 2d  uence, pOrderBy-
3860: 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61  >iECursor, regBa
3870: 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20 73 71 6c  se+nExpr);.  sql
3880: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
3890: 28 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61  (pParse, regData
38a0: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b  , regBase+nExpr+
38b0: 31 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  1, 1);.  sqlite3
38c0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
38d0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
38e0: 42 61 73 65 2c 20 6e 45 78 70 72 20 2b 20 32 2c  Base, nExpr + 2,
38f0: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69   regRecord);.  i
3900: 66 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46  f( pSelect->selF
3910: 6c 61 67 73 20 26 20 53 46 5f 55 73 65 53 6f 72  lags & SF_UseSor
3920: 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  ter ){.    op = 
3930: 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b  OP_SorterInsert;
3940: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
3950: 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b   = OP_IdxInsert;
3960: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
3970: 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
3980: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
3990: 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  or, regRecord);.
39a0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
39b0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
39c0: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
39d0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
39e0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
39f0: 67 42 61 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b  gBase, nExpr+2);
3a00: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e  .  if( pSelect->
3a10: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e  iLimit ){.    in
3a20: 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a  t addr1, addr2;.
3a30: 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a      int iLimit;.
3a40: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d      if( pSelect-
3a50: 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >iOffset ){.    
3a60: 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65    iLimit = pSele
3a70: 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 3b 0a 20  ct->iOffset+1;. 
3a80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3a90: 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74  iLimit = pSelect
3aa0: 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 0a  ->iLimit;.    }.
3ab0: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
3ac0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
3ad0: 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d   OP_IfZero, iLim
3ae0: 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
3af0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3b00: 5f 41 64 64 49 6d 6d 2c 20 69 4c 69 6d 69 74 2c  _AddImm, iLimit,
3b10: 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20   -1);.    addr2 
3b20: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
3b30: 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
3b40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3b50: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
3b60: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
3b70: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
3b80: 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e  Last, pOrderBy->
3b90: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  iECursor);.    s
3ba0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
3bb0: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70  (v, OP_Delete, p
3bc0: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
3bd0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
3be0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
3bf0: 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ddr2);.  }.}../*
3c00: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20  .** Add code to 
3c10: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46  implement the OF
3c20: 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76  FSET.*/.static v
3c30: 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a  oid codeOffset(.
3c40: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
3c50: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
3c60: 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56  code into this V
3c70: 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  M */.  Select *p
3c80: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
3c90: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3ca0: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
3cb0: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20    int iContinue 
3cc0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
3cd0: 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72   to skip the cur
3ce0: 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29  rent record */.)
3cf0: 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73  {.  if( p->iOffs
3d00: 65 74 20 26 26 20 69 43 6f 6e 74 69 6e 75 65 21  et && iContinue!
3d10: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  =0 ){.    int ad
3d20: 64 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  dr;.    sqlite3V
3d30: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3d40: 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66 66 73  AddImm, p->iOffs
3d50: 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64  et, -1);.    add
3d60: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
3d70: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 65  ddOp1(v, OP_IfNe
3d80: 67 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a  g, p->iOffset);.
3d90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3da0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
3db0: 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , 0, iContinue);
3dc0: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
3dd0: 28 28 76 2c 20 22 73 6b 69 70 20 4f 46 46 53 45  ((v, "skip OFFSE
3de0: 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20  T records"));.  
3df0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
3e00: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
3e10: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
3e20: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
3e30: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  check to make su
3e40: 72 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65  re the N registe
3e50: 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69  rs starting at i
3e60: 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69  Mem.** form a di
3e70: 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69  stinct entry.  i
3e80: 54 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67  Tab is a sorting
3e90: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
3ea0: 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
3eb0: 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  seen combination
3ec0: 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65  s of the N value
3ed0: 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  s.  A new entry 
3ee0: 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a  is made in iTab.
3ef0: 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  ** if the curren
3f00: 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e  t N values are n
3f10: 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70  ew..**.** A jump
3f20: 20 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69   to addrRepeat i
3f30: 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e  s made and the N
3f40: 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f  +1 values are po
3f50: 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  pped from the.**
3f60: 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f   stack if the to
3f70: 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65  p N elements are
3f80: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a   not distinct..*
3f90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
3fa0: 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61  deDistinct(.  Pa
3fb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
3fc0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
3fd0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
3fe0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
3ff0: 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20   iTab,          
4000: 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64  /* A sorting ind
4010: 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  ex used to test 
4020: 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73  for distinctness
4030: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65   */.  int addrRe
4040: 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70  peat,    /* Jump
4050: 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20   to here if not 
4060: 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e  distinct */.  in
4070: 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t N,            
4080: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
4090: 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  ements */.  int 
40a0: 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f  iMem           /
40b0: 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20  * First element 
40c0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  */.){.  Vdbe *v;
40d0: 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20  .  int r1;..  v 
40e0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
40f0: 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  .  r1 = sqlite3G
4100: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
4110: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
4120: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
4130: 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64  Found, iTab, add
4140: 72 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e  rRepeat, iMem, N
4150: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
4160: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
4170: 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e  eRecord, iMem, N
4180: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
4190: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
41a0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62  _IdxInsert, iTab
41b0: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
41c0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
41d0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23  Parse, r1);.}..#
41e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
41f0: 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
4200: 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72  * Generate an er
4210: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e  ror message when
4220: 20 61 20 53 45 4c 45 43 54 20 69 73 20 75 73 65   a SELECT is use
4230: 64 20 77 69 74 68 69 6e 20 61 20 73 75 62 65 78  d within a subex
4240: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61  pression.** (exa
4250: 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53 45  mple:  "a IN (SE
4260: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c  LECT * FROM tabl
4270: 65 29 22 29 20 62 75 74 20 69 74 20 68 61 73 20  e)") but it has 
4280: 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73 75  more than 1 resu
4290: 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57  lt.** column.  W
42a0: 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20 73  e do this in a s
42b0: 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75 73  ubroutine becaus
42c0: 65 20 74 68 65 20 65 72 72 6f 72 20 75 73 65 64  e the error used
42d0: 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 69 6e 20   to occur.** in 
42e0: 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2e  multiple places.
42f0: 20 20 28 54 68 65 20 65 72 72 6f 72 20 6f 6e 6c    (The error onl
4300: 79 20 6f 63 63 75 72 73 20 69 6e 20 6f 6e 65 20  y occurs in one 
4310: 70 6c 61 63 65 20 6e 6f 77 2c 20 62 75 74 20 77  place now, but w
4320: 65 0a 2a 2a 20 72 65 74 61 69 6e 20 74 68 65 20  e.** retain the 
4330: 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 69  subroutine to mi
4340: 6e 69 6d 69 7a 65 20 63 6f 64 65 20 64 69 73 72  nimize code disr
4350: 75 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74 61 74  uption.).*/.stat
4360: 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d  ic int checkForM
4370: 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74  ultiColumnSelect
4380: 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a  Error(.  Parse *
4390: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
43a0: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e 20   Parse context. 
43b0: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
43c0: 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65 73  *pDest,   /* Des
43d0: 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c 45  tination of SELE
43e0: 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  CT results */.  
43f0: 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20 20  int nExpr       
4400: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4410: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
4420: 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c   returned by SEL
4430: 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ECT */.){.  int 
4440: 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65  eDest = pDest->e
4450: 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78 70  Dest;.  if( nExp
4460: 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d 53  r>1 && (eDest==S
4470: 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d  RT_Mem || eDest=
4480: 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20 20  =SRT_Set) ){.   
4490: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
44a0: 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61  (pParse, "only a
44b0: 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61   single result a
44c0: 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20  llowed for ".   
44d0: 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68      "a SELECT th
44e0: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
44f0: 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20   expression");. 
4500: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
4510: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
4520: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
4530: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
4540: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
4550: 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  he code for the 
4560: 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e  inside of the in
4570: 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61  ner loop.** of a
4580: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49   SELECT..**.** I
4590: 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f  f srcTab and nCo
45a0: 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65  lumn are both ze
45b0: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c  ro, then the pEL
45c0: 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  ist expressions.
45d0: 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ** are evaluated
45e0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
45f0: 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
4600: 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c  is row.  If nCol
4610: 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61  umn>0.** then da
4620: 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f  ta is pulled fro
4630: 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c  m srcTab and pEL
4640: 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ist is used only
4650: 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64   to get the.** d
4660: 61 74 61 74 79 70 65 73 20 66 6f 72 20 65 61 63  atatypes for eac
4670: 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61  h column..*/.sta
4680: 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49  tic void selectI
4690: 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73  nnerLoop(.  Pars
46a0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
46b0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
46c0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
46d0: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
46e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
46f0: 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74  mplete select st
4700: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
4710: 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ded */.  ExprLis
4720: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
4730: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75   /* List of valu
4740: 65 73 20 62 65 69 6e 67 20 65 78 74 72 61 63 74  es being extract
4750: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54  ed */.  int srcT
4760: 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
4770: 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f  /* Pull data fro
4780: 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  m this table */.
4790: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20    int nColumn,  
47a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
47b0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
47c0: 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  n the source tab
47d0: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
47e0: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
47f0: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
4800: 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75 73 69  sort results usi
4810: 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20  ng this key */. 
4820: 20 69 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20   int distinct,  
4830: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e           /* If >
4840: 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65  =0, make sure re
4850: 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e  sults are distin
4860: 63 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ct */.  SelectDe
4870: 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20  st *pDest,      
4880: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
4890: 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73  e of the results
48a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
48b0: 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  nue,          /*
48c0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
48d0: 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
48e0: 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42   row */.  int iB
48f0: 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20  reak            
4900: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
4910: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
4920: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f  he inner loop */
4930: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
4940: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
4950: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61   int i;.  int ha
4960: 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  sDistinct;      
4970: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
4980: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
4990: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
49a0: 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b    int regResult;
49b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
49c0: 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79   Start of memory
49d0: 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
49e0: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  set */.  int eDe
49f0: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
4a00: 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64  t;   /* How to d
4a10: 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c 74  ispose of result
4a20: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  s */.  int iParm
4a30: 20 3d 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b   = pDest->iParm;
4a40: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
4a50: 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61 6c  ment to disposal
4a60: 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74   method */.  int
4a70: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20   nResultCol;    
4a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4a90: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
4aa0: 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  umns */..  asser
4ab0: 74 28 20 76 20 29 3b 0a 20 20 69 66 28 20 4e 45  t( v );.  if( NE
4ac0: 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75  VER(v==0) ) retu
4ad0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  rn;.  assert( pE
4ae0: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73  List!=0 );.  has
4af0: 44 69 73 74 69 6e 63 74 20 3d 20 64 69 73 74 69  Distinct = disti
4b00: 6e 63 74 3e 3d 30 3b 0a 20 20 69 66 28 20 70 4f  nct>=0;.  if( pO
4b10: 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21 68 61  rderBy==0 && !ha
4b20: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
4b30: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
4b40: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
4b50: 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65  }..  /* Pull the
4b60: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d   requested colum
4b70: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ns..  */.  if( n
4b80: 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20  Column>0 ){.    
4b90: 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 6e 43 6f  nResultCol = nCo
4ba0: 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lumn;.  }else{. 
4bb0: 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20     nResultCol = 
4bc0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
4bd0: 20 7d 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e   }.  if( pDest->
4be0: 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 70  iMem==0 ){.    p
4bf0: 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 70 50 61  Dest->iMem = pPa
4c00: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
4c10: 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 6e   pDest->nMem = n
4c20: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 70  ResultCol;.    p
4c30: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
4c40: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c  ResultCol;.  }el
4c50: 73 65 7b 20 0a 20 20 20 20 61 73 73 65 72 74 28  se{ .    assert(
4c60: 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 3d 3d 6e 52   pDest->nMem==nR
4c70: 65 73 75 6c 74 43 6f 6c 20 29 3b 0a 20 20 7d 0a  esultCol );.  }.
4c80: 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44    regResult = pD
4c90: 65 73 74 2d 3e 69 4d 65 6d 3b 0a 20 20 69 66 28  est->iMem;.  if(
4ca0: 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20   nColumn>0 ){.  
4cb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
4cc0: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
4cd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4ce0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
4cf0: 2c 20 73 72 63 54 61 62 2c 20 69 2c 20 72 65 67  , srcTab, i, reg
4d00: 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 7d  Result+i);.    }
4d10: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65  .  }else if( eDe
4d20: 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29  st!=SRT_Exists )
4d30: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
4d40: 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61  destination is a
4d50: 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78  n EXISTS(...) ex
4d60: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63  pression, the ac
4d70: 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75  tual.    ** valu
4d80: 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  es returned by t
4d90: 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f  he SELECT are no
4da0: 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  t required..    
4db0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
4dc0: 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
4dd0: 72 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rse);.    sqlite
4de0: 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
4df0: 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  t(pParse, pEList
4e00: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 65 44 65  , regResult, eDe
4e10: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 29 3b  st==SRT_Output);
4e20: 0a 20 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d  .  }.  nColumn =
4e30: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20   nResultCol;..  
4e40: 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54 49 4e  /* If the DISTIN
4e50: 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70  CT keyword was p
4e60: 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45  resent on the SE
4e70: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
4e80: 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77   ** and this row
4e90: 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62   has been seen b
4ea0: 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e  efore, then do n
4eb0: 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77  ot make this row
4ec0: 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  .  ** part of th
4ed0: 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20  e result..  */. 
4ee0: 20 69 66 28 20 68 61 73 44 69 73 74 69 6e 63 74   if( hasDistinct
4ef0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4f00: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20  pEList!=0 );.   
4f10: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d   assert( pEList-
4f20: 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c 75 6d 6e 20  >nExpr==nColumn 
4f30: 29 3b 0a 20 20 20 20 63 6f 64 65 44 69 73 74 69  );.    codeDisti
4f40: 6e 63 74 28 70 50 61 72 73 65 2c 20 64 69 73 74  nct(pParse, dist
4f50: 69 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  inct, iContinue,
4f60: 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 65 73   nColumn, regRes
4f70: 75 6c 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  ult);.    if( pO
4f80: 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
4f90: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
4fa0: 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   p, iContinue);.
4fb0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69      }.  }..  swi
4fc0: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
4fd0: 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64    /* In this mod
4fe0: 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75  e, write each qu
4ff0: 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68  ery result to th
5000: 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d  e key of the tem
5010: 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61  porary.    ** ta
5020: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
5030: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
5040: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
5050: 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20 53  ELECT.    case S
5060: 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20  RT_Union: {.    
5070: 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20    int r1;.      
5080: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
5090: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
50a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
50b0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
50c0: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
50d0: 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31  ult, nColumn, r1
50e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
50f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5100: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
5110: 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  m, r1);.      sq
5120: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
5130: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
5140: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5150: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73    }..    /* Cons
5160: 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66  truct a record f
5170: 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65  rom the query re
5180: 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61  sult, but instea
5190: 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69  d of.    ** savi
51a0: 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20  ng that record, 
51b0: 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20  use it as a key 
51c0: 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e  to delete elemen
51d0: 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ts from.    ** t
51e0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
51f0: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
5200: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
5210: 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71  cept: {.      sq
5220: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5230: 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c  v, OP_IdxDelete,
5240: 20 69 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c   iParm, regResul
5250: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
5260: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5270: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53  #endif..    /* S
5280: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
5290: 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
52a0: 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
52b0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
52c0: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
52d0: 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
52e0: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
52f0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
5300: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
5310: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
5320: 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20  =SRT_Table );.  
5330: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
5340: 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
5350: 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b );.      sqlit
5360: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5370: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
5380: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5390: 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 69 66  n, r1);.      if
53a0: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
53b0: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
53c0: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
53d0: 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20  derBy, p, r1);. 
53e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
53f0: 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
5400: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
5410: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
5420: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5430: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
5440: 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20  , iParm, r2);.  
5450: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5460: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
5470: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c  sert, iParm, r1,
5480: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r2);.        sq
5490: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
54a0: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
54b0: 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ND);.        sql
54c0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
54d0: 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
54e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
54f0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
5500: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
5510: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5520: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
5530: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
5540: 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
5550: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
5560: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
5570: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
5580: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
5590: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
55a0: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
55b0: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
55c0: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
55d0: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
55e0: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
55f0: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
5600: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
5610: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
5620: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
5630: 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  =1 );.      p->a
5640: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
5650: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
5660: 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  (pEList->a[0].pE
5670: 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 69  xpr, pDest->affi
5680: 6e 69 74 79 29 3b 0a 20 20 20 20 20 20 69 66 28  nity);.      if(
5690: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
56a0: 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74       /* At first
56b0: 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c   glance you woul
56c0: 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64  d think we could
56d0: 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68   optimize out th
56e0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44  e.        ** ORD
56f0: 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61  ER BY in this ca
5700: 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64  se since the ord
5710: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
5720: 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20   the set.       
5730: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   ** does not mat
5740: 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20  ter.  But there 
5750: 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54  might be a LIMIT
5760: 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63   clause, in whic
5770: 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73  h.        ** cas
5780: 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73  e the order does
5790: 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20   matter */.     
57a0: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
57b0: 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  r(pParse, pOrder
57c0: 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74  By, p, regResult
57d0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
57e0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
57f0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
5800: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
5810: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5820: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
5830: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
5840: 74 2c 20 31 2c 20 72 31 2c 20 26 70 2d 3e 61 66  t, 1, r1, &p->af
5850: 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20  finity, 1);.    
5860: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
5870: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
5880: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  ge(pParse, regRe
5890: 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  sult, 1);.      
58a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
58b0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
58c0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b  ert, iParm, r1);
58d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
58e0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
58f0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
5900: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
5910: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
5920: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
5930: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
5940: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
5950: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
5960: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
5970: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
5980: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5990: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
59a0: 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20  er, 1, iParm);. 
59b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
59c0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
59d0: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
59e0: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
59f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
5a00: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
5a10: 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
5a20: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
5a30: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
5a40: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
5a50: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
5a60: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
5a70: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
5a80: 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a   break out.    *
5a90: 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
5aa0: 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
5ab0: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
5ac0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
5ad0: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
5ae0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
5af0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
5b00: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
5b10: 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67  pOrderBy, p, reg
5b20: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d  Result);.      }
5b30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
5b40: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
5b50: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73  e(pParse, regRes
5b60: 75 6c 74 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ult, iParm, 1);.
5b70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
5b80: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
5b90: 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   jump out of the
5ba0: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
5bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5bc0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5bd0: 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
5be0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
5bf0: 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e  Y */..    /* Sen
5c00: 64 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68  d the data to th
5c10: 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  e callback funct
5c20: 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75 62 72  ion or to a subr
5c30: 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a  outine.  In the.
5c40: 20 20 20 20 2a 2a 20 63 61 73 65 20 6f 66 20 61      ** case of a
5c50: 20 73 75 62 72 6f 75 74 69 6e 65 2c 20 74 68 65   subroutine, the
5c60: 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65   subroutine itse
5c70: 6c 66 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  lf is responsibl
5c80: 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70  e for.    ** pop
5c90: 70 69 6e 67 20 74 68 65 20 64 61 74 61 20 66 72  ping the data fr
5ca0: 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  om the stack..  
5cb0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
5cc0: 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 0a 20 20 20  T_Coroutine:.   
5cd0: 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74   case SRT_Output
5ce0: 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
5cf0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  se( eDest==SRT_C
5d00: 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20  oroutine );.    
5d10: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
5d20: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
5d30: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
5d40: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69  rBy ){.        i
5d50: 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
5d60: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
5d70: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5d80: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5d90: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
5da0: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5db0: 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  n, r1);.        
5dc0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
5dd0: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
5de0: 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20   p, r1);.       
5df0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5e00: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5e10: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  1);.      }else 
5e20: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
5e30: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
5e40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5e50: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
5e60: 64 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29  d, pDest->iParm)
5e70: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5e80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5e90: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
5ea0: 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73  esultRow, regRes
5eb0: 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  ult, nColumn);. 
5ec0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
5ed0: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
5ee0: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
5ef0: 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e  gResult, nColumn
5f00: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5f10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
5f20: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
5f30: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
5f40: 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20  .    /* Discard 
5f50: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
5f60: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53  is is used for S
5f70: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
5f80: 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74   inside.    ** t
5f90: 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49  he body of a TRI
5fa0: 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f  GGER.  The purpo
5fb0: 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63  se of such selec
5fc0: 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20  ts is to call.  
5fd0: 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65    ** user-define
5fe0: 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  d functions that
5ff0: 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63   have side effec
6000: 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63  ts.  We do not c
6010: 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74  are.    ** about
6020: 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75   the actual resu
6030: 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
6040: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  t..    */.    de
6050: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
6060: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
6070: 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20  T_Discard );.   
6080: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6090: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
60a0: 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   Jump to the end
60b0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20   of the loop if 
60c0: 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61  the LIMIT is rea
60d0: 63 68 65 64 2e 20 20 45 78 63 65 70 74 2c 20 69  ched.  Except, i
60e0: 66 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  f.  ** there is 
60f0: 61 20 73 6f 72 74 65 72 2c 20 69 6e 20 77 68 69  a sorter, in whi
6100: 63 68 20 63 61 73 65 20 74 68 65 20 73 6f 72 74  ch case the sort
6110: 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6c  er has already l
6120: 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68 65 20  imited.  ** the 
6130: 6f 75 74 70 75 74 20 66 6f 72 20 75 73 2e 0a 20  output for us.. 
6140: 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
6150: 42 79 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d  By==0 && p->iLim
6160: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
6170: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6180: 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  P_IfZero, p->iLi
6190: 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29  mit, iBreak, -1)
61a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
61b0: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
61c0: 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74  on list, generat
61d0: 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  e a KeyInfo stru
61e0: 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72  cture that recor
61f0: 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74  ds.** the collat
6200: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
6210: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
6220: 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73   in that express
6230: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
6240: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
6250: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  is an ORDER BY o
6260: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
6270: 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  e then the resul
6280: 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20  ting.** KeyInfo 
6290: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70  structure is app
62a0: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69  ropriate for ini
62b0: 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74  tializing a virt
62c0: 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20  ual index to.** 
62d0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63  implement that c
62e0: 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45  lause.  If the E
62f0: 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72  xprList is the r
6300: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
6310: 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68  ELECT.** then th
6320: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
6330: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
6340: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
6350: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a  ing a virtual.**
6360: 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d   index to implem
6370: 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74  ent a DISTINCT t
6380: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  est..**.** Space
6390: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79   to hold the Key
63a0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
63b0: 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20 6d 61  s obtain from ma
63c0: 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69  lloc.  The calli
63d0: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  ng.** function i
63e0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
63f0: 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74 68  r seeing that th
6400: 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
6410: 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72  eventually.** fr
6420: 65 65 64 2e 20 20 41 64 64 20 74 68 65 20 4b 65  eed.  Add the Ke
6430: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
6440: 74 6f 20 74 68 65 20 50 34 20 66 69 65 6c 64 20  to the P4 field 
6450: 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 75 73 69  of an opcode usi
6460: 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49 4e 46 4f  ng.** P4_KEYINFO
6470: 5f 48 41 4e 44 4f 46 46 20 69 73 20 74 68 65 20  _HANDOFF is the 
6480: 75 73 75 61 6c 20 77 61 79 20 6f 66 20 64 65 61  usual way of dea
6490: 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73 2e 0a  ling with this..
64a0: 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66  */.static KeyInf
64b0: 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  o *keyInfoFromEx
64c0: 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a 70 50  prList(Parse *pP
64d0: 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a  arse, ExprList *
64e0: 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65  pList){.  sqlite
64f0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
6500: 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b  db;.  int nExpr;
6510: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66  .  KeyInfo *pInf
6520: 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  o;.  struct Expr
6530: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
6540: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45  ;.  int i;..  nE
6550: 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  xpr = pList->nEx
6560: 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71  pr;.  pInfo = sq
6570: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
6580: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49  o(db, sizeof(*pI
6590: 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28 73 69  nfo) + nExpr*(si
65a0: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
65b0: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f  ) );.  if( pInfo
65c0: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61   ){.    pInfo->a
65d0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
65e0: 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e  )&pInfo->aColl[n
65f0: 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e 66 6f  Expr];.    pInfo
6600: 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  ->nField = (u16)
6610: 6e 45 78 70 72 3b 0a 20 20 20 20 70 49 6e 66 6f  nExpr;.    pInfo
6620: 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
6630: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 64 62 20 3d  .    pInfo->db =
6640: 20 64 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   db;.    for(i=0
6650: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
6660: 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  ; i<nExpr; i++, 
6670: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
6680: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
6690: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
66a0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
66b0: 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
66c0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
66d0: 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
66e0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e      pColl = db->
66f0: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
6700: 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e   }.      pInfo->
6710: 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c  aColl[i] = pColl
6720: 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  ;.      pInfo->a
6730: 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
6740: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
6750: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6760: 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 23 69  urn pInfo;.}..#i
6770: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6780: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
6790: 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20  T./*.** Name of 
67a0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
67b0: 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f  perator, used fo
67c0: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
67d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
67e0: 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70  t char *selectOp
67f0: 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20  Name(int id){.  
6800: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63  char *z;.  switc
6810: 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73  h( id ){.    cas
6820: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20  e TK_ALL:       
6830: 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b  z = "UNION ALL";
6840: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
6850: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
6860: 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22   z = "INTERSECT"
6870: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
6880: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
6890: 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20    z = "EXCEPT"; 
68a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
68b0: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
68c0: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20     z = "UNION"; 
68d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
68e0: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23  .  return z;.}.#
68f0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
6900: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
6910: 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  LECT */..#ifndef
6920: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
6930: 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  LAIN./*.** Unles
6940: 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55  s an "EXPLAIN QU
6950: 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e  ERY PLAN" comman
6960: 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65  d is being proce
6970: 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ssed, this funct
6980: 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ion.** is a no-o
6990: 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
69a0: 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72   adds a single r
69b0: 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20  ow of output to 
69c0: 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a  the EQP result,.
69d0: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70  ** where the cap
69e0: 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  tion is of the f
69f0: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53  orm:.**.**   "US
6a00: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
6a10: 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65  R xxx".**.** whe
6a20: 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f 66  re xxx is one of
6a30: 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f 52   "DISTINCT", "OR
6a40: 44 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f 55  DER BY" or "GROU
6a50: 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20 77  P BY". Exactly w
6a60: 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65 72  hich.** is deter
6a70: 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55 73  mined by the zUs
6a80: 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  age argument..*/
6a90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
6aa0: 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50 61  lainTempTable(Pa
6ab0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
6ac0: 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65 29  st char *zUsage)
6ad0: 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
6ae0: 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
6af0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
6b00: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63  se->pVdbe;.    c
6b10: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
6b20: 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
6b30: 65 2d 3e 64 62 2c 20 22 55 53 45 20 54 45 4d 50  e->db, "USE TEMP
6b40: 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73 22 2c   B-TREE FOR %s",
6b50: 20 7a 55 73 61 67 65 29 3b 0a 20 20 20 20 73 71   zUsage);.    sq
6b60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
6b70: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  v, OP_Explain, p
6b80: 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
6b90: 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  , 0, 0, zMsg, P4
6ba0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
6bb0: 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65  ../*.** Assign e
6bc0: 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c  xpression b to l
6bd0: 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63 6f 6e  value a. A secon
6be0: 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f  d, no-op, versio
6bf0: 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 0a  n of this macro.
6c00: 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20 77  ** is provided w
6c10: 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  hen SQLITE_OMIT_
6c20: 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66 69 6e  EXPLAIN is defin
6c30: 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  ed. This allows 
6c40: 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73  the code.** in s
6c50: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 74  qlite3Select() t
6c60: 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65 73 20  o assign values 
6c70: 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d 65 6d  to structure mem
6c80: 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  ber variables th
6c90: 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74  at.** only exist
6ca0: 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
6cb0: 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64  EXPLAIN is not d
6cc0: 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74 20 70  efined without p
6cd0: 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20  olluting the.** 
6ce0: 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e 64 65  code with #ifnde
6cf0: 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f  f directives..*/
6d00: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
6d10: 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c 20 62  nSetInteger(a, b
6d20: 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f  ) a = b..#else./
6d30: 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73  * No-op versions
6d40: 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58   of the explainX
6d50: 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61  XX() functions a
6d60: 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20  nd macros. */.# 
6d70: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 54 65  define explainTe
6d80: 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64  mpTable(y,z).# d
6d90: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74  efine explainSet
6da0: 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23 65 6e  Integer(y,z).#en
6db0: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
6dc0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  d(SQLITE_OMIT_EX
6dd0: 50 4c 41 49 4e 29 20 26 26 20 21 64 65 66 69 6e  PLAIN) && !defin
6de0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
6df0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 0a  OMPOUND_SELECT).
6e00: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20  /*.** Unless an 
6e10: 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
6e20: 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  LAN" command is 
6e30: 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c  being processed,
6e40: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
6e50: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  * is a no-op. Ot
6e60: 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73  herwise, it adds
6e70: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
6e80: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45   output to the E
6e90: 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68  QP result,.** wh
6ea0: 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20  ere the caption 
6eb0: 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65  is of one of the
6ec0: 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a   two forms:.**.*
6ed0: 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53  *   "COMPOSITE S
6ee0: 55 42 51 55 45 52 49 45 53 20 69 53 75 62 31 20  UBQUERIES iSub1 
6ef0: 61 6e 64 20 69 53 75 62 32 20 28 6f 70 29 22 0a  and iSub2 (op)".
6f00: 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20  **   "COMPOSITE 
6f10: 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62 31  SUBQUERIES iSub1
6f20: 20 61 6e 64 20 69 53 75 62 32 20 55 53 49 4e 47   and iSub2 USING
6f30: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 28 6f 70   TEMP B-TREE (op
6f40: 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 69  )".**.** where i
6f50: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 61  Sub1 and iSub2 a
6f60: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 73 20  re the integers 
6f70: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f  passed as the co
6f80: 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66  rresponding.** f
6f90: 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
6fa0: 72 73 2c 20 61 6e 64 20 6f 70 20 69 73 20 74 68  rs, and op is th
6fb0: 65 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74  e text represent
6fc0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72  ation of the par
6fd0: 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65  ameter.** of the
6fe0: 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68 65 20   same name. The 
6ff0: 70 61 72 61 6d 65 74 65 72 20 22 6f 70 22 20 6d  parameter "op" m
7000: 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 54 4b  ust be one of TK
7010: 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
7020: 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52 53 45  T,.** TK_INTERSE
7030: 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20 54 68  CT or TK_ALL. Th
7040: 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69 73 20  e first form is 
7050: 75 73 65 64 20 69 66 20 61 72 67 75 6d 65 6e 74  used if argument
7060: 20 62 55 73 65 54 6d 70 20 69 73 20 0a 2a 2a 20   bUseTmp is .** 
7070: 66 61 6c 73 65 2c 20 6f 72 20 74 68 65 20 73 65  false, or the se
7080: 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69 74 20  cond form if it 
7090: 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
70a0: 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 43  ic void explainC
70b0: 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50 61 72 73  omposite(.  Pars
70c0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
70e0: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
70f0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7110: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55    /* One of TK_U
7120: 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 20  NION, TK_EXCEPT 
7130: 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 53  etc. */.  int iS
7140: 75 62 31 2c 20 20 20 20 20 20 20 20 20 20 20 20  ub1,            
7150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
7160: 71 75 65 72 79 20 69 64 20 31 20 2a 2f 0a 20 20  query id 1 */.  
7170: 69 6e 74 20 69 53 75 62 32 2c 20 20 20 20 20 20  int iSub2,      
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7190: 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 32  /* Subquery id 2
71a0: 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65 54 6d   */.  int bUseTm
71b0: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
71c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
71d0: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20 77 61   a temp table wa
71e0: 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  s used */.){.  a
71f0: 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e  ssert( op==TK_UN
7200: 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58  ION || op==TK_EX
7210: 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  CEPT || op==TK_I
7220: 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f 70 3d 3d  NTERSECT || op==
7230: 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20  TK_ALL );.  if( 
7240: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
7250: 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =2 ){.    Vdbe *
7260: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
7270: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  e;.    char *zMs
7280: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
7290: 74 66 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  tf(.        pPar
72a0: 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f 55 4e  se->db, "COMPOUN
72b0: 44 20 53 55 42 51 55 45 52 49 45 53 20 25 64 20  D SUBQUERIES %d 
72c0: 41 4e 44 20 25 64 20 25 73 28 25 73 29 22 2c 20  AND %d %s(%s)", 
72d0: 69 53 75 62 31 2c 20 69 53 75 62 32 2c 0a 20 20  iSub1, iSub2,.  
72e0: 20 20 20 20 20 20 62 55 73 65 54 6d 70 3f 22 55        bUseTmp?"U
72f0: 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45  SING TEMP B-TREE
7300: 20 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f 70 4e   ":"", selectOpN
7310: 61 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b 0a 20  ame(op).    );. 
7320: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7330: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
7340: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
7350: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
7360: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
7370: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e    }.}.#else./* N
7380: 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66  o-op versions of
7390: 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28   the explainXXX(
73a0: 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  ) functions and 
73b0: 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66  macros. */.# def
73c0: 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  ine explainCompo
73d0: 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a  site(v,w,x,y,z).
73e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
73f0: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
7400: 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73  was generated us
7410: 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70  ing a non-null p
7420: 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74  OrderBy argument
7430: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
7440: 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65  sults were place
7450: 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20  d in a sorter.  
7460: 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69  After the loop i
7470: 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  s terminated.** 
7480: 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74  we need to run t
7490: 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75  he sorter and ou
74a0: 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73  tput the results
74b0: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
74c0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
74d0: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e  rates the code n
74e0: 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74  eeded to do that
74f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7500: 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
7510: 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  l(.  Parse *pPar
7520: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
7530: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
7540: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
7550: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
7560: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64  tatement */.  Vd
7570: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
7580: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
7590: 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20   into this VDBE 
75a0: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
75b0: 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ,      /* Number
75c0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64   of columns of d
75d0: 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ata */.  SelectD
75e0: 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72  est *pDest /* Wr
75f0: 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72  ite the sorted r
7600: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
7610: 7b 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65 61  {.  int addrBrea
7620: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
7630: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 20 20  akeLabel(v);    
7640: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
7650: 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20   exit loop */.  
7660: 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  int addrContinue
7670: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
7680: 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20  keLabel(v);  /* 
7690: 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e 65  Jump here for ne
76a0: 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e  xt cycle */.  in
76b0: 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69 54  t addr;.  int iT
76c0: 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64 6f  ab;.  int pseudo
76d0: 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c  Tab = 0;.  ExprL
76e0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
76f0: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20  p->pOrderBy;..  
7700: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
7710: 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20  t->eDest;.  int 
7720: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
7730: 50 61 72 6d 3b 0a 0a 20 20 69 6e 74 20 72 65 67  Parm;..  int reg
7740: 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f  Row;.  int regRo
7750: 77 69 64 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70  wid;..  iTab = p
7760: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
7770: 72 3b 0a 20 20 72 65 67 52 6f 77 20 3d 20 73 71  r;.  regRow = sq
7780: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
7790: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 65  pParse);.  if( e
77a0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
77b0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
77c0: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
77d0: 70 73 65 75 64 6f 54 61 62 20 3d 20 70 50 61 72  pseudoTab = pPar
77e0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
77f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7800: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
7810: 64 6f 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 72  do, pseudoTab, r
7820: 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  egRow, nColumn);
7830: 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20  .    regRowid = 
7840: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
7850: 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  regRowid = sqlit
7860: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
7870: 72 73 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rse);.  }.  if( 
7880: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
7890: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
78a0: 20 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74    int regSortOut
78b0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
78c0: 6d 3b 0a 20 20 20 20 69 6e 74 20 70 74 61 62 32  m;.    int ptab2
78d0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
78e0: 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  +;.    sqlite3Vd
78f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
7900: 70 65 6e 50 73 65 75 64 6f 2c 20 70 74 61 62 32  penPseudo, ptab2
7910: 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 70 4f  , regSortOut, pO
7920: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 29  rderBy->nExpr+2)
7930: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b  ;.    addr = 1 +
7940: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7950: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
7960: 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42  ort, iTab, addrB
7970: 72 65 61 6b 29 3b 0a 20 20 20 20 63 6f 64 65 4f  reak);.    codeO
7980: 66 66 73 65 74 28 76 2c 20 70 2c 20 61 64 64 72  ffset(v, p, addr
7990: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73  Continue);.    s
79a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
79b0: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
79c0: 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74  a, iTab, regSort
79d0: 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
79e0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
79f0: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 74 61 62 32 2c  P_Column, ptab2,
7a00: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
7a10: 2b 31 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20  +1, regRow);.   
7a20: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7a30: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43  geP5(v, OPFLAG_C
7a40: 4c 45 41 52 43 41 43 48 45 29 3b 0a 20 20 7d 65  LEARCACHE);.  }e
7a50: 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  lse{.    addr = 
7a60: 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
7a70: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
7a80: 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61  , iTab, addrBrea
7a90: 6b 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73  k);.    codeOffs
7aa0: 65 74 28 76 2c 20 70 2c 20 61 64 64 72 43 6f 6e  et(v, p, addrCon
7ab0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69  tinue);.    sqli
7ac0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7ad0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
7ae0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
7af0: 72 2b 31 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  r+1, regRow);.  
7b00: 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  }.  switch( eDes
7b10: 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52  t ){.    case SR
7b20: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
7b30: 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
7b40: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
7b50: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62  ( eDest==SRT_Tab
7b60: 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  le );.      test
7b70: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
7b80: 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20  _EphemTab );.   
7b90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7ba0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
7bb0: 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  wid, iParm, regR
7bc0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
7bd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7be0: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
7bf0: 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52  rm, regRow, regR
7c00: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
7c10: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
7c20: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
7c30: 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  D);.      break;
7c40: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
7c50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
7c60: 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54  ERY.    case SRT
7c70: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Set: {.      as
7c80: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
7c90: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
7ca0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
7cb0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
7cc0: 67 52 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69  gRow, 1, regRowi
7cd0: 64 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c  d, &p->affinity,
7ce0: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
7cf0: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
7d00: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
7d10: 2c 20 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20  , regRow, 1);.  
7d20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7d30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
7d40: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65  nsert, iParm, re
7d50: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62  gRowid);.      b
7d60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
7d70: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
7d80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
7d90: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
7da0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
7db0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
7dc0: 67 52 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b  gRow, iParm, 1);
7dd0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
7de0: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
7df0: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
7e00: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
7e10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7e20: 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
7e30: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  lt: {.      int 
7e40: 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  i;.      assert(
7e50: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
7e60: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
7e70: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20  _Coroutine ); . 
7e80: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
7e90: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
7ea0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7eb0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  se( eDest==SRT_C
7ec0: 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20  oroutine );.    
7ed0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
7ee0: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
7ef0: 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52      assert( regR
7f00: 6f 77 21 3d 70 44 65 73 74 2d 3e 69 4d 65 6d 2b  ow!=pDest->iMem+
7f10: 69 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  i );.        sql
7f20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7f30: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65  , OP_Column, pse
7f40: 75 64 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74  udoTab, i, pDest
7f50: 2d 3e 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20 20  ->iMem+i);.     
7f60: 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20     if( i==0 ){. 
7f70: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7f80: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
7f90: 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48  OPFLAG_CLEARCACH
7fa0: 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  E);.        }.  
7fb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7fc0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
7fd0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
7fe0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7ff0: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
8000: 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f  pDest->iMem, nCo
8010: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  lumn);.        s
8020: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
8030: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
8040: 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 4d 65  arse, pDest->iMe
8050: 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  m, nColumn);.   
8060: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8070: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8080: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
8090: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a   pDest->iParm);.
80a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
80b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
80c0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
80d0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
80e0: 65 67 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65  egRow);.  sqlite
80f0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
8100: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64  pParse, regRowid
8110: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74  );..  /* The bot
8120: 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  tom of the loop.
8130: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
8140: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
8150: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
8160: 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
8170: 67 73 20 26 20 53 46 5f 55 73 65 53 6f 72 74 65  gs & SF_UseSorte
8180: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
8190: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
81a0: 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 54 61  _SorterNext, iTa
81b0: 62 2c 20 61 64 64 72 29 3b 0a 20 20 7d 65 6c 73  b, addr);.  }els
81c0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
81d0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
81e0: 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29  ext, iTab, addr)
81f0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
8200: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
8210: 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  v, addrBreak);. 
8220: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
8230: 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d  Output || eDest=
8240: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
8250: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
8260: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
8270: 6f 73 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  ose, pseudoTab, 
8280: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
8290: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
82a0: 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f  r to a string co
82b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65  ntaining the 'de
82c0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20  claration type' 
82d0: 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  of the.** expres
82e0: 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20  sion pExpr. The 
82f0: 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72  string may be tr
8300: 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20  eated as static 
8310: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  by the caller..*
8320: 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61  *.** The declara
8330: 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65  tion type is the
8340: 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65 20   exact datatype 
8350: 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61  definition extra
8360: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  cted from the.**
8370: 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45   original CREATE
8380: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
8390: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
83a0: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
83b0: 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69  The.** declarati
83c0: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f  on type for a RO
83d0: 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54  WID field is INT
83e0: 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68  EGER. Exactly wh
83f0: 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  en an expression
8400: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
8410: 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  d a column can b
8420: 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65  e complex in the
8430: 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62   presence of sub
8440: 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20  queries. The.** 
8450: 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65  result-set expre
8460: 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20  ssion in all of 
8470: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45  the following SE
8480: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
8490: 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65  is .** considere
84a0: 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68  d a column by th
84b0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
84c0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20  **   SELECT col 
84d0: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
84e0: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
84f0: 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20  l FROM tbl;.**  
8500: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
8510: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  col FROM tbl);.*
8520: 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20 46  *   SELECT abc F
8530: 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ROM (SELECT col 
8540: 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29  AS abc FROM tbl)
8550: 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63  ;.** .** The dec
8560: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
8570: 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  r any expression
8580: 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f   other than a co
8590: 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f  lumn is NULL..*/
85a0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
85b0: 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a  ar *columnType(.
85c0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
85d0: 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78  NC, .  Expr *pEx
85e0: 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pr,.  const char
85f0: 20 2a 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20   **pzOriginDb,. 
8600: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
8610: 4f 72 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e  OriginTab,.  con
8620: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
8630: 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20  inCol.){.  char 
8640: 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30  const *zType = 0
8650: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
8660: 7a 4f 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20  zOriginDb = 0;. 
8670: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
8680: 69 67 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63  iginTab = 0;.  c
8690: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
86a0: 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  inCol = 0;.  int
86b0: 20 6a 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   j;.  if( NEVER(
86c0: 70 45 78 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43  pExpr==0) || pNC
86d0: 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20  ->pSrcList==0 ) 
86e0: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69  return 0;..  swi
86f0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
8700: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
8710: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
8720: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
8730: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
8740: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
8750: 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20  umn. Locate the 
8760: 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e  table the column
8770: 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20   is being.      
8780: 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ** extracted fro
8790: 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74  m in NameContext
87a0: 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20  .pSrcList. This 
87b0: 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61  table may be rea
87c0: 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  l.      ** datab
87d0: 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73  ase table or a s
87e0: 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a  ubquery..      *
87f0: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
8800: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
8810: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72      /* Table str
8820: 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73  ucture column is
8830: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
8840: 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
8850: 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *pS = 0;        
8860: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74       /* Select t
8870: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  he column is ext
8880: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
8890: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
88a0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20  pExpr->iColumn; 
88b0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
88c0: 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20  umn in pTab */. 
88d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
88e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
88f0: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
8900: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
8910: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
8920: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
8930: 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a  pNC && !pTab ){.
8940: 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20          SrcList 
8950: 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d  *pTabList = pNC-
8960: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20  >pSrcList;.     
8970: 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61     for(j=0;j<pTa
8980: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
8990: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
89a0: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
89b0: 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20  able;j++);.     
89c0: 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73     if( j<pTabLis
89d0: 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20  t->nSrc ){.     
89e0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
89f0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
8a00: 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20  .          pS = 
8a10: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
8a20: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
8a30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8a40: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
8a50: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
8a60: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
8a70: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
8a80: 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d     /* At one tim
8a90: 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20  e, code such as 
8aa0: 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77  "SELECT new.x" w
8ab0: 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20  ithin a trigger 
8ac0: 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  would.        **
8ad0: 20 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64   cause this cond
8ae0: 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53  ition to run.  S
8af0: 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61  ince then, we ha
8b00: 76 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20  ve restructured 
8b10: 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  how.        ** t
8b20: 72 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67  rigger code is g
8b30: 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20  enerated and so 
8b40: 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  this condition i
8b50: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20  s no longer .   
8b60: 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65       ** possible
8b70: 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61  . However, it ca
8b80: 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20  n still be true 
8b90: 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c  for statements l
8ba0: 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ike.        ** t
8bb0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
8bc0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
8bd0: 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
8be0: 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45  LE t1(col INTEGE
8bf0: 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  R);.        **  
8c00: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
8c10: 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f  t1.col) FROM FRO
8c20: 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a  M t1;.        **
8c30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  .        ** when
8c40: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
8c50: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
8c60: 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f  xpression "t1.co
8c70: 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20  l" in the .     
8c80: 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74     ** sub-select
8c90: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
8ca0: 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  set the column t
8cb0: 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65  ype to NULL, eve
8cc0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f  n.        ** tho
8cd0: 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65  ugh it should re
8ce0: 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52  ally be "INTEGER
8cf0: 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  "..        **.  
8d00: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
8d10: 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20   not a problem, 
8d20: 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  as the column ty
8d30: 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69  pe of "t1.col" i
8d40: 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20  s never.        
8d50: 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f  ** used. When co
8d60: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
8d70: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
8d80: 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20  ession .        
8d90: 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63  ** "(SELECT t1.c
8da0: 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63  ol)", the correc
8db0: 74 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e  t type is return
8dc0: 65 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53  ed (see the TK_S
8dd0: 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a  ELECT.        **
8de0: 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20   branch below.  
8df0: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
8e00: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
8e10: 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
8e20: 20 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54   pExpr->pTab==pT
8e30: 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ab );.      if( 
8e40: 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pS ){.        /*
8e50: 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20   The "table" is 
8e60: 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73  actually a sub-s
8e70: 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20  elect or a view 
8e80: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
8e90: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  se.        ** of
8ea0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
8eb0: 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68  ement. Return th
8ec0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
8ed0: 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20  pe and origin.  
8ee0: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f        ** data fo
8ef0: 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  r the result-set
8f00: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73   column of the s
8f10: 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20  ub-select..     
8f20: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
8f30: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57  ( iCol>=0 && ALW
8f40: 41 59 53 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c  AYS(iCol<pS->pEL
8f50: 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
8f60: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69           /* If i
8f70: 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  Col is less than
8f80: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
8f90: 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65  expression reque
8fa0: 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  sts the.        
8fb0: 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68    ** rowid of th
8fc0: 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  e sub-select or 
8fd0: 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65  view. This expre
8fe0: 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28  ssion is legal (
8ff0: 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  see .          *
9000: 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63  * test case misc
9010: 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61  2.2.2) - it alwa
9020: 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  ys evaluates to 
9030: 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20  NULL..          
9040: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d  */.          Nam
9050: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
9060: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20          Expr *p 
9070: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
9080: 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20  iCol].pExpr;.   
9090: 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c         sNC.pSrcL
90a0: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
90b0: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e            sNC.pN
90c0: 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20  ext = pNC;.     
90d0: 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20       sNC.pParse 
90e0: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
90f0: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
9100: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
9110: 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c  , p, &zOriginDb,
9120: 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a   &zOriginTab, &z
9130: 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20  OriginCol); .   
9140: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
9150: 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 54  se if( ALWAYS(pT
9160: 61 62 2d 3e 70 53 63 68 65 6d 61 29 20 29 7b 0a  ab->pSchema) ){.
9170: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61          /* A rea
9180: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  l table */.     
9190: 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29     assert( !pS )
91a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
91b0: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
91c0: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
91d0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
91e0: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
91f0: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
9200: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ol) );.        i
9210: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
9220: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
9230: 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20  INTEGER";.      
9240: 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d      zOriginCol =
9250: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
9260: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9270: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
9280: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
9290: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  e;.          zOr
92a0: 69 67 69 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e  iginCol = pTab->
92b0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
92c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
92d0: 20 20 20 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d      zOriginTab =
92e0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
92f0: 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70        if( pNC->p
9300: 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20  Parse ){.       
9310: 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
9320: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
9330: 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  x(pNC->pParse->d
9340: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
9350: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  );.          zOr
9360: 69 67 69 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50  iginDb = pNC->pP
9370: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
9380: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b].zName;.      
9390: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
93a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
93b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
93c0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
93d0: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
93e0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
93f0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73  xpression is a s
9400: 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72  ub-select. Retur
9410: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
9420: 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20  n type and.     
9430: 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20   ** origin info 
9440: 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63  for the single c
9450: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
9460: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
9470: 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73  ELECT.      ** s
9480: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
9490: 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e  */.      NameCon
94a0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
94b0: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78  Select *pS = pEx
94c0: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
94d0: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
94e0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  S->pEList->a[0].
94f0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
9500: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
9510: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
9520: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
9530: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
9540: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
9550: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
9560: 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61  C;.      sNC.pPa
9570: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
9580: 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  e;.      zType =
9590: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
95a0: 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c  , p, &zOriginDb,
95b0: 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a   &zOriginTab, &z
95c0: 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20  OriginCol); .   
95d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
95e0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20  #endif.  }.  .  
95f0: 69 66 28 20 70 7a 4f 72 69 67 69 6e 44 62 20 29  if( pzOriginDb )
9600: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 7a  {.    assert( pz
9610: 4f 72 69 67 69 6e 54 61 62 20 26 26 20 70 7a 4f  OriginTab && pzO
9620: 72 69 67 69 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  riginCol );.    
9630: 2a 70 7a 4f 72 69 67 69 6e 44 62 20 3d 20 7a 4f  *pzOriginDb = zO
9640: 72 69 67 69 6e 44 62 3b 0a 20 20 20 20 2a 70 7a  riginDb;.    *pz
9650: 4f 72 69 67 69 6e 54 61 62 20 3d 20 7a 4f 72 69  OriginTab = zOri
9660: 67 69 6e 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f  ginTab;.    *pzO
9670: 72 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69 67  riginCol = zOrig
9680: 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 74  inCol;.  }.  ret
9690: 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a  urn zType;.}../*
96a0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
96b0: 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c  e that will tell
96c0: 20 74 68 65 20 56 44 42 45 20 74 68 65 20 64 65   the VDBE the de
96d0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20  claration types 
96e0: 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  of columns.** in
96f0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
9700: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9710: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
9720: 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pes(.  Parse *pP
9730: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
9740: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
9750: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
9760: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
9770: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70   tables */.  Exp
9780: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
9790: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
97a0: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73  defining the res
97b0: 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69  ult set */.){.#i
97c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
97d0: 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62  T_DECLTYPE.  Vdb
97e0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
97f0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
9800: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
9810: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
9820: 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73   = pTabList;.  s
9830: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
9840: 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  se;.  for(i=0; i
9850: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
9860: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
9870: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
9880: 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73  .pExpr;.    cons
9890: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23  t char *zType;.#
98a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
98b0: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
98c0: 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ATA.    const ch
98d0: 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b  ar *zOrigDb = 0;
98e0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
98f0: 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20  *zOrigTab = 0;. 
9900: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
9910: 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  OrigCol = 0;.   
9920: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
9930: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f  ype(&sNC, p, &zO
9940: 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62  rigDb, &zOrigTab
9950: 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20  , &zOrigCol);.. 
9960: 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d     /* The vdbe m
9970: 75 73 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e  ust make its own
9980: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c   copy of the col
9990: 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68  umn-type and oth
99a0: 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  er .    ** colum
99b0: 6e 20 73 70 65 63 69 66 69 63 20 73 74 72 69 6e  n specific strin
99c0: 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  gs, in case the 
99d0: 73 63 68 65 6d 61 20 69 73 20 72 65 73 65 74 20  schema is reset 
99e0: 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20  before this.    
99f0: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
9a00: 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20  ne is deleted.. 
9a10: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
9a20: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
9a30: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41  v, i, COLNAME_DA
9a40: 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c  TABASE, zOrigDb,
9a50: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
9a60: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
9a70: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
9a80: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c   i, COLNAME_TABL
9a90: 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c  E, zOrigTab, SQL
9aa0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
9ab0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
9ac0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
9ad0: 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20  COLNAME_COLUMN, 
9ae0: 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45  zOrigCol, SQLITE
9af0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c  _TRANSIENT);.#el
9b00: 73 65 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63  se.    zType = c
9b10: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
9b20: 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e  p, 0, 0, 0);.#en
9b30: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56  dif.    sqlite3V
9b40: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
9b50: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c   i, COLNAME_DECL
9b60: 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c  TYPE, zType, SQL
9b70: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
9b80: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
9b90: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
9ba0: 50 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  PE */.}../*.** G
9bb0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
9bc0: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
9bd0: 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f  VDBE the names o
9be0: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
9bf0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
9c00: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
9c10: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  n is used to pro
9c20: 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f  vide the.** azCo
9c30: 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68  l[] values in th
9c40: 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  e callback..*/.s
9c50: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
9c60: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a  ateColumnNames(.
9c70: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9c80: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
9c90: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
9ca0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
9cb0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
9cc0: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
9cd0: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
9ce0: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
9cf0: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
9d00: 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  et */.){.  Vdbe 
9d10: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
9d20: 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  be;.  int i, j;.
9d30: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9d40: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
9d50: 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f  t fullNames, sho
9d60: 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65  rtNames;..#ifnde
9d70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
9d80: 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68  PLAIN.  /* If th
9d90: 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e  is is an EXPLAIN
9da0: 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70  , skip this step
9db0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
9dc0: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
9dd0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
9de0: 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73  dif..  if( pPars
9df0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c  e->colNamesSet |
9e00: 7c 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 7c 7c  | NEVER(v==0) ||
9e10: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
9e20: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50  d ) return;.  pP
9e30: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
9e40: 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d  t = 1;.  fullNam
9e50: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
9e60: 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
9e70: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f  Names)!=0;.  sho
9e80: 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  rtNames = (db->f
9e90: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
9ea0: 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ortColNames)!=0;
9eb0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
9ec0: 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69  tNumCols(v, pELi
9ed0: 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f  st->nExpr);.  fo
9ee0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
9ef0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
9f00: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70    Expr *p;.    p
9f10: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
9f20: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 4e  pExpr;.    if( N
9f30: 45 56 45 52 28 70 3d 3d 30 29 20 29 20 63 6f 6e  EVER(p==0) ) con
9f40: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
9f50: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
9f60: 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  e ){.      char 
9f70: 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  *zName = pEList-
9f80: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[i].zName;.   
9f90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
9fa0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
9fb0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61  OLNAME_NAME, zNa
9fc0: 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  me, SQLITE_TRANS
9fd0: 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65  IENT);.    }else
9fe0: 20 69 66 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f   if( (p->op==TK_
9ff0: 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70 3d  COLUMN || p->op=
a000: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20  =TK_AGG_COLUMN) 
a010: 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20  && pTabList ){. 
a020: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
a030: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  ;.      char *zC
a040: 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  ol;.      int iC
a050: 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b  ol = p->iColumn;
a060: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
a070: 41 4c 57 41 59 53 28 6a 3c 70 54 61 62 4c 69 73  ALWAYS(j<pTabLis
a080: 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a  t->nSrc); j++){.
a090: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
a0a0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
a0b0: 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c 65 20 29 20  or==p->iTable ) 
a0c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
a0d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70       assert( j<p
a0e0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
a0f0: 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54  .      pTab = pT
a100: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
a110: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  b;.      if( iCo
a120: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
a130: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
a140: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
a150: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
a160: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
a170: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43   );.      if( iC
a180: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
a190: 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  zCol = "rowid";.
a1a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a1b0: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62       zCol = pTab
a1c0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
a1d0: 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  me;.      }.    
a1e0: 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65    if( !shortName
a1f0: 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20  s && !fullNames 
a200: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
a210: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
a220: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
a230: 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  AME, .          
a240: 20 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75    sqlite3DbStrDu
a250: 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  p(db, pEList->a[
a260: 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54  i].zSpan), SQLIT
a270: 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  E_DYNAMIC);.    
a280: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c    }else if( full
a290: 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
a2a0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
a2b0: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
a2c0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
a2d0: 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54  (db, "%s.%s", pT
a2e0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  ab->zName, zCol)
a2f0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a300: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
a310: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
a320: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54  ME, zName, SQLIT
a330: 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  E_DYNAMIC);.    
a340: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a350: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
a360: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
a370: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c  NAME_NAME, zCol,
a380: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
a390: 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T);.      }.    
a3a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
a3b0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
a3c0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
a3d0: 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20  _NAME, .        
a3e0: 20 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75    sqlite3DbStrDu
a3f0: 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  p(db, pEList->a[
a400: 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54  i].zSpan), SQLIT
a410: 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  E_DYNAMIC);.    
a420: 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65  }.  }.  generate
a430: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72  ColumnTypes(pPar
a440: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
a450: 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
a460: 47 69 76 65 6e 20 61 20 61 6e 20 65 78 70 72 65  Given a an expre
a470: 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63  ssion list (whic
a480: 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  h is really the 
a490: 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
a4a0: 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d  ons.** that form
a4b0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
a4c0: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
a4d0: 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61  ement) compute a
a4e0: 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f  ppropriate.** co
a4f0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61  lumn names for a
a500: 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c   table that woul
a510: 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  d hold the expre
a520: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
a530: 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * All column nam
a540: 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75  es will be uniqu
a550: 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  e..**.** Only th
a560: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
a570: 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f  re computed.  Co
a580: 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75  lumn.zType, Colu
a590: 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64  mn.zColl,.** and
a5a0: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66   other fields of
a5b0: 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f   Column are zero
a5c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
a5d0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
a5e0: 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d  ccess.  If a mem
a5f0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
a600: 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
a610: 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70  store NULL in *p
a620: 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70  aCol and 0 in *p
a630: 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20  nCol and return 
a640: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f  SQLITE_NOMEM..*/
a650: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
a660: 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  ctColumnsFromExp
a670: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
a680: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
a690: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
a6a0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
a6b0: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
a6c0: 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72   /* Expr list fr
a6d0: 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69  om which to deri
a6e0: 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ve column names 
a6f0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c  */.  int *pnCol,
a700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a710: 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
a720: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65   of columns here
a730: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70   */.  Column **p
a740: 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  aCol          /*
a750: 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63   Write the new c
a760: 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20  olumn list here 
a770: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
a780: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
a790: 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ;   /* Database 
a7a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
a7b0: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
a7d0: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
a7e0: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a800: 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20   Index added to 
a810: 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e  make the name un
a820: 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  ique */.  Column
a830: 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20   *aCol, *pCol;  
a840: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
a850: 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74  ping over result
a860: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
a870: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
a880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a890: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
a8a0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
a8b0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20 20   */.  Expr *p;  
a8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8d0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
a8e0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65 73  for a single res
a8f0: 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ult column */.  
a900: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
a910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
a920: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
a930: 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
a940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a950: 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a  ize of name in z
a960: 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 2a 70 6e  Name[] */..  *pn
a970: 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d 20 70 45 4c  Col = nCol = pEL
a980: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 43  ist->nExpr;.  aC
a990: 6f 6c 20 3d 20 2a 70 61 43 6f 6c 20 3d 20 73 71  ol = *paCol = sq
a9a0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
a9b0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f  o(db, sizeof(aCo
a9c0: 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 69  l[0])*nCol);.  i
a9d0: 66 28 20 61 43 6f 6c 3d 3d 30 20 29 20 72 65 74  f( aCol==0 ) ret
a9e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
a9f0: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ;.  for(i=0, pCo
aa00: 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  l=aCol; i<nCol; 
aa10: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
aa20: 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72    /* Get an appr
aa30: 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72  opriate name for
aa40: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   the column.    
aa50: 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  */.    p = pELis
aa60: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
aa70: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
aa80: 69 67 68 74 3d 3d 30 20 7c 7c 20 45 78 70 72 48  ight==0 || ExprH
aa90: 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e 70 52  asProperty(p->pR
aaa0: 69 67 68 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ight, EP_IntValu
aab0: 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e).             
aac0: 20 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e    || p->pRight->
aad0: 75 2e 7a 54 6f 6b 65 6e 3d 3d 30 20 7c 7c 20 70  u.zToken==0 || p
aae0: 2d 3e 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  ->pRight->u.zTok
aaf0: 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  en[0]!=0 );.    
ab00: 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c  if( (zName = pEL
ab10: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
ab20: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
ab30: 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f  If the column co
ab40: 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e  ntains an "AS <n
ab50: 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73  ame>" phrase, us
ab60: 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20  e <name> as the 
ab70: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e  name */.      zN
ab80: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
ab90: 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29  trDup(db, zName)
aba0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
abb0: 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70     Expr *pColExp
abc0: 72 20 3d 20 70 3b 20 20 2f 2a 20 54 68 65 20 65  r = p;  /* The e
abd0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
abe0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c  s the result col
abf0: 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  umn name */.    
ac00: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
ac10: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
ac20: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
ac30: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
ac40: 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
ac50: 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
ac60: 5f 44 4f 54 20 29 20 70 43 6f 6c 45 78 70 72 20  _DOT ) pColExpr 
ac70: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67  = pColExpr->pRig
ac80: 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ht;.      if( pC
ac90: 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43  olExpr->op==TK_C
aca0: 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59 53 28  OLUMN && ALWAYS(
acb0: 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d  pColExpr->pTab!=
acc0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  0) ){.        /*
acd0: 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65   For columns use
ace0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
acf0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
ad00: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c   int iCol = pCol
ad10: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
ad20: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 43         pTab = pC
ad30: 6f 6c 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20  olExpr->pTab;.  
ad40: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
ad50: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
ad60: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a  iPKey;.        z
ad70: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
ad80: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 0a  rintf(db, "%s",.
ad90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ada0: 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d   iCol>=0 ? pTab-
adb0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
adc0: 65 20 3a 20 22 72 6f 77 69 64 22 29 3b 0a 20 20  e : "rowid");.  
add0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43      }else if( pC
ade0: 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  olExpr->op==TK_I
adf0: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  D ){.        ass
ae00: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
ae10: 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20  perty(pColExpr, 
ae20: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
ae30: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ae40: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
ae50: 62 2c 20 22 25 73 22 2c 20 70 43 6f 6c 45 78 70  b, "%s", pColExp
ae60: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
ae70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ae80: 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72     /* Use the or
ae90: 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74  iginal text of t
aea0: 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  he column expres
aeb0: 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65  sion as its name
aec0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   */.        zNam
aed0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
aee0: 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70 45 4c  tf(db, "%s", pEL
aef0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29  ist->a[i].zSpan)
af00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
af10: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
af20: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
af30: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
af40: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
af50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
af60: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
af70: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
af80: 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20   is unique.  If 
af90: 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  the name is not 
afa0: 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61  unique,.    ** a
afb0: 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65 72 20  ppend a integer 
afc0: 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74  to the name so t
afd0: 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75  hat it becomes u
afe0: 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  nique..    */.  
aff0: 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
b000: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
b010: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d  ;.    for(j=cnt=
b020: 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<i; j++){.  
b030: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
b040: 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a  trICmp(aCol[j].z
b050: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
b060: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
b070: 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20  *zNewName;.     
b080: 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20     zName[nName] 
b090: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 65  = 0;.        zNe
b0a0: 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  wName = sqlite3M
b0b0: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 3a 25  Printf(db, "%s:%
b0c0: 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74  d", zName, ++cnt
b0d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b0e0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
b0f0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  me);.        zNa
b100: 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20  me = zNewName;. 
b110: 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20         j = -1;. 
b120: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
b130: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
b140: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
b150: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  Col->zName = zNa
b160: 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  me;.  }.  if( db
b170: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b180: 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
b190: 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <i; j++){.      
b1a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
b1b0: 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  , aCol[j].zName)
b1c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
b1d0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43  te3DbFree(db, aC
b1e0: 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20  ol);.    *paCol 
b1f0: 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20  = 0;.    *pnCol 
b200: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
b210: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
b220: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
b230: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
b240: 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  dd type and coll
b250: 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ation informatio
b260: 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69  n to a column li
b270: 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61  st based on.** a
b280: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
b290: 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f  t..** .** The co
b2a0: 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d  lumn list presum
b2b0: 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73  ably came from s
b2c0: 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  electColumnNames
b2d0: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a  FromExprList()..
b2e0: 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  ** The column li
b2f0: 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65  st has only name
b300: 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20  s, not types or 
b310: 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69  collations.  Thi
b320: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65  s.** routine goe
b330: 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64  s through and ad
b340: 64 73 20 74 68 65 20 74 79 70 65 73 20 61 6e 64  ds the types and
b350: 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a   collations..**.
b360: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b370: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 61 6c  requires that al
b380: 6c 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e  l identifiers in
b390: 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73   the SELECT.** s
b3a0: 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f  tatement be reso
b3b0: 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lved..*/.static 
b3c0: 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 43 6f  void selectAddCo
b3d0: 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
b3e0: 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  tion(.  Parse *p
b3f0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
b400: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
b410: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c  s */.  int nCol,
b420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b430: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
b440: 73 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  s */.  Column *a
b450: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Col,         /* 
b460: 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
b470: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
b480: 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45  lect       /* SE
b490: 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74  LECT used to det
b4a0: 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64  ermine types and
b4b0: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29   collations */.)
b4c0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
b4d0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
b4e0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
b4f0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
b500: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
b510: 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  l;.  int i;.  Ex
b520: 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20  pr *p;.  struct 
b530: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
b540: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  ;..  assert( pSe
b550: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  lect!=0 );.  ass
b560: 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73  ert( (pSelect->s
b570: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
b580: 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61  olved)!=0 );.  a
b590: 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 70 53 65  ssert( nCol==pSe
b5a0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
b5b0: 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  xpr || db->mallo
b5c0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
b5d0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
b5e0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  d ) return;.  me
b5f0: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
b600: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e  zeof(sNC));.  sN
b610: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65  C.pSrcList = pSe
b620: 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20  lect->pSrc;.  a 
b630: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
b640: 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  t->a;.  for(i=0,
b650: 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43   pCol=aCol; i<nC
b660: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
b670: 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70  {.    p = a[i].p
b680: 45 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Expr;.    pCol->
b690: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44  zType = sqlite3D
b6a0: 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c 75  bStrDup(db, colu
b6b0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
b6c0: 30 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20 20 70  0, 0, 0));.    p
b6d0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
b6e0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
b6f0: 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ity(p);.    if( 
b700: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
b710: 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  0 ) pCol->affini
b720: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
b730: 4e 4f 4e 45 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  NONE;.    pColl 
b740: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
b750: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
b760: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
b770: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43  {.      pCol->zC
b780: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53  oll = sqlite3DbS
b790: 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d  trDup(db, pColl-
b7a0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
b7b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65   }.}../*.** Give
b7c0: 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
b7d0: 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61  ment, generate a
b7e0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
b7f0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
b800: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
b810: 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54  t of that SELECT
b820: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
b830: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
b840: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
b850: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
b860: 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ect){.  Table *p
b870: 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Tab;.  sqlite3 *
b880: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
b890: 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61 67  .  int savedFlag
b8a0: 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73  s;..  savedFlags
b8b0: 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
b8c0: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
b8d0: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
b8e0: 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  s;.  db->flags |
b8f0: 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  = SQLITE_ShortCo
b900: 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65  lNames;.  sqlite
b910: 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72  3SelectPrep(pPar
b920: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b  se, pSelect, 0);
b930: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
b940: 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Err ) return 0;.
b950: 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
b960: 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65  ->pPrior ) pSele
b970: 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50  ct = pSelect->pP
b980: 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  rior;.  db->flag
b990: 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  s = savedFlags;.
b9a0: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
b9b0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
b9c0: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
b9d0: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
b9e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
b9f0: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71  .  }.  /* The sq
ba00: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
ba10: 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c 79  Select() is only
ba20: 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74 73   used n contexts
ba30: 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65   where lookaside
ba40: 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  .  ** is disable
ba50: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64  d */.  assert( d
ba60: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
ba70: 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54  abled==0 );.  pT
ba80: 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
ba90: 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  pTab->zName = 0;
baa0: 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74  .  pTab->nRowEst
bab0: 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 73 65   = 1000000;.  se
bac0: 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  lectColumnsFromE
bad0: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
bae0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c  pSelect->pEList,
baf0: 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
bb00: 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65  Tab->aCol);.  se
bb10: 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
bb20: 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
bb30: 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  arse, pTab->nCol
bb40: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53  , pTab->aCol, pS
bb50: 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e  elect);.  pTab->
bb60: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66  iPKey = -1;.  if
bb70: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
bb80: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
bb90: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
bba0: 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75   pTab);.    retu
bbb0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
bbc0: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
bbd0: 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72  * Get a VDBE for
bbe0: 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65   the given parse
bbf0: 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61  r context.  Crea
bc00: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
bc10: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66  necessary..** If
bc20: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
bc30: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
bc40: 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67  d leave a messag
bc50: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
bc60: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74  Vdbe *sqlite3Get
bc70: 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
bc80: 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  se){.  Vdbe *v =
bc90: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
bca0: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
bcb0: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
bcc0: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dbe = sqlite3Vdb
bcd0: 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e  eCreate(pParse->
bce0: 64 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  db);.#ifndef SQL
bcf0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20  ITE_OMIT_TRACE. 
bd00: 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20     if( v ){.    
bd10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bd20: 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61 63 65 29  Op0(v, OP_Trace)
bd30: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
bd40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d   }.  return v;.}
bd50: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  .../*.** Compute
bd60: 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
bd70: 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
bd80: 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
bd90: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69  ed on the.** pLi
bda0: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
bdb0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c  expressions.  pL
bdc0: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
bdd0: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
bde0: 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70  sions.** that ap
bdf0: 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67  pear in the orig
be00: 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
be10: 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d  nt after the LIM
be20: 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a  IT and OFFSET.**
be30: 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e   keywords.  Or N
be40: 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79  ULL if those key
be50: 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65  words are omitte
be60: 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  d. iLimit and iO
be70: 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68  ffset .** are th
be80: 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79  e integer memory
be90: 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
bea0: 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75  s for counters u
beb0: 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a  sed to compute .
bec0: 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64  ** the limit and
bed0: 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65   offset.  If the
bee0: 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61  re is no limit a
bef0: 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68  nd/or offset, th
bf00: 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e  en .** iLimit an
bf10: 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65  d iOffset are ne
bf20: 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  gative..**.** Th
bf30: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67  is routine chang
bf40: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
bf50: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
bf60: 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61  set only if.** a
bf70: 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74   limit or offset
bf80: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
bf90: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
bfa0: 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a  t.  iLimit and.*
bfb0: 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64  * iOffset should
bfc0: 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65   have been prese
bfd0: 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65  t to appropriate
bfe0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a   default values.
bff0: 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20  ** (usually but 
c000: 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70  not always -1) p
c010: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
c020: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
c030: 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21   Only if pLimit!
c040: 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30  =0 or pOffset!=0
c050: 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65   do the limit re
c060: 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72  gisters get.** r
c070: 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55  edefined.  The U
c080: 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
c090: 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70  r uses this prop
c0a0: 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a  erty to force.**
c0b0: 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68   the reuse of th
c0c0: 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64  e same limit and
c0d0: 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72   offset register
c0e0: 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c  s across multipl
c0f0: 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
c100: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
c110: 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69  c void computeLi
c120: 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72  mitRegisters(Par
c130: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
c140: 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61  ct *p, int iBrea
c150: 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  k){.  Vdbe *v = 
c160: 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20  0;.  int iLimit 
c170: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73  = 0;.  int iOffs
c180: 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c  et;.  int addr1,
c190: 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69   n;.  if( p->iLi
c1a0: 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  mit ) return;.. 
c1b0: 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54   /* .  ** "LIMIT
c1c0: 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77   -1" always show
c1d0: 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65  s all rows.  The
c1e0: 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20  re is some.  ** 
c1f0: 63 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75  contraversy abou
c200: 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65  t what the corre
c210: 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75  ct behavior shou
c220: 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20  ld be..  ** The 
c230: 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
c240: 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74  tation interpret
c250: 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d  s "LIMIT 0" to m
c260: 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73  ean.  ** no rows
c270: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
c280: 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
c290: 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
c2a0: 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
c2b0: 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20  || p->pLimit!=0 
c2c0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  );.  if( p->pLim
c2d0: 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69  it ){.    p->iLi
c2e0: 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b  mit = iLimit = +
c2f0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
c300: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
c310: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
c320: 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d     if( NEVER(v==
c330: 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  0) ) return;  /*
c340: 20 56 44 42 45 20 73 68 6f 75 6c 64 20 68 61 76   VDBE should hav
c350: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  e already been a
c360: 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20  llocated */.    
c370: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
c380: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d  sInteger(p->pLim
c390: 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20  it, &n) ){.     
c3a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c3b0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
c3c0: 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  , n, iLimit);.  
c3d0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
c3e0: 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74  (v, "LIMIT count
c3f0: 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28  er"));.      if(
c400: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
c410: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c420: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
c430: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
c440: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c450: 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
c460: 77 20 3e 20 28 64 6f 75 62 6c 65 29 6e 20 29 20  w > (double)n ) 
c470: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
c480: 28 64 6f 75 62 6c 65 29 6e 3b 0a 20 20 20 20 20  (double)n;.     
c490: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
c4a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
c4b0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
c4c0: 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a  Limit, iLimit);.
c4d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c4e0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
c4f0: 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29  stBeInt, iLimit)
c500: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
c510: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
c520: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
c530: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c540: 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p2(v, OP_IfZero,
c550: 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29   iLimit, iBreak)
c560: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
c570: 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
c580: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
c590: 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61   iOffset = ++pPa
c5a0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
c5b0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
c5c0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
c5d0: 6e 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  n extra register
c5e0: 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65   for limit+offse
c5f0: 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  t */.      sqlit
c600: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
c610: 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69  e, p->pOffset, i
c620: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
c630: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c640: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
c650: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
c660: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
c670: 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  , "OFFSET counte
c680: 72 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72  r"));.      addr
c690: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
c6a0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
c6b0: 73 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  s, iOffset);.   
c6c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c6d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
c6e0: 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b  er, 0, iOffset);
c6f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c700: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
c710: 64 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dr1);.      sqli
c720: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
c730: 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c   OP_Add, iLimit,
c740: 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65   iOffset, iOffse
c750: 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65  t+1);.      Vdbe
c760: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
c770: 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20  IT+OFFSET"));.  
c780: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
c790: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
c7a0: 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69   OP_IfPos, iLimi
c7b0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
c7c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c7d0: 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69  P_Integer, -1, i
c7e0: 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20  Offset+1);.     
c7f0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
c800: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
c810: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
c820: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c830: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
c840: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
c850: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
c860: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
c870: 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68   for the iCol-th
c880: 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
c890: 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72  e result set for
c8a0: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65   the compound-se
c8b0: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22  lect statement "
c8c0: 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  p".  Return NULL
c8d0: 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   if.** the colum
c8e0: 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74  n has no default
c8f0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
c900: 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  nce..**.** The c
c910: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
c920: 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  e for the compou
c930: 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b  nd select is tak
c940: 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c  en from the.** l
c950: 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
c960: 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74   the select that
c970: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
c980: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74   sequence..*/.st
c990: 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75  atic CollSeq *mu
c9a0: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
c9b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c9c0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
c9d0: 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  Col){.  CollSeq 
c9e0: 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e  *pRet;.  if( p->
c9f0: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52  pPrior ){.    pR
ca00: 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  et = multiSelect
ca10: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
ca20: 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29  p->pPrior, iCol)
ca30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
ca40: 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  Ret = 0;.  }.  a
ca50: 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29  ssert( iCol>=0 )
ca60: 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20  ;.  if( pRet==0 
ca70: 26 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73  && iCol<p->pELis
ca80: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
ca90: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
caa0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
cab0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  , p->pEList->a[i
cac0: 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  Col].pExpr);.  }
cad0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
cae0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
caf0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
cb00: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46  _SELECT */../* F
cb10: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
cb20: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d   */.static int m
cb30: 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
cb40: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
cb50: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
cb60: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
cb70: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
cb80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
cb90: 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
cba0: 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
cbb0: 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
cbc0: 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
cbd0: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
cbe0: 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
cbf0: 0a 29 3b 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  .);...#ifndef SQ
cc00: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
cc10: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
cc20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
cc30: 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
cc40: 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  s a compound que
cc50: 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20  ry form from.** 
cc60: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
cc70: 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69  rate queries usi
cc80: 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20  ng UNION, UNION 
cc90: 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a  ALL, EXCEPT, or.
cca0: 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a  ** INTERSECT.**.
ccb0: 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
ccc0: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
ccd0: 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
cce0: 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
ccf0: 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
cd00: 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
cd10: 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
cd20: 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
cd30: 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
cd40: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
cd50: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
cd60: 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
cd70: 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
cd80: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
cd90: 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
cda0: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
cdb0: 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
cdc0: 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
cdd0: 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
cde0: 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
cdf0: 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
ce00: 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
ce10: 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
ce20: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
ce30: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
ce40: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
ce50: 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
ce60: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
ce70: 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
ce80: 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
ce90: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
cea0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
ceb0: 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
cec0: 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
ced0: 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
cee0: 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
cef0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
cf00: 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
cf10: 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
cf20: 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
cf30: 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
cf40: 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
cf50: 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
cf60: 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
cf70: 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
cf80: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
cf90: 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
cfa0: 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
cfb0: 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
cfc0: 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
cfd0: 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
cfe0: 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
cff0: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
d000: 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
d010: 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
d020: 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
d030: 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
d040: 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
d050: 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
d060: 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
d070: 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
d080: 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
d090: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
d0a0: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
d0b0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
d0c0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
d0d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d0e0: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
d0f0: 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
d100: 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
d110: 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
d120: 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
d130: 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
d140: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
d150: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
d160: 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
d170: 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
d180: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
d190: 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
d1a0: 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
d1b0: 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
d1c0: 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
d1d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
d1e0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
d1f0: 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
d200: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
d210: 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  t;      /* Alter
d220: 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74  native data dest
d230: 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ination */.  Sel
d240: 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30  ect *pDelete = 0
d250: 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73  ;  /* Chain of s
d260: 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f  imple selects to
d270: 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c   delete */.  sql
d280: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
d290: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
d2a0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66  onnection */.#if
d2b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d2c0: 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
d2d0: 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20 20  Sub1;           
d2e0: 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65   /* EQP id of le
d2f0: 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ft-hand query */
d300: 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20  .  int iSub2;   
d310: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20           /* EQP 
d320: 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  id of right-hand
d330: 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66   query */.#endif
d340: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
d350: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
d360: 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
d370: 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
d380: 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
d390: 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
d3a0: 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
d3b0: 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
d3c0: 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
d3d0: 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
d3e0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26  /.  assert( p &&
d3f0: 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f   p->pPrior );  /
d400: 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * Calling functi
d410: 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  on guarantees th
d420: 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 64 62 20  is much */.  db 
d430: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
d440: 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
d450: 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
d460: 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74  rior->pRightmost
d470: 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73  !=pPrior );.  as
d480: 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52  sert( pPrior->pR
d490: 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69  ightmost==p->pRi
d4a0: 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 64 65 73  ghtmost );.  des
d4b0: 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66  t = *pDest;.  if
d4c0: 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
d4d0: 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
d4e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d4f0: 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  ,"ORDER BY claus
d500: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
d510: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
d520: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
d530: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
d540: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
d550: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
d560: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  t_end;.  }.  if(
d570: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
d580: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d590: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c  rorMsg(pParse,"L
d5a0: 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75  IMIT clause shou
d5b0: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
d5c0: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
d5d0: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
d5e0: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
d5f0: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
d600: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
d610: 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69  .  }..  v = sqli
d620: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
d630: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
d640: 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44  =0 );  /* The VD
d650: 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74  BE already creat
d660: 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75  ed by calling fu
d670: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  nction */..  /* 
d680: 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69  Create the desti
d690: 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79  nation temporary
d6a0: 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73   table if necess
d6b0: 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ary.  */.  if( d
d6c0: 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45  est.eDest==SRT_E
d6d0: 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61  phemTab ){.    a
d6e0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
d6f0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
d700: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d710: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64  OpenEphemeral, d
d720: 65 73 74 2e 69 50 61 72 6d 2c 20 70 2d 3e 70 45  est.iParm, p->pE
d730: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
d740: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
d750: 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55  ngeP5(v, BTREE_U
d760: 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 64  NORDERED);.    d
d770: 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
d780: 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Table;.  }..  /*
d790: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53   Make sure all S
d7a0: 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73 74  ELECTs in the st
d7b0: 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65  atement have the
d7c0: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
d7d0: 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e  elements.  ** in
d7e0: 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73 65   their result se
d7f0: 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ts..  */.  asser
d800: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  t( p->pEList && 
d810: 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29  pPrior->pEList )
d820: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  ;.  if( p->pELis
d830: 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72  t->nExpr!=pPrior
d840: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
d850: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d860: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
d870: 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c  SELECTs to the l
d880: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66  eft and right of
d890: 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20   %s".      " do 
d8a0: 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  not have the sam
d8b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
d8c0: 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c  lt columns", sel
d8d0: 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
d8e0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
d8f0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
d900: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
d910: 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c   /* Compound SEL
d920: 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20 61  ECTs that have a
d930: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
d940: 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  e are handled se
d950: 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  parately..  */. 
d960: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
d970: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d   ){.    return m
d980: 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
d990: 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  y(pParse, p, pDe
d9a0: 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  st);.  }..  /* G
d9b0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
d9c0: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
d9d0: 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
d9e0: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77  ments..  */.  sw
d9f0: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
da00: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
da10: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
da20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
da30: 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61 73  nLimit;.      as
da40: 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
da50: 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70  Limit );.      p
da60: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20  Prior->pLimit = 
da70: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
da80: 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74   pPrior->pOffset
da90: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
daa0: 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
dab0: 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
dac0: 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
dad0: 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
dae0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
daf0: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
db00: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  dest);.      p->
db10: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
db20: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
db30: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
db40: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
db50: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
db60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
db70: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
db80: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
db90: 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
dba0: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
dbb0: 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
dbc0: 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  et;.      if( p-
dbd0: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
dbe0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
dbf0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
dc00: 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  P_IfZero, p->iLi
dc10: 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64  mit);.        Vd
dc20: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a  beComment((v, "J
dc30: 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d  ump ahead if LIM
dc40: 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20  IT reached"));. 
dc50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
dc60: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
dc70: 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
dc80: 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
dc90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
dca0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
dcb0: 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
dcc0: 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
dcd0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
dce0: 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
dcf0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
dd00: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
dd10: 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
dd20: 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e  Row += pPrior->n
dd30: 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
dd40: 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
dd50: 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20 73 71  mit.       && sq
dd60: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
dd70: 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  er(pPrior->pLimi
dd80: 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20  t, &nLimit).    
dd90: 20 20 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74     && p->nSelect
dda0: 52 6f 77 20 3e 20 28 64 6f 75 62 6c 65 29 6e 4c  Row > (double)nL
ddb0: 69 6d 69 74 20 0a 20 20 20 20 20 20 29 7b 0a 20  imit .      ){. 
ddc0: 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
ddd0: 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 6e  tRow = (double)n
dde0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Limit;.      }. 
ddf0: 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b       if( addr ){
de00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
de10: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
de20: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  addr);.      }. 
de30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
de40: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  }.    case TK_EX
de50: 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54  CEPT:.    case T
de60: 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
de70: 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20   int unionTab;  
de80: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
de90: 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  er of the tempor
dea0: 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  ary table holdin
deb0: 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  g result */.    
dec0: 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20    u8 op = 0;    
ded0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
dee0: 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
def0: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
df00: 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70  f */.      int p
df10: 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54  riorOp;     /* T
df20: 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
df30: 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72  n to apply to pr
df40: 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20  ior selects */. 
df50: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
df60: 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20  t, *pOffset; /* 
df70: 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
df80: 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d  p->nLimit and p-
df90: 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  >nOffset */.    
dfa0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
dfb0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69    SelectDest uni
dfc0: 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74  ondest;..      t
dfd0: 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
dfe0: 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20  TK_EXCEPT );.   
dff0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
e000: 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
e010: 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
e020: 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
e030: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
e040: 3d 70 72 69 6f 72 4f 70 20 26 26 20 41 4c 57 41  =priorOp && ALWA
e050: 59 53 28 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26  YS(!p->pLimit &&
e060: 21 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a  !p->pOffset) ){.
e070: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61          /* We ca
e080: 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72  n reuse a tempor
e090: 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61  ary table genera
e0a0: 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20  ted by a SELECT 
e0b0: 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a  to our.        *
e0c0: 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
e0d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
e0e0: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  rt( p->pRightmos
e0f0: 74 21 3d 70 20 29 3b 20 20 2f 2a 20 43 61 6e 20  t!=p );  /* Can 
e100: 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 72 20  only happen for 
e110: 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
e120: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e140: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 33         ** of a 3
e150: 2d 77 61 79 20 6f 72 20 6d 6f 72 65 20 63 6f 6d  -way or more com
e160: 70 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  pound */.       
e170: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d   assert( p->pLim
e180: 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  it==0 );      /*
e190: 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   Not allowed on 
e1a0: 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
e1b0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  s */.        ass
e1c0: 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
e1d0: 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74  =0 );     /* Not
e1e0: 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74   allowed on left
e1f0: 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  ward elements */
e200: 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
e210: 62 20 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a  b = dest.iParm;.
e220: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e230: 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20       /* We will 
e240: 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f  need to create o
e250: 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79  ur own temporary
e260: 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74   table to hold t
e270: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  he.        ** in
e280: 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
e290: 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ts..        */. 
e2a0: 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
e2b0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
e2c0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
e2d0: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
e2e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72   );.        addr
e2f0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
e300: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
e310: 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54  phemeral, unionT
e320: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
e330: 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
e340: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
e350: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   );.        p->a
e360: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
e370: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 70   addr;.        p
e380: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65  ->pRightmost->se
e390: 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
e3a0: 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
e3b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
e3c0: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d  EList );.      }
e3d0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
e3e0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
e3f0: 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66  ments to our lef
e400: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
e410: 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
e420: 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ->pOrderBy );.  
e430: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
e440: 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e  tDestInit(&union
e450: 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75  dest, priorOp, u
e460: 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20  nionTab);.      
e470: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
e480: 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
e490: 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
e4a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
e4b0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
e4c0: 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e  , pPrior, &union
e4d0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  dest);.      if(
e4e0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
e4f0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
e500: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
e510: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
e520: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
e530: 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
e540: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
e550: 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b  op==TK_EXCEPT ){
e560: 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52  .        op = SR
e570: 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20  T_Except;.      
e580: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
e590: 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
e5a0: 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  _UNION );.      
e5b0: 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e    op = SRT_Union
e5c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e5d0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
e5e0: 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
e5f0: 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
e600: 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
e610: 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
e620: 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
e630: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
e640: 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e        uniondest.
e650: 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20  eDest = op;.    
e660: 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
e670: 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
e680: 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
e690: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
e6a0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
e6b0: 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73  se, p, &uniondes
e6c0: 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
e6d0: 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
e6e0: 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75  K );.      /* Qu
e6f0: 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  ery flattening i
e700: 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  n sqlite3Select(
e710: 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70  ) might refill p
e720: 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20  ->pOrderBy..    
e730: 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20    ** Be sure to 
e740: 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72  delete p->pOrder
e750: 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74  By, therefore, t
e760: 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79  o avoid a memory
e770: 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   leak. */.      
e780: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
e790: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
e7a0: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70 44  derBy);.      pD
e7b0: 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
e7c0: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
e7d0: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
e7e0: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
e7f0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   0;.      if( p-
e800: 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 20  >op==TK_UNION ) 
e810: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d  p->nSelectRow +=
e820: 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
e830: 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Row;.      sqlit
e840: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
e850: 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
e860: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
e870: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
e880: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
e890: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  t;.      p->iLim
e8a0: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  it = 0;.      p-
e8b0: 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  >iOffset = 0;.. 
e8c0: 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
e8d0: 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20  the data in the 
e8e0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
e8f0: 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
e900: 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  rm.      ** it i
e910: 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e  s that we curren
e920: 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  tly need..      
e930: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
e940: 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e   unionTab==dest.
e950: 69 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44  iParm || dest.eD
e960: 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a  est!=priorOp );.
e970: 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
e980: 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b  Dest!=priorOp ){
e990: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
e9a0: 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
e9b0: 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
e9c0: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
e9d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65 73  .        if( des
e9e0: 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  t.eDest==SRT_Out
e9f0: 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  put ){.         
ea00: 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
ea10: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77  = p;.          w
ea20: 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
ea30: 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
ea40: 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
ea50: 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61            genera
ea60: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
ea70: 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d  arse, 0, pFirst-
ea80: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
ea90: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65    }.        iBre
eaa0: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
eab0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
eac0: 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
ead0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
eae0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63  el(v);.        c
eaf0: 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
eb00: 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
eb10: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
eb20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
eb30: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
eb40: 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61   unionTab, iBrea
eb50: 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  k);.        iSta
eb60: 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
eb70: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
eb80: 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e          selectIn
eb90: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
eba0: 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e  p, p->pEList, un
ebb0: 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73  ionTab, p->pELis
ebc0: 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  t->nExpr,.      
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebe0: 20 20 30 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20    0, -1, &dest, 
ebf0: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
ec00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ec10: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
ec20: 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
ec30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ec40: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
ec50: 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
ec60: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
ec70: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
ec80: 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
ec90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
eca0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ecb0: 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
ecc0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
ecd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ece0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
ecf0: 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49  ert( p->op==TK_I
ed00: 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20  NTERSECT ); {.  
ed10: 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
ed20: 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b2;.      int iC
ed30: 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
ed40: 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  art;.      Expr 
ed50: 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
ed60: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
ed70: 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
ed80: 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73  est intersectdes
ed90: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b  t;.      int r1;
eda0: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52  ..      /* INTER
edb0: 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
edc0: 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
edd0: 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
ede0: 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  res.      ** two
edf0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
ee00: 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73  s.  Hence it has
ee10: 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20   its own case.  
ee20: 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  Begin.      ** b
ee30: 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  y allocating the
ee40: 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20   tables we will 
ee50: 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
ee60: 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72       tab1 = pPar
ee70: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
ee80: 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
ee90: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
eea0: 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
eeb0: 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  By==0 );..      
eec0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
eed0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
eee0: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
eef0: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b1, 0);.      as
ef00: 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
ef10: 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
ef20: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
ef30: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
ef40: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 69 67  r;.      p->pRig
ef50: 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73  htmost->selFlags
ef60: 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
ef70: 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  eral;.      asse
ef80: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
ef90: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
efa0: 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f  the SELECTs to o
efb0: 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d  ur left into tem
efc0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
efd0: 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  b1"..      */.  
efe0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
eff0: 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72  tDestInit(&inter
f000: 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e  sectdest, SRT_Un
f010: 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20  ion, tab1);.    
f020: 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
f030: 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
f040: 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
f050: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
f060: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
f070: 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74  se, pPrior, &int
f080: 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
f090: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
f0a0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
f0b0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
f0c0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
f0d0: 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
f0e0: 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
f0f0: 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
f100: 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
f110: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
f120: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f130: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
f140: 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab2, 0);.      a
f150: 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
f160: 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20  enEphm[1] == -1 
f170: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
f180: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64  OpenEphm[1] = ad
f190: 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  dr;.      p->pPr
f1a0: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
f1b0: 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
f1c0: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
f1d0: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
f1e0: 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
f1f0: 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
f200: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
f210: 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 50  intersectdest.iP
f220: 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20  arm = tab2;.    
f230: 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
f240: 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
f250: 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
f260: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
f270: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
f280: 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63  se, p, &intersec
f290: 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  tdest);.      te
f2a0: 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
f2b0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70  TE_OK );.      p
f2c0: 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
f2d0: 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
f2e0: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
f2f0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
f300: 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53  ctRow>pPrior->nS
f310: 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53  electRow ) p->nS
f320: 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f  electRow = pPrio
f330: 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
f340: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f350: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
f360: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
f370: 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
f380: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
f390: 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20  t = pOffset;..  
f3a0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
f3b0: 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65  code to take the
f3c0: 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
f3d0: 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61   the two tempora
f3e0: 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  ry.      ** tabl
f3f0: 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  es..      */.   
f400: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
f410: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66  List );.      if
f420: 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
f430: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
f440: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
f450: 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
f460: 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
f470: 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
f480: 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
f490: 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74  .        generat
f4a0: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
f4b0: 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
f4c0: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  pEList);.      }
f4d0: 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20  .      iBreak = 
f4e0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
f4f0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
f500: 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
f510: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
f520: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
f530: 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
f540: 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
f550: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f560: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
f570: 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65  wind, tab1, iBre
f580: 61 6b 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  ak);.      r1 = 
f590: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
f5a0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
f5b0: 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
f5c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f5d0: 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20  P_RowKey, tab1, 
f5e0: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
f5f0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
f600: 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
f610: 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c  tab2, iCont, r1,
f620: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
f630: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
f640: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
f650: 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
f660: 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
f670: 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20  ->pEList, tab1, 
f680: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
f690: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f6a0: 20 20 20 20 20 20 20 20 30 2c 20 2d 31 2c 20 26          0, -1, &
f6b0: 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
f6c0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
f6d0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
f6e0: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
f6f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f700: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
f710: 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29  t, tab1, iStart)
f720: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f730: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
f740: 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
f750: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f760: 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
f770: 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
f780: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f790: 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
f7a0: 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
f7b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
f7c0: 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  ..  explainCompo
f7d0: 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  site(pParse, p->
f7e0: 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  op, iSub1, iSub2
f7f0: 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  , p->op!=TK_ALL)
f800: 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;..  /* Compute 
f810: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
f820: 63 65 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a  ces used by .  *
f830: 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  * temporary tabl
f840: 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70  es needed to imp
f850: 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f  lement the compo
f860: 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a  und select..  **
f870: 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49   Attach the KeyI
f880: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f  nfo structure to
f890: 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74   all temporary t
f8a0: 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
f8b0: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73   This section is
f8c0: 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68   run by the righ
f8d0: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
f8e0: 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20  atement only..  
f8f0: 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
f900: 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ents to the left
f910: 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69   always skip thi
f920: 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67  s part.  The rig
f930: 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c  ht-most.  ** SEL
f940: 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73  ECT might also s
f950: 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66  kip this part if
f960: 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52   it has no ORDER
f970: 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20   BY clause and. 
f980: 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c   ** no temp tabl
f990: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e  es are required.
f9a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
f9b0: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65  elFlags & SF_Use
f9c0: 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20  sEphemeral ){.  
f9d0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9f0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
fa00: 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  */.    KeyInfo *
fa10: 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20  pKeyInfo;       
fa20: 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
fa30: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
fa40: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
fa50: 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f  .    Select *pLo
fa60: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
fa70: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
fa80: 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54  g through SELECT
fa90: 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20   statements */. 
faa0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43     CollSeq **apC
fab0: 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
fac0: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
fad0: 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f  through pKeyInfo
fae0: 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20  ->aColl[] */.   
faf0: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
fb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fb10: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
fb20: 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
fb30: 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  t */..    assert
fb40: 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ( p->pRightmost=
fb50: 3d 70 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d  =p );.    nCol =
fb60: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
fb70: 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  r;.    pKeyInfo 
fb80: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
fb90: 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20  cZero(db,.      
fba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbb0: 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66   sizeof(*pKeyInf
fbc0: 6f 29 2b 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66 28  o)+nCol*(sizeof(
fbd0: 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b  CollSeq*) + 1));
fbe0: 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e  .    if( !pKeyIn
fbf0: 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fo ){.      rc =
fc00: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
fc10: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
fc20: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
fc30: 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d  }..    pKeyInfo-
fc40: 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a  >enc = ENC(db);.
fc50: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46      pKeyInfo->nF
fc60: 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c  ield = (u16)nCol
fc70: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  ;..    for(i=0, 
fc80: 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d  apColl=pKeyInfo-
fc90: 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  >aColl; i<nCol; 
fca0: 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a  i++, apColl++){.
fcb0: 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
fcc0: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
fcd0: 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
fce0: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a  ;.      if( 0==*
fcf0: 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  apColl ){.      
fd00: 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e    *apColl = db->
fd10: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
fd20: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
fd30: 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
fd40: 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
fd50: 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f  Prior){.      fo
fd60: 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
fd70: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
fd80: 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  dr = pLoop->addr
fd90: 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20  OpenEphm[i];.   
fda0: 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20       if( addr<0 
fdb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
fdc0: 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  If [0] is unused
fdd0: 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73   then [1] is als
fde0: 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65  o unused.  So we
fdf0: 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a   can.          *
fe00: 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20  * always safely 
fe10: 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73  abort as soon as
fe20: 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65   the first unuse
fe30: 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20  d slot is found 
fe40: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
fe50: 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  ert( pLoop->addr
fe60: 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b  OpenEphm[1]<0 );
fe70: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
fe80: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fe90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
fea0: 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
feb0: 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
fec0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
fed0: 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP4(v, addr, (ch
fee0: 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
fef0: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
ff00: 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70     pLoop->addrOp
ff10: 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a  enEphm[i] = -1;.
ff20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ff30: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
ff40: 64 62 2c 20 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  db, pKeyInfo);. 
ff50: 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74   }..multi_select
ff60: 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69  _end:.  pDest->i
ff70: 4d 65 6d 20 3d 20 64 65 73 74 2e 69 4d 65 6d 3b  Mem = dest.iMem;
ff80: 0a 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d  .  pDest->nMem =
ff90: 20 64 65 73 74 2e 6e 4d 65 6d 3b 0a 20 20 73 71   dest.nMem;.  sq
ffa0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
ffb0: 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a  e(db, pDelete);.
ffc0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
ffd0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
ffe0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
fff0: 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  LECT */../*.** C
10000 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75  ode an output su
10010 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63  broutine for a c
10020 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65  oroutine impleme
10030 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20  ntation of a.** 
10040 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e  SELECT statment.
10050 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20  .**.** The data 
10060 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73 20  to be output is 
10070 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e  contained in pIn
10080 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 72 65 20 61  ->iMem.  There a
10090 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 4d 65 6d 20  re.** pIn->nMem 
100a0 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75  columns to be ou
100b0 74 70 75 74 2e 20 20 70 44 65 73 74 20 69 73 20  tput.  pDest is 
100c0 77 68 65 72 65 20 74 68 65 20 6f 75 74 70 75 74  where the output
100d0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
100e0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74  nt..**.** regRet
100f0 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  urn is the numbe
10100 72 20 6f 66 20 74 68 65 20 72 65 67 69 73 74 65  r of the registe
10110 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75  r holding the su
10120 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75  broutine.** retu
10130 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a  rn address..**.*
10140 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74  * If regPrev>0 t
10150 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 66 69  hen it is the fi
10160 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e 20  rst register in 
10170 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a  a vector that.**
10180 20 72 65 63 6f 72 64 73 20 74 68 65 20 70 72 65   records the pre
10190 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d  vious output.  m
101a0 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61  em[regPrev] is a
101b0 20 66 6c 61 67 20 74 68 61 74 20 69 73 20 66 61   flag that is fa
101c0 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  lse.** if there 
101d0 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76  has been no prev
101e0 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66  ious output.  If
101f0 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20   regPrev>0 then 
10200 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72  code is.** gener
10210 61 74 65 64 20 74 6f 20 73 75 70 70 72 65 73 73  ated to suppress
10220 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b   duplicates.  pK
10230 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66  eyInfo is used f
10240 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20  or comparing.** 
10250 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  keys..**.** If t
10260 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69  he LIMIT found i
10270 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72  n p->iLimit is r
10280 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d  eached, jump imm
10290 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69  ediately to.** i
102a0 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  Break..*/.static
102b0 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74   int generateOut
102c0 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20  putSubroutine(. 
102d0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
102e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
102f0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
10300 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
10310 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10320 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
10330 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
10340 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a   *pIn,        /*
10350 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c   Coroutine suppl
10360 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53  ying data */.  S
10370 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
10380 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20  ,      /* Where 
10390 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74 61  to send the data
103a0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74   */.  int regRet
103b0 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  urn,          /*
103c0 20 54 68 65 20 72 65 74 75 72 6e 20 61 64 64 72   The return addr
103d0 65 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ess register */.
103e0 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20    int regPrev,  
103f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
10400 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67  vious result reg
10410 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75  ister.  No uniqu
10420 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20  eness if 0 */.  
10430 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
10440 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63  o,      /* For c
10450 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70 72  omparing with pr
10460 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a  evious entry */.
10470 20 20 69 6e 74 20 70 34 74 79 70 65 2c 20 20 20    int p4type,   
10480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10490 20 70 34 20 74 79 70 65 20 66 6f 72 20 70 4b 65   p4 type for pKe
104a0 79 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 69  yInfo */.  int i
104b0 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20  Break           
104c0 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
104d0 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c 49  if we hit the LI
104e0 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  MIT */.){.  Vdbe
104f0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
10500 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74  dbe;.  int iCont
10510 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72  inue;.  int addr
10520 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  ;..  addr = sqli
10530 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
10540 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e  dr(v);.  iContin
10550 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
10560 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
10570 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75 70   /* Suppress dup
10580 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f  licates for UNIO
10590 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
105a0 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20  NTERSECT .  */. 
105b0 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a   if( regPrev ){.
105c0 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a      int j1, j2;.
105d0 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
105e0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
105f0 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29  _IfNot, regPrev)
10600 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74  ;.    j2 = sqlit
10610 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
10620 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d  OP_Compare, pIn-
10630 3e 69 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31  >iMem, regPrev+1
10640 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 0a 20 20 20  , pIn->nMem,.   
10650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10660 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
10670 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 70 34 74 79  *)pKeyInfo, p4ty
10680 70 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pe);.    sqlite3
10690 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
106a0 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f  _Jump, j2+2, iCo
106b0 6e 74 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20  ntinue, j2+2);. 
106c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
106d0 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
106e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
106f0 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70  deCopy(pParse, p
10700 49 6e 2d 3e 69 4d 65 6d 2c 20 72 65 67 50 72 65  In->iMem, regPre
10710 76 2b 31 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b  v+1, pIn->nMem);
10720 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10730 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
10740 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76  eger, 1, regPrev
10750 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
10760 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
10770 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30  ailed ) return 0
10780 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
10790 20 74 68 65 20 74 68 65 20 66 69 72 73 74 20 4f   the the first O
107a0 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66  FFSET entries if
107b0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46   there is an OFF
107c0 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  SET clause.  */.
107d0 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
107e0 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a  p, iContinue);..
107f0 20 20 73 77 69 74 63 68 28 20 70 44 65 73 74 2d    switch( pDest-
10800 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a  >eDest ){.    /*
10810 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
10820 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
10830 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
10840 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
10850 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
10860 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
10870 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d  {.      int r1 =
10880 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
10890 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
108a0 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
108b0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
108c0 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  rse);.      test
108d0 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65  case( pDest->eDe
108e0 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st==SRT_Table );
108f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
10900 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
10910 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
10920 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10930 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
10940 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 4d  eRecord, pIn->iM
10950 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 20 72  em, pIn->nMem, r
10960 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
10970 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10980 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73  P_NewRowid, pDes
10990 74 2d 3e 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20  t->iParm, r2);. 
109a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
109b0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
109c0 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 50 61 72  ert, pDest->iPar
109d0 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
109e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
109f0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
10a00 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73  APPEND);.      s
10a10 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
10a20 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
10a30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
10a40 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
10a50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
10a60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
10a70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10a80 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
10a90 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65  /* If we are cre
10aa0 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20  ating a set for 
10ab0 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  an "expr IN (SEL
10ac0 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72  ECT ...)" constr
10ad0 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  uct,.    ** then
10ae0 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   there should be
10af0 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f   a single item o
10b00 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72  n the stack.  Wr
10b10 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ite this.    ** 
10b20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65  item into the se
10b30 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67  t table with bog
10b40 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  us data..    */.
10b50 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
10b60 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
10b70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10b80 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a  pIn->nMem==1 );.
10b90 20 20 20 20 20 20 70 2d 3e 61 66 66 69 6e 69 74        p->affinit
10ba0 79 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73 71  y = .         sq
10bb0 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
10bc0 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e  nity(p->pEList->
10bd0 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73  a[0].pExpr, pDes
10be0 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20 20  t->affinity);.  
10bf0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
10c00 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
10c10 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
10c20 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
10c30 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
10c40 6e 2d 3e 69 4d 65 6d 2c 20 31 2c 20 72 31 2c 20  n->iMem, 1, r1, 
10c50 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29  &p->affinity, 1)
10c60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
10c70 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
10c80 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
10c90 49 6e 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20  In->iMem, 1);.  
10ca0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10cb0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
10cc0 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 50  nsert, pDest->iP
10cd0 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  arm, r1);.      
10ce0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
10cf0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
10d00 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
10d10 20 20 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a      }..#if 0  /*
10d20 20 4e 65 76 65 72 20 6f 63 63 75 72 73 20 6f 6e   Never occurs on
10d30 20 61 6e 20 4f 52 44 45 52 20 42 59 20 71 75 65   an ORDER BY que
10d40 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20  ry */.    /* If 
10d50 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
10d60 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
10d70 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
10d80 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
10d90 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
10da0 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
10db0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10dc0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
10dd0 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69 50 61 72  , 1, pDest->iPar
10de0 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  m);.      /* The
10df0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
10e00 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
10e10 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
10e20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10e30 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
10e40 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
10e50 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
10e60 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
10e70 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
10e80 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
10e90 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
10ea0 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
10eb0 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65  ory cell and bre
10ec0 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  ak out.    ** of
10ed0 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
10ee0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
10ef0 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
10f00 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 4d   assert( pIn->nM
10f10 65 6d 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  em==1 );.      s
10f20 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
10f30 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
10f40 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69 50 61  iMem, pDest->iPa
10f50 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a  rm, 1);.      /*
10f60 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
10f70 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
10f80 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
10f90 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
10fa0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
10fb0 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
10fc0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
10fd0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  */..    /* The r
10fe0 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
10ff0 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
11000 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20  of registers.   
11010 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
11020 70 44 65 73 74 2d 3e 69 4d 65 6d 2e 20 20 54 68  pDest->iMem.  Th
11030 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  en the co-routin
11040 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f  e yields..    */
11050 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
11060 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20  routine: {.     
11070 20 69 66 28 20 70 44 65 73 74 2d 3e 69 4d 65 6d   if( pDest->iMem
11080 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
11090 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 73 71 6c  Dest->iMem = sql
110a0 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
110b0 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 4d  (pParse, pIn->nM
110c0 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65  em);.        pDe
110d0 73 74 2d 3e 6e 4d 65 6d 20 3d 20 70 49 6e 2d 3e  st->nMem = pIn->
110e0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nMem;.      }.  
110f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
11100 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
11110 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74  pIn->iMem, pDest
11120 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 6e  ->iMem, pDest->n
11130 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Mem);.      sqli
11140 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
11150 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
11160 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  ->iParm);.      
11170 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
11180 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20    /* If none of 
11190 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  the above, then 
111a0 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74 69  the result desti
111b0 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20  nation must be. 
111c0 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74     ** SRT_Output
111d0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
111e0 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
111f0 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20  with any other. 
11200 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f     ** destinatio
11210 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  n other than the
11220 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62   ones handled ab
11230 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75  ove or SRT_Outpu
11240 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
11250 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c   For SRT_Output,
11260 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
11270 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
11280 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20  e of registers. 
11290 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68   .    ** Then th
112a0 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f  e OP_ResultRow o
112b0 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f  pcode is used to
112c0 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73   cause sqlite3_s
112d0 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  tep() to.    ** 
112e0 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20  return the next 
112f0 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20  row of result.. 
11300 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
11310 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
11320 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  t( pDest->eDest=
11330 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
11340 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11350 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
11360 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 4d 65  ultRow, pIn->iMe
11370 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20  m, pIn->nMem);. 
11380 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
11390 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
113a0 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
113b0 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d  >iMem, pIn->nMem
113c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
113d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
113e0 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
113f0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74  of the loop if t
11400 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
11410 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hed..  */.  if( 
11420 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
11430 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11440 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p3(v, OP_IfZero,
11450 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
11460 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20  ak, -1);.  }..  
11470 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
11480 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72  subroutine retur
11490 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n.  */.  sqlite3
114a0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
114b0 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  (v, iContinue);.
114c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
114d0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
114e0 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20  , regReturn);.. 
114f0 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
11500 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69  ./*.** Alternati
11510 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  ve compound sele
11520 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  ct code generato
11530 72 20 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e  r for cases when
11540 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20   there.** is an 
11550 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
11560 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65  .**.** We assume
11570 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
11580 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a  following form:.
11590 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65  **.**      <sele
115a0 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e  ctA>  <operator>
115b0 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44    <selectB>  ORD
115c0 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69  ER BY <orderbyli
115d0 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61  st>.**.** <opera
115e0 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55  tor> is one of U
115f0 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c  NION ALL, UNION,
11600 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45   EXCEPT, or INTE
11610 52 53 45 43 54 2e 20 20 54 68 65 20 69 64 65 61  RSECT.  The idea
11620 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62  .** is to code b
11630 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e  oth <selectA> an
11640 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68  d <selectB> with
11650 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
11660 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f  ause as.** co-ro
11670 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75  utines.  Then ru
11680 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
11690 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e  s in parallel an
116a0 64 20 6d 65 72 67 65 20 74 68 65 20 72 65 73 75  d merge the resu
116b0 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  lts.** into the 
116c0 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69  output.  In addi
116d0 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20  tion to the two 
116e0 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c  coroutines (call
116f0 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a  ed selectA and.*
11700 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65 72 65  * selectB) there
11710 20 61 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e   are 7 subroutin
11720 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74  es:.**.**    out
11730 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f  A:    Move the o
11740 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c  utput of the sel
11750 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69  ectA coroutine i
11760 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  nto the output.*
11770 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  *             of
11780 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
11790 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75  ery..**.**    ou
117a0 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20  tB:    Move the 
117b0 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65  output of the se
117c0 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20  lectB coroutine 
117d0 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  into the output.
117e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
117f0 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
11800 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e  uery.  (Only gen
11810 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e  erated for UNION
11820 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
11830 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20      UNION ALL.  
11840 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52  EXCEPT and INSER
11850 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70  TSECT never outp
11860 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a  ut a row that.**
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
11880 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29  ears only in B.)
11890 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20  .**.**    AltB: 
118a0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
118b0 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
118c0 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
118d0 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a  s and A<B..**.**
118e0 20 20 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c      AeqB:    Cal
118f0 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
11900 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
11910 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
11920 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  A==B..**.**    A
11930 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  gtB:    Called w
11940 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
11950 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
11960 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a  utines and A>B..
11970 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20  **.**    EofA:  
11980 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61    Called when da
11990 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
119a0 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a  from selectA..**
119b0 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20  .**    EofB:    
119c0 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
119d0 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
119e0 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a  om selectB..**.*
119f0 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
11a00 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74  tion of the latt
11a10 65 72 20 66 69 76 65 20 73 75 62 72 6f 75 74 69  er five subrouti
11a20 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68  nes depend on wh
11a30 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  ich .** <operato
11a40 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a  r> is used:.**.*
11a50 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
11a60 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20   UNION ALL      
11a70 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20     UNION        
11a80 20 20 20 20 45 58 43 45 50 54 20 20 20 20 20 20      EXCEPT      
11a90 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a      INTERSECT.**
11aa0 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
11ab0 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
11ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
11ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
11ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
11af0 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c     AltB:   outA,
11b00 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41   nextA      outA
11b10 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75  , nextA       ou
11b20 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
11b30 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20    nextA.**.**   
11b40 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  AeqB:   outA, ne
11b50 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74  xtA         next
11b60 41 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  A             ne
11b70 78 74 41 20 20 20 20 20 20 20 20 20 6f 75 74 41  xtA         outA
11b80 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20  , nextA.**.**   
11b90 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65  AgtB:   outB, ne
11ba0 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e  xtB      outB, n
11bb0 65 78 74 42 20 20 20 20 20 20 20 20 20 20 6e 65  extB          ne
11bc0 78 74 42 20 20 20 20 20 20 20 20 20 20 20 20 6e  xtB            n
11bd0 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66  extB.**.**   Eof
11be0 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42  A:   outB, nextB
11bf0 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74        outB, next
11c00 42 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 20  B          halt 
11c10 20 20 20 20 20 20 20 20 20 20 20 20 68 61 6c 74              halt
11c20 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20  .**.**   EofB:  
11c30 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
11c40 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
11c50 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
11c60 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a          halt.**.
11c70 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20  ** In the AltB, 
11c80 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73  AeqB, and AgtB s
11c90 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45  ubroutines, an E
11ca0 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e  OF on A followin
11cb0 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65  g nextA.** cause
11cc0 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a  s an immediate j
11cd0 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20  ump to EofA and 
11ce0 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c  an EOF on B foll
11cf0 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73  owing nextB caus
11d00 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61  es.** an immedia
11d10 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e  te jump to EofB.
11d20 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e    Within EofA an
11d30 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20  d EofB, and EOF 
11d40 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66  on entry or.** f
11d50 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63  ollowing nextX c
11d60 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20  auses a jump to 
11d70 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73  the end of the s
11d80 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67  elect processing
11d90 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74  ..**.** Duplicat
11da0 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65  e removal in the
11db0 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
11dc0 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63 61  and INTERSECT ca
11dd0 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a  ses is handled.*
11de0 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74  * within the out
11df0 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  put subroutine. 
11e00 20 54 68 65 20 72 65 67 50 72 65 76 20 72 65 67   The regPrev reg
11e10 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20  ister set holds 
11e20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  the previously.*
11e30 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20  * output value. 
11e40 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73   A comparison is
11e50 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74 68   made against th
11e60 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  is value and the
11e70 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b   output.** is sk
11e80 69 70 70 65 64 20 69 66 20 74 68 65 20 6e 65 78  ipped if the nex
11e90 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20  t results would 
11ea0 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
11eb0 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a  he previous..**.
11ec0 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
11ed0 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f  ation plan is to
11ee0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74   implement the t
11ef0 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  wo coroutines an
11f00 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f  d seven.** subro
11f10 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68  utines first, th
11f20 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72  en put the contr
11f30 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20  ol logic at the 
11f40 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68  bottom.  Like th
11f50 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
11f60 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20     goto Init.** 
11f70 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69      coA: corouti
11f80 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72  ne for left quer
11f90 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42  y (A).**     coB
11fa0 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  : coroutine for 
11fb0 72 69 67 68 74 20 71 75 65 72 79 20 28 42 29 0a  right query (B).
11fc0 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70  **    outA: outp
11fd0 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a  ut one row of A.
11fe0 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70  **    outB: outp
11ff0 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20  ut one row of B 
12000 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e  (UNION and UNION
12010 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20   ALL only).**   
12020 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   EofA: ....**   
12030 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   EofB: ....**   
12040 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AltB: ....**   
12050 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AeqB: ....**   
12060 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AgtB: ....**   
12070 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a   Init: initializ
12080 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69  e coroutine regi
12090 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20  sters.**        
120a0 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20    yield coA.**  
120b0 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 41          if eof(A
120c0 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20  ) goto EofA.**  
120d0 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
120e0 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  B.**          if
120f0 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66   eof(B) goto Eof
12100 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f  B.**    Cmpr: Co
12110 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20  mpare A, B.**   
12120 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42         Jump AltB
12130 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20  , AeqB, AgtB.** 
12140 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a      End: ....**.
12150 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c  ** We call AltB,
12160 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66   AeqB, AgtB, Eof
12170 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62  A, and EofB "sub
12180 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74 68  routines" but th
12190 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63  ey are not.** ac
121a0 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73  tually called us
121b0 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68  ing Gosub and th
121c0 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e  ey do not Return
121d0 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42  .  EofA and EofB
121e0 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61   loop.** until a
121f0 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68 61 75  ll data is exhau
12200 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74  sted then jump t
12210 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65  o the "end" labe
12220 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a  .  AltB, AeqB,.*
12230 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20  * and AgtB jump 
12240 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20  to either L2 or 
12250 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f  to one of EofA o
12260 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64  r EofB..*/.#ifnd
12270 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
12280 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73  OMPOUND_SELECT.s
12290 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
122a0 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20  electOrderBy(.  
122b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
122c0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
122d0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
122e0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
122f0 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
12300 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
12310 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
12320 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
12330 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
12340 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
12350 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
12360 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
12370 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
12380 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c  ounters */.  Sel
12390 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
123a0 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
123b0 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
123c0 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
123d0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
123e0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
123f0 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
12400 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63   VDBE */.  Selec
12410 74 44 65 73 74 20 64 65 73 74 41 3b 20 20 20 20  tDest destA;    
12420 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
12430 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20  for coroutine A 
12440 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
12450 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65  destB;     /* De
12460 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f  stination for co
12470 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69  routine B */.  i
12480 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20 20 20  nt regAddrA;    
12490 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
124a0 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
124b0 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
124c0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 41  */.  int regEofA
124d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  ;          /* Fl
124e0 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77  ag to indicate w
124f0 68 65 6e 20 73 65 6c 65 63 74 2d 41 20 69 73 20  hen select-A is 
12500 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  complete */.  in
12510 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20  t regAddrB;     
12520 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
12530 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
12540 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
12550 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 42 3b  /.  int regEofB;
12560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
12570 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68  g to indicate wh
12580 65 6e 20 73 65 6c 65 63 74 2d 42 20 69 73 20 63  en select-B is c
12590 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74  omplete */.  int
125a0 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20   addrSelectA;   
125b0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
125c0 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f   the select-A co
125d0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
125e0 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20   addrSelectB;   
125f0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
12600 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f   the select-B co
12610 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
12620 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20   regOutA;       
12630 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
12640 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
12650 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
12660 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ne */.  int regO
12670 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  utB;          /*
12680 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
12690 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74  r for the output
126a0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -B subroutine */
126b0 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b  .  int addrOutA;
126c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
126d0 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
126e0 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
126f0 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42  /.  int addrOutB
12700 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64   = 0;     /* Add
12710 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
12720 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-B subroutine 
12730 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
12740 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
12750 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
12760 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20  ect-A-exhausted 
12770 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
12780 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20  int addrEofB;   
12790 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
127a0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
127b0 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
127c0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
127d0 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20  ddrAltB;        
127e0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
127f0 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e  he A<B subroutin
12800 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
12810 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eqB;         /* 
12820 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
12830 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ==B subroutine *
12840 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42  /.  int addrAgtB
12850 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
12860 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20  ress of the A>B 
12870 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
12880 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20  int regLimitA;  
12890 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
128a0 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
128b0 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
128c0 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20  gLimitB;        
128d0 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
128e0 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
128f0 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b  /.  int regPrev;
12900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72            /* A r
12910 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
12920 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f  s to hold previo
12930 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  us output */.  i
12940 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20  nt savedLimit;  
12950 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
12960 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74  lue of p->iLimit
12970 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f   */.  int savedO
12980 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  ffset;      /* S
12990 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
129a0 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  >iOffset */.  in
129b0 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20  t labelCmpr;    
129c0 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
129d0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
129e0 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  e merge algorith
129f0 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  m */.  int label
12a00 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  End;         /* 
12a10 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e  Label for the en
12a20 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c  d of the overall
12a30 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a   SELECT stmt */.
12a40 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20    int j1;       
12a50 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
12a60 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
12a70 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65  t get retargette
12a80 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  d */.  int op;  
12a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12aa0 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54  One of TK_ALL, T
12ab0 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
12ac0 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  PT, TK_INTERSECT
12ad0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
12ae0 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43  KeyDup = 0; /* C
12af0 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
12b00 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
12b10 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20  ate removal */. 
12b20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65   KeyInfo *pKeyMe
12b30 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72  rge;   /* Compar
12b40 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
12b50 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77   for merging row
12b60 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
12b70 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
12b80 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
12b90 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
12ba0 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f  t *pOrderBy;   /
12bb0 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
12bc0 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
12bd0 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
12be0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
12bf0 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
12c00 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
12c10 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20  int *aPermute;  
12c20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
12c30 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74   from ORDER BY t
12c40 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73  erms to result s
12c50 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69  et columns */.#i
12c60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12c70 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
12c80 69 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20  iSub1;          
12c90 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
12ca0 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
12cb0 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20  /.  int iSub2;  
12cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
12cd0 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
12ce0 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
12cf0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  f..  assert( p->
12d00 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20  pOrderBy!=0 );. 
12d10 20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70   assert( pKeyDup
12d20 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67  ==0 ); /* "Manag
12d30 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74  ed" code needs t
12d40 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33  his.  Ticket #33
12d50 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  82. */.  db = pP
12d60 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20  arse->db;.  v = 
12d70 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
12d80 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
12d90 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64         /* Alread
12da0 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72  y thrown the err
12db0 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63  or if VDBE alloc
12dc0 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62   failed */.  lab
12dd0 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  elEnd = sqlite3V
12de0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
12df0 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73  .  labelCmpr = s
12e00 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
12e10 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50  bel(v);...  /* P
12e20 61 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45  atch up the ORDE
12e30 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f  R BY clause.  */
12e40 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20  .  op = p->op;  
12e50 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
12e60 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
12e70 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
12e80 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72  y==0 );.  pOrder
12e90 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
12ea0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
12eb0 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72  erBy );.  nOrder
12ec0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
12ed0 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  Expr;..  /* For 
12ee0 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20  operators other 
12ef0 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77  than UNION ALL w
12f00 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73  e have to make s
12f10 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ure that.  ** th
12f20 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
12f30 65 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74  e covers every t
12f40 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c  erm of the resul
12f50 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a  t set.  Add.  **
12f60 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52   terms to the OR
12f70 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
12f80 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
12f90 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c  .  if( op!=TK_AL
12fa0 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  L ){.    for(i=1
12fb0 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ; db->mallocFail
12fc0 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70  ed==0 && i<=p->p
12fd0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
12fe0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
12ff0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
13000 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72  pItem;.      for
13010 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (j=0, pItem=pOrd
13020 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65  erBy->a; j<nOrde
13030 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; j++, pItem+
13040 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
13050 72 74 28 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3e  rt( pItem->iCol>
13060 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
13070 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3d 3d 69 20   pItem->iCol==i 
13080 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
13090 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f  .      if( j==nO
130a0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
130b0 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
130c0 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
130d0 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20  K_INTEGER, 0);. 
130e0 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d         if( pNew=
130f0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
13100 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
13110 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
13120 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
13130 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
13140 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20  alue = i;.      
13150 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c    pOrderBy = sql
13160 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
13170 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  nd(pParse, pOrde
13180 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  rBy, pNew);.    
13190 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
131a0 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 69 43 6f 6c  nOrderBy++].iCol
131b0 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20   = (u16)i;.     
131c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
131d0 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
131e0 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74  omparison permut
131f0 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66  ation and keyinf
13200 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77  o that is used w
13210 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72  ith.  ** the per
13220 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f  mutation used to
13230 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
13240 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20  e next.  ** row 
13250 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73  of results comes
13260 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72   from selectA or
13270 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20   selectB.  Also 
13280 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a  add explicit.  *
13290 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20  * collations to 
132a0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
132b0 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61  use terms so tha
132c0 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75  t when the subqu
132d0 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68  eries.  ** to th
132e0 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20  e right and the 
132f0 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74  left are evaluat
13300 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65  ed, they use the
13310 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f   correct.  ** co
13320 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  llation..  */.  
13330 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74  aPermute = sqlit
13340 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
13350 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f  , sizeof(int)*nO
13360 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 61  rderBy);.  if( a
13370 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73  Permute ){.    s
13380 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
13390 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
133a0 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
133b0 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f  OrderBy->a; i<nO
133c0 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74  rderBy; i++, pIt
133d0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  em++){.      ass
133e0 65 72 74 28 20 70 49 74 65 6d 2d 3e 69 43 6f 6c  ert( pItem->iCol
133f0 3e 30 20 20 26 26 20 70 49 74 65 6d 2d 3e 69 43  >0  && pItem->iC
13400 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<=p->pEList->n
13410 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50  Expr );.      aP
13420 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65  ermute[i] = pIte
13430 6d 2d 3e 69 43 6f 6c 20 2d 20 31 3b 0a 20 20 20  m->iCol - 1;.   
13440 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65   }.    pKeyMerge
13450 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   =.      sqlite3
13460 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
13470 73 69 7a 65 6f 66 28 2a 70 4b 65 79 4d 65 72 67  sizeof(*pKeyMerg
13480 65 29 2b 6e 4f 72 64 65 72 42 79 2a 28 73 69 7a  e)+nOrderBy*(siz
13490 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29  eof(CollSeq*)+1)
134a0 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 4d  );.    if( pKeyM
134b0 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20 70 4b  erge ){.      pK
134c0 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72  eyMerge->aSortOr
134d0 64 65 72 20 3d 20 28 75 38 2a 29 26 70 4b 65 79  der = (u8*)&pKey
134e0 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72  Merge->aColl[nOr
134f0 64 65 72 42 79 5d 3b 0a 20 20 20 20 20 20 70 4b  derBy];.      pK
13500 65 79 4d 65 72 67 65 2d 3e 6e 46 69 65 6c 64 20  eyMerge->nField 
13510 3d 20 28 75 31 36 29 6e 4f 72 64 65 72 42 79 3b  = (u16)nOrderBy;
13520 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65  .      pKeyMerge
13530 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
13540 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
13550 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
13560 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
13570 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
13580 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20    Expr *pTerm = 
13590 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
135a0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66  Expr;.        if
135b0 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26  ( pTerm->flags &
135c0 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
135d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
135e0 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c  l = pTerm->pColl
135f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
13600 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
13610 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
13620 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
13630 20 61 50 65 72 6d 75 74 65 5b 69 5d 29 3b 0a 20   aPermute[i]);. 
13640 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e           pTerm->
13650 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43  flags |= EP_ExpC
13660 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20  ollate;.        
13670 20 20 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c 20 3d    pTerm->pColl =
13680 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20   pColl;.        
13690 7d 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65  }.        pKeyMe
136a0 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  rge->aColl[i] = 
136b0 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  pColl;.        p
136c0 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f  KeyMerge->aSortO
136d0 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72  rder[i] = pOrder
136e0 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
136f0 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  er;.      }.    
13700 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
13710 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20  KeyMerge = 0;.  
13720 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68  }..  /* Reattach
13730 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
13740 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72  ause to the quer
13750 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  y..  */.  p->pOr
13760 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
13770 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  ;.  pPrior->pOrd
13780 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
13790 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
137a0 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20  ->db, pOrderBy, 
137b0 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  0);..  /* Alloca
137c0 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65  te a range of te
137d0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
137e0 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66  s and the KeyInf
137f0 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f  o needed.  ** fo
13800 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  r the logic that
13810 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61   removes duplica
13820 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77  te result rows w
13830 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  hen the.  ** ope
13840 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20  rator is UNION, 
13850 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
13860 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e  SECT (but not UN
13870 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20  ION ALL)..  */. 
13880 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
13890 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  ){.    regPrev =
138a0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
138b0 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e   int nExpr = p->
138c0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
138d0 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65     assert( nOrde
138e0 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62  rBy>=nExpr || db
138f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13900 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  ;.    regPrev = 
13910 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
13920 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70  nge(pParse, nExp
13930 72 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r+1);.    sqlite
13940 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13950 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
13960 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79  gPrev);.    pKey
13970 44 75 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Dup = sqlite3DbM
13980 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20  allocZero(db,.  
13990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139a0 73 69 7a 65 6f 66 28 2a 70 4b 65 79 44 75 70 29  sizeof(*pKeyDup)
139b0 20 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66   + nExpr*(sizeof
139c0 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b  (CollSeq*)+1) );
139d0 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70  .    if( pKeyDup
139e0 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 44 75   ){.      pKeyDu
139f0 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  p->aSortOrder = 
13a00 28 75 38 2a 29 26 70 4b 65 79 44 75 70 2d 3e 61  (u8*)&pKeyDup->a
13a10 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20  Coll[nExpr];.   
13a20 20 20 20 70 4b 65 79 44 75 70 2d 3e 6e 46 69 65     pKeyDup->nFie
13a30 6c 64 20 3d 20 28 75 31 36 29 6e 45 78 70 72 3b  ld = (u16)nExpr;
13a40 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e  .      pKeyDup->
13a50 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
13a60 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
13a70 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
13a80 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43       pKeyDup->aC
13a90 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65  oll[i] = multiSe
13aa0 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
13ab0 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20  se, p, i);.     
13ac0 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72     pKeyDup->aSor
13ad0 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20  tOrder[i] = 0;. 
13ae0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
13af0 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65  . .  /* Separate
13b00 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68   the left and th
13b10 65 20 72 69 67 68 74 20 71 75 65 72 79 20 66 72  e right query fr
13b20 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20  om one another. 
13b30 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   */.  p->pPrior 
13b40 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  = 0;.  sqlite3Re
13b50 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
13b60 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  y(pParse, p, p->
13b70 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52  pOrderBy, "ORDER
13b80 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  ");.  if( pPrior
13b90 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
13ba0 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
13bb0 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  eOrderGroupBy(pP
13bc0 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50  arse, pPrior, pP
13bd0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20  rior->pOrderBy, 
13be0 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20  "ORDER");.  }.. 
13bf0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
13c00 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
13c10 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  */.  computeLimi
13c20 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
13c30 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  e, p, labelEnd);
13c40 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
13c50 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29   && op==TK_ALL )
13c60 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20  {.    regLimitA 
13c70 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
13c80 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20  ;.    regLimitB 
13c90 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
13ca0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13cb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
13cc0 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f  py, p->iOffset ?
13cd0 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20   p->iOffset+1 : 
13ce0 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20  p->iLimit,.     
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d00 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
13d10 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c  LimitA);.    sql
13d20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13d30 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69  , OP_Copy, regLi
13d40 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29  mitA, regLimitB)
13d50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
13d60 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69  egLimitA = regLi
13d70 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  mitB = 0;.  }.  
13d80 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
13d90 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
13da0 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20  ;.  p->pLimit = 
13db0 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
13dc0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
13dd0 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66  ffset);.  p->pOf
13de0 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67  fset = 0;..  reg
13df0 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65  AddrA = ++pParse
13e00 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66  ->nMem;.  regEof
13e10 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
13e20 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d  em;.  regAddrB =
13e30 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
13e40 0a 20 20 72 65 67 45 6f 66 42 20 3d 20 2b 2b 70  .  regEofB = ++p
13e50 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
13e60 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73  egOutA = ++pPars
13e70 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75  e->nMem;.  regOu
13e80 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tB = ++pParse->n
13e90 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  Mem;.  sqlite3Se
13ea0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
13eb0 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  stA, SRT_Corouti
13ec0 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ne, regAddrA);. 
13ed0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
13ee0 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53  stInit(&destB, S
13ef0 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
13f00 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 4a  gAddrB);..  /* J
13f10 75 6d 70 20 70 61 73 74 20 74 68 65 20 76 61 72  ump past the var
13f20 69 6f 75 73 20 73 75 62 72 6f 75 74 69 6e 65 73  ious subroutines
13f30 20 61 6e 64 20 63 6f 72 6f 75 74 69 6e 65 73 20   and coroutines 
13f40 74 6f 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a 2a  to the main.  **
13f50 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f   merge loop.  */
13f60 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56  .  j1 = sqlite3V
13f70 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
13f80 47 6f 74 6f 29 3b 0a 20 20 61 64 64 72 53 65 6c  Goto);.  addrSel
13f90 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64  ectA = sqlite3Vd
13fa0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
13fb0 3b 0a 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  ;...  /* Generat
13fc0 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
13fd0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
13fe0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
13ff0 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20  o the.  ** left 
14000 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
14010 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22  operator - the "
14020 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  A" select..  */.
14030 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
14040 74 28 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72  t((v, "Begin cor
14050 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20  outine for left 
14060 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50 72  SELECT"));.  pPr
14070 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65  ior->iLimit = re
14080 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c 61  gLimitA;.  expla
14090 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
140a0 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
140b0 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71  tSelectId);.  sq
140c0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
140d0 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
140e0 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
140f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
14100 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f  nteger, 1, regEo
14110 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fA);.  sqlite3Vd
14120 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
14130 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b  ield, regAddrA);
14140 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
14150 6e 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f  nt((v, "End coro
14160 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 53  utine for left S
14170 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20  ELECT"));..  /* 
14180 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
14190 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
141a0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
141b0 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74  ement on .  ** t
141c0 68 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22  he right - the "
141d0 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20  B" select.  */. 
141e0 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73   addrSelectB = s
141f0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
14200 74 41 64 64 72 28 76 29 3b 0a 20 20 56 64 62 65  tAddr(v);.  Vdbe
14210 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
14220 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65  "Begin coroutine
14230 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45 43   for right SELEC
14240 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d  T"));.  savedLim
14250 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
14260 20 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20    savedOffset = 
14270 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d  p->iOffset;.  p-
14280 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
14290 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65  itB;.  p->iOffse
142a0 74 20 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c 61  t = 0;  .  expla
142b0 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
142c0 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
142d0 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71  tSelectId);.  sq
142e0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
142f0 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a  se, p, &destB);.
14300 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61    p->iLimit = sa
14310 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69  vedLimit;.  p->i
14320 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66  Offset = savedOf
14330 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56  fset;.  sqlite3V
14340 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14350 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45  Integer, 1, regE
14360 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofB);.  sqlite3V
14370 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
14380 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29  Yield, regAddrB)
14390 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ;.  VdbeNoopComm
143a0 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72  ent((v, "End cor
143b0 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
143c0 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f   SELECT"));..  /
143d0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
143e0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
143f0 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
14400 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20   row of the A.  
14410 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
14420 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
14430 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
14440 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
14450 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
14460 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74  (v, "Output rout
14470 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20  ine for A"));.  
14480 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72  addrOutA = gener
14490 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
144a0 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
144b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
144c0 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72  &destA, pDest, r
144d0 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20  egOutA,.        
144e0 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
144f0 2c 20 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45  , pKeyDup, P4_KE
14500 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 2c 20 6c  YINFO_HANDOFF, l
14510 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f  abelEnd);.  .  /
14520 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
14530 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
14540 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
14550 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20   row of the B.  
14560 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
14570 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
14580 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
14590 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
145a0 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  if( op==TK_ALL |
145b0 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  | op==TK_UNION )
145c0 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
145d0 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
145e0 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22  t routine for B"
145f0 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42  ));.    addrOutB
14600 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
14610 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
14620 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
14630 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20       p, &destB, 
14640 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a  pDest, regOutB,.
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14660 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
14670 70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54  p, P4_KEYINFO_ST
14680 41 54 49 43 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  ATIC, labelEnd);
14690 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
146a0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
146b0 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
146c0 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
146d0 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20  lect A.  ** are 
146e0 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
146f0 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
14700 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t B remains..  *
14710 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
14720 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73  ent((v, "eof-A s
14730 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
14740 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50  if( op==TK_EXCEP
14750 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45  T || op==TK_INTE
14760 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
14770 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56  rEofA = sqlite3V
14780 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14790 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 45 6e  Goto, 0, labelEn
147a0 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  d);.  }else{  . 
147b0 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71     addrEofA = sq
147c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
147d0 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
147e0 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  B, labelEnd);.  
147f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14800 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
14810 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
14820 74 42 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tB);.    sqlite3
14830 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
14840 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
14850 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14860 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
14870 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 41  oto, 0, addrEofA
14880 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  );.    p->nSelec
14890 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e  tRow += pPrior->
148a0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 0a  nSelectRow;.  }.
148b0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
148c0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
148d0 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
148e0 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
148f0 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  B.  ** are exhau
14900 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
14910 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72  ta in select A r
14920 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  emains..  */.  i
14930 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  f( op==TK_INTERS
14940 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45  ECT ){.    addrE
14950 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a  ofB = addrEofA;.
14960 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
14970 63 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e  ctRow > pPrior->
14980 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e  nSelectRow ) p->
14990 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72  nSelectRow = pPr
149a0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
149b0 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20  .  }else{  .    
149c0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
149d0 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f  (v, "eof-B subro
149e0 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
149f0 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33  drEofB = sqlite3
14a00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14a10 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 6c 61  _If, regEofA, la
14a20 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c  belEnd);.    sql
14a30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14a40 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
14a50 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a  utA, addrOutA);.
14a60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14a70 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
14a80 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  d, regAddrA);.  
14a90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14aa0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
14ab0 30 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20  0, addrEofB);.  
14ac0 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
14ad0 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
14ae0 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a  the case of A<B.
14af0 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
14b00 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74  omment((v, "A-lt
14b10 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
14b20 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73  ;.  addrAltB = s
14b30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14b40 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
14b50 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29  gOutA, addrOutA)
14b60 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
14b70 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
14b80 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  d, regAddrA);.  
14b90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14ba0 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
14bb0 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  ofA, addrEofA);.
14bc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14bd0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
14be0 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  0, labelCmpr);..
14bf0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
14c00 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
14c10 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20   case of A==B.  
14c20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
14c30 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41  ALL ){.    addrA
14c40 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a  eqB = addrAltB;.
14c50 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
14c60 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
14c70 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61      addrAeqB = a
14c80 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64  ddrAltB;.    add
14c90 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65  rAltB++;.  }else
14ca0 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
14cb0 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d  mment((v, "A-eq-
14cc0 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
14cd0 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a  .    addrAeqB =.
14ce0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14cf0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
14d00 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  d, regAddrA);.  
14d10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14d20 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
14d30 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29  gEofA, addrEofA)
14d40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14d50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
14d60 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72  to, 0, labelCmpr
14d70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
14d80 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
14d90 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
14da0 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65   A>B.  */.  Vdbe
14db0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
14dc0 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69  "A-gt-B subrouti
14dd0 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74  ne"));.  addrAgt
14de0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
14df0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
14e00 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
14e10 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  || op==TK_UNION 
14e20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
14e30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
14e40 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61  osub, regOutB, a
14e50 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20  ddrOutB);.  }.  
14e60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14e70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
14e80 65 67 41 64 64 72 42 29 3b 0a 20 20 73 71 6c 69  egAddrB);.  sqli
14e90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14ea0 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c   OP_If, regEofB,
14eb0 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 73 71   addrEofB);.  sq
14ec0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14ed0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
14ee0 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
14ef0 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20   This code runs 
14f00 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  once to initiali
14f10 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20  ze everything.. 
14f20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
14f30 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
14f40 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
14f50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
14f60 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66 41 29  ger, 0, regEofA)
14f70 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
14f80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
14f90 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66 42 29  ger, 0, regEofB)
14fa0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
14fb0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
14fc0 62 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64  b, regAddrA, add
14fd0 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 73 71 6c  rSelectA);.  sql
14fe0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14ff0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 41  , OP_Gosub, regA
15000 64 64 72 42 2c 20 61 64 64 72 53 65 6c 65 63 74  ddrB, addrSelect
15010 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  B);.  sqlite3Vdb
15020 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
15030 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45  , regEofA, addrE
15040 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofA);.  sqlite3V
15050 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15060 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64 64  If, regEofB, add
15070 72 45 6f 66 42 29 3b 0a 0a 20 20 2f 2a 20 49 6d  rEofB);..  /* Im
15080 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e  plement the main
15090 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f   merge loop.  */
150a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
150b0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
150c0 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69  belCmpr);.  sqli
150d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
150e0 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c   OP_Permutation,
150f0 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a   0, 0, 0, (char*
15100 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e  )aPermute, P4_IN
15110 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74  TARRAY);.  sqlit
15120 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
15130 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74  OP_Compare, dest
15140 41 2e 69 4d 65 6d 2c 20 64 65 73 74 42 2e 69 4d  A.iMem, destB.iM
15150 65 6d 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20  em, nOrderBy,.  
15160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15170 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
15180 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49  eyMerge, P4_KEYI
15190 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
151a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
151b0 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
151c0 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42  drAltB, addrAeqB
151d0 2c 20 61 64 64 72 41 67 74 42 29 3b 0a 0a 20 20  , addrAgtB);..  
151e0 2f 2a 20 52 65 6c 65 61 73 65 20 74 65 6d 70 6f  /* Release tempo
151f0 72 61 72 79 20 72 65 67 69 73 74 65 72 73 0a 20  rary registers. 
15200 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65   */.  if( regPre
15210 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
15220 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
15230 28 70 50 61 72 73 65 2c 20 72 65 67 50 72 65 76  (pParse, regPrev
15240 2c 20 6e 4f 72 64 65 72 42 79 2b 31 29 3b 0a 20  , nOrderBy+1);. 
15250 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
15260 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20   the this point 
15270 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d  in order to term
15280 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e  inate the query.
15290 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
152a0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
152b0 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20  v, labelEnd);.. 
152c0 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62   /* Set the numb
152d0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c  er of output col
152e0 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  umns.  */.  if( 
152f0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
15300 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
15310 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
15320 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69   pPrior;.    whi
15330 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
15340 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
15350 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
15360 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
15370 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
15380 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
15390 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73  ;.  }..  /* Reas
153a0 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f  sembly the compo
153b0 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61  und query so tha
153c0 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65  t it will be fre
153d0 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a  ed correctly.  *
153e0 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
153f0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
15400 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
15410 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
15420 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
15430 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d  Prior);.  }.  p-
15440 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
15450 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20  ;..  /*** TBD:  
15460 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e  Insert subroutin
15470 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65  e calls to close
15480 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f   cursors on inco
15490 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75  mplete.  **** su
154a0 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20  bqueries ****/. 
154b0 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
154c0 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c  e(pParse, p->op,
154d0 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 30   iSub1, iSub2, 0
154e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
154f0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
15500 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
15510 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
15520 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
15530 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
15540 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63  )./* Forward Dec
15550 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  larations */.sta
15560 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
15570 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c  prList(sqlite3*,
15580 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c   ExprList*, int,
15590 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61   ExprList*);.sta
155a0 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
155b0 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53  lect(sqlite3*, S
155c0 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78  elect *, int, Ex
155d0 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a  prList *);../*.*
155e0 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74  * Scan through t
155f0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
15600 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76  xpr.  Replace ev
15610 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ery reference to
15620 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  .** a column in 
15630 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61  table number iTa
15640 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20  ble with a copy 
15650 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  of the iColumn-t
15660 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45  h.** entry in pE
15670 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76  List.  (But leav
15680 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
15690 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  the ROWID column
156a0 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29   .** unchanged.)
156b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
156c0 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ine is part of t
156d0 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72  he flattening pr
156e0 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71  ocedure.  A subq
156f0 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65  uery.** whose re
15700 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69  sult set is defi
15710 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70  ned by pEList ap
15720 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69  pears as entry i
15730 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c  n the.** FROM cl
15740 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
15750 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56   such that the V
15760 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67  DBE cursor assig
15770 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46  ned to that.** F
15780 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ORM clause entry
15790 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69   is iTable.  Thi
157a0 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74  s routine make t
157b0 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
157c0 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
157d0 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
157e0 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
157f0 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
15800 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
15810 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
15820 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
15830 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
15840 61 74 69 63 20 45 78 70 72 20 2a 73 75 62 73 74  atic Expr *subst
15850 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20  Expr(.  sqlite3 
15860 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52  *db,        /* R
15870 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
15880 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e  ors to this conn
15890 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
158a0 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
158b0 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68  /* Expr in which
158c0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63   substitution oc
158d0 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  curs */.  int iT
158e0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  able,         /*
158f0 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62   Table to be sub
15900 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78  stituted */.  Ex
15910 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
15920 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
15930 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29  expressions */.)
15940 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  {.  if( pExpr==0
15950 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
15960 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
15970 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72  _COLUMN && pExpr
15980 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
15990 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70   ){.    if( pExp
159a0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
159b0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
159c0 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d  = TK_NULL;.    }
159d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
159e0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73   *pNew;.      as
159f0 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
15a00 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
15a10 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  n<pEList->nExpr 
15a20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15a30 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
15a40 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
15a50 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e  t==0 );.      pN
15a60 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
15a70 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e  Dup(db, pEList->
15a80 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
15a90 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
15aa0 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20 70     if( pNew && p
15ab0 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 7b 0a 20  Expr->pColl ){. 
15ac0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f         pNew->pCo
15ad0 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c  ll = pExpr->pCol
15ae0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
15af0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
15b00 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  te(db, pExpr);. 
15b10 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65       pExpr = pNe
15b20 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  w;.    }.  }else
15b30 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65  {.    pExpr->pLe
15b40 66 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ft = substExpr(d
15b50 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
15b60 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
15b70 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69  ;.    pExpr->pRi
15b80 67 68 74 20 3d 20 73 75 62 73 74 45 78 70 72 28  ght = substExpr(
15b90 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  db, pExpr->pRigh
15ba0 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
15bb0 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  t);.    if( Expr
15bc0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
15bd0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
15be0 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53   ){.      substS
15bf0 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d  elect(db, pExpr-
15c00 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  >x.pSelect, iTab
15c10 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
15c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75   }else{.      su
15c30 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
15c40 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20  pExpr->x.pList, 
15c50 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
15c60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
15c70 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61  urn pExpr;.}.sta
15c80 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
15c90 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65  prList(.  sqlite
15ca0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f  3 *db,         /
15cb0 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
15cc0 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20  errors here */. 
15cd0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
15ce0 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f  ,     /* List to
15cf0 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69   scan and in whi
15d00 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
15d10 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20  itutes */.  int 
15d20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
15d30 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
15d40 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20  substituted */. 
15d50 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
15d60 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  t     /* Substit
15d70 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  ute values */.){
15d80 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
15d90 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
15da0 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
15db0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
15dc0 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  +){.    pList->a
15dd0 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73  [i].pExpr = subs
15de0 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d  tExpr(db, pList-
15df0 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61  >a[i].pExpr, iTa
15e00 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
15e10 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
15e20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73  substSelect(.  s
15e30 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
15e40 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
15e50 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65  lloc errors here
15e60 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
15e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
15e80 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
15e90 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
15ea0 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f  substitutions */
15eb0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
15ec0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
15ed0 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20   to be replaced 
15ee0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
15ef0 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62  EList     /* Sub
15f00 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a  stitute values *
15f10 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  /.){.  SrcList *
15f20 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53  pSrc;.  struct S
15f30 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
15f40 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
15f50 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a  f( !p ) return;.
15f60 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
15f70 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69  db, p->pEList, i
15f80 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
15f90 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
15fa0 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c  db, p->pGroupBy,
15fb0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
15fc0 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
15fd0 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  t(db, p->pOrderB
15fe0 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  y, iTable, pELis
15ff0 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67  t);.  p->pHaving
16000 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
16010 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61   p->pHaving, iTa
16020 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
16030 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73  p->pWhere = subs
16040 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68  tExpr(db, p->pWh
16050 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ere, iTable, pEL
16060 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c  ist);.  substSel
16070 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  ect(db, p->pPrio
16080 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
16090 74 29 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e  t);.  pSrc = p->
160a0 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
160b0 70 53 72 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e  pSrc );  /* Even
160c0 20 66 6f 72 20 28 53 45 4c 45 43 54 20 31 29 20   for (SELECT 1) 
160d0 77 65 20 68 61 76 65 3a 20 70 53 72 63 21 3d 30  we have: pSrc!=0
160e0 20 62 75 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d   but pSrc->nSrc=
160f0 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41  =0 */.  if( ALWA
16100 59 53 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20  YS(pSrc) ){.    
16110 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
16120 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b  , pItem=pSrc->a;
16130 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
16140 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ++){.      subst
16150 53 65 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d  Select(db, pItem
16160 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c  ->pSelect, iTabl
16170 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
16180 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  }.  }.}.#endif /
16190 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
161a0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
161b0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
161c0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
161d0 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
161e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
161f0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
16200 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
16210 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EW)./*.** This r
16220 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
16230 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75  to flatten subqu
16240 65 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74  eries in order t
16250 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75  o speed.** execu
16260 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e  tion.  It return
16270 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
16280 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
16290 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a   no flattening.*
162a0 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  * occurs..**.** 
162b0 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  To understand th
162c0 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61  e concept of fla
162d0 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65  ttening, conside
162e0 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  r the following.
162f0 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  ** query:.**.** 
16300 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
16310 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53  M (SELECT x+y AS
16320 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
16330 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e   z<100) WHERE a>
16340 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  5.**.** The defa
16350 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65  ult way of imple
16360 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65  menting this que
16370 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65  ry is to execute
16380 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79   the.** subquery
16390 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65   first and store
163a0 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
163b0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
163c0 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74  e, then.** run t
163d0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f  he outer query o
163e0 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79  n that temporary
163f0 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65   table.  This re
16400 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61  quires two.** pa
16410 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61  sses over the da
16420 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65  ta.  Furthermore
16430 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65  , because the te
16440 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a  mporary table.**
16450 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c   has no indices,
16460 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
16470 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e on the outer q
16480 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  uery cannot be.*
16490 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a  * optimized..**.
164a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
164b0 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72  attempts to rewr
164c0 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68  ite queries such
164d0 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e   as the above in
164e0 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66  to.** a single f
164f0 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65  lat select, like
16500 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
16510 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61   SELECT x+y AS a
16520 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
16530 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a  <100 AND a>5.**.
16540 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
16550 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73  rated for this s
16560 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76  impification giv
16570 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  es the same resu
16580 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68  lt.** but only h
16590 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64  as to scan the d
165a0 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62  ata once.  And b
165b0 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d  ecause indices m
165c0 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f  ight .** exist o
165d0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20  n the table t1, 
165e0 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20  a complete scan 
165f0 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68  of the data migh
16600 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e  t be.** avoided.
16610 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e  .**.** Flattenin
16620 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  g is only attemp
16630 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  ted if all of th
16640 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
16650 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  true:.**.**   (1
16660 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
16670 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
16680 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
16690 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a  use aggregates..
166a0 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65  **.**   (2)  The
166b0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
166c0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
166d0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
166e0 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
166f0 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65  **.**   (3)  The
16700 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
16710 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
16720 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
16730 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20  er join.**      
16740 20 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69    (Originally ti
16750 63 6b 65 74 20 23 33 30 36 2e 20 20 53 74 72 65  cket #306.  Stre
16760 6e 67 74 68 65 6e 65 64 20 62 79 20 74 69 63 6b  ngthened by tick
16770 65 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20  et #3300).**.** 
16780 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75    (4)  The subqu
16790 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49  ery is not DISTI
167a0 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  NCT..**.**  (**)
167b0 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72    At one point r
167c0 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20  estrictions (4) 
167d0 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65 64 20  and (5) defined 
167e0 61 20 73 75 62 73 65 74 20 6f 66 20 44 49 53 54  a subset of DIST
167f0 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73  INCT.**        s
16800 75 62 2d 71 75 65 72 69 65 73 20 74 68 61 74 20  ub-queries that 
16810 77 65 72 65 20 65 78 63 6c 75 64 65 64 20 66 72  were excluded fr
16820 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  om this optimiza
16830 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f  tion. Restrictio
16840 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29  n .**        (4)
16850 20 68 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20   has since been 
16860 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c  expanded to excl
16870 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54  ude all DISTINCT
16880 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a   subqueries..**.
16890 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75  **   (6)  The su
168a0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
168b0 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
168c0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
168d0 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  y is not.**     
168e0 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a     DISTINCT..**.
168f0 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75  **   (7)  The su
16900 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52 4f  bquery has a FRO
16910 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
16920 20 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75    (8)  The subqu
16930 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
16940 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
16950 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
16960 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
16970 20 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65   (9)  The subque
16980 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
16990 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
169a0 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
169b0 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
169c0 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
169d0 2a 20 20 28 31 30 29 20 20 54 68 65 20 73 75 62  *  (10)  The sub
169e0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
169f0 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
16a00 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
16a10 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20   does not.**    
16a20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a      use LIMIT..*
16a30 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20  *.**  (11)  The 
16a40 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
16a50 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
16a60 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52  not both have OR
16a70 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a  DER BY clauses..
16a80 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74  **.**  (**)  Not
16a90 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53   implemented.  S
16aa0 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73  ubsumed into res
16ab0 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57  triction (3).  W
16ac0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  as previously.**
16ad0 20 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61          a separa
16ae0 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64  te restriction d
16af0 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63  eriving from tic
16b00 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20  ket #350..**.** 
16b10 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75   (13)  The subqu
16b20 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75  ery and outer qu
16b30 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
16b40 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a  use LIMIT..**.**
16b50 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71    (14)  The subq
16b60 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
16b70 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20  e OFFSET..**.** 
16b80 20 28 31 35 29 20 20 54 68 65 20 6f 75 74 65 72   (15)  The outer
16b90 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61   query is not pa
16ba0 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  rt of a compound
16bb0 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a   select or the.*
16bc0 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72  *        subquer
16bd0 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  y does not have 
16be0 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a  a LIMIT clause..
16bf0 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74  **        (See t
16c00 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20  icket #2339 and 
16c10 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64  ticket [02a8e81d
16c20 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36  44])..**.**  (16
16c30 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  )  The outer que
16c40 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
16c50 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 73 75  regate or the su
16c60 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20  bquery does.**  
16c70 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69        not contai
16c80 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69  n ORDER BY.  (Ti
16c90 63 6b 65 74 20 23 32 39 34 32 29 20 20 54 68 69  cket #2942)  Thi
16ca0 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61  s used to not ma
16cb0 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75  tter.**        u
16cc0 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63  ntil we introduc
16cd0 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e  ed the group_con
16ce0 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  cat() function. 
16cf0 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54   .**.**  (17)  T
16d00 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
16d10 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73  not a compound s
16d20 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20  elect, or it is 
16d30 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20  a UNION ALL .** 
16d40 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20         compound 
16d50 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20 65  clause made up e
16d60 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61  ntirely of non-a
16d70 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
16d80 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20  , and .**       
16d90 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
16da0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  y:.**.**        
16db0 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c    * is not itsel
16dc0 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  f part of a comp
16dd0 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20  ound select,.** 
16de0 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f           * is no
16df0 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
16e00 72 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 79  r DISTINCT query
16e10 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  , and.**        
16e20 20 20 2a 20 68 61 73 20 6e 6f 20 6f 74 68 65 72    * has no other
16e30 20 74 61 62 6c 65 73 20 6f 72 20 73 75 62 2d 73   tables or sub-s
16e40 65 6c 65 63 74 73 20 69 6e 20 74 68 65 20 46 52  elects in the FR
16e50 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
16e60 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65          The pare
16e70 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79  nt and sub-query
16e80 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45   may contain WHE
16e90 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a  RE clauses. Subj
16ea0 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ect to.**       
16eb0 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33   rules (11), (13
16ec0 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79  ) and (14), they
16ed0 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
16ee0 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20  n ORDER BY,.**  
16ef0 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20        LIMIT and 
16f00 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 0a  OFFSET clauses..
16f10 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20  **.**  (18)  If 
16f20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
16f30 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
16f40 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72  ct, then all ter
16f50 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20  ms of the.**    
16f60 20 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61      ORDER by cla
16f70 75 73 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e  use of the paren
16f80 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65  t must be simple
16f90 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a   references to .
16fa0 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  **        column
16fb0 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65  s of the sub-que
16fc0 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20  ry..**.**  (19) 
16fd0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
16fe0 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
16ff0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
17000 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
17010 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57 48         have a WH
17020 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ERE clause..**.*
17030 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65 20  *  (20)  If the 
17040 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
17050 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
17060 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74  then it must not
17070 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
17080 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
17090 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37 33  e.  Ticket #3773
170a0 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61  .  We could rela
170b0 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  x this constrain
170c0 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65  t.**        some
170d0 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20 74  what by saying t
170e0 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66  hat the terms of
170f0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
17100 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20  ause must.**    
17110 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75 6e      appear as un
17120 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74 20  modified result 
17130 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  columns in the o
17140 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75 74  uter query.  But
17150 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20  .**        have 
17160 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  other optimizati
17170 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64  ons in mind to d
17180 65 61 6c 20 77 69 74 68 20 74 68 61 74 20 63 61  eal with that ca
17190 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20  se..**.**  (21) 
171a0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
171b0 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
171c0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
171d0 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20  ery is not.**   
171e0 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20       DISTINCT.  
171f0 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32  (See ticket [752
17200 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a  e1646fc])..**.**
17210 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   In this routine
17220 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65  , the "p" parame
17230 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
17240 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
17250 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71  ery..** The subq
17260 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d  uery is p->pSrc-
17270 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67  >a[iFrom].  isAg
17280 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
17290 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20   outer query.** 
172a0 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20  uses aggregates 
172b0 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67  and subqueryIsAg
172c0 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
172d0 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
172e0 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
172f0 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
17300 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
17310 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
17320 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74   a no-op and ret
17330 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c  urns 0..** If fl
17340 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65  attening is atte
17350 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69  mpted this routi
17360 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a  ne returns 1..**
17370 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65  .** All of the e
17380 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
17390 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e  is must occur on
173a0 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20   both the outer 
173b0 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65  query and.** the
173c0 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65   subquery before
173d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
173e0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
173f0 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  t flattenSubquer
17400 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
17410 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
17420 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
17430 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
17440 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
17450 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45  rent or outer SE
17460 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
17470 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
17480 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
17490 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  x in p->pSrc->a[
174a0 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  ] of the inner s
174b0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
174c0 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20   isAgg,         
174d0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
174e0 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61  er SELECT uses a
174f0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
17500 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71  ns */.  int subq
17510 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20  ueryIsAgg    /* 
17520 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  True if the subq
17530 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
17540 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
17550 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
17560 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
17570 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
17580 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65  uthContext;.  Se
17590 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20  lect *pParent;. 
175a0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20   Select *pSub;  
175b0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65       /* The inne
175c0 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71  r query or "subq
175d0 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63  uery" */.  Selec
175e0 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f  t *pSub1;      /
175f0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
17600 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63   rightmost selec
17610 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a  t in sub-query *
17620 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
17630 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46  c;      /* The F
17640 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
17650 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
17660 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62  .  SrcList *pSub
17670 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52  Src;   /* The FR
17680 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
17690 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45   subquery */.  E
176a0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20  xprList *pList; 
176b0 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
176c0 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65   set of the oute
176d0 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  r query */.  int
176e0 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20   iParent;       
176f0 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20   /* VDBE cursor 
17700 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53  number of the pS
17710 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65  ub result set te
17720 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  mp table */.  in
17730 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
17740 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
17750 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  r */.  Expr *pWh
17760 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ere;            
17770 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
17780 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
17790 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
177a0 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20  item *pSubitem; 
177b0 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
177c0 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  y */.  sqlite3 *
177d0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
177e0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
177f0 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e  see if flattenin
17800 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
17810 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
17820 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
17830 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
17840 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  t( p->pPrior==0 
17850 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f  );  /* Unable to
17860 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e   flatten compoun
17870 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  d queries */.  i
17880 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
17890 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74  QLITE_QueryFlatt
178a0 65 6e 65 72 20 29 20 72 65 74 75 72 6e 20 30 3b  ener ) return 0;
178b0 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
178c0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
178d0 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26  c && iFrom>=0 &&
178e0 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72   iFrom<pSrc->nSr
178f0 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20  c );.  pSubitem 
17900 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  = &pSrc->a[iFrom
17910 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70  ];.  iParent = p
17920 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72  Subitem->iCursor
17930 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69  ;.  pSub = pSubi
17940 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
17950 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20  assert( pSub!=0 
17960 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26  );.  if( isAgg &
17970 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
17980 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
17990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
179a0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20  estriction (1)  
179b0 2a 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72  */.  if( subquer
179c0 79 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e  yIsAgg && pSrc->
179d0 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20  nSrc>1 ) return 
179e0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  0;          /* R
179f0 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20  estriction (2)  
17a00 2a 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70  */.  pSubSrc = p
17a10 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  Sub->pSrc;.  ass
17a20 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a  ert( pSubSrc );.
17a30 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65    /* Prior to ve
17a40 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65  rsion 3.1.2, whe
17a50 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
17a60 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d  ET had to be sim
17a70 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20  ple constants,. 
17a80 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72   ** not arbitrar
17a90 79 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20  y expresssions, 
17aa0 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20  we allowed some 
17ab0 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d  combining of LIM
17ac0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20  IT and OFFSET.  
17ad0 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20  ** because they 
17ae0 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  could be compute
17af0 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
17b00 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d  e.  But when LIM
17b10 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20  IT and OFFSET.  
17b20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72  ** became arbitr
17b30 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ary expressions,
17b40 20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20   we were forced 
17b50 74 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69  to add restricti
17b60 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e  ons (13).  ** an
17b70 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28  d (14). */.  if(
17b80 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
17b90 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74   p->pLimit ) ret
17ba0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
17bb0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
17bc0 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28  on (13) */.  if(
17bd0 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29   pSub->pOffset )
17be0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
17bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c00 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
17c10 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28  on (14) */.  if(
17c20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26   p->pRightmost &
17c30 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  & pSub->pLimit )
17c40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
17c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
17c80 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a  striction (15) *
17c90 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
17ca0 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) 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 2f                 /
17cd0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37  * Restriction (7
17ce0 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
17cf0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
17d00 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
17d10 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  n 0;           /
17d20 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 35  * Restriction (5
17d30 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
17d40 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72  ->pLimit && (pSr
17d50 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
17d60 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
17d70 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
17d80 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38   Restrictions (8
17d90 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  )(9) */.  }.  if
17da0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
17db0 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
17dc0 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
17dd0 67 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  g ){.     return
17de0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
17df0 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20  estriction (6)  
17e00 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  */.  }.  if( p->
17e10 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62  pOrderBy && pSub
17e20 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
17e30 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
17e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e60 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
17e70 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20  ction (11) */.  
17e80 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  }.  if( isAgg &&
17e90 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
17ea0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
17eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
17ec0 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a  striction (16) *
17ed0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
17ee0 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72  imit && p->pWher
17ef0 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
17f00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
17f10 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a  striction (19) *
17f20 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
17f30 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  imit && (p->selF
17f40 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
17f50 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72  ct)!=0 ){.     r
17f60 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
17f70 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
17f80 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  (21) */.  }..  /
17f90 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45  * OBSOLETE COMME
17fa0 4e 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72  NT 1:.  ** Restr
17fb0 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68  iction 3:  If th
17fc0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20  e subquery is a 
17fd0 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
17fe0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
17ff0 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61  .  ** not used a
18000 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
18010 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20  and of an outer 
18020 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20  join.  Examples 
18030 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a  of why this.  **
18040 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a   is not allowed:
18050 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
18060 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
18070 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74   JOIN (t2 JOIN t
18080 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  3).  **.  ** If 
18090 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
180a0 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
180b0 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
180c0 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
180d0 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49  TER JOIN t2) JOI
180e0 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77  N t3.  **.  ** w
180f0 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61  hich is not at a
18100 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  ll the same thin
18110 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53  g..  **.  ** OBS
18120 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a  OLETE COMMENT 2:
18130 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f  .  ** Restrictio
18140 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75  n 12:  If the su
18150 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69  bquery is the ri
18160 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
18170 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a   left outer.  **
18180 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
18190 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
181a0 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
181b0 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70  e..  ** An examp
181c0 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20  les of why this 
181d0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
181e0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
181f0 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
18200 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  JOIN (SELECT * F
18210 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e  ROM t2 WHERE t2.
18220 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  x>0).  **.  ** I
18230 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
18240 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
18250 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
18260 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
18270 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57  OUTER JOIN t2) W
18280 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a  HERE t2.x>0.  **
18290 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32  .  ** But the t2
182a0 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61  .x>0 test will a
182b0 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20  lways fail on a 
182c0 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20  NULL row of t2, 
182d0 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63  which.  ** effec
182e0 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20  tively converts 
182f0 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69  the OUTER JOIN i
18300 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49  nto an INNER JOI
18310 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49  N..  **.  ** THI
18320 53 20 4f 56 45 52 52 49 44 45 53 20 4f 42 53 4f  S OVERRIDES OBSO
18330 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20  LETE COMMENTS 1 
18340 41 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a  AND 2 ABOVE:.  *
18350 2a 20 54 69 63 6b 65 74 20 23 33 33 30 30 20 73  * Ticket #3300 s
18360 68 6f 77 73 20 74 68 61 74 20 66 6c 61 74 74 65  hows that flatte
18370 6e 69 6e 67 20 74 68 65 20 72 69 67 68 74 20 74  ning the right t
18380 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  erm of a LEFT JO
18390 49 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61 75 67  IN.  ** is fraug
183a0 68 74 20 77 69 74 68 20 64 61 6e 67 65 72 2e 20  ht with danger. 
183b0 20 42 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74   Best to avoid t
183c0 68 65 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20  he whole thing. 
183d0 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62   If the.  ** sub
183e0 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
183f0 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46  ht term of a LEF
18400 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20  T JOIN, then do 
18410 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a  not flatten..  *
18420 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69 74 65  /.  if( (pSubite
18430 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  m->jointype & JT
18440 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20  _OUTER)!=0 ){.  
18450 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
18460 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
18470 6e 20 31 37 3a 20 49 66 20 74 68 65 20 73 75 62  n 17: If the sub
18480 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
18490 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65  ound SELECT, the
184a0 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75  n it must.  ** u
184b0 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f  se only the UNIO
184c0 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20  N ALL operator. 
184d0 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  And none of the 
184e0 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75  simple select qu
184f0 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  eries.  ** that 
18500 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70  make up the comp
18510 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20  ound SELECT are 
18520 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67  allowed to be ag
18530 67 72 65 67 61 74 65 20 6f 72 20 64 69 73 74 69  gregate or disti
18540 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73  nct.  ** queries
18550 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ..  */.  if( pSu
18560 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  b->pPrior ){.   
18570 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
18580 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rBy ){.      ret
18590 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72  urn 0;  /* Restr
185a0 69 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20  iction 20 */.   
185b0 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67   }.    if( isAgg
185c0 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   || (p->selFlags
185d0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
185e0 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63  =0 || pSrc->nSrc
185f0 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=1 ){.      ret
18600 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
18610 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b   for(pSub1=pSub;
18620 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53   pSub1; pSub1=pS
18630 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  ub1->pPrior){.  
18640 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
18650 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
18660 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
18670 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
18680 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
18690 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
186a0 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
186b0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
186c0 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
186d0 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
186e0 20 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73     if( (pSub1->s
186f0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
18700 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
18710 61 74 65 29 29 21 3d 30 0a 20 20 20 20 20 20 20  ate))!=0.       
18720 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f  || (pSub1->pPrio
18730 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d  r && pSub1->op!=
18740 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20 20  TK_ALL) .       
18750 7c 7c 20 4e 45 56 45 52 28 70 53 75 62 31 2d 3e  || NEVER(pSub1->
18760 70 53 72 63 3d 3d 30 29 20 7c 7c 20 70 53 75 62  pSrc==0) || pSub
18770 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  1->pSrc->nSrc!=1
18780 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
18790 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
187a0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
187b0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38  * Restriction 18
187c0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
187d0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
187e0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
187f0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e  for(ii=0; ii<p->
18800 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
18810 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
18820 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  if( p->pOrderBy-
18830 3e 61 5b 69 69 5d 2e 69 43 6f 6c 3d 3d 30 20 29  >a[ii].iCol==0 )
18840 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
18850 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
18860 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61  /***** If we rea
18870 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66  ch this point, f
18880 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
18890 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a  mitted. *****/..
188a0 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74    /* Authorize t
188b0 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
188c0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
188d0 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d  ntext = pSubitem
188e0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74  ->zName;.  sqlit
188f0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
18900 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
18910 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 70  T, 0, 0, 0);.  p
18920 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
18930 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68  ext = zSavedAuth
18940 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49  Context;..  /* I
18950 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
18960 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
18970 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
18980 74 68 65 6e 20 28 62 79 20 72 65 73 74 72 69 63  then (by restric
18990 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e  tions.  ** 17 an
189a0 64 20 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d  d 18 above) it m
189b0 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41  ust be a UNION A
189c0 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e  LL and the paren
189d0 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20  t query must .  
189e0 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  ** be of the for
189f0 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  m:.  **.  **    
18a00 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69   SELECT <expr-li
18a10 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71  st> FROM (<sub-q
18a20 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c  uery>) <where-cl
18a30 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ause> .  **.  **
18a40 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79   followed by any
18a50 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54   ORDER BY, LIMIT
18a60 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63   and/or OFFSET c
18a70 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f  lauses. This blo
18a80 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20  ck.  ** creates 
18a90 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68  N-1 copies of th
18aa0 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 77  e parent query w
18ab0 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52  ithout any ORDER
18ac0 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20   BY, LIMIT or . 
18ad0 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73   ** OFFSET claus
18ae0 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65  es and joins the
18af0 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61  m to the left-ha
18b00 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f  nd-side of the o
18b10 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69  riginal.  ** usi
18b20 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  ng UNION ALL ope
18b30 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20  rators. In this 
18b40 63 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75  case N is the nu
18b50 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20  mber of simple. 
18b60 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65   ** select state
18b70 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d  ments in the com
18b80 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e  pound sub-query.
18b90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70  .  **.  ** Examp
18ba0 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
18bb0 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f    SELECT a+1 FRO
18bc0 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  M (.  **        
18bd0 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61  SELECT x FROM ta
18be0 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e  b.  **        UN
18bf0 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
18c00 20 20 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f      SELECT y FRO
18c10 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20  M tab.  **      
18c20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
18c30 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61          SELECT a
18c40 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62  bs(z*2) FROM tab
18c50 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45  2.  **     ) WHE
18c60 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59  RE a!=5 ORDER BY
18c70 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61   1.  **.  ** Tra
18c80 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20  nsformed into:. 
18c90 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
18ca0 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62  ECT x+1 FROM tab
18cb0 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20   WHERE x+1!=5.  
18cc0 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  **     UNION ALL
18cd0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
18ce0 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48   y+1 FROM tab WH
18cf0 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20  ERE y+1!=5.  ** 
18d00 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
18d10 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 62  **     SELECT ab
18d20 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61  s(z*2)+1 FROM ta
18d30 62 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32  b2 WHERE abs(z*2
18d40 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  )+1!=5.  **     
18d50 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
18d60 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69    ** We call thi
18d70 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d  s the "compound-
18d80 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e  subquery flatten
18d90 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ing"..  */.  for
18da0 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69  (pSub=pSub->pPri
18db0 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70  or; pSub; pSub=p
18dc0 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  Sub->pPrior){.  
18dd0 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
18de0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f      ExprList *pO
18df0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
18e00 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a  erBy;.    Expr *
18e10 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
18e20 69 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  it;.    Select *
18e30 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
18e40 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  or;.    p->pOrde
18e50 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  rBy = 0;.    p->
18e60 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d  pSrc = 0;.    p-
18e70 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
18e80 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
18e90 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
18ea0 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
18eb0 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4c  p, 0);.    p->pL
18ec0 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
18ed0 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
18ee0 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70   pOrderBy;.    p
18ef0 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
18f00 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c     p->op = TK_AL
18f10 4c 3b 0a 20 20 20 20 70 2d 3e 70 52 69 67 68 74  L;.    p->pRight
18f20 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  most = 0;.    if
18f30 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
18f40 20 20 20 70 4e 65 77 20 3d 20 70 50 72 69 6f 72     pNew = pPrior
18f50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18f60 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20     pNew->pPrior 
18f70 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
18f80 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74  pNew->pRightmost
18f90 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
18fa0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77  p->pPrior = pNew
18fb0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
18fc0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
18fd0 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
18fe0 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e   Begin flattenin
18ff0 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65  g the iFrom-th e
19000 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
19010 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e   clause .  ** in
19020 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
19030 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20  ..  */.  pSub = 
19040 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d  pSub1 = pSubitem
19050 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a  ->pSelect;..  /*
19060 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e   Delete the tran
19070 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
19080 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64  cture associated
19090 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
190a0 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  ubquery.  */.  s
190b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
190c0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
190d0 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  base);.  sqlite3
190e0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
190f0 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  tem->zName);.  s
19100 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
19110 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61   pSubitem->zAlia
19120 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e  s);.  pSubitem->
19130 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  zDatabase = 0;. 
19140 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
19150 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
19160 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->zAlias = 0;.  
19170 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
19180 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66  t = 0;..  /* Def
19190 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  er deleting the 
191a0 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73  Table object ass
191b0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
191c0 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75  .  ** subquery u
191d0 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
191e0 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
191f0 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65  plete, since the
19200 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69  re may still exi
19210 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74  st Expr.pTab ent
19220 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72  ries that.  ** r
19230 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71  efer to the subq
19240 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20  uery even after 
19250 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63  flattening.  Tic
19260 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a  ket #3346..  **.
19270 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70    ** pSubitem->p
19280 54 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f  Tab is always no
19290 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72  n-NULL by test r
192a0 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20  estrictions and 
192b0 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a  tests above..  *
192c0 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
192d0 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30  Subitem->pTab!=0
192e0 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ) ){.    Table *
192f0 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62  pTabToDel = pSub
19300 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  item->pTab;.    
19310 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e  if( pTabToDel->n
19320 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Ref==1 ){.      
19330 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
19340 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
19350 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
19360 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
19370 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20  ->pNextZombie = 
19380 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
19390 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f  ieTab;.      pTo
193a0 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
193b0 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a  ab = pTabToDel;.
193c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
193d0 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
193e0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  --;.    }.    pS
193f0 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30  ubitem->pTab = 0
19400 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
19410 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72  following loop r
19420 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
19430 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70  h term in a comp
19440 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20  ound-subquery.  
19450 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61  ** flattening (a
19460 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
19470 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64  e).  If we are d
19480 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  oing a different
19490 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c   kind.  ** of fl
194a0 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61  attening - a fla
194b0 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68  ttening other th
194c0 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  an a compound-su
194d0 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
194e0 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  g -.  ** then th
194f0 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e  is loop only run
19500 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s once..  **.  *
19510 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65  * This loop move
19520 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  s all of the FRO
19530 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
19540 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
19550 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
19560 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
19570 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
19580 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
19590 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
195a0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
195b0 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
195c0 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
195d0 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
195e0 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
195f0 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
19600 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
19610 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
19620 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
19630 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
19640 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
19650 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
19660 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
19670 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
19680 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
19690 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
196a0 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
196b0 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
196c0 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
196d0 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
196e0 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70  for(pParent=p; p
196f0 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d  Parent; pParent=
19700 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c  pParent->pPrior,
19710 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
19720 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  or){.    int nSu
19730 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69  bSrc;.    u8 joi
19740 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ntype = 0;.    p
19750 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
19760 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
19770 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
19780 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53  ery */.    nSubS
19790 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
197a0 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  rc;  /* Number o
197b0 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75  f terms in subqu
197c0 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
197d0 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50  */.    pSrc = pP
197e0 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20  arent->pSrc;    
197f0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
19800 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
19810 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  ry */..    if( p
19820 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Src ){.      ass
19830 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20  ert( pParent==p 
19840 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d  );  /* First tim
19850 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  e through the lo
19860 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e  op */.      join
19870 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
19880 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  >jointype;.    }
19890 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
198a0 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
198b0 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
198c0 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
198d0 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
198e0 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
198f0 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
19900 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
19910 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30  pend(db, 0, 0, 0
19920 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
19930 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
19940 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
19950 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
19960 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
19970 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
19980 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73   The subquery us
19990 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74  es a single slot
199a0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
199b0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
199c0 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20  .    ** query.  
199d0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
199e0 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
199f0 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73  e element in its
19a00 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20   FROM clause,.  
19a10 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64    ** then expand
19a20 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
19a30 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
19a40 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c  or it to hold al
19a50 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a  l elements.    *
19a60 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
19a70 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
19a80 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
19a90 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43  .    **    SELEC
19aa0 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28  T * FROM tabA, (
19ab0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75  SELECT * FROM su
19ac0 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b  b1, sub2), tabB;
19ad0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
19ae0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
19af0 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74  as 3 slots in it
19b00 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
19b10 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a  One slot of the.
19b20 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
19b30 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73  ry (the middle s
19b40 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20  lot) is used by 
19b50 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
19b60 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
19b70 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c  lock of code wil
19b80 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  l expand the out
19b90 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74   query to 4 slot
19ba0 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20  s.  The middle. 
19bb0 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78     ** slot is ex
19bc0 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c  panded to two sl
19bd0 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ots in order to 
19be0 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74  make space for t
19bf0 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c  he.    ** two el
19c00 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52  ements in the FR
19c10 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
19c20 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
19c30 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  /.    if( nSubSr
19c40 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61  c>1 ){.      pPa
19c50 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72  rent->pSrc = pSr
19c60 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
19c70 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
19c80 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46  rc, nSubSrc-1,iF
19c90 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  rom+1);.      if
19ca0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
19cb0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ed ){.        br
19cc0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
19cd0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73   }..    /* Trans
19ce0 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  fer the FROM cla
19cf0 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  use terms from t
19d00 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
19d10 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
19d20 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  r query..    */.
19d30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
19d40 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
19d50 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
19d60 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63  tDelete(db, pSrc
19d70 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73  ->a[i+iFrom].pUs
19d80 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63  ing);.      pSrc
19d90 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
19da0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
19db0 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
19dc0 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
19dd0 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
19de0 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
19df0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a  pSrc->a[iFrom].j
19e00 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
19e10 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
19e20 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
19e30 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
19e40 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
19e50 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
19e60 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
19e70 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
19e80 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
19e90 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
19ea0 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
19eb0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
19ec0 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
19ed0 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
19ee0 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
19ef0 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
19f00 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
19f10 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
19f20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
19f30 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
19f40 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
19f50 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
19f60 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
19f70 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
19f80 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
19f90 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
19fa0 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
19fb0 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
19fc0 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
19fd0 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
19fe0 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
19ff0 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
1a000 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
1a010 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
1a020 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
1a030 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
1a040 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  */.    pList = p
1a050 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a  Parent->pEList;.
1a060 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1a070 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1a080 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  ){.      if( pLi
1a090 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
1a0a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
1a0b0 73 74 20 63 68 61 72 20 2a 7a 53 70 61 6e 20 3d  st char *zSpan =
1a0c0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70   pList->a[i].zSp
1a0d0 61 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  an;.        if( 
1a0e0 41 4c 57 41 59 53 28 7a 53 70 61 6e 29 20 29 7b  ALWAYS(zSpan) ){
1a0f0 0a 20 20 20 20 20 20 20 20 20 20 70 4c 69 73 74  .          pList
1a100 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
1a110 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
1a120 62 2c 20 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20  b, zSpan);.     
1a130 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1a140 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70 72   }.    substExpr
1a150 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
1a160 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
1a170 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1a180 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  ;.    if( isAgg 
1a190 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  ){.      substEx
1a1a0 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
1a1b0 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50  nt->pGroupBy, iP
1a1c0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1a1d0 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
1a1e0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
1a1f0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
1a200 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69  rent->pHaving, i
1a210 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1a220 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
1a230 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
1a240 72 42 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73  rBy ){.      ass
1a250 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f  ert( pParent->pO
1a260 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
1a270 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64     pParent->pOrd
1a280 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72  erBy = pSub->pOr
1a290 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75  derBy;.      pSu
1a2a0 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  b->pOrderBy = 0;
1a2b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
1a2c0 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
1a2d0 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45   ){.      substE
1a2e0 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
1a2f0 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  ent->pOrderBy, i
1a300 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1a310 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
1a320 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
1a330 65 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 72  e ){.      pWher
1a340 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
1a350 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68  up(db, pSub->pWh
1a360 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  ere, 0);.    }el
1a370 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65  se{.      pWhere
1a380 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1a390 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
1a3a0 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  g ){.      asser
1a3b0 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  t( pParent->pHav
1a3c0 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ing==0 );.      
1a3d0 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1a3e0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65   = pParent->pWhe
1a3f0 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
1a400 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  t->pWhere = pWhe
1a410 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
1a420 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  t->pHaving = sub
1a430 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65  stExpr(db, pPare
1a440 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  nt->pHaving, iPa
1a450 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1a460 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  st);.      pPare
1a470 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  nt->pHaving = sq
1a480 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
1a490 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1a4a0 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
1a4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a4d0 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
1a4e0 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20  Having, 0));.   
1a4f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
1a500 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20  nt->pGroupBy==0 
1a510 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1a520 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
1a530 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
1a540 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70  db, pSub->pGroup
1a550 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  By, 0);.    }els
1a560 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e{.      pParent
1a570 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74  ->pWhere = subst
1a580 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
1a590 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e  ->pWhere, iParen
1a5a0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1a5b0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1a5c0 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
1a5d0 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
1a5e0 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70 57  rent->pWhere, pW
1a5f0 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  here);.    }.  .
1a600 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74      /* The flatt
1a610 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69  ened query is di
1a620 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72  stinct if either
1a630 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68   the inner or th
1a640 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
1a650 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
1a660 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  . .    */.    pP
1a670 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20  arent->selFlags 
1a680 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  |= pSub->selFlag
1a690 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b  s & SF_Distinct;
1a6a0 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  .  .    /*.    *
1a6b0 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  * SELECT ... FRO
1a6c0 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49  M (SELECT ... LI
1a6d0 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20  MIT a OFFSET b) 
1a6e0 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79  LIMIT x OFFSET y
1a6f0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1a700 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74  One is tempted t
1a710 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61  o try to add a a
1a720 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20  nd b to combine 
1a730 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74  the limits.  But
1a740 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65   this.    ** doe
1a750 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69  s not work if ei
1a760 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65  ther limit is ne
1a770 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  gative..    */. 
1a780 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69     if( pSub->pLi
1a790 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  mit ){.      pPa
1a7a0 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rent->pLimit = p
1a7b0 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  Sub->pLimit;.   
1a7c0 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20     pSub->pLimit 
1a7d0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
1a7e0 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
1a7f0 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
1a800 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
1a810 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
1a820 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
1a830 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1a840 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31  Delete(db, pSub1
1a850 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  );..  return 1;.
1a860 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
1a870 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1a880 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1a890 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1a8a0 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a  IT_VIEW) */../*.
1a8b0 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53  ** Analyze the S
1a8c0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1a8d0 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
1a8e0 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20  ument to see if 
1a8f0 69 74 0a 2a 2a 20 69 73 20 61 20 6d 69 6e 28 29  it.** is a min()
1a900 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e   or max() query.
1a910 20 52 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52   Return WHERE_OR
1a920 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45  DERBY_MIN or WHE
1a930 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 20 69  RE_ORDERBY_MAX i
1a940 66 20 0a 2a 2a 20 69 74 20 69 73 2c 20 6f 72 20  f .** it is, or 
1a950 30 20 6f 74 68 65 72 77 69 73 65 2e 20 41 74 20  0 otherwise. At 
1a960 70 72 65 73 65 6e 74 2c 20 61 20 71 75 65 72 79  present, a query
1a970 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74   is considered t
1a980 6f 20 62 65 0a 2a 2a 20 61 20 6d 69 6e 28 29 2f  o be.** a min()/
1a990 6d 61 78 28 29 20 71 75 65 72 79 20 69 66 3a 0a  max() query if:.
1a9a0 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54 68 65 72 65  **.**   1. There
1a9b0 20 69 73 20 61 20 73 69 6e 67 6c 65 20 6f 62 6a   is a single obj
1a9c0 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ect in the FROM 
1a9d0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
1a9e0 32 2e 20 54 68 65 72 65 20 69 73 20 61 20 73 69  2. There is a si
1a9f0 6e 67 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20  ngle expression 
1aa00 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
1aa10 74 2c 20 61 6e 64 20 69 74 20 69 73 0a 2a 2a 20  t, and it is.** 
1aa20 20 20 20 20 20 65 69 74 68 65 72 20 6d 69 6e 28       either min(
1aa30 78 29 20 6f 72 20 6d 61 78 28 78 29 2c 20 77 68  x) or max(x), wh
1aa40 65 72 65 20 78 20 69 73 20 61 20 63 6f 6c 75 6d  ere x is a colum
1aa50 6e 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2f 0a  n reference..*/.
1aa60 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78  static u8 minMax
1aa70 51 75 65 72 79 28 53 65 6c 65 63 74 20 2a 70 29  Query(Select *p)
1aa80 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  {.  Expr *pExpr;
1aa90 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1aaa0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
1aab0 0a 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e  ..  if( pEList->
1aac0 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
1aad0 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  n WHERE_ORDERBY_
1aae0 4e 4f 52 4d 41 4c 3b 0a 20 20 70 45 78 70 72 20  NORMAL;.  pExpr 
1aaf0 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  = pEList->a[0].p
1ab00 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70  Expr;.  if( pExp
1ab10 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55  r->op!=TK_AGG_FU
1ab20 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20  NCTION ) return 
1ab30 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 45  0;.  if( NEVER(E
1ab40 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1ab50 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1ab60 63 74 29 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ct)) ) return 0;
1ab70 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70  .  pEList = pExp
1ab80 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66  r->x.pList;.  if
1ab90 28 20 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  ( pEList==0 || p
1aba0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
1abb0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1abc0 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ( pEList->a[0].p
1abd0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
1abe0 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
1abf0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
1ac00 4f 52 4d 41 4c 3b 0a 20 20 61 73 73 65 72 74 28  ORMAL;.  assert(
1ac10 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1ac20 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1ac30 61 6c 75 65 29 20 29 3b 0a 20 20 69 66 28 20 73  alue) );.  if( s
1ac40 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
1ac50 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d  xpr->u.zToken,"m
1ac60 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  in")==0 ){.    r
1ac70 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45  eturn WHERE_ORDE
1ac80 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d 65 6c 73 65  RBY_MIN;.  }else
1ac90 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1aca0 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Cmp(pExpr->u.zTo
1acb0 6b 65 6e 2c 22 6d 61 78 22 29 3d 3d 30 20 29 7b  ken,"max")==0 ){
1acc0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 48 45 52  .    return WHER
1acd0 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20  E_ORDERBY_MAX;. 
1ace0 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 48 45 52   }.  return WHER
1acf0 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
1ad00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
1ad10 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
1ad20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
1ad30 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
1ad40 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  an aggregate que
1ad50 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ry..** The secon
1ad60 64 20 61 72 67 6d 65 6e 74 20 69 73 20 74 68 65  d argment is the
1ad70 20 61 73 73 6f 63 69 61 74 65 64 20 61 67 67 72   associated aggr
1ad80 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63  egate-info objec
1ad90 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  t. This .** func
1ada0 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68  tion tests if th
1adb0 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74  e SELECT is of t
1adc0 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
1add0 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
1ade0 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a   FROM <tbl>.**.*
1adf0 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20 69 73  * where table is
1ae00 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
1ae10 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c  e, not a sub-sel
1ae20 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20  ect or view. If 
1ae30 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65  the query.** doe
1ae40 73 20 6d 61 74 63 68 20 74 68 69 73 20 70 61 74  s match this pat
1ae50 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69  tern, then a poi
1ae60 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c  nter to the Tabl
1ae70 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65  e object represe
1ae80 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69  nting.** <tbl> i
1ae90 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
1aea0 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
1aeb0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1aec0 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43  Table *isSimpleC
1aed0 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  ount(Select *p, 
1aee0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1aef0 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  o){.  Table *pTa
1af00 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  b;.  Expr *pExpr
1af10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d  ;..  assert( !p-
1af20 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20  >pGroupBy );..  
1af30 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c  if( p->pWhere ||
1af40 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
1af50 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70  r!=1 .   || p->p
1af60 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20  Src->nSrc!=1 || 
1af70 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
1af80 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72  elect.  ){.    r
1af90 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1afa0 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
1afb0 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70  [0].pTab;.  pExp
1afc0 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
1afd0 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73  [0].pExpr;.  ass
1afe0 65 72 74 28 20 70 54 61 62 20 26 26 20 21 70 54  ert( pTab && !pT
1aff0 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70  ab->pSelect && p
1b000 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49  Expr );..  if( I
1b010 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
1b020 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1b030 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
1b040 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65  GG_FUNCTION ) re
1b050 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
1b060 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
1b070 5d 2e 70 46 75 6e 63 2d 3e 66 6c 61 67 73 26 53  ].pFunc->flags&S
1b080 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54  QLITE_FUNC_COUNT
1b090 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
1b0a0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
1b0b0 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20  ags&EP_Distinct 
1b0c0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72  ) return 0;..  r
1b0d0 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
1b0e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72  *.** If the sour
1b0f0 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73  ce-list item pas
1b100 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
1b110 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64  nt was augmented
1b120 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45   with an.** INDE
1b130 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74  XED BY clause, t
1b140 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74  hen try to locat
1b150 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1b160 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a  index. If there.
1b170 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20 63 6c  ** was such a cl
1b180 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d  ause and the nam
1b190 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20  ed index cannot 
1b1a0 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  be found, return
1b1b0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f   .** SQLITE_ERRO
1b1c0 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65  R and leave an e
1b1d0 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20  rror in pParse. 
1b1e0 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c  Otherwise, popul
1b1f0 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70  ate .** pFrom->p
1b200 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e  Index and return
1b210 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
1b220 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65  nt sqlite3Indexe
1b230 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20  dByLookup(Parse 
1b240 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20  *pParse, struct 
1b250 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
1b260 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f  rom){.  if( pFro
1b270 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d  m->pTab && pFrom
1b280 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ->zIndex ){.    
1b290 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
1b2a0 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63  rom->pTab;.    c
1b2b0 68 61 72 20 2a 7a 49 6e 64 65 78 20 3d 20 70 46  har *zIndex = pF
1b2c0 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20 20  rom->zIndex;.   
1b2d0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
1b2e0 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
1b2f0 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20  >pIndex; .      
1b300 20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74 65    pIdx && sqlite
1b310 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a  3StrICmp(pIdx->z
1b320 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 29 3b 20 0a  Name, zIndex); .
1b330 20 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64          pIdx=pId
1b340 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a  x->pNext.    );.
1b350 20 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b      if( !pIdx ){
1b360 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1b370 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1b380 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
1b390 73 22 2c 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a  s", zIndex, 0);.
1b3a0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68        pParse->ch
1b3b0 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
1b3c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1b3d0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
1b3e0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65      pFrom->pInde
1b3f0 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20  x = pIdx;.  }.  
1b400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b410 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1b420 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c  routine is a Wal
1b430 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ker callback for
1b440 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53   "expanding" a S
1b450 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1b460 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20  .** "Expanding" 
1b470 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20  means to do the 
1b480 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
1b490 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75      (1)  Make su
1b4a0 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  re VDBE cursor n
1b4b0 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
1b4c0 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65   assigned to eve
1b4d0 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c  ry.**         el
1b4e0 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f  ement of the FRO
1b4f0 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
1b500 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20     (2)  Fill in 
1b510 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  the pTabList->a[
1b520 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e  ].pTab fields in
1b530 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
1b540 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65  t .**         de
1b550 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73  fines FROM claus
1b560 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61  e.  When views a
1b570 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
1b580 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20  M clause,.**    
1b590 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69       fill pTabLi
1b5a0 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20  st->a[].pSelect 
1b5b0 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
1b5c0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1b5d0 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74  ent.**         t
1b5e0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
1b5f0 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79  he view.  A copy
1b600 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
1b610 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a  view's SELECT.**
1b620 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65           stateme
1b630 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  nt so that we ca
1b640 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20  n freely modify 
1b650 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73  or delete that s
1b660 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
1b670 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72      without worr
1b680 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69  ying about messi
1b690 6e 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73  ng up the presis
1b6a0 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  tent representat
1b6b0 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ion.**         o
1b6c0 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a  f the view..**.*
1b6d0 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65  *    (3)  Add te
1b6e0 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  rms to the WHERE
1b6f0 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d   clause to accom
1b700 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41  odate the NATURA
1b710 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20  L keyword.**    
1b720 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e       on joins an
1b730 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  d the ON and USI
1b740 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69  NG clause of joi
1b750 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29  ns..**.**    (4)
1b760 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20    Scan the list 
1b770 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
1b780 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45  e result set (pE
1b790 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  List) looking.**
1b7a0 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73           for ins
1b7b0 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a  tances of the "*
1b7c0 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68  " operator or th
1b7d0 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74  e TABLE.* operat
1b7e0 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49  or..**         I
1b7f0 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20  f found, expand 
1b800 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65  each "*" to be e
1b810 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  very column in e
1b820 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20  very table.**   
1b830 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e        and TABLE.
1b840 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  * to be every co
1b850 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a  lumn in TABLE..*
1b860 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
1b870 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57  selectExpander(W
1b880 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
1b890 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
1b8a0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
1b8b0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
1b8c0 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20   int i, j, k;.  
1b8d0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
1b8e0 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  t;.  ExprList *p
1b8f0 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  EList;.  struct 
1b900 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
1b910 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rom;.  sqlite3 *
1b920 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1b930 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
1b940 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20  ocFailed  ){.   
1b950 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
1b960 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56  t;.  }.  if( NEV
1b970 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c  ER(p->pSrc==0) |
1b980 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
1b990 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30   SF_Expanded)!=0
1b9a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
1b9b0 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20  RC_Prune;.  }.  
1b9c0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
1b9d0 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 70 54  F_Expanded;.  pT
1b9e0 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
1b9f0 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
1ba00 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61  pEList;..  /* Ma
1ba10 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e  ke sure cursor n
1ba20 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
1ba30 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
1ba40 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a   entries in.  **
1ba50 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1ba60 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
1ba70 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
1ba80 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1ba90 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
1baa0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a  rse, pTabList);.
1bab0 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
1bac0 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  ery table named 
1bad0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1bae0 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  se of the select
1baf0 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e  .  If.  ** an en
1bb00 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
1bb10 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71  clause is a subq
1bb20 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20  uery instead of 
1bb30 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c  a table or view,
1bb40 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  .  ** then creat
1bb50 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61  e a transient ta
1bb60 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ble structure to
1bb70 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75   describe the su
1bb80 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  bquery..  */.  f
1bb90 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
1bba0 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
1bbb0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
1bbc0 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
1bbd0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
1bbe0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
1bbf0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
1bc00 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68  This statement h
1bc10 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1bc20 70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65  prepared.  There
1bc30 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
1bc40 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68    ** to go furth
1bc50 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  er. */.      ass
1bc60 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20  ert( i==0 );.   
1bc70 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
1bc80 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  une;.    }.    i
1bc90 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d  f( pFrom->zName=
1bca0 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
1bcb0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1bcc0 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  RY.      Select 
1bcd0 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSel = pFrom->p
1bce0 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a  Select;.      /*
1bcf0 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
1bd00 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1bd10 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
1bd20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65       assert( pSe
1bd30 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  l!=0 );.      as
1bd40 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
1bd50 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  b==0 );.      sq
1bd60 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
1bd70 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a  pWalker, pSel);.
1bd80 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
1bd90 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
1bda0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
1bdb0 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
1bdc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
1bdd0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
1bde0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70  C_Abort;.      p
1bdf0 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Tab->nRef = 1;. 
1be00 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
1be10 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
1be20 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 75  f(db, "sqlite_su
1be30 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f  bquery_%p_", (vo
1be40 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20  id*)pTab);.     
1be50 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50   while( pSel->pP
1be60 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70  rior ){ pSel = p
1be70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20  Sel->pPrior; }. 
1be80 20 20 20 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d       selectColum
1be90 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
1bea0 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c  Parse, pSel->pEL
1beb0 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
1bec0 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
1bed0 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65        pTab->iPKe
1bee0 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 54  y = -1;.      pT
1bef0 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30  ab->nRowEst = 10
1bf00 30 30 30 30 30 3b 0a 20 20 20 20 20 20 70 54 61  00000;.      pTa
1bf10 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
1bf20 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e  F_Ephemeral;.#en
1bf30 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
1bf40 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e       /* An ordin
1bf50 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65  ary table or vie
1bf60 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52  w name in the FR
1bf70 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
1bf80 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
1bf90 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
1bfa0 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
1bfb0 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20   pTab = .       
1bfc0 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
1bfd0 62 6c 65 28 70 50 61 72 73 65 2c 30 2c 70 46 72  ble(pParse,0,pFr
1bfe0 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d  om->zName,pFrom-
1bff0 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
1c000 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
1c010 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
1c020 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  t;.      pTab->n
1c030 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69  Ref++;.#if !defi
1c040 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1c050 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
1c060 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  d (SQLITE_OMIT_V
1c070 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
1c080 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
1c090 6c 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61  lect || IsVirtua
1c0a0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
1c0b0 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68     /* We reach h
1c0c0 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ere if the named
1c0d0 20 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c   table is a real
1c0e0 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20  ly a view */.   
1c0f0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1c100 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
1c110 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
1c120 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
1c130 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ort;.        ass
1c140 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ert( pFrom->pSel
1c150 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ect==0 );.      
1c160 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
1c170 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
1c180 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  Dup(db, pTab->pS
1c190 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20  elect, 0);.     
1c1a0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
1c1b0 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46  lect(pWalker, pF
1c1c0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  rom->pSelect);. 
1c1d0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1c1e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61    }..    /* Loca
1c1f0 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  te the index nam
1c200 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45  ed by the INDEXE
1c210 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20  D BY clause, if 
1c220 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  any. */.    if( 
1c230 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
1c240 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
1c250 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72  From) ){.      r
1c260 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
1c270 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1c280 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c   Process NATURAL
1c290 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f   keywords, and O
1c2a0 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
1c2b0 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20  ses of joins..  
1c2c0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
1c2d0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c  locFailed || sql
1c2e0 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
1c2f0 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
1c300 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
1c310 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72  t;.  }..  /* For
1c320 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20   every "*" that 
1c330 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f  occurs in the co
1c340 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72  lumn list, inser
1c350 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20  t the names of. 
1c360 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   ** all columns 
1c370 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20  in all tables.  
1c380 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41  And for every TA
1c390 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65  BLE.* insert the
1c3a0 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61   names.  ** of a
1c3b0 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41  ll columns in TA
1c3c0 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72  BLE.  The parser
1c3d0 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63   inserted a spec
1c3e0 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ial expression. 
1c3f0 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f   ** with the TK_
1c400 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  ALL operator for
1c410 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69   each "*" that i
1c420 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63  t found in the c
1c430 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a  olumn list..  **
1c440 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
1c450 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20  ode just has to 
1c460 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c  locate the TK_AL
1c470 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e  L expressions an
1c480 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61  d expand.  ** ea
1c490 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69  ch one to the li
1c4a0 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  st of all column
1c4b0 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
1c4c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
1c4d0 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63  irst loop just c
1c4e0 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
1c4f0 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a  there are any "*
1c500 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a  " operators.  **
1c510 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e   that need expan
1c520 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ding..  */.  for
1c530 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
1c540 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
1c550 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69   Expr *pE = pELi
1c560 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  st->a[k].pExpr;.
1c570 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
1c580 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a  TK_ALL ) break;.
1c590 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
1c5a0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45  op!=TK_DOT || pE
1c5b0 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  ->pRight!=0 );. 
1c5c0 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
1c5d0 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45  p!=TK_DOT || (pE
1c5e0 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45  ->pLeft!=0 && pE
1c5f0 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
1c600 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ID) );.    if( p
1c610 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
1c620 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d   pE->pRight->op=
1c630 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b  =TK_ALL ) break;
1c640 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c  .  }.  if( k<pEL
1c650 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
1c660 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77    /*.    ** If w
1c670 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65  e get here it me
1c680 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  ans the result s
1c690 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  et contains one 
1c6a0 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20  or more "*".    
1c6b0 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  ** operators tha
1c6c0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
1c6d0 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72  anded.  Loop thr
1c6e0 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
1c6f0 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74  sion.    ** in t
1c700 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
1c710 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e  d expand them on
1c720 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f  e by one..    */
1c730 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
1c740 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70  List_item *a = p
1c750 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78  EList->a;.    Ex
1c760 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30  prList *pNew = 0
1c770 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  ;.    int flags 
1c780 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  = pParse->db->fl
1c790 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e  ags;.    int lon
1c7a0 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20  gNames = (flags 
1c7b0 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
1c7c0 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20  Names)!=0.      
1c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7e0 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  && (flags & SQLI
1c7f0 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
1c800 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b  )==0;..    for(k
1c810 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
1c820 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  xpr; k++){.     
1c830 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d   Expr *pE = a[k]
1c840 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  .pExpr;.      as
1c850 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b  sert( pE->op!=TK
1c860 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67  _DOT || pE->pRig
1c870 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ht!=0 );.      i
1c880 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  f( pE->op!=TK_AL
1c890 4c 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b  L && (pE->op!=TK
1c8a0 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67  _DOT || pE->pRig
1c8b0 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  ht->op!=TK_ALL) 
1c8c0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1c8d0 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78  is particular ex
1c8e0 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f  pression does no
1c8f0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
1c900 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  anded..        *
1c910 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  /.        pNew =
1c920 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1c930 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
1c940 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29  New, a[k].pExpr)
1c950 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
1c960 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
1c970 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
1c980 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61  xpr-1].zName = a
1c990 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [k].zName;.     
1c9a0 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
1c9b0 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61  w->nExpr-1].zSpa
1c9c0 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a  n = a[k].zSpan;.
1c9d0 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
1c9e0 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
1c9f0 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d      a[k].zSpan =
1ca00 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
1ca10 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72        a[k].pExpr
1ca20 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
1ca30 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
1ca40 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
1ca50 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42   a "*" or a "TAB
1ca60 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20  LE.*" and needs 
1ca70 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  to be.        **
1ca80 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20   expanded. */.  
1ca90 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53        int tableS
1caa0 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  een = 0;      /*
1cab0 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54   Set to 1 when T
1cac0 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a  ABLE matches */.
1cad0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
1cae0 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
1caf0 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65   /* text of name
1cb00 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20   of TABLE */.   
1cb10 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d       if( pE->op=
1cb20 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20  =TK_DOT ){.     
1cb30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
1cb40 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20  >pLeft!=0 );.   
1cb50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1cb60 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1cb70 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e  pE->pLeft, EP_In
1cb80 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1cb90 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45       zTName = pE
1cba0 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  ->pLeft->u.zToke
1cbb0 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  n;.        }else
1cbc0 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  {.          zTNa
1cbd0 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
1cbe0 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
1cbf0 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
1cc00 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
1cc10 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
1cc20 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  om++){.         
1cc30 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
1cc40 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
1cc50 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
1cc60 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41  Name = pFrom->zA
1cc70 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
1cc80 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  if( zTabName==0 
1cc90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
1cca0 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  TabName = pTab->
1ccb0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
1ccc0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
1ccd0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1cce0 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  d ) break;.     
1ccf0 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
1cd00 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
1cd10 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  p(zTName, zTabNa
1cd20 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
1cd30 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1cd40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1cd50 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20        tableSeen 
1cd60 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 1;.          f
1cd70 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
1cd80 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
1cd90 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
1cda0 78 70 72 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20  xpr, *pRight;.  
1cdb0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1cdc0 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
1cdd0 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
1cde0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
1cdf0 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65  Colname;  /* The
1ce00 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   computed column
1ce10 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
1ce20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72       char *zToFr
1ce30 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65  ee;   /* Malloce
1ce40 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65  d string that ne
1ce50 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
1ce60 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  */.            T
1ce70 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20  oken sColname;  
1ce80 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75  /* Computed colu
1ce90 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b  mn name as a tok
1cea0 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20  en */..         
1ceb0 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d     /* If a colum
1cec0 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27  n is marked as '
1ced0 68 69 64 64 65 6e 27 20 28 63 75 72 72 65 6e 74  hidden' (current
1cee0 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  ly only possible
1cef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1cf00 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c  for virtual tabl
1cf10 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c  es), do not incl
1cf20 75 64 65 20 69 74 20 69 6e 20 74 68 65 20 65 78  ude it in the ex
1cf30 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20  panded.         
1cf40 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74     ** result-set
1cf50 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20 20   list..         
1cf60 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1cf70 20 20 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f    if( IsHiddenCo
1cf80 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c  lumn(&pTab->aCol
1cf90 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [j]) ){.        
1cfa0 20 20 20 20 20 20 61 73 73 65 72 74 28 49 73 56        assert(IsV
1cfb0 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b 0a 20  irtual(pTab));. 
1cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
1cfd0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1cfe0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
1cff0 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e    if( i>0 && zTN
1d000 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
1d010 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46 72          if( (pFr
1d020 6f 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  om->jointype & J
1d030 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20  T_NATURAL)!=0.  
1d040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
1d050 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
1d060 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69  ndex(pTabList, i
1d070 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20  , zName, 0, 0). 
1d080 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a               ){.
1d090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0a0 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20  /* In a NATURAL 
1d0b0 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a  join, omit the j
1d0c0 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  oin columns from
1d0d0 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
1d0e0 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74        ** table t
1d0f0 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74  o the right of t
1d100 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20  he join */.     
1d110 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
1d120 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
1d130 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1d140 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64     if( sqlite3Id
1d150 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d  ListIndex(pFrom-
1d160 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e  >pUsing, zName)>
1d170 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1d180 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f        /* In a jo
1d190 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20  in with a USING 
1d1a0 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c  clause, omit col
1d1b0 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20  umns in the.    
1d1c0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75              ** u
1d1d0 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d  sing clause from
1d1e0 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68   the table on th
1d1f0 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  e right. */.    
1d200 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
1d210 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1d220 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d230 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1d240 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
1d250 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
1d260 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
1d270 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a      zColname = z
1d280 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
1d290 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20    zToFree = 0;. 
1d2a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
1d2b0 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62  ongNames || pTab
1d2c0 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a  List->nSrc>1 ){.
1d2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
1d2e0 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr *pLeft;.     
1d2f0 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
1d300 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
1d310 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65   TK_ID, zTabName
1d320 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1d330 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
1d340 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
1d350 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69  _DOT, pLeft, pRi
1d360 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
1d370 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
1d380 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
1d390 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65          zColname
1d3a0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
1d3b0 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a  f(db, "%s.%s", z
1d3c0 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  TabName, zName);
1d3d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d3e0 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e   zToFree = zColn
1d3f0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
1d400 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1d410 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d420 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52        pExpr = pR
1d430 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
1d440 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1d450 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
1d460 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
1d470 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72  rse, pNew, pExpr
1d480 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
1d490 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c  Colname.z = zCol
1d4a0 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  name;.          
1d4b0 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73    sColname.n = s
1d4c0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1d4d0 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
1d4e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1d4f0 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
1d500 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c  rse, pNew, &sCol
1d510 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  name, 0);.      
1d520 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
1d530 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29  ree(db, zToFree)
1d540 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1d550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d560 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29  if( !tableSeen )
1d570 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1d580 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  zTName ){.      
1d590 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1d5a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
1d5b0 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
1d5c0 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20  ", zTName);.    
1d5d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d5e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1d5f0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1d600 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63   "no tables spec
1d610 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20  ified");.       
1d620 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1d630 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1d640 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1d650 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73  Delete(db, pELis
1d660 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73  t);.    p->pELis
1d670 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69  t = pNew;.  }.#i
1d680 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  f SQLITE_MAX_COL
1d690 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c  UMN.  if( p->pEL
1d6a0 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74  ist && p->pEList
1d6b0 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d  ->nExpr>db->aLim
1d6c0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
1d6d0 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73  COLUMN] ){.    s
1d6e0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1d6f0 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
1d700 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75   columns in resu
1d710 6c 74 20 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65  lt set");.  }.#e
1d720 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52  ndif.  return WR
1d730 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
1d740 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69  *.** No-op routi
1d750 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  ne for the parse
1d760 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a  -tree walker..**
1d770 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
1d780 75 74 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c  utine is the Wal
1d790 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
1d7a0 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f  k then expressio
1d7b0 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77  n trees.** are w
1d7c0 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e  alked without an
1d7d0 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20  y actions being 
1d7e0 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f  taken at each no
1d7f0 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c  de.  Presumably,
1d800 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f  .** when this ro
1d810 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
1d820 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  r Walker.xExprCa
1d830 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20  llback then .** 
1d840 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
1d850 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f  llback is set to
1d860 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73   do something us
1d870 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a  eful for every .
1d880 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74  ** subquery in t
1d890 68 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a  he parser tree..
1d8a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
1d8b0 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65  prWalkNoop(Walke
1d8c0 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72  r *NotUsed, Expr
1d8d0 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55   *NotUsed2){.  U
1d8e0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
1d8f0 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
1d900 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  d2);.  return WR
1d910 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
1d920 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1d930 65 20 22 65 78 70 61 6e 64 73 22 20 61 20 53 45  e "expands" a SE
1d940 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61  LECT statement a
1d950 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75  nd all of its su
1d960 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72  bqueries..** For
1d970 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
1d980 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20  rmation on what 
1d990 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70  it means to "exp
1d9a0 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a  and" a SELECT.**
1d9b0 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20   statement, see 
1d9c0 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  the comment on t
1d9d0 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20  he selectExpand 
1d9e0 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20  worker callback 
1d9f0 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70  above..**.** Exp
1da00 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20  anding a SELECT 
1da10 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65  statement is the
1da20 20 66 69 72 73 74 20 73 74 65 70 20 69 6e 20 70   first step in p
1da30 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53  rocessing a.** S
1da40 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1da50 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61    The SELECT sta
1da60 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65  tement must be e
1da70 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a  xpanded before.*
1da80 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  * name resolutio
1da90 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a  n is performed..
1daa0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e  **.** If anythin
1dab0 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e  g goes wrong, an
1dac0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
1dad0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70  s written into p
1dae0 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61  Parse..** The ca
1daf0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63  lling function c
1db00 61 6e 20 64 65 74 65 63 74 20 74 68 65 20 70 72  an detect the pr
1db10 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67  oblem by looking
1db20 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   at pParse->nErr
1db30 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73  .** and/or pPars
1db40 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
1db50 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  led..*/.static v
1db60 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
1db70 74 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70  tExpand(Parse *p
1db80 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
1db90 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65  Select){.  Walke
1dba0 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  r w;.  w.xSelect
1dbb0 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
1dbc0 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78  tExpander;.  w.x
1dbd0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
1dbe0 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
1dbf0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
1dc00 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  ;.  sqlite3WalkS
1dc10 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
1dc20 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  t);.}...#ifndef 
1dc30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1dc40 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  UERY./*.** This 
1dc50 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c  is a Walker.xSel
1dc60 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c  ectCallback call
1dc70 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c  back for the sql
1dc80 69 74 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e  ite3SelectTypeIn
1dc90 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63  fo().** interfac
1dca0 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63  e..**.** For eac
1dcb0 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  h FROM-clause su
1dcc0 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75  bquery, add Colu
1dcd0 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c  mn.zType and Col
1dce0 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66  umn.zColl.** inf
1dcf0 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  ormation to the 
1dd00 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
1dd10 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20  that represents 
1dd20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a  the result set.*
1dd30 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71 75 65  * of that subque
1dd40 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61  ry..**.** The Ta
1dd50 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
1dd60 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  at represents th
1dd70 65 20 72 65 73 75 6c 74 20 73 65 74 20 77 61 73  e result set was
1dd80 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20   constructed.** 
1dd90 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65  by selectExpande
1dda0 72 28 29 20 62 75 74 20 74 68 65 20 74 79 70 65  r() but the type
1ddb0 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69   and collation i
1ddc0 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f  nformation was o
1ddd0 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61  mitted.** at tha
1dde0 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20  t point because 
1ddf0 69 64 65 6e 74 69 66 69 65 72 73 20 68 61 64 20  identifiers had 
1de00 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65 73  not yet been res
1de10 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20  olved.  This.** 
1de20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1de30 64 20 61 66 74 65 72 20 69 64 65 6e 74 69 66 69  d after identifi
1de40 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  er resolution..*
1de50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
1de60 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
1de70 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70  peInfo(Walker *p
1de80 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
1de90 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
1dea0 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rse;.  int i;.  
1deb0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
1dec0 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
1ded0 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
1dee0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ..  assert( p->s
1def0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
1df00 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20 28  olved );.  if( (
1df10 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1df20 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30  _HasTypeInfo)==0
1df30 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   ){.    p->selFl
1df40 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70  ags |= SF_HasTyp
1df50 65 49 6e 66 6f 3b 0a 20 20 20 20 70 50 61 72 73  eInfo;.    pPars
1df60 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
1df70 72 73 65 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  rse;.    pTabLis
1df80 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
1df90 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
1dfa0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
1dfb0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
1dfc0 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
1dfd0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
1dfe0 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
1dff0 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
1e000 70 54 61 62 21 3d 30 29 20 26 26 20 28 70 54 61  pTab!=0) && (pTa
1e010 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
1e020 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29  _Ephemeral)!=0 )
1e030 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73  {.        /* A s
1e040 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
1e050 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
1e060 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
1e070 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20     Select *pSel 
1e080 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
1e090 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1e0a0 28 20 70 53 65 6c 20 29 3b 0a 20 20 20 20 20 20  ( pSel );.      
1e0b0 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70    while( pSel->p
1e0c0 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70  Prior ) pSel = p
1e0d0 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  Sel->pPrior;.   
1e0e0 20 20 20 20 20 73 65 6c 65 63 74 41 64 64 43 6f       selectAddCo
1e0f0 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
1e100 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
1e110 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 61  b->nCol, pTab->a
1e120 43 6f 6c 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  Col, pSel);.    
1e130 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1e140 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1e150 6e 75 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  nue;.}.#endif...
1e160 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1e170 6e 65 20 61 64 64 73 20 64 61 74 61 74 79 70 65  ne adds datatype
1e180 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
1e190 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74  equence informat
1e1a0 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61  ion to.** the Ta
1e1b0 62 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 6f  ble structures o
1e1c0 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  f all FROM-claus
1e1d0 65 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20  e subqueries in 
1e1e0 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
1e1f0 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  ement..**.** Use
1e200 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66   this routine af
1e210 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  ter name resolut
1e220 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1e230 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
1e240 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72  tAddTypeInfo(Par
1e250 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
1e260 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69  ct *pSelect){.#i
1e270 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e280 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c  T_SUBQUERY.  Wal
1e290 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65  ker w;.  w.xSele
1e2a0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
1e2b0 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
1e2c0 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70  peInfo;.  w.xExp
1e2d0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
1e2e0 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
1e2f0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
1e300 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
1e310 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
1e320 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
1e330 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
1e340 65 74 73 20 6f 66 20 61 20 53 45 4c 45 43 54 20  ets of a SELECT 
1e350 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72  statement for pr
1e360 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a  ocessing.  The.*
1e370 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  * following is a
1e380 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a  ccomplished:.**.
1e390 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43  **     *  VDBE C
1e3a0 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72  ursor numbers ar
1e3b0 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  e assigned to al
1e3c0 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65  l FROM-clause te
1e3d0 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45  rms..**     *  E
1e3e0 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f  phemeral Table o
1e3f0 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74  bjects are creat
1e400 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d  ed for all FROM-
1e410 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
1e420 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20  s..**     *  ON 
1e430 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
1e440 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e  s are shifted in
1e450 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65  to WHERE stateme
1e460 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69  nts.**     *  Wi
1e470 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20  ldcards "*" and 
1e480 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73  "TABLE.*" in res
1e490 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70  ult sets are exp
1e4a0 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20  anded..**     * 
1e4b0 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   Identifiers in 
1e4c0 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d  expression are m
1e4d0 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73  atched to tables
1e4e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1e4f0 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73  tine acts recurs
1e500 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62  ively on all sub
1e510 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74  queries within t
1e520 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
1e530 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
1e540 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Prep(.  Parse *p
1e550 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
1e560 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
1e570 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
1e580 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1e590 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
1e5a0 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
1e5b0 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43  oded. */.  NameC
1e5c0 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43  ontext *pOuterNC
1e5d0 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
1e5e0 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20  t for container 
1e5f0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
1e600 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  *db;.  if( NEVER
1e610 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (p==0) ) return;
1e620 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
1e630 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  db;.  if( p->sel
1e640 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79  Flags & SF_HasTy
1e650 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b  peInfo ) return;
1e660 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1e670 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70  Expand(pParse, p
1e680 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
1e690 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
1e6a0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
1e6b0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73  rn;.  sqlite3Res
1e6c0 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28  olveSelectNames(
1e6d0 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65  pParse, p, pOute
1e6e0 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72  rNC);.  if( pPar
1e6f0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
1e700 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
1e710 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
1e720 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66  SelectAddTypeInf
1e730 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a  o(pParse, p);.}.
1e740 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65  ./*.** Reset the
1e750 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
1e760 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ulator..**.** Th
1e770 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
1e780 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74  mulator is a set
1e790 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73   of memory cells
1e7a0 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e   that hold.** in
1e7b0 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
1e7c0 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61  ts while calcula
1e7d0 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74  ting an aggregat
1e7e0 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  e.  This.** rout
1e7f0 69 6e 65 20 73 69 6d 70 6c 79 20 73 74 6f 72 65  ine simply store
1e800 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f  s NULLs in all o
1e810 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63  f those memory c
1e820 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ells..*/.static 
1e830 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d 75  void resetAccumu
1e840 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
1e850 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
1e860 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
1e870 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1e880 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
1e890 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
1e8a0 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28  nc *pFunc;.  if(
1e8b0 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63   pAggInfo->nFunc
1e8c0 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  +pAggInfo->nColu
1e8d0 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  mn==0 ){.    ret
1e8e0 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  urn;.  }.  for(i
1e8f0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
1e900 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
1e910 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e920 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
1e930 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   0, pAggInfo->aC
1e940 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 7d  ol[i].iMem);.  }
1e950 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67  .  for(pFunc=pAg
1e960 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d  gInfo->aFunc, i=
1e970 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
1e980 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63  Func; i++, pFunc
1e990 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
1e9a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e9b0 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46 75 6e 63 2d  _Null, 0, pFunc-
1e9c0 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  >iMem);.    if( 
1e9d0 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
1e9e0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  >=0 ){.      Exp
1e9f0 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70  r *pE = pFunc->p
1ea00 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
1ea10 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1ea20 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53  erty(pE, EP_xIsS
1ea30 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
1ea40 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d  if( pE->x.pList=
1ea50 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73  =0 || pE->x.pLis
1ea60 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  t->nExpr!=1 ){. 
1ea70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1ea80 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1ea90 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67 61  DISTINCT aggrega
1eaa0 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65 78  tes must have ex
1eab0 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20  actly one ".    
1eac0 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74         "argument
1ead0 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e  ");.        pFun
1eae0 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  c->iDistinct = -
1eaf0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1eb00 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
1eb10 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49  *pKeyInfo = keyI
1eb20 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
1eb30 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c  pParse, pE->x.pL
1eb40 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ist);.        sq
1eb50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1eb60 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
1eb70 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73  ral, pFunc->iDis
1eb80 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  tinct, 0, 0,.   
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eba0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
1ebb0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
1ebc0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
1ebd0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
1ebe0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
1ebf0 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a  he OP_AggFinaliz
1ec00 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65  e opcode for eve
1ec10 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ry aggregate fun
1ec20 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  ction.** in the 
1ec30 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
1ec40 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1ec50 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e  d finalizeAggFun
1ec60 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50  ctions(Parse *pP
1ec70 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
1ec80 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
1ec90 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1eca0 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
1ecb0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
1ecc0 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69  unc *pF;.  for(i
1ecd0 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
1ece0 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
1ecf0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
1ed00 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c  pF++){.    ExprL
1ed10 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
1ed20 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b  >pExpr->x.pList;
1ed30 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
1ed40 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
1ed50 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
1ed60 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71  elect) );.    sq
1ed70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1ed80 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20  v, OP_AggFinal, 
1ed90 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20  pF->iMem, pList 
1eda0 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
1edb0 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
1edd0 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50  id*)pF->pFunc, P
1ede0 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a  4_FUNCDEF);.  }.
1edf0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  }../*.** Update 
1ee00 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
1ee10 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
1ee20 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61   an aggregate ba
1ee30 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75  sed on.** the cu
1ee40 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
1ee50 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ition..*/.static
1ee60 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75   void updateAccu
1ee70 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
1ee80 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
1ee90 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
1eea0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1eeb0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
1eec0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
1eed0 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75  func *pF;.  stru
1eee0 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
1eef0 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d  pC;..  pAggInfo-
1ef00 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  >directMode = 1;
1ef10 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
1ef20 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
1ef30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
1ef40 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
1ef50 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
1ef60 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
1ef70 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20      int nArg;.  
1ef80 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d    int addrNext =
1ef90 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41   0;.    int regA
1efa0 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  gg;.    ExprList
1efb0 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
1efc0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
1efd0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1efe0 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
1eff0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1f000 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ct) );.    if( p
1f010 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41  List ){.      nA
1f020 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  rg = pList->nExp
1f030 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  r;.      regAgg 
1f040 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1f050 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41  Range(pParse, nA
1f060 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rg);.      sqlit
1f070 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
1f080 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  st(pParse, pList
1f090 2c 20 72 65 67 41 67 67 2c 20 31 29 3b 0a 20 20  , regAgg, 1);.  
1f0a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
1f0b0 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Arg = 0;.      r
1f0c0 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d  egAgg = 0;.    }
1f0d0 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69  .    if( pF->iDi
1f0e0 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
1f0f0 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71     addrNext = sq
1f100 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1f110 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73  el(v);.      ass
1f120 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a  ert( nArg==1 );.
1f130 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e        codeDistin
1f140 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69  ct(pParse, pF->i
1f150 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65  Distinct, addrNe
1f160 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a  xt, 1, regAgg);.
1f170 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
1f180 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61 67 73 20 26  ->pFunc->flags &
1f190 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
1f1a0 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43  DCOLL ){.      C
1f1b0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
1f1c0 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  0;.      struct 
1f1d0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1f1e0 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Item;.      int 
1f1f0 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  j;.      assert(
1f200 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a   pList!=0 );  /*
1f210 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d   pList!=0 if pF-
1f220 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43  >pFunc has NEEDC
1f230 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  OLL */.      for
1f240 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (j=0, pItem=pLis
1f250 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20  t->a; !pColl && 
1f260 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74  j<nArg; j++, pIt
1f270 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
1f280 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1f290 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1f2a0 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
1f2b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1f2c0 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
1f2d0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61       pColl = pPa
1f2e0 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
1f2f0 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
1f300 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f310 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
1f320 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  q, 0, 0, 0, (cha
1f330 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
1f340 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20  LLSEQ);.    }.  
1f350 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f360 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65  Op4(v, OP_AggSte
1f370 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46  p, 0, regAgg, pF
1f380 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20  ->iMem,.        
1f390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
1f3a0 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
1f3b0 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
1f3c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1f3d0 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67  geP5(v, (u8)nArg
1f3e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1f3f0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1f400 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
1f410 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
1f420 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1f430 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1f440 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
1f450 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
1f460 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1f470 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1f480 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  l(v, addrNext);.
1f490 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f4a0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
1f4b0 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  se);.    }.  }..
1f4c0 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75    /* Before popu
1f4d0 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  lating the accum
1f4e0 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
1f4f0 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  , clear the colu
1f500 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f  mn cache..  ** O
1f510 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79  therwise, if any
1f520 20 6f 66 20 74 68 65 20 72 65 71 75 69 72 65 64   of the required
1f530 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61   column values a
1f540 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  re already prese
1f550 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69  nt .  ** in regi
1f560 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78  sters, sqlite3Ex
1f570 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65  prCode() may use
1f580 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70   OP_SCopy to cop
1f590 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a  y the value.  **
1f5a0 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75   to pC->iMem. Bu
1f5b0 74 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68  t by the time th
1f5c0 65 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c  e value is used,
1f5d0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65   the original re
1f5e0 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20  gister.  ** may 
1f5f0 68 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20  have been used, 
1f600 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65  invalidating the
1f610 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66   underlying buff
1f620 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  er holding the. 
1f630 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62   ** text or blob
1f640 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b   value. See tick
1f650 65 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e  et [883034dcb5].
1f660 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68  .  **.  ** Anoth
1f670 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c  er solution woul
1f680 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74  d be to change t
1f690 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64  he OP_SCopy used
1f6a0 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a   to copy cached.
1f6b0 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61    ** values to a
1f6c0 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a  n OP_Copy..  */.
1f6d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f6e0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
1f6f0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70  .  for(i=0, pC=p
1f700 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69  AggInfo->aCol; i
1f710 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75  <pAggInfo->nAccu
1f720 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43  mulator; i++, pC
1f730 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
1f740 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1f750 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e   pC->pExpr, pC->
1f760 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67  iMem);.  }.  pAg
1f770 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
1f780 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
1f790 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
1f7a0 50 61 72 73 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Parse);.}../*.**
1f7b0 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f 50   Add a single OP
1f7c0 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63  _Explain instruc
1f7d0 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42 45  tion to the VDBE
1f7e0 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73 69   to explain a si
1f7f0 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29  mple.** count(*)
1f800 20 71 75 65 72 79 20 28 22 53 45 4c 45 43 54 20   query ("SELECT 
1f810 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54  count(*) FROM pT
1f820 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ab")..*/.#ifndef
1f830 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
1f840 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69 64  LAIN.static void
1f850 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f   explainSimpleCo
1f860 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  unt(.  Parse *pP
1f870 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
1f880 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
1f890 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
1f8a0 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
1f8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f8c0 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72  Table being quer
1f8d0 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ied */.  Index *
1f8e0 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20  pIdx            
1f8f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1f900 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69  x used to optimi
1f910 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c  ze scan, or NULL
1f920 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61   */.){.  if( pPa
1f930 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
1f940 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71  ){.    char *zEq
1f950 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  p = sqlite3MPrin
1f960 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
1f970 53 43 41 4e 20 54 41 42 4c 45 20 25 73 20 25 73  SCAN TABLE %s %s
1f980 25 73 28 7e 25 64 20 72 6f 77 73 29 22 2c 0a 20  %s(~%d rows)",. 
1f990 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
1f9a0 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 49 64  me, .        pId
1f9b0 78 20 3f 20 22 55 53 49 4e 47 20 43 4f 56 45 52  x ? "USING COVER
1f9c0 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22  ING INDEX " : ""
1f9d0 2c 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3f  ,.        pIdx ?
1f9e0 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22   pIdx->zName : "
1f9f0 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ",.        pTab-
1fa00 3e 6e 52 6f 77 45 73 74 0a 20 20 20 20 29 3b 0a  >nRowEst.    );.
1fa10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1fa20 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 70  ddOp4(.        p
1fa30 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
1fa40 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
1fa50 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
1fa60 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41  0, zEqp, P4_DYNA
1fa70 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  MIC.    );.  }.}
1fa80 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1fa90 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
1faa0 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66  nt(a,b,c).#endif
1fab0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1fac0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45   code for the SE
1fad0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67  LECT statement g
1fae0 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72  iven in the p ar
1faf0 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  gument.  .**.** 
1fb00 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
1fb10 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76  distributed in v
1fb20 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65  arious ways depe
1fb30 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20  nding on the.** 
1fb40 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1fb50 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
1fb60 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  ture pointed to 
1fb70 62 79 20 61 72 67 75 6d 65 6e 74 20 70 44 65 73  by argument pDes
1fb80 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t.** as follows:
1fb90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73 74  .**.**     pDest
1fba0 2d 3e 65 44 65 73 74 20 20 20 20 52 65 73 75 6c  ->eDest    Resul
1fbb0 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  t.**     -------
1fbc0 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
1fbd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fbe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fbf0 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ----.**     SRT_
1fc00 4f 75 74 70 75 74 20 20 20 20 20 20 47 65 6e 65  Output      Gene
1fc10 72 61 74 65 20 61 20 72 6f 77 20 6f 66 20 6f 75  rate a row of ou
1fc20 74 70 75 74 20 28 75 73 69 6e 67 20 74 68 65 20  tput (using the 
1fc30 4f 50 5f 52 65 73 75 6c 74 52 6f 77 0a 2a 2a 20  OP_ResultRow.** 
1fc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc50 20 20 20 20 6f 70 63 6f 64 65 29 20 66 6f 72 20      opcode) for 
1fc60 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20  each row in the 
1fc70 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a  result set..**.*
1fc80 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20  *     SRT_Mem   
1fc90 20 20 20 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64        Only valid
1fca0 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 69   if the result i
1fcb0 73 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  s a single colum
1fcc0 6e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  n..**           
1fcd0 20 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20            Store 
1fce0 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  the first column
1fcf0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65   of the first re
1fd00 73 75 6c 74 20 72 6f 77 0a 2a 2a 20 20 20 20 20  sult row.**     
1fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd20 69 6e 20 72 65 67 69 73 74 65 72 20 70 44 65 73  in register pDes
1fd30 74 2d 3e 69 50 61 72 6d 20 74 68 65 6e 20 61 62  t->iParm then ab
1fd40 61 6e 64 6f 6e 20 74 68 65 20 72 65 73 74 0a 2a  andon the rest.*
1fd50 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1fd60 20 20 20 20 20 20 6f 66 20 74 68 65 20 71 75 65        of the que
1fd70 72 79 2e 20 20 54 68 69 73 20 64 65 73 74 69 6e  ry.  This destin
1fd80 61 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 22 4c  ation implies "L
1fd90 49 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20 20  IMIT 1"..**.**  
1fda0 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20     SRT_Set      
1fdb0 20 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 75     The result mu
1fdc0 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63  st be a single c
1fdd0 6f 6c 75 6d 6e 2e 20 20 53 74 6f 72 65 20 65 61  olumn.  Store ea
1fde0 63 68 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ch.**           
1fdf0 20 20 20 20 20 20 20 20 20 20 72 6f 77 20 6f 66            row of
1fe00 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 6b   result as the k
1fe10 65 79 20 69 6e 20 74 61 62 6c 65 20 70 44 65 73  ey in table pDes
1fe20 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20 20 20  t->iParm. .**   
1fe30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe40 20 20 41 70 70 6c 79 20 74 68 65 20 61 66 66 69    Apply the affi
1fe50 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66 66 69  nity pDest->affi
1fe60 6e 69 74 79 20 62 65 66 6f 72 65 20 73 74 6f 72  nity before stor
1fe70 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
1fe80 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
1fe90 74 73 2e 20 20 55 73 65 64 20 74 6f 20 69 6d 70  ts.  Used to imp
1fea0 6c 65 6d 65 6e 74 20 22 49 4e 20 28 53 45 4c 45  lement "IN (SELE
1feb0 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a 20  CT ...)"..**.** 
1fec0 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20      SRT_Union   
1fed0 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
1fee0 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20  s as a key in a 
1fef0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1ff00 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a  pDest->iParm..**
1ff10 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65  .**     SRT_Exce
1ff20 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72  pt      Remove r
1ff30 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20  esults from the 
1ff40 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1ff50 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a  pDest->iParm..**
1ff60 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c  .**     SRT_Tabl
1ff70 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  e       Store re
1ff80 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61  sults in tempora
1ff90 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  ry table pDest->
1ffa0 69 50 61 72 6d 2e 0a 2a 2a 20 20 20 20 20 20 20  iParm..**       
1ffb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68                Th
1ffc0 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54 5f 45  is is like SRT_E
1ffd0 70 68 65 6d 54 61 62 20 65 78 63 65 70 74 20 74  phemTab except t
1ffe0 68 61 74 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a  hat the table.**
1fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20000 20 20 20 20 20 69 73 20 61 73 73 75 6d 65 64 20       is assumed 
20010 74 6f 20 61 6c 72 65 61 64 79 20 62 65 20 6f 70  to already be op
20020 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  en..**.**     SR
20030 54 5f 45 70 68 65 6d 54 61 62 20 20 20 20 43 72  T_EphemTab    Cr
20040 65 61 74 65 20 61 6e 20 74 65 6d 70 6f 72 61 72  eate an temporar
20050 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
20060 50 61 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a  Parm and store.*
20070 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
20080 20 20 20 20 20 20 74 68 65 20 72 65 73 75 6c 74        the result
20090 20 74 68 65 72 65 2e 20 54 68 65 20 63 75 72 73   there. The curs
200a0 6f 72 20 69 73 20 6c 65 66 74 20 6f 70 65 6e 20  or is left open 
200b0 61 66 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  after.**        
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
200d0 75 72 6e 69 6e 67 2e 20 20 54 68 69 73 20 69 73  urning.  This is
200e0 20 6c 69 6b 65 20 53 52 54 5f 54 61 62 6c 65 20   like SRT_Table 
200f0 65 78 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 20  except that.**  
20100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20110 20 20 20 74 68 69 73 20 64 65 73 74 69 6e 61 74     this destinat
20120 69 6f 6e 20 75 73 65 73 20 4f 50 5f 4f 70 65 6e  ion uses OP_Open
20130 45 70 68 65 6d 65 72 61 6c 20 74 6f 20 63 72 65  Ephemeral to cre
20140 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ate.**          
20150 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 74             the t
20160 61 62 6c 65 20 66 69 72 73 74 2e 0a 2a 2a 0a 2a  able first..**.*
20170 2a 20 20 20 20 20 53 52 54 5f 43 6f 72 6f 75 74  *     SRT_Corout
20180 69 6e 65 20 20 20 47 65 6e 65 72 61 74 65 20 61  ine   Generate a
20190 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74   co-routine that
201a0 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20 72   returns a new r
201b0 6f 77 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20  ow of.**        
201c0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
201d0 75 6c 74 73 20 65 61 63 68 20 74 69 6d 65 20 69  ults each time i
201e0 74 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20 54  t is invoked.  T
201f0 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74 0a 2a  he entry point.*
20200 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
20210 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 2d        of the co-
20220 72 6f 75 74 69 6e 65 20 69 73 20 73 74 6f 72 65  routine is store
20230 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 44  d in register pD
20240 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  est->iParm..**.*
20250 2a 20 20 20 20 20 53 52 54 5f 45 78 69 73 74 73  *     SRT_Exists
20260 20 20 20 20 20 20 53 74 6f 72 65 20 61 20 31 20        Store a 1 
20270 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70  in memory cell p
20280 44 65 73 74 2d 3e 69 50 61 72 6d 20 69 66 20 74  Dest->iParm if t
20290 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20  he result.**    
202a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202b0 20 73 65 74 20 69 73 20 6e 6f 74 20 65 6d 70 74   set is not empt
202c0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  y..**.**     SRT
202d0 5f 44 69 73 63 61 72 64 20 20 20 20 20 54 68 72  _Discard     Thr
202e0 6f 77 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  ow the results a
202f0 77 61 79 2e 20 20 54 68 69 73 20 69 73 20 75 73  way.  This is us
20300 65 64 20 62 79 20 53 45 4c 45 43 54 0a 2a 2a 20  ed by SELECT.** 
20310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20320 20 20 20 20 73 74 61 74 65 6d 65 6e 74 73 20 77      statements w
20330 69 74 68 69 6e 20 74 72 69 67 67 65 72 73 20 77  ithin triggers w
20340 68 6f 73 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73  hose only purpos
20350 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  e is.**         
20360 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
20370 73 69 64 65 2d 65 66 66 65 63 74 73 20 6f 66 20  side-effects of 
20380 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  functions..**.**
20390 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
203a0 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
203b0 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
203c0 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
203d0 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
203e0 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
203f0 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
20400 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
20410 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
20420 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
20430 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
20440 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
20450 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
20460 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
20470 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
20480 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69  to do that..*/.i
20490 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
204a0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
204b0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
204c0 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
204d0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
204e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
204f0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
20500 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
20510 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
20520 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a  t *pDest      /*
20530 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
20540 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
20550 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
20560 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
20570 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
20580 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  rs */.  WhereInf
20590 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f  o *pWInfo;     /
205a0 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71  * Return from sq
205b0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
205c0 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ) */.  Vdbe *v; 
205d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
205e0 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
205f0 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  hine under const
20600 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
20610 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20   isAgg;         
20620 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
20630 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b  select lists lik
20640 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a  e "count(*)" */.
20650 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
20660 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st;      /* List
20670 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65   of columns to e
20680 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63  xtract. */.  Src
20690 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
206a0 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
206b0 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20  ables to select 
206c0 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a  from */.  Expr *
206d0 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
206e0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
206f0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
20700 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
20710 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f   *pOrderBy;    /
20720 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
20730 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
20740 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
20750 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
20760 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20  /* The GROUP BY 
20770 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
20780 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
20790 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20  pHaving;        
207a0 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63   /* The HAVING c
207b0 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
207c0 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  ULL */.  int isD
207d0 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
207e0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
207f0 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
20800 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
20810 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20  int distinct;   
20820 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
20830 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
20840 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20  istinct set */. 
20850 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20   int rc = 1;    
20860 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
20870 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20   to return from 
20880 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
20890 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49  .  int addrSortI
208a0 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41 64 64  ndex;     /* Add
208b0 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70  ress of an OP_Op
208c0 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
208d0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
208e0 20 61 64 64 72 44 69 73 74 69 6e 63 74 49 6e 64   addrDistinctInd
208f0 65 78 3b 20 2f 2a 20 41 64 64 72 65 73 73 20 6f  ex; /* Address o
20900 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65  f an OP_OpenEphe
20910 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
20920 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73  n */.  AggInfo s
20930 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a  AggInfo;      /*
20940 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65   Information use
20950 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71  d by aggregate q
20960 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ueries */.  int 
20970 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  iEnd;           
20980 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
20990 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
209a0 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
209b0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
209c0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
209d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
209e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
209f0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
20a00 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  nt iRestoreSelec
20a10 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  tId = pParse->iS
20a20 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73  electId;.  pPars
20a30 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70  e->iSelectId = p
20a40 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
20a50 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ctId++;.#endif..
20a60 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
20a70 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  b;.  if( p==0 ||
20a80 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
20a90 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
20aa0 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
20ab0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
20ac0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
20ad0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
20ae0 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20  ECT, 0, 0, 0) ) 
20af0 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73  return 1;.  mems
20b00 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c  et(&sAggInfo, 0,
20b10 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f   sizeof(sAggInfo
20b20 29 29 3b 0a 0a 20 20 69 66 28 20 49 67 6e 6f 72  ));..  if( Ignor
20b30 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
20b40 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  t) ){.    assert
20b50 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53  (pDest->eDest==S
20b60 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65  RT_Exists || pDe
20b70 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55  st->eDest==SRT_U
20b80 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20  nion || .       
20b90 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
20ba0 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20  ==SRT_Except || 
20bb0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
20bc0 54 5f 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20  T_Discard);.    
20bd0 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d  /* If ORDER BY m
20be0 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  akes no differen
20bf0 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ce in the output
20c00 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f   then neither do
20c10 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e  es.    ** DISTIN
20c20 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20  CT so it can be 
20c30 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a  removed too. */.
20c40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
20c50 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
20c60 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
20c70 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
20c80 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
20c90 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
20ca0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
20cb0 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
20cc0 2c 20 70 2c 20 30 29 3b 0a 20 20 70 4f 72 64 65  , p, 0);.  pOrde
20cd0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
20ce0 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  y;.  pTabList = 
20cf0 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
20d00 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
20d10 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
20d20 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
20d30 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
20d40 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
20d50 7d 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e  }.  isAgg = (p->
20d60 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
20d70 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 61  gregate)!=0;.  a
20d80 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
20d90 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
20da0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
20db0 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
20dc0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
20dd0 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
20de0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
20df0 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69  ;..  /* If writi
20e00 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20  ng to memory or 
20e10 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74  generating a set
20e20 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  .  ** only a sin
20e30 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62  gle column may b
20e40 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23  e output..  */.#
20e50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20e60 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
20e70 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  ( checkForMultiC
20e80 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
20e90 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20  (pParse, pDest, 
20ea0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
20eb0 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
20ec0 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69  t_end;.  }.#endi
20ed0 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
20ee0 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
20ef0 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
20f00 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
20f10 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
20f20 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
20f30 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
20f40 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
20f50 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70  W).  for(i=0; !p
20f60 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54  ->pPrior && i<pT
20f70 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
20f80 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
20f90 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
20fa0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
20fb0 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
20fc0 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53  Dest dest;.    S
20fd0 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49  elect *pSub = pI
20fe0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
20ff0 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a    int isAggSub;.
21000 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30  .    if( pSub==0
21010 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21020 20 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72   if( pItem->addr
21030 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20  FillSub ){.     
21040 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21050 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
21060 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
21070 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  , pItem->addrFil
21080 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 63 6f 6e  lSub);.      con
21090 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
210a0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50    /* Increment P
210b0 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20  arse.nHeight by 
210c0 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68  the height of th
210d0 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73  e largest expres
210e0 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65  sion.    ** tree
210f0 20 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 74   refered to by t
21100 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20  his, the parent 
21110 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c  select. The chil
21120 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20  d select.    ** 
21130 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72  may contain expr
21140 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20  ession trees of 
21150 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28  at most.    ** (
21160 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
21170 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69  DEPTH-Parse.nHei
21180 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69  ght) height. Thi
21190 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a  s is a bit.    *
211a0 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74  * more conservat
211b0 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61  ive than necessa
211c0 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73  ry, but much eas
211d0 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69  ier than enforci
211e0 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61  ng.    ** an exa
211f0 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f  ct limit..    */
21200 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
21210 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  ight += sqlite3S
21220 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
21230 70 29 3b 0a 0a 20 20 20 20 69 73 41 67 67 53 75  p);..    isAggSu
21240 62 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c  b = (pSub->selFl
21250 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
21260 74 65 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20  te)!=0;.    if( 
21270 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
21280 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73  pParse, p, i, is
21290 41 67 67 2c 20 69 73 41 67 67 53 75 62 29 20 29  Agg, isAggSub) )
212a0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
212b0 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65 20  subquery can be 
212c0 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74  absorbed into it
212d0 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20  s parent. */.   
212e0 20 20 20 69 66 28 20 69 73 41 67 67 53 75 62 20     if( isAggSub 
212f0 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67 67  ){.        isAgg
21300 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 1;.        p-
21310 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
21320 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20  Aggregate;.     
21330 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b   }.      i = -1;
21340 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21350 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
21360 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
21370 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68  will fill an eph
21380 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74  emeral table wit
21390 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  h.      ** the c
213a0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73  ontent of this s
213b0 75 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d  ubquery.  pItem-
213c0 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c  >addrFillSub wil
213d0 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a  l point.      **
213e0 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20   to the address 
213f0 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
21400 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49   subroutine.  pI
21410 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20  tem->regReturn. 
21420 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67       ** is a reg
21430 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  ister allocated 
21440 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72  to hold the subr
21450 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64  outine return ad
21460 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20  dress.      */. 
21470 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72       int topAddr
21480 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65  ;.      int once
21490 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Addr = 0;.      
214a0 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20  int retAddr;.   
214b0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
214c0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30  ->addrFillSub==0
214d0 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   );.      pItem-
214e0 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
214f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
21500 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c     topAddr = sql
21510 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21520 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
21530 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
21540 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  n);.      pItem-
21550 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74  >addrFillSub = t
21560 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20  opAddr+1;.      
21570 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
21580 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65  (v, "materialize
21590 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61   %s", pItem->pTa
215a0 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
215b0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 73 43    if( pItem->isC
215c0 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 26 26 20  orrelated==0 && 
215d0 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  pParse->pTrigger
215e0 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
215f0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71    /* If the subq
21600 75 65 72 79 20 69 73 20 6e 6f 20 63 6f 72 72 65  uery is no corre
21610 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77 65 20  lated and if we 
21620 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f  are not inside o
21630 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74  f.        ** a t
21640 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20  rigger, then we 
21650 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d  only need to com
21660 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  pute the value o
21670 66 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20  f the subquery. 
21680 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20         ** once. 
21690 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
216a0 65 67 4f 6e 63 65 20 3d 20 2b 2b 70 50 61 72 73  egOnce = ++pPars
216b0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
216c0 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c 69   onceAddr = sqli
216d0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
216e0 20 4f 50 5f 4f 6e 63 65 2c 20 72 65 67 4f 6e 63   OP_Once, regOnc
216f0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
21700 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
21710 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
21720 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74  RT_EphemTab, pIt
21730 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
21740 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
21750 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65  teger(pItem->iSe
21760 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72  lectId, (u8)pPar
21770 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
21780 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
21790 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
217a0 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
217b0 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
217c0 3e 6e 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69  >nRowEst = (unsi
217d0 67 6e 65 64 29 70 53 75 62 2d 3e 6e 53 65 6c 65  gned)pSub->nSele
217e0 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28  ctRow;.      if(
217f0 20 6f 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69   onceAddr ) sqli
21800 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
21810 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20  v, onceAddr);.  
21820 20 20 20 20 72 65 74 41 64 64 72 20 3d 20 73 71      retAddr = sq
21830 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
21840 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49  v, OP_Return, pI
21850 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
21860 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
21870 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c  nt((v, "end %s",
21880 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
21890 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ame));.      sql
218a0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
218b0 28 76 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74  (v, topAddr, ret
218c0 41 64 64 72 29 3b 0a 0a 20 20 20 20 7d 0a 20 20  Addr);..    }.  
218d0 20 20 69 66 28 20 2f 2a 70 50 61 72 73 65 2d 3e    if( /*pParse->
218e0 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61  nErr ||*/ db->ma
218f0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
21900 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
21910 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  end;.    }.    p
21920 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d  Parse->nHeight -
21930 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
21940 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20  xprHeight(p);.  
21950 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
21960 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21 49  pSrc;.    if( !I
21970 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
21980 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pDest) ){.      
21990 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
219a0 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20  rderBy;.    }.  
219b0 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  }.  pEList = p->
219c0 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66 0a 20  pEList;.#endif. 
219d0 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
219e0 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20  ere;.  pGroupBy 
219f0 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
21a00 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
21a10 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73 74 69  aving;.  isDisti
21a20 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  nct = (p->selFla
21a30 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
21a40 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53  )!=0;..#ifndef S
21a50 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
21a60 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20  UND_SELECT.  /* 
21a70 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20  If there is are 
21a80 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75  a sequence of qu
21a90 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61  eries, do the ea
21aa0 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74  rlier ones first
21ab0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
21ac0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
21ad0 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ( p->pRightmost=
21ae0 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65  =0 ){.      Sele
21af0 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69 67  ct *pLoop, *pRig
21b00 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  ht = 0;.      in
21b10 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  t cnt = 0;.     
21b20 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b 0a 20   int mxSelect;. 
21b30 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70       for(pLoop=p
21b40 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
21b50 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e  Loop->pPrior, cn
21b60 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t++){.        pL
21b70 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20  oop->pRightmost 
21b80 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  = p;.        pLo
21b90 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69 67  op->pNext = pRig
21ba0 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52 69 67  ht;.        pRig
21bb0 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20  ht = pLoop;.    
21bc0 20 20 7d 0a 20 20 20 20 20 20 6d 78 53 65 6c 65    }.      mxSele
21bd0 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  ct = db->aLimit[
21be0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d  SQLITE_LIMIT_COM
21bf0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b 0a 20  POUND_SELECT];. 
21c00 20 20 20 20 20 69 66 28 20 6d 78 53 65 6c 65 63       if( mxSelec
21c10 74 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c 65 63  t && cnt>mxSelec
21c20 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
21c30 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
21c40 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74  rse, "too many t
21c50 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e 64  erms in compound
21c60 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20 20   SELECT");.     
21c70 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
21c80 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
21c90 7d 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69  }.    rc = multi
21ca0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
21cb0 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78  , pDest);.    ex
21cc0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
21cd0 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
21ce0 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  d, iRestoreSelec
21cf0 74 49 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  tId);.    return
21d00 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
21d10 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
21d20 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42  s both a GROUP B
21d30 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42  Y and an ORDER B
21d40 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  Y clause and the
21d50 79 20 61 72 65 0a 20 20 2a 2a 20 69 64 65 6e 74  y are.  ** ident
21d60 69 63 61 6c 2c 20 74 68 65 6e 20 64 69 73 61 62  ical, then disab
21d70 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  le the ORDER BY 
21d80 63 6c 61 75 73 65 20 73 69 6e 63 65 20 74 68 65  clause since the
21d90 20 47 52 4f 55 50 20 42 59 0a 20 20 2a 2a 20 77   GROUP BY.  ** w
21da0 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e  ill cause elemen
21db0 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 69  ts to come out i
21dc0 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72  n the correct or
21dd0 64 65 72 2e 20 20 54 68 69 73 20 69 73 0a 20 20  der.  This is.  
21de0 2a 2a 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  ** an optimizati
21df0 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74  on - the correct
21e00 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72   answer should r
21e10 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73  esult regardless
21e20 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53  ..  ** Use the S
21e30 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64  QLITE_GroupByOrd
21e40 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c  er flag with SQL
21e50 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
21e60 49 4d 49 5a 45 52 0a 20 20 2a 2a 20 74 6f 20 64  IMIZER.  ** to d
21e70 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69  isable this opti
21e80 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73  mization for tes
21e90 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 20  ting purposes.. 
21ea0 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
21eb0 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
21ec0 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 4f  (p->pGroupBy, pO
21ed0 72 64 65 72 42 79 29 3d 3d 30 0a 20 20 20 20 20  rderBy)==0.     
21ee0 20 20 20 20 26 26 20 28 64 62 2d 3e 66 6c 61 67      && (db->flag
21ef0 73 20 26 20 53 51 4c 49 54 45 5f 47 72 6f 75 70  s & SQLITE_Group
21f00 42 79 4f 72 64 65 72 29 3d 3d 30 20 29 7b 0a 20  ByOrder)==0 ){. 
21f10 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
21f20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
21f30 65 20 71 75 65 72 79 20 69 73 20 44 49 53 54 49  e query is DISTI
21f40 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45  NCT with an ORDE
21f50 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20  R BY but is not 
21f60 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e  an aggregate, an
21f70 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73  d .  ** if the s
21f80 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68  elect-list is th
21f90 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52  e same as the OR
21fa0 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65  DER BY list, the
21fb0 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a  n this query.  *
21fc0 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74  * can be rewritt
21fd0 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42 59  en as a GROUP BY
21fe0 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
21ff0 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  , this:.  **.  *
22000 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44 49 53  *     SELECT DIS
22010 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e  TINCT xyz FROM .
22020 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a  .. ORDER BY xyz.
22030 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61    **.  ** is tra
22040 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a  nsformed to:.  *
22050 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
22060 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47  T xyz FROM ... G
22070 52 4f 55 50 20 42 59 20 78 79 7a 0a 20 20 2a 2a  ROUP BY xyz.  **
22080 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  .  ** The second
22090 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72   form is preferr
220a0 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69  ed as a single i
220b0 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61  ndex (or temp-ta
220c0 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a  ble) may be .  *
220d0 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20  * used for both 
220e0 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64  the ORDER BY and
220f0 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
22100 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61  sing. As origina
22110 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65  lly .  ** writte
22120 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74  n the query must
22130 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c   use a temp-tabl
22140 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f  e for at least o
22150 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ne of the ORDER 
22160 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53  .  ** BY and DIS
22170 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e  TINCT, and an in
22180 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20  dex or separate 
22190 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74  temp-table for t
221a0 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  he other..  */. 
221b0 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
221c0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
221d0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
221e0 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20  =SF_Distinct .  
221f0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c   && sqlite3ExprL
22200 69 73 74 43 6f 6d 70 61 72 65 28 70 4f 72 64 65  istCompare(pOrde
22210 72 42 79 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3d  rBy, p->pEList)=
22220 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73  =0.  ){.    p->s
22230 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
22240 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 2d 3e  istinct;.    p->
22250 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
22260 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
22270 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b  , p->pEList, 0);
22280 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
22290 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
222a0 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
222b0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
222c0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
222d0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68   clause, then th
222e0 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20  is sorting.  ** 
222f0 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20  index might end 
22300 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20  up being unused 
22310 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20  if the data can 
22320 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74  be .  ** extract
22330 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64  ed in pre-sorted
22340 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61 74   order.  If that
22350 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
22360 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f  en the.  ** OP_O
22370 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
22380 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  truction will be
22390 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f   changed to an O
223a0 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a  P_Noop once.  **
223b0 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74   we figure out t
223c0 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20  hat the sorting 
223d0 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65  index is not nee
223e0 64 65 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f  ded.  The addrSo
223f0 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72  rtIndex.  ** var
22400 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
22410 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 61 74   facilitate that
22420 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20   change..  */.  
22430 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
22440 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
22450 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49  yInfo;.    pKeyI
22460 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
22470 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
22480 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
22490 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
224a0 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
224b0 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64  ab++;.    p->add
224c0 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61  rOpenEphm[2] = a
224d0 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20  ddrSortIndex =. 
224e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
224f0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
22500 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
22510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22520 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
22530 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65  >iECursor, pOrde
22540 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c  rBy->nExpr+2, 0,
22550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22560 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
22570 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
22580 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
22590 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
225a0 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d  ddrSortIndex = -
225b0 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
225c0 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65  the output is de
225d0 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d  stined for a tem
225e0 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70  porary table, op
225f0 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20  en that table.. 
22600 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d   */.  if( pDest-
22610 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  >eDest==SRT_Ephe
22620 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  mTab ){.    sqli
22630 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22640 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
22650 6c 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c  l, pDest->iParm,
22660 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
22670 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
22680 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f  he limiter..  */
22690 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65  .  iEnd = sqlite
226a0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
226b0 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  );.  p->nSelectR
226c0 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 4c 41 52  ow = (double)LAR
226d0 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 63 6f  GEST_INT64;.  co
226e0 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
226f0 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
22700 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  End);.  if( p->i
22710 4c 69 6d 69 74 3d 3d 30 20 26 26 20 61 64 64 72  Limit==0 && addr
22720 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a  SortIndex>=0 ){.
22730 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
22740 65 74 4f 70 28 76 2c 20 61 64 64 72 53 6f 72 74  etOp(v, addrSort
22750 49 6e 64 65 78 29 2d 3e 6f 70 63 6f 64 65 20 3d  Index)->opcode =
22760 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 3b 0a   OP_SorterOpen;.
22770 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
22780 7c 3d 20 53 46 5f 55 73 65 53 6f 72 74 65 72 3b  |= SF_UseSorter;
22790 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
227a0 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20  a virtual index 
227b0 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
227c0 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a  istinct set..  *
227d0 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
227e0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
227f0 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  t ){.    KeyInfo
22800 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
22810 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  distinct = pPars
22820 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70  e->nTab++;.    p
22830 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
22840 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
22850 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29  arse, p->pEList)
22860 3b 0a 20 20 20 20 61 64 64 72 44 69 73 74 69 6e  ;.    addrDistin
22870 63 74 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65  ctIndex = sqlite
22880 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
22890 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
228a0 20 64 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c   distinct, 0, 0,
228b0 0a 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29  .        (char*)
228c0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
228d0 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
228e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
228f0 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f  angeP5(v, BTREE_
22900 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 7d 65  UNORDERED);.  }e
22910 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63  lse{.    distinc
22920 74 20 3d 20 61 64 64 72 44 69 73 74 69 6e 63 74  t = addrDistinct
22930 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a  Index = -1;.  }.
22940 0a 20 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20  .  /* Aggregate 
22950 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74  and non-aggregat
22960 65 20 71 75 65 72 69 65 73 20 61 72 65 20 68 61  e queries are ha
22970 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c  ndled differentl
22980 79 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67  y */.  if( !isAg
22990 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30  g && pGroupBy==0
229a0 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
229b0 20 2a 70 44 69 73 74 20 3d 20 28 69 73 44 69 73   *pDist = (isDis
229c0 74 69 6e 63 74 20 3f 20 70 2d 3e 70 45 4c 69 73  tinct ? p->pELis
229d0 74 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  t : 0);..    /* 
229e0 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
229f0 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20  se scan. */.    
22a00 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
22a10 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
22a20 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
22a30 65 72 65 2c 20 26 70 4f 72 64 65 72 42 79 2c 20  ere, &pOrderBy, 
22a40 70 44 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 69  pDist, 0);.    i
22a50 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
22a60 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
22a70 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
22a80 6e 52 6f 77 4f 75 74 20 3c 20 70 2d 3e 6e 53 65  nRowOut < p->nSe
22a90 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65  lectRow ) p->nSe
22aa0 6c 65 63 74 52 6f 77 20 3d 20 70 57 49 6e 66 6f  lectRow = pWInfo
22ab0 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 20 20  ->nRowOut;..    
22ac0 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e  /* If sorting in
22ad0 64 65 78 20 74 68 61 74 20 77 61 73 20 63 72 65  dex that was cre
22ae0 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20  ated by a prior 
22af0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
22b00 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63   .    ** instruc
22b10 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f  tion ended up no
22b20 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20  t being needed, 
22b30 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20  then change the 
22b40 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
22b50 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20  .    ** into an 
22b60 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  OP_Noop..    */.
22b70 20 20 20 20 69 66 28 20 61 64 64 72 53 6f 72 74      if( addrSort
22b80 49 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f 72 64  Index>=0 && pOrd
22b90 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
22ba0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
22bb0 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
22bc0 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20  SortIndex);.    
22bd0 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
22be0 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  m[2] = -1;.    }
22bf0 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ..    if( pWInfo
22c00 2d 3e 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  ->eDistinct ){. 
22c10 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70       VdbeOp *pOp
22c20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22c30 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65   /* No longer re
22c40 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d  quired OpenEphem
22c50 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20  eral instr. */. 
22c60 20 20 20 20 0a 20 20 20 20 20 20 61 73 73 65 72      .      asser
22c70 74 28 20 61 64 64 72 44 69 73 74 69 6e 63 74 49  t( addrDistinctI
22c80 6e 64 65 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20  ndex>=0 );.     
22c90 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
22ca0 62 65 47 65 74 4f 70 28 76 2c 20 61 64 64 72 44  beGetOp(v, addrD
22cb0 69 73 74 69 6e 63 74 49 6e 64 65 78 29 3b 0a 0a  istinctIndex);..
22cc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
22cd0 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
22ce0 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
22cf0 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45  ->eDistinct==WHE
22d00 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
22d10 52 45 44 20 0a 20 20 20 20 20 20 20 20 20 20 20  RED .           
22d20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  || pWInfo->eDist
22d30 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54  inct==WHERE_DIST
22d40 49 4e 43 54 5f 55 4e 49 51 55 45 20 0a 20 20 20  INCT_UNIQUE .   
22d50 20 20 20 29 3b 0a 20 20 20 20 20 20 64 69 73 74     );.      dist
22d60 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
22d70 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69   if( pWInfo->eDi
22d80 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49  stinct==WHERE_DI
22d90 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 20 29  STINCT_ORDERED )
22da0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a  {.        int iJ
22db0 75 6d 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ump;.        int
22dc0 20 69 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   iExpr;.        
22dd0 69 6e 74 20 69 46 6c 61 67 20 3d 20 2b 2b 70 50  int iFlag = ++pP
22de0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
22df0 20 20 20 20 69 6e 74 20 69 42 61 73 65 20 3d 20      int iBase = 
22e00 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
22e10 20 20 20 20 20 20 20 20 69 6e 74 20 69 42 61 73          int iBas
22e20 65 32 20 3d 20 69 42 61 73 65 20 2b 20 70 45 4c  e2 = iBase + pEL
22e30 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
22e40 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
22e50 20 2b 3d 20 28 70 45 4c 69 73 74 2d 3e 6e 45 78   += (pEList->nEx
22e60 70 72 2a 32 29 3b 0a 0a 20 20 20 20 20 20 20 20  pr*2);..        
22e70 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4f 50  /* Change the OP
22e80 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 63  _OpenEphemeral c
22e90 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74 6f 20  oded earlier to 
22ea0 61 6e 20 4f 50 5f 49 6e 74 65 67 65 72 2e 20 54  an OP_Integer. T
22eb0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50  he.        ** OP
22ec0 5f 49 6e 74 65 67 65 72 20 69 6e 69 74 69 61 6c  _Integer initial
22ed0 69 7a 65 73 20 74 68 65 20 22 66 69 72 73 74 20  izes the "first 
22ee0 72 6f 77 22 20 66 6c 61 67 2e 20 20 2a 2f 0a 20  row" flag.  */. 
22ef0 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
22f00 64 65 20 3d 20 4f 50 5f 49 6e 74 65 67 65 72 3b  de = OP_Integer;
22f10 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31  .        pOp->p1
22f20 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f   = 1;.        pO
22f30 70 2d 3e 70 32 20 3d 20 69 46 6c 61 67 3b 0a 0a  p->p2 = iFlag;..
22f40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
22f50 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
22f60 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
22f70 69 42 61 73 65 2c 20 31 29 3b 0a 20 20 20 20 20  iBase, 1);.     
22f80 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74     iJump = sqlit
22f90 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
22fa0 72 28 76 29 20 2b 20 31 20 2b 20 70 45 4c 69 73  r(v) + 1 + pELis
22fb0 74 2d 3e 6e 45 78 70 72 20 2b 20 31 20 2b 20 31  t->nExpr + 1 + 1
22fc0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
22fd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
22fe0 50 5f 49 66 2c 20 69 46 6c 61 67 2c 20 69 4a 75  P_If, iFlag, iJu
22ff0 6d 70 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 66  mp-1);.        f
23000 6f 72 28 69 45 78 70 72 3d 30 3b 20 69 45 78 70  or(iExpr=0; iExp
23010 72 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  r<pEList->nExpr;
23020 20 69 45 78 70 72 2b 2b 29 7b 0a 20 20 20 20 20   iExpr++){.     
23030 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
23040 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
23050 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
23060 20 70 45 4c 69 73 74 2d 3e 61 5b 69 45 78 70 72   pEList->a[iExpr
23070 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
23080 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23090 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20  ddOp3(v, OP_Ne, 
230a0 69 42 61 73 65 2b 69 45 78 70 72 2c 20 69 4a 75  iBase+iExpr, iJu
230b0 6d 70 2c 20 69 42 61 73 65 32 2b 69 45 78 70 72  mp, iBase2+iExpr
230c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
230d0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
230e0 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63  (v, -1, (const c
230f0 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
23100 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
23110 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
23120 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
23130 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
23140 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
23150 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
23160 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 57  , OP_Goto, 0, pW
23170 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 29  Info->iContinue)
23180 3b 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;..        sqlit
23190 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
231a0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
231b0 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 20 20 61  Flag);.        a
231c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
231d0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
231e0 3d 3d 69 4a 75 6d 70 20 29 3b 0a 20 20 20 20 20  ==iJump );.     
231f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23200 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c  dOp3(v, OP_Move,
23210 20 69 42 61 73 65 2c 20 69 42 61 73 65 32 2c 20   iBase, iBase2, 
23220 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
23230 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23240 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
23250 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
23260 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
23270 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61  * Use the standa
23280 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a  rd inner loop. *
23290 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65  /.    selectInne
232a0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
232b0 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70   pEList, 0, 0, p
232c0 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63  OrderBy, distinc
232d0 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20  t, pDest,.      
232e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
232f0 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c  Info->iContinue,
23300 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29   pWInfo->iBreak)
23310 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68  ;..    /* End th
23320 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
23330 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
23340 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
23350 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  (pWInfo);.  }els
23360 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  e{.    /* This i
23370 73 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  s the processing
23380 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 71   for aggregate q
23390 75 65 72 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61  ueries */.    Na
233a0 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
233b0 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
233c0 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
233d0 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72   aggregate infor
233e0 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e  mation */.    in
233f0 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iAMem;        
23400 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
23410 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69  ddress for stori
23420 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  ng current GROUP
23430 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
23440 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  BMem;          /
23450 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
23460 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73  ess for previous
23470 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
23480 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20   int iUseFlag;  
23490 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72       /* Mem addr
234a0 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67  ess holding flag
234b0 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
234c0 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20   at least.      
234d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234e0 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20    ** one row of 
234f0 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65  the input to the
23500 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20   aggregator has 
23510 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20  been.           
23520 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
23530 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20  processed */.   
23540 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b   int iAbortFlag;
23550 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72       /* Mem addr
23560 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73  ess which causes
23570 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20   query abort if 
23580 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20  positive */.    
23590 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b  int groupBySort;
235a0 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65      /* Rows come
235b0 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20   from source in 
235c0 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a  GROUP BY order *
235d0 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e  /.    int addrEn
235e0 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64  d;        /* End
235f0 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66   of processing f
23600 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a  or this SELECT *
23610 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54  /.    int sortPT
23620 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65  ab = 0;   /* Pse
23630 75 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f  udotable used to
23640 20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20   decode sorting 
23650 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69  results */.    i
23660 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20  nt sortOut = 0; 
23670 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67     /* Output reg
23680 69 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73  ister from the s
23690 6f 72 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  orter */..    /*
236a0 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20   Remove any and 
236b0 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77  all aliases betw
236c0 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73  een the result s
236d0 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  et and the.    *
236e0 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  * GROUP BY claus
236f0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
23700 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
23710 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20      int k;      
23720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23730 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
23740 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  r */.      struc
23750 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
23760 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20  *pItem;  /* For 
23770 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70  looping over exp
23780 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73  ression in a lis
23790 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28  t */..      for(
237a0 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  k=p->pEList->nEx
237b0 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c  pr, pItem=p->pEL
237c0 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  ist->a; k>0; k--
237d0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
237e0 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61      pItem->iAlia
237f0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
23800 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75       for(k=pGrou
23810 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  pBy->nExpr, pIte
23820 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b  m=pGroupBy->a; k
23830 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
23840 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
23850 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->iAlias = 0;.  
23860 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23870 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28 64  p->nSelectRow>(d
23880 6f 75 62 6c 65 29 31 30 30 20 29 20 70 2d 3e 6e  ouble)100 ) p->n
23890 53 65 6c 65 63 74 52 6f 77 20 3d 20 28 64 6f 75  SelectRow = (dou
238a0 62 6c 65 29 31 30 30 3b 0a 20 20 20 20 7d 65 6c  ble)100;.    }el
238b0 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65  se{.      p->nSe
238c0 6c 65 63 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c  lectRow = (doubl
238d0 65 29 31 3b 0a 20 20 20 20 7d 0a 0a 20 0a 20 20  e)1;.    }.. .  
238e0 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61    /* Create a la
238f0 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77  bel to jump to w
23900 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61  hen we want to a
23910 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a  bort the query *
23920 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20  /.    addrEnd = 
23930 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
23940 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  abel(v);..    /*
23950 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55   Convert TK_COLU
23960 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b  MN nodes into TK
23970 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20  _AGG_COLUMN and 
23980 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a  make entries in.
23990 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20      ** sAggInfo 
239a0 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46  for all TK_AGG_F
239b0 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e  UNCTION nodes in
239c0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   expressions of 
239d0 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43  the.    ** SELEC
239e0 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  T statement..   
239f0 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
23a00 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
23a10 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50  NC));.    sNC.pP
23a20 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
23a30 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
23a40 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  = pTabList;.    
23a50 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26  sNC.pAggInfo = &
23a60 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41  sAggInfo;.    sA
23a70 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
23a80 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79  olumn = pGroupBy
23a90 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   ? pGroupBy->nEx
23aa0 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73 41  pr+1 : 0;.    sA
23ab0 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20  ggInfo.pGroupBy 
23ac0 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = pGroupBy;.    
23ad0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
23ae0 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
23af0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
23b00 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
23b10 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72  ggList(&sNC, pOr
23b20 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
23b30 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
23b40 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
23b50 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73  yzeAggregates(&s
23b60 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20  NC, pHaving);.  
23b70 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
23b80 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20  .nAccumulator = 
23b90 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
23ba0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
23bb0 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
23bc0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
23bd0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
23be0 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61  perty(sAggInfo.a
23bf0 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45  Func[i].pExpr, E
23c00 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
23c10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23c20 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
23c30 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61  &sNC, sAggInfo.a
23c40 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78  Func[i].pExpr->x
23c50 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
23c60 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
23c70 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
23c80 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20  elect_end;..    
23c90 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f  /* Processing fo
23ca0 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74  r aggregates wit
23cb0 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65  h GROUP BY is ve
23cc0 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64  ry different and
23cd0 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72  .    ** much mor
23ce0 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61  e complex than a
23cf0 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75  ggregates withou
23d00 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20  t a GROUP BY..  
23d10 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72    */.    if( pGr
23d20 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b  oupBy ){.      K
23d30 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
23d40 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66  ;  /* Keying inf
23d50 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
23d60 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65   group by clause
23d70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31   */.      int j1
23d80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
23d90 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73   A-vs-B comparis
23da0 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20  ion jump */.    
23db0 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74    int addrOutput
23dc0 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f  Row;  /* Start o
23dd0 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  f subroutine tha
23de0 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75  t outputs a resu
23df0 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  lt row */.      
23e00 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77  int regOutputRow
23e10 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64  ;   /* Return ad
23e20 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
23e30 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  or output subrou
23e40 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tine */.      in
23e50 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20  t addrSetAbort; 
23e60 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f    /* Set the abo
23e70 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75  rt flag and retu
23e80 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  rn */.      int 
23e90 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20  addrTopOfLoop;  
23ea0 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
23eb0 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  put loop */.    
23ec0 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e    int addrSortin
23ed0 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f  gIdx; /* The OP_
23ee0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f  OpenEphemeral fo
23ef0 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
23f00 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  dex */.      int
23f10 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20   addrReset;     
23f20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66   /* Subroutine f
23f30 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65  or resetting the
23f40 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a   accumulator */.
23f50 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73        int regRes
23f60 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74  et;       /* Ret
23f70 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
23f80 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73  ster for reset s
23f90 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20  ubroutine */..  
23fa0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
23fb0 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  is a GROUP BY cl
23fc0 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65  ause we might ne
23fd0 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  ed a sorting ind
23fe0 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69  ex to.      ** i
23ff0 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c  mplement it.  Al
24000 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74  locate that sort
24010 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20  ing index now.  
24020 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a  If it turns out.
24030 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
24040 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20   do not need it 
24050 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f  after all, the O
24060 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73  P_SorterOpen ins
24070 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  truction.      *
24080 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  * will be conver
24090 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e  ted into a Noop.
240a0 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20    .      */.    
240b0 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
240c0 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e  ngIdx = pParse->
240d0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b  nTab++;.      pK
240e0 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
240f0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
24100 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a  rse, pGroupBy);.
24110 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e        addrSortin
24120 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64  gIdx = sqlite3Vd
24130 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
24140 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20  orterOpen, .    
24150 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
24160 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49  ortingIdx, sAggI
24170 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
24180 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30  mn, .          0
24190 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
241a0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
241b0 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f  NDOFF);..      /
241c0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d  * Initialize mem
241d0 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73  ory locations us
241e0 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61  ed by GROUP BY a
241f0 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73  ggregate process
24200 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ing.      */.   
24210 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b     iUseFlag = ++
24220 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
24230 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d      iAbortFlag =
24240 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
24250 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70 75 74  .      regOutput
24260 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Row = ++pParse->
24270 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72  nMem;.      addr
24280 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69  OutputRow = sqli
24290 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
242a0 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65  (v);.      regRe
242b0 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
242c0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72  nMem;.      addr
242d0 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56  Reset = sqlite3V
242e0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
242f0 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70  .      iAMem = p
24300 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
24310 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
24320 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
24330 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42  >nExpr;.      iB
24340 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
24350 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
24360 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
24370 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
24380 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24390 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
243a0 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46  eger, 0, iAbortF
243b0 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
243c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65  Comment((v, "cle
243d0 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  ar abort flag"))
243e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
243f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
24400 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65  Integer, 0, iUse
24410 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
24420 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
24430 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74  dicate accumulat
24440 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 0a 20 20  or empty"));..  
24450 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c      /* Begin a l
24460 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78  oop that will ex
24470 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65  tract all source
24480 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42   rows in GROUP B
24490 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  Y order..      *
244a0 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76  * This might inv
244b0 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74  olve two separat
244c0 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20  e loops with an 
244d0 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65  OP_Sort in betwe
244e0 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  en, or.      ** 
244f0 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69  it might be a si
24500 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75  ngle loop that u
24510 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ses an index to 
24520 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
24530 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ion.      ** in 
24540 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20  the right order 
24550 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20  to begin with.. 
24560 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
24570 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24580 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
24590 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74  Reset, addrReset
245a0 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
245b0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
245c0 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
245d0 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70  List, pWhere, &p
245e0 47 72 6f 75 70 42 79 2c 20 30 2c 20 30 29 3b 0a  GroupBy, 0, 0);.
245f0 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
24600 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
24610 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28  t_end;.      if(
24620 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
24630 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
24640 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65  ptimizer is able
24650 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73   to deliver rows
24660 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64   in group by ord
24670 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a  er so.        **
24680 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20   we do not have 
24690 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50  to sort.  The OP
246a0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74  _OpenEphemeral t
246b0 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  able will be.   
246c0 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65       ** cancelle
246d0 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20  d later because 
246e0 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
246f0 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66   use the pKeyInf
24700 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  o.        */.   
24710 20 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20       pGroupBy = 
24720 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
24730 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
24740 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
24750 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f  e{.        /* Ro
24760 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75  ws are coming ou
24770 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65  t in undetermine
24780 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76  d order.  We hav
24790 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20  e to push.      
247a0 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e    ** each row in
247b0 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  to a sorting ind
247c0 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ex, terminate th
247d0 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20  e first loop,.  
247e0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f        ** then lo
247f0 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74  op over the sort
24800 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64  ing index in ord
24810 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75  er to get the ou
24820 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  tput.        ** 
24830 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a  in sorted order.
24840 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
24850 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a     int regBase;.
24860 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 52          int regR
24870 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69  ecord;.        i
24880 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt nCol;.       
24890 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a   int nGroupBy;..
248a0 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 54          explainT
248b0 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
248c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73   .            is
248d0 44 69 73 74 69 6e 63 74 20 26 26 20 21 28 70 2d  Distinct && !(p-
248e0 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73  >selFlags&SF_Dis
248f0 74 69 6e 63 74 29 3f 22 44 49 53 54 49 4e 43 54  tinct)?"DISTINCT
24900 22 3a 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a  ":"GROUP BY");..
24910 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
24920 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ort = 1;.       
24930 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f   nGroupBy = pGro
24940 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
24950 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f       nCol = nGro
24960 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20 20 20  upBy + 1;.      
24970 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31    j = nGroupBy+1
24980 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
24990 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
249a0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
249b0 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49         if( sAggI
249c0 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72  nfo.aCol[i].iSor
249d0 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
249e0 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c              nCol
249f0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
24a00 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
24a10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24a20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c     regBase = sql
24a30 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
24a40 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a  (pParse, nCol);.
24a50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
24a60 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
24a70 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
24a80 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
24a90 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
24aa0 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65  GroupBy, regBase
24ab0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
24ac0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24ad0 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20  v, OP_Sequence, 
24ae0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
24af0 49 64 78 2c 72 65 67 42 61 73 65 2b 6e 47 72 6f  Idx,regBase+nGro
24b00 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20 6a  upBy);.        j
24b10 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20   = nGroupBy+1;. 
24b20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
24b30 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
24b40 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
24b50 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
24b60 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
24b70 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
24b80 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
24b90 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
24ba0 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
24bb0 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a        int r1 = j
24bc0 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20   + regBase;.    
24bd0 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b 0a          int r2;.
24be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 32 20  .            r2 
24bf0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
24c00 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
24c10 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
24c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c30 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70     pCol->pTab, p
24c40 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43  Col->iColumn, pC
24c50 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 29 3b  ol->iTable, r1);
24c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
24c70 20 72 31 21 3d 72 32 20 29 7b 0a 20 20 20 20 20   r1!=r2 ){.     
24c80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
24c90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
24ca0 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b  _SCopy, r2, r1);
24cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
24cc0 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a             j++;.
24cd0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24ce0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
24cf0 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
24d00 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
24d10 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
24d20 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
24d30 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
24d40 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20   regBase, nCol, 
24d50 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
24d60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
24d70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
24d80 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e  erInsert, sAggIn
24d90 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72  fo.sortingIdx, r
24da0 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
24db0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
24dc0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
24dd0 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
24de0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
24df0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
24e00 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  rse, regBase, nC
24e10 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
24e20 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
24e30 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41  nfo);.        sA
24e40 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
24e50 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62  xPTab = sortPTab
24e60 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
24e70 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f  +;.        sortO
24e80 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ut = sqlite3GetT
24e90 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
24ea0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
24eb0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
24ec0 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74  OpenPseudo, sort
24ed0 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e  PTab, sortOut, n
24ee0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
24ef0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24f00 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  v, OP_SorterSort
24f10 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
24f20 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b  ngIdx, addrEnd);
24f30 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
24f40 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20  ment((v, "GROUP 
24f50 42 59 20 73 6f 72 74 22 29 29 3b 0a 20 20 20 20  BY sort"));.    
24f60 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65      sAggInfo.use
24f70 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a  SortingIdx = 1;.
24f80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
24f90 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
24fa0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  arse);.      }..
24fb0 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
24fc0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
24fd0 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64  OUP BY terms and
24fe0 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31   store in b0, b1
24ff0 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  , b2....      **
25000 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c   (b0 is memory l
25010 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c  ocation iBMem+0,
25020 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20   b1 is iBMem+1, 
25030 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20  and so forth).  
25040 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70      ** Then comp
25050 61 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  are the current 
25060 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61  GROUP BY terms a
25070 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50  gainst the GROUP
25080 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20   BY terms.      
25090 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  ** from the prev
250a0 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74  ious row current
250b0 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c  ly stored in a0,
250c0 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20   a1, a2....     
250d0 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f   */.      addrTo
250e0 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65  pOfLoop = sqlite
250f0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
25100 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
25110 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
25120 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
25130 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
25140 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
25150 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25160 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73  OP_SorterData, s
25170 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
25180 64 78 2c 20 73 6f 72 74 4f 75 74 29 3b 0a 20 20  dx, sortOut);.  
25190 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
251a0 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d  j=0; j<pGroupBy-
251b0 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
251c0 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
251d0 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
251e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
251f0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
25200 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20  n, sortPTab, j, 
25210 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20  iBMem+j);.      
25220 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 73      if( j==0 ) s
25230 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
25240 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45  P5(v, OPFLAG_CLE
25250 41 52 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20  ARCACHE);.      
25260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25270 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65     sAggInfo.dire
25280 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  ctMode = 1;.    
25290 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
252a0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47  rCode(pParse, pG
252b0 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78  roupBy->a[j].pEx
252c0 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20  pr, iBMem+j);.  
252d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
252e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
252f0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
25300 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42  mpare, iAMem, iB
25310 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  Mem, pGroupBy->n
25320 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
25330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25340 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
25350 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
25360 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
25370 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
25380 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
25390 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
253a0 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c  P_Jump, j1+1, 0,
253b0 20 6a 31 2b 31 29 3b 0a 0a 20 20 20 20 20 20 2f   j1+1);..      /
253c0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
253d0 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76  that runs whenev
253e0 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  er the GROUP BY 
253f0 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a  changes..      *
25400 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65  * Changes in the
25410 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65   GROUP BY are de
25420 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72  tected by the pr
25430 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20  evious code.    
25440 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20    ** block.  If 
25450 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68  there were no ch
25460 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63  anges, this bloc
25470 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20  k is skipped..  
25480 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
25490 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73  This code copies
254a0 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62   current group b
254b0 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31  y terms in b0,b1
254c0 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  ,b2,....      **
254d0 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61   over to a0,a1,a
254e0 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c  2.  It then call
254f0 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62  s the output sub
25500 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
25510 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
25520 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
25530 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20  lator registers 
25540 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20  in preparation. 
25550 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
25560 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61  next GROUP BY ba
25570 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tch..      */.  
25580 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25590 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
255a0 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47  iBMem, iAMem, pG
255b0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a  roupBy->nExpr);.
255c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
255d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
255e0 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
255f0 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
25600 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
25610 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
25620 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20   one row"));.   
25630 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25640 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
25650 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64  , iAbortFlag, ad
25660 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 56 64  drEnd);.      Vd
25670 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63  beComment((v, "c
25680 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22  heck abort flag"
25690 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
256a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
256b0 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65  P_Gosub, regRese
256c0 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  t, addrReset);. 
256d0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
256e0 28 28 76 2c 20 22 72 65 73 65 74 20 61 63 63 75  ((v, "reset accu
256f0 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  mulator"));..   
25700 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
25710 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
25720 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e  ulators based on
25730 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
25740 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72        ** the cur
25750 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a  rent row.      *
25760 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
25770 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
25780 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65  1);.      update
25790 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
257a0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
257b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
257c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
257d0 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c  teger, 1, iUseFl
257e0 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
257f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69  omment((v, "indi
25800 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63  cate data in 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 45 6e 64 20 6f 66 20 74 68      /* End of th
25830 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a  e loop.      */.
25840 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
25850 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
25860 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
25870 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
25880 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ext, sAggInfo.so
25890 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f  rtingIdx, addrTo
258a0 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  pOfLoop);.      
258b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
258c0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
258d0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
258e0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
258f0 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53  eToNoop(v, addrS
25900 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20 20  ortingIdx);.    
25910 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75    }..      /* Ou
25920 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72  tput the final r
25930 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20  ow of result.   
25940 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
25950 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
25960 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
25970 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74  tputRow, addrOut
25980 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
25990 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
259a0 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f 77  output final row
259b0 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a  "));..      /* J
259c0 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75 62  ump over the sub
259d0 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20 2a  routines.      *
259e0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
259f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
25a00 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6e 64  Goto, 0, addrEnd
25a10 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
25a20 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
25a30 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
25a40 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
25a50 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
25a60 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73   ** set.  This s
25a70 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20  ubroutine first 
25a80 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73  looks at the iUs
25a90 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46  eFlag.  If iUseF
25aa0 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  lag.      ** is 
25ab0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
25ac0 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20  al to zero, the 
25ad0 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20  subroutine is a 
25ae0 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20  no-op.  If.     
25af0 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69   ** the processi
25b00 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  ng calls for the
25b10 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c   query to abort,
25b20 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
25b30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d  .      ** increm
25b40 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46  ents the iAbortF
25b50 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lag memory locat
25b60 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ion before retur
25b70 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a  ning in.      **
25b80 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c   order to signal
25b90 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61   the caller to a
25ba0 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bort..      */. 
25bb0 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72       addrSetAbor
25bc0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
25bd0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
25be0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25bf0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
25c00 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46  eger, 1, iAbortF
25c10 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
25c20 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74  Comment((v, "set
25c30 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
25c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25c50 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
25c60 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
25c70 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ow);.      sqlit
25c80 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
25c90 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74  el(v, addrOutput
25ca0 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72  Row);.      addr
25cb0 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69  OutputRow = sqli
25cc0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
25cd0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
25ce0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
25cf0 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65  , OP_IfPos, iUse
25d00 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74  Flag, addrOutput
25d10 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64  Row+2);.      Vd
25d20 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
25d30 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65  roupby result ge
25d40 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f  nerator entry po
25d50 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71  int"));.      sq
25d60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
25d70 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
25d80 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
25d90 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
25da0 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
25db0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
25dc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
25dd0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
25de0 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74  ving, addrOutput
25df0 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55  Row+1, SQLITE_JU
25e00 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
25e10 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
25e20 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
25e30 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
25e40 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
25e50 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
25e60 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20  tinct, pDest,.  
25e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e80 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
25e90 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72  w+1, addrSetAbor
25ea0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
25eb0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
25ec0 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
25ed0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
25ee0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
25ef0 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75  end groupby resu
25f00 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b  lt generator"));
25f10 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
25f20 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
25f30 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74   that will reset
25f40 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63   the group-by ac
25f50 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20  cumulator.      
25f60 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
25f70 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
25f80 28 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  (v, addrReset);.
25f90 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
25fa0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
25fb0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
25fc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
25fd0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
25fe0 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20   regReset);.    
25ff0 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66   .    } /* endif
26000 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69   pGroupBy.  Begi
26010 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
26020 69 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55  ies without GROU
26030 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73  P BY: */.    els
26040 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  e {.      ExprLi
26050 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69  st *pDel = 0;.#i
26060 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26070 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20  T_BTREECOUNT.   
26080 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
26090 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62 20        if( (pTab 
260a0 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28  = isSimpleCount(
260b0 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d  p, &sAggInfo))!=
260c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
260d0 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74  If isSimpleCount
260e0 28 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  () returns a poi
260f0 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20  nter to a Table 
26100 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a  structure, then.
26110 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53          ** the S
26120 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  QL statement is 
26130 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20  of the form:.   
26140 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
26150 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
26160 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
26170 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
26180 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20     ** where the 
26190 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
261a0 72 65 74 75 72 6e 65 64 20 72 65 70 72 65 73 65  returned represe
261b0 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e  nts table <tbl>.
261c0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
261d0 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74      ** This stat
261e0 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d  ement is so comm
261f0 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f 70  on that it is op
26200 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c  timized speciall
26210 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  y. The.        *
26220 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72  * OP_Count instr
26230 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74  uction is execut
26240 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65  ed either on the
26250 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68   intkey table th
26260 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  at.        ** co
26270 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 20  ntains the data 
26280 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20  for table <tbl> 
26290 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73  or on one of its
262a0 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20   indexes. It.   
262b0 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65       ** is bette
262c0 72 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  r to execute the
262d0 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c   op on an index,
262e0 20 61 73 20 69 6e 64 65 78 65 73 20 61 72 65 20   as indexes are 
262f0 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a  almost.        *
26300 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61 64 20  * always spread 
26310 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65  across less page
26320 73 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72  s than their cor
26330 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
26340 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
26350 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
26360 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
26370 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
26380 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
26390 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63  hema);.        c
263a0 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20  onst int iCsr = 
263b0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
263c0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
263d0 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a   scan b-tree */.
263e0 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
263f0 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
26400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26410 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
26420 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79  e */.        Key
26430 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
26440 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
26450 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72    /* Keyinfo for
26460 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a   scanned index *
26470 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  /.        Index 
26480 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20  *pBest = 0;     
26490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
264a0 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75  * Best index fou
264b0 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  nd so far */.   
264c0 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d       int iRoot =
264d0 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20   pTab->tnum;    
264e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
264f0 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65  t page of scanne
26500 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20  d b-tree */..   
26510 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
26520 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
26530 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
26540 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
26550 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
26560 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
26570 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
26580 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
26590 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74   for the index t
265a0 68 61 74 20 68 61 73 20 74 68 65 20 6c 65 61 73  hat has the leas
265b0 74 20 61 6d 6f 75 6e 74 20 6f 66 20 63 6f 6c 75  t amount of colu
265c0 6d 6e 73 2e 20 49 66 0a 20 20 20 20 20 20 20 20  mns. If.        
265d0 2a 2a 20 74 68 65 72 65 20 69 73 20 73 75 63 68  ** there is such
265e0 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20 69   an index, and i
265f0 74 20 68 61 73 20 6c 65 73 73 20 63 6f 6c 75 6d  t has less colum
26600 6e 73 20 74 68 61 6e 20 74 68 65 20 74 61 62 6c  ns than the tabl
26610 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65  e.        ** doe
26620 73 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 61  s, then we can a
26630 73 73 75 6d 65 20 74 68 61 74 20 69 74 20 63 6f  ssume that it co
26640 6e 73 75 6d 65 73 20 6c 65 73 73 20 73 70 61 63  nsumes less spac
26650 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64 0a 20 20  e on disk and.  
26660 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 74 68        ** will th
26670 65 72 65 66 6f 72 65 20 62 65 20 63 68 65 61 70  erefore be cheap
26680 65 72 20 74 6f 20 73 63 61 6e 20 74 6f 20 64 65  er to scan to de
26690 74 65 72 6d 69 6e 65 20 74 68 65 20 71 75 65 72  termine the quer
266a0 79 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20  y result..      
266b0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
266c0 65 20 73 65 74 20 69 52 6f 6f 74 20 74 6f 20 74  e set iRoot to t
266d0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
266e0 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
266f0 20 62 2d 74 72 65 65 0a 20 20 20 20 20 20 20 20   b-tree.        
26700 2a 2a 20 61 6e 64 20 70 4b 65 79 49 6e 66 6f 20  ** and pKeyInfo 
26710 74 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  to the KeyInfo s
26720 74 72 75 63 74 75 72 65 20 72 65 71 75 69 72 65  tructure require
26730 64 20 74 6f 20 6e 61 76 69 67 61 74 65 20 74 68  d to navigate th
26740 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64  e.        ** ind
26750 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ex..        **. 
26760 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 31 2d         ** (2011-
26770 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f  04-15) Do not do
26780 20 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20   a full scan of 
26790 61 6e 20 75 6e 6f 72 64 65 72 65 64 20 69 6e 64  an unordered ind
267a0 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ex..        **. 
267b0 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61         ** In pra
267c0 63 74 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66  ctice the KeyInf
267d0 6f 20 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c  o structure will
267e0 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74   not be used. It
267f0 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20   is only .      
26800 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b    ** passed to k
26810 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20  eep OP_OpenRead 
26820 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a  happy..        *
26830 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49  /.        for(pI
26840 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
26850 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
26860 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
26870 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62 55      if( pIdx->bU
26880 6e 6f 72 64 65 72 65 64 3d 3d 30 20 26 26 20 28  nordered==0 && (
26890 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e  !pBest || pIdx->
268a0 6e 43 6f 6c 75 6d 6e 3c 70 42 65 73 74 2d 3e 6e  nColumn<pBest->n
268b0 43 6f 6c 75 6d 6e 29 20 29 7b 0a 20 20 20 20 20  Column) ){.     
268c0 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70         pBest = p
268d0 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Idx;.          }
268e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
268f0 20 20 20 69 66 28 20 70 42 65 73 74 20 26 26 20     if( pBest && 
26900 70 42 65 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70  pBest->nColumn<p
26910 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
26920 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20 70         iRoot = p
26930 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20  Best->tnum;.    
26940 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
26950 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79   sqlite3IndexKey
26960 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 42 65  info(pParse, pBe
26970 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  st);.        }..
26980 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
26990 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
269a0 6f 72 2c 20 65 78 65 63 75 74 65 20 74 68 65 20  or, execute the 
269b0 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20  OP_Count, close 
269c0 74 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20  the cursor. */. 
269d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
269e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
269f0 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69  penRead, iCsr, i
26a00 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20  Root, iDb);.    
26a10 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
26a20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
26a30 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
26a40 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a  4(v, -1, (char *
26a50 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
26a60 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
26a70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26a80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
26a90 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c  Op2(v, OP_Count,
26aa0 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e   iCsr, sAggInfo.
26ab0 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a  aFunc[0].iMem);.
26ac0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
26ad0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
26ae0 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20 20  Close, iCsr);.  
26af0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 69 6d        explainSim
26b00 70 6c 65 43 6f 75 6e 74 28 70 50 61 72 73 65 2c  pleCount(pParse,
26b10 20 70 54 61 62 2c 20 70 42 65 73 74 29 3b 0a 20   pTab, pBest);. 
26b20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
26b30 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
26b40 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20  _BTREECOUNT */. 
26b50 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f       {.        /
26b60 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 71  * Check if the q
26b70 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f  uery is of one o
26b80 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
26b90 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a  forms:.        *
26ba0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  *.        **   S
26bb0 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f  ELECT min(x) FRO
26bc0 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  M ....        **
26bd0 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29     SELECT max(x)
26be0 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20   FROM ....      
26bf0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
26c00 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61  If it is, then a
26c10 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77  sk the code in w
26c20 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70  here.c to attemp
26c30 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74  t to sort result
26c40 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20  s.        ** as 
26c50 69 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20  if there was an 
26c60 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72 20  "ORDER ON x" or 
26c70 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53 43  "ORDER ON x DESC
26c80 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20 20  " clause. .     
26c90 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e 63     ** If where.c
26ca0 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f 64   is able to prod
26cb0 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72 74  uce results sort
26cc0 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72  ed in this order
26cd0 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  , then.        *
26ce0 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64 65 20  * add vdbe code 
26cf0 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
26d00 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  the processing l
26d10 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a 20  oop after the . 
26d20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20         ** first 
26d30 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63 65  iteration (since
26d40 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
26d50 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
26d60 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   is .        ** 
26d70 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 70  guaranteed to op
26d80 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f 77  erate on the row
26d90 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d 75   with the minimu
26da0 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20  m or maximum .  
26db0 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f        ** value o
26dc0 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f  f x, the only ro
26dd0 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20  w required)..   
26de0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
26df0 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61  ** A special fla
26e00 67 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64  g must be passed
26e10 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
26e20 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68  Begin() to sligh
26e30 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  tly.        ** m
26e40 6f 64 69 66 79 20 62 65 68 61 76 69 6f 75 72 20  odify behaviour 
26e50 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
26e60 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
26e70 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71 75 65  *   + If the que
26e80 72 79 20 69 73 20 61 20 22 53 45 4c 45 43 54 20  ry is a "SELECT 
26e90 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74 68  min(x)", then th
26ea0 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a  e loop coded by.
26eb0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77          **     w
26ec0 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f  here.c should no
26ed0 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  t iterate over a
26ee0 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20 61  ny values with a
26ef0 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20   NULL value.    
26f00 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78      **     for x
26f10 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
26f20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20       **   + The 
26f30 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69  optimizer code i
26f40 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20 74  n where.c (the t
26f50 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64 65  hing that decide
26f60 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  s which.        
26f70 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20  **     index or 
26f80 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29 20  indices to use) 
26f90 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64  should place a d
26fa0 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74  ifferent priorit
26fb0 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  y on .        **
26fc0 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67 20       satisfying 
26fd0 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20 63  the 'ORDER BY' c
26fe0 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f  lause than it do
26ff0 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65  es in other case
27000 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  s..        **   
27010 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20    Refer to code 
27020 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  and comments in 
27030 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61  where.c for deta
27040 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ils..        */.
27050 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
27060 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20   *pMinMax = 0;. 
27070 20 20 20 20 20 20 20 75 38 20 66 6c 61 67 20 3d         u8 flag =
27080 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 70 29 3b   minMaxQuery(p);
27090 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61  .        if( fla
270a0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  g ){.          a
270b0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
270c0 72 6f 70 65 72 74 79 28 70 2d 3e 70 45 4c 69 73  roperty(p->pELis
270d0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 45  t->a[0].pExpr, E
270e0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
270f0 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
27100 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  x = sqlite3ExprL
27110 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
27120 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
27130 2d 3e 78 2e 70 4c 69 73 74 2c 30 29 3b 0a 20 20  ->x.pList,0);.  
27140 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70          pDel = p
27150 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20  MinMax;.        
27160 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26    if( pMinMax &&
27170 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
27180 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
27190 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e    pMinMax->a[0].
271a0 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67  sortOrder = flag
271b0 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  !=WHERE_ORDERBY_
271c0 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20  MIN ?1:0;.      
271d0 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
271e0 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20  [0].pExpr->op = 
271f0 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
27200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
27210 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  .  .        /* T
27220 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66  his case runs if
27230 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68   the aggregate h
27240 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
27250 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20  lause.  The.    
27260 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
27270 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65  g is much simple
27280 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  r since there is
27290 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72   only a single r
272a0 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ow.        ** of
272b0 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20   output..       
272c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65   */.        rese
272d0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
272e0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
272f0 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20  .        pWInfo 
27300 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
27310 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
27320 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70  List, pWhere, &p
27330 4d 69 6e 4d 61 78 2c 20 30 2c 20 66 6c 61 67 29  MinMax, 0, flag)
27340 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57  ;.        if( pW
27350 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Info==0 ){.     
27360 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27370 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
27380 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Del);.          
27390 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
273a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
273b0 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
273c0 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
273d0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
273e0 20 69 66 28 20 21 70 4d 69 6e 4d 61 78 20 26 26   if( !pMinMax &&
273f0 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20   flag ){.       
27400 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27410 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
27420 20 30 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65   0, pWInfo->iBre
27430 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  ak);.          V
27440 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
27450 25 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a  %s() by index",.
27460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27470 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44  (flag==WHERE_ORD
27480 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22  ERBY_MIN?"min":"
27490 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20  max")));.       
274a0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
274b0 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
274c0 6f 29 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61  o);.        fina
274d0 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
274e0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
274f0 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  fo);.      }..  
27500 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
27510 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
27520 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
27530 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
27540 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  End, SQLITE_JUMP
27550 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
27560 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
27570 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
27580 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31  ist, 0, 0, 0, -1
27590 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
275a0 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2c 20           pDest, 
275b0 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64  addrEnd, addrEnd
275c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
275d0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
275e0 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a  b, pDel);.    }.
275f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
27600 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
27610 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20  ddrEnd);.    .  
27620 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65  } /* endif aggre
27630 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20  gate query */.. 
27640 20 69 66 28 20 64 69 73 74 69 6e 63 74 3e 3d 30   if( distinct>=0
27650 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54   ){.    explainT
27660 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
27670 20 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20   "DISTINCT");.  
27680 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
27690 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
276a0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20  clause, then we 
276b0 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65  need to sort the
276c0 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e   results.  ** an
276d0 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74  d send them to t
276e0 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20  he callback one 
276f0 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  by one..  */.  i
27700 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
27710 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61     explainTempTa
27720 62 6c 65 28 70 50 61 72 73 65 2c 20 22 4f 52 44  ble(pParse, "ORD
27730 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e  ER BY");.    gen
27740 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50  erateSortTail(pP
27750 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69  arse, p, v, pELi
27760 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74  st->nExpr, pDest
27770 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  );.  }..  /* Jum
27780 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
27790 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20  his query.  */. 
277a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
277b0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64  lveLabel(v, iEnd
277c0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c  );..  /* The SEL
277d0 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66  ECT was successf
277e0 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65  ully coded.   Se
277f0 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
27800 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69  e to 0.  ** to i
27810 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72  ndicate no error
27820 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30  s..  */.  rc = 0
27830 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20  ;..  /* Control 
27840 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66  jumps to here if
27850 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
27860 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20  ountered above, 
27870 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63  or upon.  ** suc
27880 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f  cessful coding o
27890 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20  f the SELECT..  
278a0 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  */.select_end:. 
278b0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
278c0 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  er(pParse->iSele
278d0 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65  ctId, iRestoreSe
278e0 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49  lectId);..  /* I
278f0 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e  dentify column n
27900 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73 20  ames if results 
27910 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 61 72  of the SELECT ar
27920 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a  e to be output..
27930 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
27940 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73  QLITE_OK && pDes
27950 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
27960 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65  tput ){.    gene
27970 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
27980 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
27990 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  , pEList);.  }..
279a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
279b0 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f  db, sAggInfo.aCo
279c0 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  l);.  sqlite3DbF
279d0 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f  ree(db, sAggInfo
279e0 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72  .aFunc);.  retur
279f0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  n rc;.}..#if def
27a00 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
27a10 47 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  G)./*.**********
27a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27a60 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  *****.** The fol
27a70 6c 6f 77 69 6e 67 20 63 6f 64 65 20 69 73 20 75  lowing code is u
27a80 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
27a90 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
27aa0 6c 79 2e 20 20 54 68 65 20 63 6f 64 65 0a 2a 2a  ly.  The code.**
27ab0 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64 6f   that follows do
27ac0 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e  es not appear in
27ad0 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2e 0a   normal builds..
27ae0 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
27af0 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
27b00 20 70 72 69 6e 74 20 6f 75 74 20 74 68 65 20 63   print out the c
27b10 6f 6e 74 65 6e 74 20 6f 66 20 61 6c 6c 20 6f 72  ontent of all or
27b20 20 70 61 72 74 20 6f 66 20 61 20 0a 2a 2a 20 70   part of a .** p
27b30 61 72 73 65 20 73 74 72 75 63 74 75 72 65 73 20  arse structures 
27b40 73 75 63 68 20 61 73 20 53 65 6c 65 63 74 20 6f  such as Select o
27b50 72 20 45 78 70 72 2e 20 20 53 75 63 68 20 70 72  r Expr.  Such pr
27b60 69 6e 74 6f 75 74 73 20 61 72 65 20 75 73 65 66  intouts are usef
27b70 75 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c 70 69 6e  ul.** for helpin
27b80 67 20 74 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  g to understand 
27b90 77 68 61 74 20 69 73 20 68 61 70 70 65 6e 69 6e  what is happenin
27ba0 67 20 69 6e 73 69 64 65 20 74 68 65 20 63 6f 64  g inside the cod
27bb0 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 64  e generator.** d
27bc0 75 72 69 6e 67 20 74 68 65 20 65 78 65 63 75 74  uring the execut
27bd0 69 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65 78 20 53  ion of complex S
27be0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
27bf0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
27c00 75 74 69 6e 65 20 61 72 65 20 6e 6f 74 20 63 61  utine are not ca
27c10 6c 6c 65 64 20 61 6e 79 77 68 65 72 65 20 66 72  lled anywhere fr
27c20 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 6e 6f  om within the no
27c30 72 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20 62 61 73  rmal.** code bas
27c40 65 2e 20 20 54 68 65 6e 20 61 72 65 20 69 6e 74  e.  Then are int
27c50 65 6e 64 65 64 20 74 6f 20 62 65 20 63 61 6c 6c  ended to be call
27c60 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ed from within t
27c70 68 65 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 6f  he debugger.** o
27c80 72 20 66 72 6f 6d 20 74 65 6d 70 6f 72 61 72 79  r from temporary
27c90 20 22 70 72 69 6e 74 66 22 20 73 74 61 74 65 6d   "printf" statem
27ca0 65 6e 74 73 20 69 6e 73 65 72 74 65 64 20 66 6f  ents inserted fo
27cb0 72 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a  r debugging..*/.
27cc0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e  void sqlite3Prin
27cd0 74 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a  tExpr(Expr *p){.
27ce0 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
27cf0 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74  operty(p, EP_Int
27d00 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a  Value) && p->u.z
27d10 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  Token ){.    sql
27d20 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
27d30 22 28 25 73 22 2c 20 70 2d 3e 75 2e 7a 54 6f 6b  "(%s", p->u.zTok
27d40 65 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  en);.  }else{.  
27d50 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
27d60 69 6e 74 66 28 22 28 25 64 22 2c 20 70 2d 3e 6f  intf("(%d", p->o
27d70 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  p);.  }.  if( p-
27d80 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 73 71  >pLeft ){.    sq
27d90 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
27da0 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  (" ");.    sqlit
27db0 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70  e3PrintExpr(p->p
27dc0 4c 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Left);.  }.  if(
27dd0 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20   p->pRight ){.  
27de0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
27df0 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73  intf(" ");.    s
27e00 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
27e10 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  p->pRight);.  }.
27e20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
27e30 69 6e 74 66 28 22 29 22 29 3b 0a 7d 0a 76 6f 69  intf(")");.}.voi
27e40 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78  d sqlite3PrintEx
27e50 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
27e60 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
27e70 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
27e80 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
27e90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  ){.    sqlite3Pr
27ea0 69 6e 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61  intExpr(pList->a
27eb0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
27ec0 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  if( i<pList->nEx
27ed0 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  pr-1 ){.      sq
27ee0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
27ef0 28 22 2c 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20  (", ");.    }.  
27f00 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
27f10 50 72 69 6e 74 53 65 6c 65 63 74 28 53 65 6c 65  PrintSelect(Sele
27f20 63 74 20 2a 70 2c 20 69 6e 74 20 69 6e 64 65 6e  ct *p, int inden
27f30 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  t){.  sqlite3Deb
27f40 75 67 50 72 69 6e 74 66 28 22 25 2a 73 53 45 4c  ugPrintf("%*sSEL
27f50 45 43 54 28 25 70 29 20 22 2c 20 69 6e 64 65 6e  ECT(%p) ", inden
27f60 74 2c 20 22 22 2c 20 70 29 3b 0a 20 20 73 71 6c  t, "", p);.  sql
27f70 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
27f80 74 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  t(p->pEList);.  
27f90 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
27fa0 74 66 28 22 5c 6e 22 29 3b 0a 20 20 69 66 28 20  tf("\n");.  if( 
27fb0 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20 63  p->pSrc ){.    c
27fc0 68 61 72 20 2a 7a 50 72 65 66 69 78 3b 0a 20 20  har *zPrefix;.  
27fd0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 7a 50 72    int i;.    zPr
27fe0 65 66 69 78 20 3d 20 22 46 52 4f 4d 22 3b 0a 20  efix = "FROM";. 
27ff0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
28000 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  >pSrc->nSrc; i++
28010 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
28020 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
28030 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e  tem = &p->pSrc->
28040 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[i];.      sqli
28050 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
28060 25 2a 73 20 22 2c 20 69 6e 64 65 6e 74 2b 36 2c  %*s ", indent+6,
28070 20 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20   zPrefix);.     
28080 20 7a 50 72 65 66 69 78 20 3d 20 22 22 3b 0a 20   zPrefix = "";. 
28090 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
280a0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
280b0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
280c0 72 69 6e 74 66 28 22 28 5c 6e 22 29 3b 0a 20 20  rintf("(\n");.  
280d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 69        sqlite3Pri
280e0 6e 74 53 65 6c 65 63 74 28 70 49 74 65 6d 2d 3e  ntSelect(pItem->
280f0 70 53 65 6c 65 63 74 2c 20 69 6e 64 65 6e 74 2b  pSelect, indent+
28100 31 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  10);.        sql
28110 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
28120 22 25 2a 73 29 22 2c 20 69 6e 64 65 6e 74 2b 38  "%*s)", indent+8
28130 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , "");.      }el
28140 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e  se if( pItem->zN
28150 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
28160 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
28170 66 28 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  f("%s", pItem->z
28180 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
28190 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
281a0 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
281b0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
281c0 74 66 28 22 28 74 61 62 6c 65 3a 20 25 73 29 22  tf("(table: %s)"
281d0 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
281e0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
281f0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
28200 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
28210 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
28220 69 6e 74 66 28 22 20 41 53 20 25 73 22 2c 20 70  intf(" AS %s", p
28230 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
28240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
28250 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63   i<p->pSrc->nSrc
28260 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  -1 ){.        sq
28270 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
28280 28 22 2c 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (",");.      }. 
28290 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
282a0 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
282b0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
282c0 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
282d0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
282e0 74 66 28 22 25 2a 73 20 57 48 45 52 45 20 22 2c  tf("%*s WHERE ",
282f0 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20   indent, "");.  
28300 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
28310 70 72 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  pr(p->pWhere);. 
28320 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
28330 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
28340 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70  .  if( p->pGroup
28350 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
28360 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
28370 73 20 47 52 4f 55 50 20 42 59 20 22 2c 20 69 6e  s GROUP BY ", in
28380 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
28390 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c  qlite3PrintExprL
283a0 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 29  ist(p->pGroupBy)
283b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
283c0 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
283d0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48 61    }.  if( p->pHa
283e0 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  ving ){.    sqli
283f0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
28400 25 2a 73 20 48 41 56 49 4e 47 20 22 2c 20 69 6e  %*s HAVING ", in
28410 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
28420 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
28430 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  p->pHaving);.   
28440 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
28450 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ntf("\n");.  }. 
28460 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
28470 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
28480 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20  ebugPrintf("%*s 
28490 4f 52 44 45 52 20 42 59 20 22 2c 20 69 6e 64 65  ORDER BY ", inde
284a0 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c  nt, "");.    sql
284b0 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
284c0 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  t(p->pOrderBy);.
284d0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
284e0 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
284f0 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68  }.}./* End of th
28500 65 20 73 74 72 75 63 74 75 72 65 20 64 65 62 75  e structure debu
28510 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a  g printing code.
28520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23  *************/.#
28570 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
28580 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
28590 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
285a0 44 45 42 55 47 29 20 2a 2f 0a                    DEBUG) */.