/ Hex Artifact Content
Login

Artifact 60af46f5f6bc3803c27af3edd8881ed2d0c3f19f:


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 53 44 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b  iSDParm = iParm;
04a0: 0a 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73  .  pDest->affSds
04b0: 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e  t = 0;.  pDest->
04c0: 69 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65  iSdst = 0;.  pDe
04d0: 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d  st->nSdst = 0;.}
04e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
04f0: 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73  e a new Select s
0500: 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74  tructure and ret
0510: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
0520: 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75   that.** structu
0530: 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73  re..*/.Select *s
0540: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
0550: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0560: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
0570: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
0580: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
0590: 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20  t,     /* which 
05a0: 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75  columns to inclu
05b0: 64 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  de in the result
05c0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
05d0: 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74  Src,        /* t
05e0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d  he FROM clause -
05f0: 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 74  - which tables t
0600: 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72  o scan */.  Expr
0610: 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
0620: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
0630: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
0640: 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20  ist *pGroupBy,  
0650: 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59   /* the GROUP BY
0660: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
0670: 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20  r *pHaving,     
0680: 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47     /* the HAVING
0690: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
06a0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
06b0: 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20     /* the ORDER 
06c0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75  BY clause */.  u
06d0: 31 36 20 73 65 6c 46 6c 61 67 73 2c 20 20 20 20  16 selFlags,    
06e0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 70 61 72       /* Flag par
06f0: 61 6d 65 74 65 72 73 2c 20 73 75 63 68 20 61 73  ameters, such as
0700: 20 53 46 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a   SF_Distinct */.
0710: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
0720: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54          /* LIMIT
0730: 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65   value.  NULL me
0740: 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a  ans not used */.
0750: 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20    Expr *pOffset 
0760: 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45          /* OFFSE
0770: 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d  T value.  NULL m
0780: 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a  eans no offset *
0790: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
07a0: 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74  New;.  Select st
07b0: 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  andin;.  sqlite3
07c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
07d0: 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
07e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
07f0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
0800: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ) );.  assert( d
0810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0820: 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70  || !pOffset || p
0830: 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f 46 46 53  Limit ); /* OFFS
0840: 45 54 20 69 6d 70 6c 69 65 73 20 4c 49 4d 49 54  ET implies LIMIT
0850: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   */.  if( pNew==
0860: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
0870: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0880: 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  d );.    pNew = 
0890: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65  &standin;.    me
08a0: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
08b0: 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
08c0: 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  }.  if( pEList==
08d0: 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20  0 ){.    pEList 
08e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
08f0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
0900: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
0910: 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20  b,TK_ALL,0));.  
0920: 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  }.  pNew->pEList
0930: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 69 66 28   = pEList;.  if(
0940: 20 70 53 72 63 3d 3d 30 20 29 20 70 53 72 63 20   pSrc==0 ) pSrc 
0950: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
0960: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
0970: 28 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77  (*pSrc));.  pNew
0980: 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
0990: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
09a0: 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e  pWhere;.  pNew->
09b0: 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
09c0: 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  pBy;.  pNew->pHa
09d0: 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a  ving = pHaving;.
09e0: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
09f0: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
0a00: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
0a10: 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  selFlags;.  pNew
0a20: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
0a30: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
0a40: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65   = pLimit;.  pNe
0a50: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  w->pOffset = pOf
0a60: 66 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20  fset;.  assert( 
0a70: 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c  pOffset==0 || pL
0a80: 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 70 4e 65  imit!=0 );.  pNe
0a90: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
0aa0: 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  0] = -1;.  pNew-
0ab0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
0ac0: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61   = -1;.  pNew->a
0ad0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
0ae0: 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   -1;.  if( db->m
0af0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a  allocFailed ) {.
0b00: 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28      clearSelect(
0b10: 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 69  db, pNew);.    i
0b20: 66 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69  f( pNew!=&standi
0b30: 6e 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  n ) sqlite3DbFre
0b40: 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  e(db, pNew);.   
0b50: 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c   pNew = 0;.  }el
0b60: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
0b70: 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c  pNew->pSrc!=0 ||
0b80: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
0b90: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
0ba0: 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 20   pNew!=&standin 
0bb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
0bc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
0bd0: 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65  e the given Sele
0be0: 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ct structure and
0bf0: 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73   all of its subs
0c00: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
0c10: 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
0c20: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
0c30: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  db, Select *p){.
0c40: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
0c50: 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70  learSelect(db, p
0c60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
0c70: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d  Free(db, p);.  }
0c80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
0c90: 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65  1 to 3 identifie
0ca0: 72 73 20 70 72 65 63 65 64 69 6e 67 20 74 68 65  rs preceding the
0cb0: 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64   JOIN keyword, d
0cc0: 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20  etermine the.** 
0cd0: 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52  type of join.  R
0ce0: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
0cf0: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65   constant that e
0d00: 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79  xpresses that ty
0d10: 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f  pe.** in terms o
0d20: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0d30: 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a  bit values:.**.*
0d40: 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a  *     JT_INNER.*
0d50: 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a  *     JT_CROSS.*
0d60: 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a  *     JT_OUTER.*
0d70: 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c  *     JT_NATURAL
0d80: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a  .**     JT_LEFT.
0d90: 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a  **     JT_RIGHT.
0da0: 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74  **.** A full out
0db0: 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63  er join is the c
0dc0: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54  ombination of JT
0dd0: 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47  _LEFT and JT_RIG
0de0: 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  HT..**.** If an 
0df0: 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70  illegal or unsup
0e00: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
0e10: 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73   is seen, then s
0e20: 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61  till return.** a
0e30: 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20   join type, but 
0e40: 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  put an error in 
0e50: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
0e60: 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ture..*/.int sql
0e70: 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72  ite3JoinType(Par
0e80: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
0e90: 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42  n *pA, Token *pB
0ea0: 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20  , Token *pC){.  
0eb0: 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30  int jointype = 0
0ec0: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c  ;.  Token *apAll
0ed0: 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b  [3];.  Token *p;
0ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0f00: 20 20 20 30 31 32 33 34 35 36 37 38 39 20 31 32     0123456789 12
0f10: 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38  3456789 12345678
0f20: 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74 69  9 123 */.  stati
0f30: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65  c const char zKe
0f40: 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72  yText[] = "natur
0f50: 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66 75  aleftouterightfu
0f60: 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20  llinnercross";. 
0f70: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
0f80: 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69 3b  ruct {.    u8 i;
0f90: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
0fa0: 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64 20  ning of keyword 
0fb0: 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78 74  text in zKeyText
0fc0: 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68  [] */.    u8 nCh
0fd0: 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68  ar;    /* Length
0fe0: 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20   of the keyword 
0ff0: 69 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  in characters */
1000: 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20 20  .    u8 code;   
1010: 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d    /* Join type m
1020: 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77  ask */.  } aKeyw
1030: 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a  ord[] = {.    /*
1040: 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c   natural */ { 0,
1050: 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20    7, JT_NATURAL 
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1070: 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20 20  ,.    /* left   
1080: 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f   */ { 6,  4, JT_
1090: 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20  LEFT|JT_OUTER   
10a0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
10b0: 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31 30   outer   */ { 10
10c0: 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20  , 5, JT_OUTER   
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
10e0: 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20 20  ,.    /* right  
10f0: 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f   */ { 14, 5, JT_
1100: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20  RIGHT|JT_OUTER  
1110: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1120: 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39   full    */ { 19
1130: 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f  , 4, JT_LEFT|JT_
1140: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  RIGHT|JT_OUTER }
1150: 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20  ,.    /* inner  
1160: 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f   */ { 23, 5, JT_
1170: 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20 20  INNER           
1180: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1190: 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38   cross   */ { 28
11a0: 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54  , 5, JT_INNER|JT
11b0: 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20 20 7d  _CROSS         }
11c0: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20  ,.  };.  int i, 
11d0: 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20  j;.  apAll[0] = 
11e0: 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d  pA;.  apAll[1] =
11f0: 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20   pB;.  apAll[2] 
1200: 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = pC;.  for(i=0;
1210: 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d   i<3 && apAll[i]
1220: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
1230: 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f  apAll[i];.    fo
1240: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
1250: 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b  ze(aKeyword); j+
1260: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
1270: 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e  >n==aKeyword[j].
1280: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
1290: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
12a0: 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  Cmp((char*)p->z,
12b0: 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79 77   &zKeyText[aKeyw
12c0: 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29  ord[j].i], p->n)
12d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  ==0 ){.        j
12e0: 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79 77  ointype |= aKeyw
12f0: 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20  ord[j].code;.   
1300: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1310: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65    }.    }.    te
1320: 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20  stcase( j==0 || 
1330: 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20  j==1 || j==2 || 
1340: 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20  j==3 || j==4 || 
1350: 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a  j==5 || j==6 );.
1360: 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79      if( j>=Array
1370: 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20 29  Size(aKeyword) )
1380: 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  {.      jointype
1390: 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20   |= JT_ERROR;.  
13a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13b0: 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20  .  }.  if(.     
13c0: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
13d0: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29  INNER|JT_OUTER))
13e0: 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  ==(JT_INNER|JT_O
13f0: 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a  UTER) ||.     (j
1400: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52  ointype & JT_ERR
1410: 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  OR)!=0.  ){.    
1420: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20  const char *zSp 
1430: 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72  = " ";.    asser
1440: 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20  t( pB!=0 );.    
1450: 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70  if( pC==0 ){ zSp
1460: 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65  ++; }.    sqlite
1470: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1480: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e  , "unknown or un
1490: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
14a0: 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25  ype: ".       "%
14b0: 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70  T %T%s%T", pA, p
14c0: 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20  B, zSp, pC);.   
14d0: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49   jointype = JT_I
14e0: 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NNER;.  }else if
14f0: 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  ( (jointype & JT
1500: 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20  _OUTER)!=0 .    
1510: 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79 70       && (jointyp
1520: 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  e & (JT_LEFT|JT_
1530: 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54  RIGHT))!=JT_LEFT
1540: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1550: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1560: 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e  .      "RIGHT an
1570: 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49  d FULL OUTER JOI
1580: 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65  Ns are not curre
1590: 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29  ntly supported")
15a0: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
15b0: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20   JT_INNER;.  }. 
15c0: 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65   return jointype
15d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
15e0: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  n the index of a
15f0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62   column in a tab
1600: 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  le.  Return -1 i
1610: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  f the column.** 
1620: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
1630: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
1640: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  /.static int col
1650: 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a  umnIndex(Table *
1660: 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  pTab, const char
1670: 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69   *zCol){.  int i
1680: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1690: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
16a0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
16b0: 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43  StrICmp(pTab->aC
16c0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  ol[i].zName, zCo
16d0: 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  l)==0 ) return i
16e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
16f0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  1;.}../*.** Sear
1700: 63 68 20 74 68 65 20 66 69 72 73 74 20 4e 20 74  ch the first N t
1710: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20 66  ables in pSrc, f
1720: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
1730: 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  t, looking for a
1740: 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 68  .** table that h
1750: 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  as a column name
1760: 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20  d zCol.  .**.** 
1770: 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20  When found, set 
1780: 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43 6f  *piTab and *piCo
1790: 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69  l to the table i
17a0: 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  ndex and column 
17b0: 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20  index.** of the 
17c0: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
17d0: 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45 2e  and return TRUE.
17e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f  .**.** If not fo
17f0: 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c 53  und, return FALS
1800: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
1810: 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
1820: 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74 20  ndex(.  SrcList 
1830: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20  *pSrc,       /* 
1840: 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73 20  Array of tables 
1850: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
1860: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
1870: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1880: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2d   tables in pSrc-
1890: 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20 2a  >a[] to search *
18a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
18b0: 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  zCol,    /* Name
18c0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77   of the column w
18d0: 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f  e are looking fo
18e0: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61  r */.  int *piTa
18f0: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  b,          /* W
1900: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
1910: 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a  rc->a[] here */.
1920: 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20    int *piCol    
1930: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1940: 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61  index of pSrc->a
1950: 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61  [*piTab].pTab->a
1960: 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b  Col[] here */.){
1970: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1980: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1990: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
19a0: 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  es in pSrc */.  
19b0: 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
19c0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
19d0: 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67   column matching
19e0: 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65   zCol */..  asse
19f0: 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d  rt( (piTab==0)==
1a00: 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f  (piCol==0) );  /
1a10: 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65  * Both or neithe
1a20: 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  r are NULL */.  
1a30: 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b  for(i=0; i<N; i+
1a40: 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63  +){.    iCol = c
1a50: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d  olumnIndex(pSrc-
1a60: 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c  >a[i].pTab, zCol
1a70: 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  );.    if( iCol>
1a80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1a90: 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  piTab ){.       
1aa0: 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20 20   *piTab = i;.   
1ab0: 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43       *piCol = iC
1ac0: 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ol;.      }.    
1ad0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1ae0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1b00: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1b10: 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69 6d   to add terms im
1b20: 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73 79  plied by JOIN sy
1b30: 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57  ntax to the.** W
1b40: 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
1b50: 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45  ession of a SELE
1b60: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  CT statement. Th
1b70: 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69 63  e new term, whic
1b80: 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77 69  h.** is ANDed wi
1b90: 74 68 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  th the existing 
1ba0: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 73  WHERE clause, is
1bb0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
1bc0: 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f 6c  .**    (tab1.col
1bd0: 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a  1 = tab2.col2).*
1be0: 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31 20  *.** where tab1 
1bf0: 69 73 20 74 68 65 20 69 53 72 63 27 74 68 20 74  is the iSrc'th t
1c00: 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74 20  able in SrcList 
1c10: 70 53 72 63 20 61 6e 64 20 74 61 62 32 20 69 73  pSrc and tab2 is
1c20: 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31   the .** (iSrc+1
1c30: 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c  )'th. Column col
1c40: 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  1 is column iCol
1c50: 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61 6e  Left of tab1, an
1c60: 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c  d col2 is.** col
1c70: 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f 66  umn iColRight of
1c80: 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63   tab2..*/.static
1c90: 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65   void addWhereTe
1ca0: 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
1cb0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
1cc0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
1cd0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
1ce0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d00: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
1d10: 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  in FROM clause *
1d20: 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20 20  /.  int iLeft,  
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1d50: 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20 6a  first table to j
1d60: 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  oin in pSrc */. 
1d70: 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20   int iColLeft,  
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
1da0: 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61 62  umn in first tab
1db0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67  le */.  int iRig
1dc0: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
1dd0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1de0: 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   of second table
1df0: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
1e00: 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20 20  t iColRight,    
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e20: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
1e30: 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   in second table
1e40: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65   */.  int isOute
1e50: 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20 20  rJoin,          
1e60: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e70: 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54 45   this is an OUTE
1e80: 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72  R join */.  Expr
1e90: 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20 20   **ppWhere      
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1eb0: 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52 45  N/OUT: The WHERE
1ec0: 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20 74   clause to add t
1ed0: 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  o */.){.  sqlite
1ee0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1ef0: 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31 3b  db;.  Expr *pE1;
1f00: 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20 20  .  Expr *pE2;.  
1f10: 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73  Expr *pEq;..  as
1f20: 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69 67  sert( iLeft<iRig
1f30: 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ht );.  assert( 
1f40: 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68  pSrc->nSrc>iRigh
1f50: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
1f60: 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54  Src->a[iLeft].pT
1f70: 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ab );.  assert( 
1f80: 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e  pSrc->a[iRight].
1f90: 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d  pTab );..  pE1 =
1fa0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f   sqlite3CreateCo
1fb0: 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72  lumnExpr(db, pSr
1fc0: 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65  c, iLeft, iColLe
1fd0: 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c  ft);.  pE2 = sql
1fe0: 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e  ite3CreateColumn
1ff0: 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69  Expr(db, pSrc, i
2000: 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68 74  Right, iColRight
2010: 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c 69  );..  pEq = sqli
2020: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2030: 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45 32   TK_EQ, pE1, pE2
2040: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45 71 20  , 0);.  if( pEq 
2050: 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29  && isOuterJoin )
2060: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
2070: 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 46 72  perty(pEq, EP_Fr
2080: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73  omJoin);.    ass
2090: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
20a0: 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 54 6f  perty(pEq, EP_To
20b0: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
20c0: 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53  ed) );.    ExprS
20d0: 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
20e0: 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  q, EP_NoReduce);
20f0: 0a 20 20 20 20 70 45 71 2d 3e 69 52 69 67 68 74  .    pEq->iRight
2100: 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36  JoinTable = (i16
2110: 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  )pE2->iTable;.  
2120: 7d 0a 20 20 2a 70 70 57 68 65 72 65 20 3d 20 73  }.  *ppWhere = s
2130: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
2140: 2c 20 2a 70 70 57 68 65 72 65 2c 20 70 45 71 29  , *ppWhere, pEq)
2150: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
2160: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
2170: 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74  roperty on all t
2180: 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65  erms of the give
2190: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  n expression..**
21a0: 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70   And set the Exp
21b0: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
21c0: 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20  e to iTable for 
21d0: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
21e0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  e.** expression.
21f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72  .**.** The EP_Fr
2200: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
2210: 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73  is used on terms
2220: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
2230: 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65  n to tell.** the
2240: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
2250: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
2260: 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d  c that this term
2270: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   is part of the.
2280: 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74  ** join restrict
2290: 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e  ion specified in
22a0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
22b0: 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20   clause and not 
22c0: 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  a part.** of the
22d0: 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48   more general WH
22e0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ERE clause.  The
22f0: 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76  se terms are mov
2300: 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a  ed over to the.*
2310: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64  * WHERE clause d
2320: 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65  uring join proce
2330: 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65  ssing but we nee
2340: 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
2350: 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69  at they.** origi
2360: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
2370: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
2380: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e  .**.** The Expr.
2390: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
23a0: 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20  tells the WHERE 
23b0: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
23c0: 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78  g that the.** ex
23d0: 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73  pression depends
23e0: 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74   on table iRight
23f0: 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69  JoinTable even i
2400: 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20  f that table is 
2410: 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c  not.** explicitl
2420: 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  y mentioned in t
2430: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  he expression.  
2440: 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  That information
2450: 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f   is needed.** fo
2460: 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69  r cases like thi
2470: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  s:.**.**    SELE
2480: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
2490: 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
24a0: 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d  a=t2.b AND t1.x=
24b0: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72  5.**.** The wher
24c0: 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74  e clause needs t
24d0: 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  o defer the hand
24e0: 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78  ling of the t1.x
24f0: 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c  =5.** term until
2500: 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f   after the t2 lo
2510: 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  op of the join. 
2520: 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a   In that way, a.
2530: 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77  ** NULL t2 row w
2540: 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
2550: 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35  whenever t1.x!=5
2560: 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a  .  If we do not.
2570: 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  ** defer the han
2580: 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c  dling of t1.x=5,
2590: 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63   it will be proc
25a0: 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  essed immediatel
25b0: 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74  y.** after the t
25c0: 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20  1 loop and rows 
25d0: 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c  with t1.x!=5 wil
25e0: 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69  l never appear i
25f0: 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c  n.** the output,
2600: 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72   which is incorr
2610: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
2620: 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  oid setJoinExpr(
2630: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61  Expr *p, int iTa
2640: 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  ble){.  while( p
2650: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
2660: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
2670: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73  omJoin);.    ass
2680: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2690: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
26a0: 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
26b0: 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74  ) );.    ExprSet
26c0: 56 56 41 50 72 6f 70 65 72 74 79 28 70 2c 20 45  VVAProperty(p, E
26d0: 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
26e0: 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61   p->iRightJoinTa
26f0: 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c  ble = (i16)iTabl
2700: 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78  e;.    setJoinEx
2710: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  pr(p->pLeft, iTa
2720: 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  ble);.    p = p-
2730: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
2740: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2750: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
2760: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
2770: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
2780: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
2790: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
27a0: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
27b0: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
27c0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
27d0: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
27e0: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
27f0: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
2800: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
2810: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66  .** The terms of
2820: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61   a FROM clause a
2830: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
2840: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20  the Select.pSrc 
2850: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68  structure..** Th
2860: 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c  e left most tabl
2870: 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65  e is the first e
2880: 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70  ntry in Select.p
2890: 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d  Src.  The right-
28a0: 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73  most.** table is
28b0: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e   the last entry.
28c0: 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61    The join opera
28d0: 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74  tor is held in t
28e0: 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74  he entry to.** t
28f0: 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65  he left.  Thus e
2900: 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20  ntry 0 contains 
2910: 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
2920: 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62  r for the join b
2930: 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65  etween.** entrie
2940: 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20  s 0 and 1.  Any 
2950: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2960: 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ses associated w
2970: 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65  ith the join are
2980: 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65  .** also attache
2990: 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e  d to the left en
29a0: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
29b0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
29c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
29d0: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
29e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29f0: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
2a00: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
2a10: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
2a20: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a40: 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  * All tables in 
2a50: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2a60: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2a90: 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63  nters */.  struc
2aa0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2ab0: 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65  pLeft;     /* Le
2ac0: 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ft table being j
2ad0: 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  oined */.  struc
2ae0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2af0: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69  pRight;    /* Ri
2b00: 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  ght table being 
2b10: 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  joined */..  pSr
2b20: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  c = p->pSrc;.  p
2b30: 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Left = &pSrc->a[
2b40: 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26  0];.  pRight = &
2b50: 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28  pLeft[1];.  for(
2b60: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
2b70: 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74  c-1; i++, pRight
2b80: 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20  ++, pLeft++){.  
2b90: 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61    Table *pLeftTa
2ba0: 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b  b = pLeft->pTab;
2bb0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67  .    Table *pRig
2bc0: 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e  htTab = pRight->
2bd0: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73  pTab;.    int is
2be0: 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Outer;..    if( 
2bf0: 4e 45 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d  NEVER(pLeftTab==
2c00: 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d  0 || pRightTab==
2c10: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
2c20: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
2c30: 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  ight->jointype &
2c40: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a   JT_OUTER)!=0;..
2c50: 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20      /* When the 
2c60: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20  NATURAL keyword 
2c70: 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20  is present, add 
2c80: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
2c90: 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76  ms for.    ** ev
2ca0: 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ery column that 
2cb0: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68  the two tables h
2cc0: 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20  ave in common.. 
2cd0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
2ce0: 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  ight->jointype &
2cf0: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20   JT_NATURAL ){. 
2d00: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
2d10: 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e  >pOn || pRight->
2d20: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
2d30: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2d40: 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54  g(pParse, "a NAT
2d50: 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f  URAL join may no
2d60: 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20  t have ".       
2d70: 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53      "an ON or US
2d80: 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b  ING clause", 0);
2d90: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2da0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
2db0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67   for(j=0; j<pRig
2dc0: 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  htTab->nCol; j++
2dd0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
2de0: 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d  *zName;   /* Nam
2df0: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  e of column in t
2e00: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a  he right table *
2e10: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c  /.        int iL
2e20: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63  eft;     /* Matc
2e30: 68 69 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20  hing left table 
2e40: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
2e50: 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74  LeftCol;  /* Mat
2e60: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20  ching column in 
2e70: 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a  the left table *
2e80: 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  /..        zName
2e90: 20 3d 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43   = pRightTab->aC
2ea0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
2eb0: 20 20 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e       if( tableAn
2ec0: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
2ed0: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
2ee0: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
2ef0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
2f00: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
2f10: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
2f20: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
2f30: 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j,.             
2f40: 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74 65            isOute
2f50: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  r, &p->pWhere);.
2f60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f70: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2f80: 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e  Disallow both ON
2f90: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
2fa0: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
2fb0: 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oin.    */.    i
2fc0: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26  f( pRight->pOn &
2fd0: 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  & pRight->pUsing
2fe0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2ff0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3000: 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62  , "cannot have b
3010: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
3020: 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75   ".        "clau
3030: 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ses in the same 
3040: 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  join");.      re
3050: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  turn 1;.    }.. 
3060: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e     /* Add the ON
3070: 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65   clause to the e
3080: 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
3090: 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65  clause, connecte
30a0: 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41  d by.    ** an A
30b0: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  ND operator..   
30c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
30d0: 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20  ht->pOn ){.     
30e0: 20 69 66 28 20 69 73 4f 75 74 65 72 20 29 20 73   if( isOuter ) s
30f0: 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68  etJoinExpr(pRigh
3100: 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e  t->pOn, pRight->
3110: 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
3120: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
3130: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
3140: 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  e->db, p->pWhere
3150: 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a  , pRight->pOn);.
3160: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f        pRight->pO
3170: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
3180: 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72    /* Create extr
3190: 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57  a terms on the W
31a0: 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
31b0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  each column name
31c0: 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  d.    ** in the 
31d0: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45  USING clause.  E
31e0: 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74  xample: If the t
31f0: 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  wo tables to be 
3200: 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20  joined are .    
3210: 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74  ** A and B and t
3220: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
3230: 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20  names X, Y, and 
3240: 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73  Z, then add this
3250: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57  .    ** to the W
3260: 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20  HERE clause:    
3270: 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d  A.X=B.X AND A.Y=
3280: 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a  B.Y AND A.Z=B.Z.
3290: 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e      ** Report an
32a0: 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f   error if any co
32b0: 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69  lumn mentioned i
32c0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
32d0: 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  se is.    ** not
32e0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f   contained in bo
32f0: 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  th tables to be 
3300: 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  joined..    */. 
3310: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3320: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49  Using ){.      I
3330: 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  dList *pList = p
3340: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20  Right->pUsing;. 
3350: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
3360: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  pList->nId; j++)
3370: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
3380: 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61  zName;     /* Na
3390: 6d 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69  me of the term i
33a0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
33b0: 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  se */.        in
33c0: 74 20 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f  t iLeft;       /
33d0: 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  * Table on the l
33e0: 65 66 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e  eft with matchin
33f0: 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  g column name */
3400: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
3410: 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c  ftCol;    /* Col
3420: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  umn number of ma
3430: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e  tching column on
3440: 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
3450: 20 20 20 20 20 69 6e 74 20 69 52 69 67 68 74 43       int iRightC
3460: 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  ol;   /* Column 
3470: 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  number of matchi
3480: 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65  ng column on the
3490: 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20   right */..     
34a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74     zName = pList
34b0: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
34c0: 20 20 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20        iRightCol 
34d0: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52  = columnIndex(pR
34e0: 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b  ightTab, zName);
34f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52 69  .        if( iRi
3500: 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20  ghtCol<0.       
3510: 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f    || !tableAndCo
3520: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
3530: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
3540: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20  ft, &iLeftCol). 
3550: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
3560: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3570: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
3580: 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63  not join using c
3590: 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d  olumn %s - colum
35a0: 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ".            
35b0: 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20  "not present in 
35c0: 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e  both tables", zN
35d0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
35e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
35f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57    }.        addW
3600: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
3610: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
3620: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69  eftCol, i+1, iRi
3630: 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  ghtCol,.        
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
3650: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
3660: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
3670: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
3680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
3690: 20 63 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74   code into "v" t
36a0: 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68  hat will push th
36b0: 65 20 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20  e record on the 
36c0: 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74  top of the.** st
36d0: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72  ack into the sor
36e0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
36f0: 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74  oid pushOntoSort
3700: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
3710: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
3720: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
3730: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
3740: 72 64 65 72 42 79 2c 20 20 20 20 2f 2a 20 54 68  rderBy,    /* Th
3750: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
3760: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
3770: 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a  Select,       /*
3780: 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43   The whole SELEC
3790: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
37a0: 20 69 6e 74 20 72 65 67 44 61 74 61 20 20 20 20   int regData    
37b0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
37c0: 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ter holding data
37d0: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f   to be sorted */
37e0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
37f0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
3800: 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4f 72   int nExpr = pOr
3810: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
3820: 69 6e 74 20 72 65 67 42 61 73 65 20 3d 20 73 71  int regBase = sq
3830: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
3840: 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b  e(pParse, nExpr+
3850: 32 29 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63  2);.  int regRec
3860: 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
3870: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
3880: 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 73 71 6c  .  int op;.  sql
3890: 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
38a0: 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  ar(pParse);.  sq
38b0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
38c0: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
38d0: 72 64 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c  rderBy, regBase,
38e0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
38f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
3900: 65 71 75 65 6e 63 65 2c 20 70 4f 72 64 65 72 42  equence, pOrderB
3910: 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67  y->iECursor, reg
3920: 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20 73  Base+nExpr);.  s
3930: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
3940: 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 44 61  ve(pParse, regDa
3950: 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70  ta, regBase+nExp
3960: 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  r+1, 1);.  sqlit
3970: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
3980: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
3990: 65 67 42 61 73 65 2c 20 6e 45 78 70 72 20 2b 20  egBase, nExpr + 
39a0: 32 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  2, regRecord);. 
39b0: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 73 65   if( pSelect->se
39c0: 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 53  lFlags & SF_UseS
39d0: 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20  orter ){.    op 
39e0: 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72  = OP_SorterInser
39f0: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
3a00: 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72  op = OP_IdxInser
3a10: 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  t;.  }.  sqlite3
3a20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
3a30: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
3a40: 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 29  rsor, regRecord)
3a50: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
3a60: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
3a70: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
3a80: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
3a90: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
3aa0: 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72 2b 32  regBase, nExpr+2
3ab0: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  );.  if( pSelect
3ac0: 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
3ad0: 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
3ae0: 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74  ;.    int iLimit
3af0: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  ;.    if( pSelec
3b00: 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20 20  t->iOffset ){.  
3b10: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65      iLimit = pSe
3b20: 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 3b  lect->iOffset+1;
3b30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3b40: 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65    iLimit = pSele
3b50: 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  ct->iLimit;.    
3b60: 7d 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  }.    addr1 = sq
3b70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
3b80: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c  v, OP_IfZero, iL
3b90: 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  imit);.    sqlit
3ba0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3bb0: 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c 69 6d 69  OP_AddImm, iLimi
3bc0: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  t, -1);.    addr
3bd0: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
3be0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
3bf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3c00: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
3c10: 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr1);.    sqlite
3c20: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
3c30: 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79  P_Last, pOrderBy
3c40: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
3c50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3c60: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
3c70: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
3c80: 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  sor);.    sqlite
3c90: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
3ca0: 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a   addr2);.  }.}..
3cb0: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
3cc0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
3cd0: 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63  OFFSET.*/.static
3ce0: 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74   void codeOffset
3cf0: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
3d00: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
3d10: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
3d20: 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20   VM */.  Select 
3d30: 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *p,        /* Th
3d40: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
3d50: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
3d60: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
3d70: 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65  e     /* Jump he
3d80: 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63  re to skip the c
3d90: 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f  urrent record */
3da0: 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66  .){.  if( p->iOf
3db0: 66 73 65 74 20 26 26 20 69 43 6f 6e 74 69 6e 75  fset && iContinu
3dc0: 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e!=0 ){.    int 
3dd0: 61 64 64 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  addr;.    sqlite
3de0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3df0: 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66  P_AddImm, p->iOf
3e00: 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61  fset, -1);.    a
3e10: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
3e20: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
3e30: 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29  Neg, p->iOffset)
3e40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3e50: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
3e60: 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65  to, 0, iContinue
3e70: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
3e80: 6e 74 28 28 76 2c 20 22 73 6b 69 70 20 4f 46 46  nt((v, "skip OFF
3e90: 53 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a  SET records"));.
3ea0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
3eb0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
3ec0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
3ed0: 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  dd code that wil
3ee0: 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  l check to make 
3ef0: 73 75 72 65 20 74 68 65 20 4e 20 72 65 67 69 73  sure the N regis
3f00: 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74  ters starting at
3f10: 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20   iMem.** form a 
3f20: 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20  distinct entry. 
3f30: 20 69 54 61 62 20 69 73 20 61 20 73 6f 72 74 69   iTab is a sorti
3f40: 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f  ng index that ho
3f50: 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  lds previously.*
3f60: 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69  * seen combinati
3f70: 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c  ons of the N val
3f80: 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72  ues.  A new entr
3f90: 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61  y is made in iTa
3fa0: 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72  b.** if the curr
3fb0: 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65  ent N values are
3fc0: 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75   new..**.** A ju
3fd0: 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65 61 74  mp to addrRepeat
3fe0: 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65   is made and the
3ff0: 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20   N+1 values are 
4000: 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a  popped from the.
4010: 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20  ** stack if the 
4020: 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61  top N elements a
4030: 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e  re not distinct.
4040: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4050: 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20  codeDistinct(.  
4060: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4070: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
4080: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
4090: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
40a0: 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20  nt iTab,        
40b0: 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69    /* A sorting i
40c0: 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65 73  ndex used to tes
40d0: 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65  t for distinctne
40e0: 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ss */.  int addr
40f0: 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75  Repeat,    /* Ju
4100: 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f  mp to here if no
4110: 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  t distinct */.  
4120: 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20  int N,          
4130: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4140: 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  elements */.  in
4150: 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20  t iMem          
4160: 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e   /* First elemen
4170: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
4180: 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20  v;.  int r1;..  
4190: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
41a0: 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65  e;.  r1 = sqlite
41b0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
41c0: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  se);.  sqlite3Vd
41d0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
41e0: 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61  P_Found, iTab, a
41f0: 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c  ddrRepeat, iMem,
4200: 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   N);.  sqlite3Vd
4210: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
4220: 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c  akeRecord, iMem,
4230: 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74   N, r1);.  sqlit
4240: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4250: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54  OP_IdxInsert, iT
4260: 61 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74  ab, r1);.  sqlit
4270: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
4280: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
4290: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
42a0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
42b0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
42c0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68  error message wh
42d0: 65 6e 20 61 20 53 45 4c 45 43 54 20 69 73 20 75  en a SELECT is u
42e0: 73 65 64 20 77 69 74 68 69 6e 20 61 20 73 75 62  sed within a sub
42f0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65  expression.** (e
4300: 78 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28  xample:  "a IN (
4310: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61  SELECT * FROM ta
4320: 62 6c 65 29 22 29 20 62 75 74 20 69 74 20 68 61  ble)") but it ha
4330: 73 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65  s more than 1 re
4340: 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20  sult.** column. 
4350: 20 57 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61   We do this in a
4360: 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61   subroutine beca
4370: 75 73 65 20 74 68 65 20 65 72 72 6f 72 20 75 73  use the error us
4380: 65 64 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 69  ed to occur.** i
4390: 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65  n multiple place
43a0: 73 2e 20 20 28 54 68 65 20 65 72 72 6f 72 20 6f  s.  (The error o
43b0: 6e 6c 79 20 6f 63 63 75 72 73 20 69 6e 20 6f 6e  nly occurs in on
43c0: 65 20 70 6c 61 63 65 20 6e 6f 77 2c 20 62 75 74  e place now, but
43d0: 20 77 65 0a 2a 2a 20 72 65 74 61 69 6e 20 74 68   we.** retain th
43e0: 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  e subroutine to 
43f0: 6d 69 6e 69 6d 69 7a 65 20 63 6f 64 65 20 64 69  minimize code di
4400: 73 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74  sruption.).*/.st
4410: 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f  atic int checkFo
4420: 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65  rMultiColumnSele
4430: 63 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65  ctError(.  Parse
4440: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
4450: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
4460: 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
4470: 74 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44  t *pDest,   /* D
4480: 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45  estination of SE
4490: 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a  LECT results */.
44a0: 20 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20    int nExpr     
44b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
44c0: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
44d0: 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  ns returned by S
44e0: 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ELECT */.){.  in
44f0: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
4500: 3e 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45  >eDest;.  if( nE
4510: 78 70 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d  xpr>1 && (eDest=
4520: 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73  =SRT_Mem || eDes
4530: 74 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20  t==SRT_Set) ){. 
4540: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4550: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79  sg(pParse, "only
4560: 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
4570: 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20   allowed for ". 
4580: 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20        "a SELECT 
4590: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
45a0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b  an expression");
45b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
45c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
45d0: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  rn 0;.  }.}.#end
45e0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  if../*.** An ins
45f0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
4600: 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73  lowing object is
4610: 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20   used to record 
4620: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
4630: 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72 6f 63  t.** how to proc
4640: 65 73 73 20 74 68 65 20 44 49 53 54 49 4e 43 54  ess the DISTINCT
4650: 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73 69 6d   keyword, to sim
4660: 70 6c 69 66 79 20 70 61 73 73 69 6e 67 20 74 68  plify passing th
4670: 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  at information.*
4680: 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 6c 65 63  * into the selec
4690: 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72 6f 75  tInnerLoop() rou
46a0: 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tine..*/.typedef
46b0: 20 73 74 72 75 63 74 20 44 69 73 74 69 6e 63 74   struct Distinct
46c0: 43 74 78 20 44 69 73 74 69 6e 63 74 43 74 78 3b  Ctx DistinctCtx;
46d0: 0a 73 74 72 75 63 74 20 44 69 73 74 69 6e 63 74  .struct Distinct
46e0: 43 74 78 20 7b 0a 20 20 75 38 20 69 73 54 6e 63  Ctx {.  u8 isTnc
46f0: 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  t;      /* True 
4700: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
4710: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
4720: 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e 63 74  nt */.  u8 eTnct
4730: 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f  Type;   /* One o
4740: 66 20 74 68 65 20 57 48 45 52 45 5f 44 49 53 54  f the WHERE_DIST
4750: 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f 72 73  INCT_* operators
4760: 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54 6e 63   */.  int tabTnc
4770: 74 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d 65 72  t;    /* Ephemer
4780: 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f  al table used fo
4790: 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65  r DISTINCT proce
47a0: 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 61  ssing */.  int a
47b0: 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20 41 64  ddrTnct;   /* Ad
47c0: 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
47d0: 45 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f 64 65  Ephemeral opcode
47e0: 20 66 6f 72 20 74 61 62 54 6e 63 74 20 2a 2f 0a   for tabTnct */.
47f0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  };../*.** This r
4800: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
4810: 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68   the code for th
4820: 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20  e inside of the 
4830: 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
4840: 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a   a SELECT..**.**
4850: 20 49 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e   If srcTab and n
4860: 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20  Column are both 
4870: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
4880: 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  EList expression
4890: 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74  s.** are evaluat
48a0: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ed in order to g
48b0: 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  et the data for 
48c0: 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43  this row.  If nC
48d0: 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20  olumn>0.** then 
48e0: 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66  data is pulled f
48f0: 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70  rom srcTab and p
4900: 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e  EList is used on
4910: 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a  ly to get the.**
4920: 20 64 61 74 61 74 79 70 65 73 20 66 6f 72 20 65   datatypes for e
4930: 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73  ach column..*/.s
4940: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
4950: 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61  tInnerLoop(.  Pa
4960: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4970: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
4980: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
4990: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
49a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
49b0: 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20  complete select 
49c0: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
49d0: 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  coded */.  ExprL
49e0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
49f0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61     /* List of va
4a00: 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74 72 61  lues being extra
4a10: 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72  cted */.  int sr
4a20: 63 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  cTab,           
4a30: 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66    /* Pull data f
4a40: 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a  rom this table *
4a50: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4a70: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
4a80: 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74   in the source t
4a90: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
4aa0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
4ab0: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
4ac0: 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75  , sort results u
4ad0: 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f  sing this key */
4ae0: 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a  .  DistinctCtx *
4af0: 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66  pDistinct, /* If
4b00: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
4b10: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
4b20: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
4b30: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
4b40: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
4b50: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
4b60: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
4b70: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
4b80: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4b90: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
4ba0: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
4bb0: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
4bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
4bd0: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
4be0: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
4bf0: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
4c00: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
4c10: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
4c20: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
4c30: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
4c40: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
4c50: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
4c60: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  sent */.  int re
4c70: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
4c80: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
4c90: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
4ca0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
4cb0: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
4cc0: 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20  st->eDest;   /* 
4cd0: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
4ce0: 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  f results */.  i
4cf0: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
4d00: 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69  ->iSDParm; /* Fi
4d10: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
4d20: 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
4d30: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  */.  int nResult
4d40: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
4d50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
4d60: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
4d70: 0a 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a  .  assert( v );.
4d80: 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
4d90: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  ) ) return;.  as
4da0: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
4db0: 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74  );.  hasDistinct
4dc0: 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70   = pDistinct ? p
4dd0: 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54  Distinct->eTnctT
4de0: 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54  ype : WHERE_DIST
4df0: 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28  INCT_NOOP;.  if(
4e00: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20   pOrderBy==0 && 
4e10: 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  !hasDistinct ){.
4e20: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
4e30: 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , p, iContinue);
4e40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20  .  }..  /* Pull 
4e50: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
4e60: 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  lumns..  */.  if
4e70: 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20  ( nColumn>0 ){. 
4e80: 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20     nResultCol = 
4e90: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65  nColumn;.  }else
4ea0: 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c  {.    nResultCol
4eb0: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
4ec0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65 73  ;.  }.  if( pDes
4ed0: 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20  t->iSdst==0 ){. 
4ee0: 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20     pDest->iSdst 
4ef0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
4f00: 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64  ;.    pDest->nSd
4f10: 73 74 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  st = nResultCol;
4f20: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
4f30: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
4f40: 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61  .  }else{ .    a
4f50: 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 6e 53  ssert( pDest->nS
4f60: 64 73 74 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20  dst==nResultCol 
4f70: 29 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 73 75  );.  }.  regResu
4f80: 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73  lt = pDest->iSds
4f90: 74 3b 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e  t;.  if( nColumn
4fa0: 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  >0 ){.    for(i=
4fb0: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
4fc0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
4fd0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4fe0: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
4ff0: 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  , i, regResult+i
5000: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
5010: 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
5020: 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a  Exists ){.    /*
5030: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
5040: 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53  ion is an EXISTS
5050: 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
5060: 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20  , the actual.   
5070: 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72   ** values retur
5080: 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
5090: 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72  T are not requir
50a0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
50b0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
50c0: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
50d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
50e0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
50f0: 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73  , pEList, regRes
5100: 75 6c 74 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f  ult, eDest==SRT_
5110: 4f 75 74 70 75 74 29 3b 0a 20 20 7d 0a 20 20 6e  Output);.  }.  n
5120: 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74  Column = nResult
5130: 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Col;..  /* If th
5140: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
5150: 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f  rd was present o
5160: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
5170: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20  tement.  ** and 
5180: 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65  this row has bee
5190: 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74  n seen before, t
51a0: 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20  hen do not make 
51b0: 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61  this row.  ** pa
51c0: 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
51d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73  ..  */.  if( has
51e0: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
51f0: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
5200: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
5210: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
5220: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 73  nColumn );.    s
5230: 77 69 74 63 68 28 20 70 44 69 73 74 69 6e 63 74  witch( pDistinct
5240: 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20  ->eTnctType ){. 
5250: 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
5260: 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
5270: 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  : {.        Vdbe
5280: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20  Op *pOp;        
5290: 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72      /* No longer
52a0: 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70   required OpenEp
52b0: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a  hemeral instr. *
52c0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a  /.        int iJ
52d0: 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  ump;            
52e0: 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e    /* Jump destin
52f0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
5300: 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
5310: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
5320: 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74  ious row content
5330: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
5340: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
5350: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  or the previous 
5360: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  row */.        r
5370: 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
5380: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
5390: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
53a0: 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20   nColumn;..     
53b0: 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65     /* Change the
53c0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
53d0: 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20  l coded earlier 
53e0: 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20  to an OP_Null.  
53f0: 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68        ** sets th
5400: 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69  e MEM_Cleared bi
5410: 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72  t on the first r
5420: 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20  egister of the. 
5430: 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
5440: 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  us value.  This 
5450: 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f  will cause the O
5460: 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c  P_Ne below to al
5470: 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ways.        ** 
5480: 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73  fail on the firs
5490: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
54a0: 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20  he loop even if 
54b0: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
54c0: 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20    ** row is all 
54d0: 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a  NULLs..        *
54e0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
54f0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
5500: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
5510: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
5520: 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
5530: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69  VdbeGetOp(v, pDi
5540: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
5550: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  );.        pOp->
5560: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c  opcode = OP_Null
5570: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
5580: 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  1 = 1;.        p
5590: 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76  Op->p2 = regPrev
55a0: 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70  ;..        iJump
55b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
55c0: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e  rrentAddr(v) + n
55d0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
55e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
55f0: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
5600: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
5610: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
5620: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
5630: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
5640: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  pr);.          i
5650: 66 28 20 69 3c 6e 43 6f 6c 75 6d 6e 2d 31 20 29  f( i<nColumn-1 )
5660: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
5670: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5680: 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73  v, OP_Ne, regRes
5690: 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65  ult+i, iJump, re
56a0: 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20  gPrev+i);.      
56b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
56c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
56d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
56e0: 71 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  q, regResult+i, 
56f0: 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72  iContinue, regPr
5700: 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ev+i);.         
5710: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
5720: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
5730: 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63  (v, -1, (const c
5740: 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
5750: 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
5760: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
5770: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
5780: 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
5790: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
57a0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
57b0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d  CurrentAddr(v)==
57c0: 69 4a 75 6d 70 20 29 3b 0a 20 20 20 20 20 20 20  iJump );.       
57d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
57e0: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
57f0: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
5800: 76 2c 20 6e 43 6f 6c 75 6d 6e 2d 31 29 3b 0a 20  v, nColumn-1);. 
5810: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5820: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
5830: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
5840: 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20  _UNIQUE: {.     
5850: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
5860: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44  angeToNoop(v, pD
5870: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
5880: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
5890: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
58a0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
58b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 69       assert( pDi
58c0: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
58d0: 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  e==WHERE_DISTINC
58e0: 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20  T_UNORDERED );. 
58f0: 20 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69         codeDisti
5900: 6e 63 74 28 70 50 61 72 73 65 2c 20 70 44 69 73  nct(pParse, pDis
5910: 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20  tinct->tabTnct, 
5920: 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75  iContinue, nColu
5930: 6d 6e 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a  mn, regResult);.
5940: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5950: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5960: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
5970: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
5980: 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74  fset(v, p, iCont
5990: 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  inue);.    }.  }
59a0: 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ..  switch( eDes
59b0: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
59c0: 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  his mode, write 
59d0: 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c  each query resul
59e0: 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20  t to the key of 
59f0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
5a00: 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d    ** table iParm
5a10: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
5a20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
5a30: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20  POUND_SELECT.   
5a40: 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a   case SRT_Union:
5a50: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
5a60: 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
5a70: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
5a80: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
5a90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5aa0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5ab0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c   regResult, nCol
5ac0: 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  umn, r1);.      
5ad0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5ae0: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
5af0: 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t, iParm, r1);. 
5b00: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
5b10: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5b20: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
5b30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
5b40: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
5b50: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
5b60: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
5b70: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
5b80: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
5b90: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
5ba0: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
5bb0: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
5bc0: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
5bd0: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
5be0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5bf0: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
5c00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5c10: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
5c20: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72  Delete, iParm, r
5c30: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5c40: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
5c50: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
5c60: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
5c70: 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
5c80: 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
5c90: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
5ca0: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
5cb0: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
5cc0: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
5cd0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
5ce0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
5cf0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
5d00: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c   eDest==SRT_Tabl
5d10: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
5d20: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
5d30: 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20  EphemTab );.    
5d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5d50: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
5d60: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
5d70: 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20   nColumn, r1);. 
5d80: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
5d90: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
5da0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
5db0: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c  se, pOrderBy, p,
5dc0: 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   r1);.      }els
5dd0: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
5de0: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
5df0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
5e00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5e10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
5e20: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
5e30: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
5e40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5e50: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
5e60: 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
5e70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5e80: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
5e90: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
5ea0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
5eb0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5ec0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
5ed0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
5ee0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5ef0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
5f00: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
5f10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5f20: 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
5f30: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
5f40: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
5f50: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
5f60: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
5f70: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
5f80: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
5f90: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
5fa0: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
5fb0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
5fc0: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
5fd0: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
5fe0: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
5ff0: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
6000: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
6010: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
6020: 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73     pDest->affSds
6030: 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t =.            
6040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
6050: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c  pareAffinity(pEL
6060: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
6070: 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29   pDest->affSdst)
6080: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
6090: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
60a0: 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e  /* At first glan
60b0: 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69  ce you would thi
60c0: 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69  nk we could opti
60d0: 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20  mize out the.   
60e0: 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
60f0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69   in this case si
6100: 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66  nce the order of
6110: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
6120: 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  set.        ** d
6130: 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20  oes not matter. 
6140: 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74   But there might
6150: 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   be a LIMIT clau
6160: 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20  se, in which.   
6170: 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65       ** case the
6180: 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74   order does matt
6190: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  er */.        pu
61a0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
61b0: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
61c0: 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  , regResult);.  
61d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
61e0: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
61f0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
6200: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
6210: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
6220: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
6230: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 31 2c 72  d, regResult,1,r
6240: 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64  1, &pDest->affSd
6250: 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  st, 1);.        
6260: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
6270: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
6280: 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74  Parse, regResult
6290: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
62a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
62b0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
62c0: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
62d0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
62e0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
62f0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r1);.      }.
6300: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6310: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   }..    /* If an
6320: 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74  y row exist in t
6330: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72  he result set, r
6340: 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20  ecord that fact 
6350: 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a  and abort..    *
6360: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
6370: 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73  xists: {.      s
6380: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6390: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
63a0: 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  1, iParm);.     
63b0: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
63c0: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
63d0: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
63e0: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
63f0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
6400: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
6410: 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
6420: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
6430: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
6440: 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
6450: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
6460: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
6470: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65  ory cell and bre
6480: 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  ak out.    ** of
6490: 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
64a0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
64b0: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
64c0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
64d0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
64e0: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
64f0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
6500: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
6510: 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75  erBy, p, regResu
6520: 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lt);.      }else
6530: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6540: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
6550: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
6560: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
6570: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
6580: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
6590: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
65a0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
65b0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
65c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
65d0: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
65e0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
65f0: 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68  ..    /* Send th
6600: 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61  e data to the ca
6610: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
6620: 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  or to a subrouti
6630: 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20  ne.  In the.    
6640: 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73 75 62  ** case of a sub
6650: 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62  routine, the sub
6660: 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69  routine itself i
6670: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
6680: 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67  r.    ** popping
6690: 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74   the data from t
66a0: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f  he stack..    */
66b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
66c0: 72 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63 61 73  routine:.    cas
66d0: 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 0a  e SRT_Output: {.
66e0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
66f0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
6700: 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  tine );.      te
6710: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
6720: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
6730: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
6740: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
6750: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
6760: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
6770: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6780: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
6790: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
67a0: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72  sult, nColumn, r
67b0: 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68  1);.        push
67c0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
67d0: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20  e, pOrderBy, p, 
67e0: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r1);.        sql
67f0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
6800: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
6810: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6820: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
6830: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tine ){.        
6840: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6850: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
6860: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
6870: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6880: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6890: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
68a0: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
68b0: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
68c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
68d0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
68e0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
68f0: 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  esult, nColumn);
6900: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6910: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
6920: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6930: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20  _OMIT_TRIGGER). 
6940: 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
6950: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73  e results.  This
6960: 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c   is used for SEL
6970: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
6980: 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  nside.    ** the
6990: 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47   body of a TRIGG
69a0: 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65  ER.  The purpose
69b0: 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73   of such selects
69c0: 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20   is to call.    
69d0: 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ** user-defined 
69e0: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68  functions that h
69f0: 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73  ave side effects
6a00: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72  .  We do not car
6a10: 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74  e.    ** about t
6a20: 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74  he actual result
6a30: 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  s of the select.
6a40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
6a50: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
6a60: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
6a70: 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20  Discard );.     
6a80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
6a90: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  ndif.  }..  /* J
6aa0: 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
6ab0: 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
6ac0: 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
6ad0: 65 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a  ed.  Except, if.
6ae0: 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20    ** there is a 
6af0: 73 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68  sorter, in which
6b00: 20 63 61 73 65 20 74 68 65 20 73 6f 72 74 65 72   case the sorter
6b10: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d   has already lim
6b20: 69 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75  ited.  ** the ou
6b30: 74 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a  tput for us..  *
6b40: 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
6b50: 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69 74  ==0 && p->iLimit
6b60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
6b70: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6b80: 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  IfZero, p->iLimi
6b90: 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b 0a  t, iBreak, -1);.
6ba0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
6bb0: 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  ocate a KeyInfo 
6bc0: 6f 62 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e  object sufficien
6bd0: 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f  t for an index o
6be0: 66 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20  f N key columns 
6bf0: 61 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61 20 63  and.** X extra c
6c00: 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e  olumns..*/.KeyIn
6c10: 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e  fo *sqlite3KeyIn
6c20: 66 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20  foAlloc(sqlite3 
6c30: 2a 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20  *db, int N, int 
6c40: 58 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  X){.  KeyInfo *p
6c50: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
6c60: 6f 63 5a 65 72 6f 28 30 2c 20 0a 20 20 20 20 20  ocZero(0, .     
6c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
6c80: 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20  zeof(KeyInfo) + 
6c90: 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f  (N+X)*(sizeof(Co
6ca0: 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20 69  llSeq*)+1));.  i
6cb0: 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  f( p ){.    p->a
6cc0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
6cd0: 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b  )&p->aColl[N+X];
6ce0: 0a 20 20 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  .    p->nField =
6cf0: 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e   (u16)N;.    p->
6d00: 6e 58 46 69 65 6c 64 20 3d 20 28 75 31 36 29 58  nXField = (u16)X
6d10: 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45  ;.    p->enc = E
6d20: 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64  NC(db);.    p->d
6d30: 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e  b = db;.    p->n
6d40: 52 65 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Ref = 1;.  }else
6d50: 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  {.    db->malloc
6d60: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
6d70: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
6d80: 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
6d90: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
6da0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6db0: 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79  KeyInfoUnref(Key
6dc0: 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20  Info *p){.  if( 
6dd0: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
6de0: 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20   p->nRef>0 );.  
6df0: 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20    p->nRef--;.   
6e00: 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20   if( p->nRef==0 
6e10: 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  ) sqlite3_free(p
6e20: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6e30: 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74  Make a new point
6e40: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
6e50: 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66  object.*/.KeyInf
6e60: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
6e70: 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29  oRef(KeyInfo *p)
6e80: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
6e90: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
6ea0: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  >0 );.    p->nRe
6eb0: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  f++;.  }.  retur
6ec0: 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n p;.}..#ifdef S
6ed0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
6ee0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
6ef0: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
6f00: 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e  t can be change.
6f10: 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62    The KeyInfo ob
6f20: 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79  ject.** can only
6f30: 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20 74   be changed if t
6f40: 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73 69  his is just a si
6f50: 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74  ngle reference t
6f60: 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a  o the object..**
6f70: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6f80: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e   is used only in
6f90: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
6fa0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
6fb0: 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  int sqlite3KeyIn
6fc0: 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65  foIsWriteable(Ke
6fd0: 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72  yInfo *p){ retur
6fe0: 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a  n p->nRef==1; }.
6ff0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7000: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
7010: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
7020: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
7030: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
7040: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
7050: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
7060: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
7070: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
7080: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
7090: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
70a0: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
70b0: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
70c0: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
70d0: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
70e0: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
70f0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
7100: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
7110: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
7120: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
7130: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
7140: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
7150: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
7160: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
7170: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
7180: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
7190: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
71a0: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
71b0: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
71c0: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
71d0: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
71e0: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
71f0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
7200: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
7210: 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20   is obtain from 
7220: 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c  malloc.  The cal
7230: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
7240: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
7250: 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20  for seeing that 
7260: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
7270: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
7280: 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  freed..*/.static
7290: 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66   KeyInfo *keyInf
72a0: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 50 61  oFromExprList(Pa
72b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
72c0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
72d0: 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65   int nExpr;.  Ke
72e0: 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20  yInfo *pInfo;.  
72f0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
7300: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
7310: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
7320: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
7330: 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69  ;..  nExpr = pLi
7340: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
7350: 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
7360: 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78  nfoAlloc(db, nEx
7370: 70 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 49  pr, 1);.  if( pI
7380: 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nfo ){.    asser
7390: 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
73a0: 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 49 6e  oIsWriteable(pIn
73b0: 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  fo) );.    for(i
73c0: 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
73d0: 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  >a; i<nExpr; i++
73e0: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
73f0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
7400: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ;.      pColl = 
7410: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
7420: 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
7430: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
7440: 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
7450: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
7460: 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  ll;.      pInfo-
7470: 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c  >aColl[i] = pCol
7480: 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  l;.      pInfo->
7490: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
74a0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
74b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
74c0: 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 23  turn pInfo;.}..#
74d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
74e0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
74f0: 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66  CT./*.** Name of
7500: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
7510: 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66  operator, used f
7520: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
7530: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s..*/.static con
7540: 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f  st char *selectO
7550: 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20  pName(int id){. 
7560: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74   char *z;.  swit
7570: 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61  ch( id ){.    ca
7580: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20  se TK_ALL:      
7590: 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22   z = "UNION ALL"
75a0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
75b0: 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
75c0: 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54  : z = "INTERSECT
75d0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
75e0: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20  case TK_EXCEPT: 
75f0: 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b     z = "EXCEPT";
7600: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7610: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
7620: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b      z = "UNION";
7630: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7640: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
7650: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7660: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
7670: 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65  ELECT */..#ifnde
7680: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
7690: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65  PLAIN./*.** Unle
76a0: 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51  ss an "EXPLAIN Q
76b0: 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61  UERY PLAN" comma
76c0: 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63  nd is being proc
76d0: 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63  essed, this func
76e0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  tion.** is a no-
76f0: 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  op. Otherwise, i
7700: 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20  t adds a single 
7710: 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f  row of output to
7720: 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c   the EQP result,
7730: 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61  .** where the ca
7740: 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ption is of the 
7750: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55  form:.**.**   "U
7760: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
7770: 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68  OR xxx".**.** wh
7780: 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f  ere xxx is one o
7790: 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f  f "DISTINCT", "O
77a0: 52 44 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f  RDER BY" or "GRO
77b0: 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20  UP BY". Exactly 
77c0: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65  which.** is dete
77d0: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55  rmined by the zU
77e0: 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  sage argument..*
77f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
7800: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50  plainTempTable(P
7810: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
7820: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65  nst char *zUsage
7830: 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
7840: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
7850: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
7860: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
7870: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c  char *zMsg = sql
7880: 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
7890: 73 65 2d 3e 64 62 2c 20 22 55 53 45 20 54 45 4d  se->db, "USE TEM
78a0: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73 22  P B-TREE FOR %s"
78b0: 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20 20 20 73  , zUsage);.    s
78c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
78d0: 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
78e0: 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
78f0: 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50  d, 0, 0, zMsg, P
7900: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
7910: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
7920: 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f 20  expression b to 
7930: 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63 6f  lvalue a. A seco
7940: 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69  nd, no-op, versi
7950: 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f  on of this macro
7960: 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20  .** is provided 
7970: 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54  when SQLITE_OMIT
7980: 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66 69  _EXPLAIN is defi
7990: 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73  ned. This allows
79a0: 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20   the code.** in 
79b0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
79c0: 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65 73  to assign values
79d0: 20 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d 65   to structure me
79e0: 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 74  mber variables t
79f0: 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73  hat.** only exis
7a00: 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  t if SQLITE_OMIT
7a10: 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20  _EXPLAIN is not 
7a20: 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74 20  defined without 
7a30: 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a  polluting the.**
7a40: 20 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e 64   code with #ifnd
7a50: 65 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a  ef directives..*
7a60: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
7a70: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c 20  inSetInteger(a, 
7a80: 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a  b) a = b..#else.
7a90: 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e  /* No-op version
7aa0: 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e  s of the explain
7ab0: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  XXX() functions 
7ac0: 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23  and macros. */.#
7ad0: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 54   define explainT
7ae0: 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20  empTable(y,z).# 
7af0: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65  define explainSe
7b00: 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23 65  tInteger(y,z).#e
7b10: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
7b20: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ed(SQLITE_OMIT_E
7b30: 58 50 4c 41 49 4e 29 20 26 26 20 21 64 65 66 69  XPLAIN) && !defi
7b40: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7b50: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29  COMPOUND_SELECT)
7b60: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e  ./*.** Unless an
7b70: 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20   "EXPLAIN QUERY 
7b80: 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73  PLAN" command is
7b90: 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
7ba0: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
7bb0: 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  ** is a no-op. O
7bc0: 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64  therwise, it add
7bd0: 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
7be0: 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20  f output to the 
7bf0: 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77  EQP result,.** w
7c00: 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e  here the caption
7c10: 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68   is of one of th
7c20: 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a  e two forms:.**.
7c30: 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20  **   "COMPOSITE 
7c40: 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62 31  SUBQUERIES iSub1
7c50: 20 61 6e 64 20 69 53 75 62 32 20 28 6f 70 29 22   and iSub2 (op)"
7c60: 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45  .**   "COMPOSITE
7c70: 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62   SUBQUERIES iSub
7c80: 31 20 61 6e 64 20 69 53 75 62 32 20 55 53 49 4e  1 and iSub2 USIN
7c90: 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20 28 6f  G TEMP B-TREE (o
7ca0: 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  p)".**.** where 
7cb0: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
7cc0: 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 73  are the integers
7cd0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 63   passed as the c
7ce0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
7cf0: 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74  function paramet
7d00: 65 72 73 2c 20 61 6e 64 20 6f 70 20 69 73 20 74  ers, and op is t
7d10: 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65 6e  he text represen
7d20: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  tation of the pa
7d30: 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68  rameter.** of th
7d40: 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68 65  e same name. The
7d50: 20 70 61 72 61 6d 65 74 65 72 20 22 6f 70 22 20   parameter "op" 
7d60: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 54  must be one of T
7d70: 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
7d80: 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52 53  PT,.** TK_INTERS
7d90: 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20 54  ECT or TK_ALL. T
7da0: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69 73  he first form is
7db0: 20 75 73 65 64 20 69 66 20 61 72 67 75 6d 65 6e   used if argumen
7dc0: 74 20 62 55 73 65 54 6d 70 20 69 73 20 0a 2a 2a  t bUseTmp is .**
7dd0: 20 66 61 6c 73 65 2c 20 6f 72 20 74 68 65 20 73   false, or the s
7de0: 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69 74  econd form if it
7df0: 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
7e00: 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
7e10: 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50 61 72  Composite(.  Par
7e20: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
7e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e40: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
7e50: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e70: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f     /* One of TK_
7e80: 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54  UNION, TK_EXCEPT
7e90: 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   etc. */.  int i
7ea0: 53 75 62 31 2c 20 20 20 20 20 20 20 20 20 20 20  Sub1,           
7eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
7ec0: 62 71 75 65 72 79 20 69 64 20 31 20 2a 2f 0a 20  bquery id 1 */. 
7ed0: 20 69 6e 74 20 69 53 75 62 32 2c 20 20 20 20 20   int iSub2,     
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ef0: 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20   /* Subquery id 
7f00: 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65 54  2 */.  int bUseT
7f10: 6d 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  mp              
7f20: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
7f30: 66 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20 77  f a temp table w
7f40: 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20  as used */.){.  
7f50: 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 55  assert( op==TK_U
7f60: 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45  NION || op==TK_E
7f70: 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  XCEPT || op==TK_
7f80: 49 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f 70 3d  INTERSECT || op=
7f90: 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28  =TK_ALL );.  if(
7fa0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
7fb0: 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ==2 ){.    Vdbe 
7fc0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
7fd0: 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  be;.    char *zM
7fe0: 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
7ff0: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70 50 61  ntf(.        pPa
8000: 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f 55  rse->db, "COMPOU
8010: 4e 44 20 53 55 42 51 55 45 52 49 45 53 20 25 64  ND SUBQUERIES %d
8020: 20 41 4e 44 20 25 64 20 25 73 28 25 73 29 22 2c   AND %d %s(%s)",
8030: 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 0a 20   iSub1, iSub2,. 
8040: 20 20 20 20 20 20 20 62 55 73 65 54 6d 70 3f 22         bUseTmp?"
8050: 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
8060: 45 20 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f 70  E ":"", selectOp
8070: 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b 0a  Name(op).    );.
8080: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8090: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
80a0: 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
80b0: 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d  lectId, 0, 0, zM
80c0: 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
80d0: 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20  .  }.}.#else./* 
80e0: 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f  No-op versions o
80f0: 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58  f the explainXXX
8100: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  () functions and
8110: 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65   macros. */.# de
8120: 66 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d 70  fine explainComp
8130: 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a 29  osite(v,w,x,y,z)
8140: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
8150: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
8160: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75   was generated u
8170: 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20  sing a non-null 
8180: 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e  pOrderBy argumen
8190: 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  t,.** then the r
81a0: 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63  esults were plac
81b0: 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20  ed in a sorter. 
81c0: 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20   After the loop 
81d0: 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  is terminated.**
81e0: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20   we need to run 
81f0: 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f  the sorter and o
8200: 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74  utput the result
8210: 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
8220: 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  g.** routine gen
8230: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
8240: 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61  needed to do tha
8250: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
8260: 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61  d generateSortTa
8270: 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  il(.  Parse *pPa
8280: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
8290: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
82a0: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
82b0: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
82c0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56  statement */.  V
82d0: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
82e0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
82f0: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45  e into this VDBE
8300: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
8310: 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  n,      /* Numbe
8320: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
8330: 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
8340: 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57  Dest *pDest /* W
8350: 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20  rite the sorted 
8360: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
8370: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65  ){.  int addrBre
8380: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
8390: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 20  MakeLabel(v);   
83a0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
83b0: 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20  o exit loop */. 
83c0: 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75   int addrContinu
83d0: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
83e0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a  akeLabel(v);  /*
83f0: 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e   Jump here for n
8400: 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  ext cycle */.  i
8410: 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69  nt addr;.  int i
8420: 54 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64  Tab;.  int pseud
8430: 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72  oTab = 0;.  Expr
8440: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
8450: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20   p->pOrderBy;.. 
8460: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
8470: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74  st->eDest;.  int
8480: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
8490: 69 53 44 50 61 72 6d 3b 0a 0a 20 20 69 6e 74 20  iSDParm;..  int 
84a0: 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65  regRow;.  int re
84b0: 67 52 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62 20  gRowid;..  iTab 
84c0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  = pOrderBy->iECu
84d0: 72 73 6f 72 3b 0a 20 20 72 65 67 52 6f 77 20 3d  rsor;.  regRow =
84e0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
84f0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  eg(pParse);.  if
8500: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
8510: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
8520: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
8530: 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20 70     pseudoTab = p
8540: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
8550: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8560: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
8570: 73 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61 62  seudo, pseudoTab
8580: 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d  , regRow, nColum
8590: 6e 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 69 64  n);.    regRowid
85a0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
85b0: 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71     regRowid = sq
85c0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
85d0: 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 69  pParse);.  }.  i
85e0: 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
85f0: 20 53 46 5f 55 73 65 53 6f 72 74 65 72 20 29 7b   SF_UseSorter ){
8600: 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f 72 74  .    int regSort
8610: 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Out = ++pParse->
8620: 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 70 74  nMem;.    int pt
8630: 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
8640: 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  ab++;.    sqlite
8650: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8660: 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 74  P_OpenPseudo, pt
8670: 61 62 32 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  ab2, regSortOut,
8680: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
8690: 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  +2);.    addr = 
86a0: 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
86b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
86c0: 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64  erSort, iTab, ad
86d0: 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 63 6f  drBreak);.    co
86e0: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 61  deOffset(v, p, a
86f0: 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  ddrContinue);.  
8700: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8710: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
8720: 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65 67 53  Data, iTab, regS
8730: 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  ortOut);.    sql
8740: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8750: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 74 61  , OP_Column, pta
8760: 62 32 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  b2, pOrderBy->nE
8770: 78 70 72 2b 31 2c 20 72 65 67 52 6f 77 29 3b 0a  xpr+1, regRow);.
8780: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
8790: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
87a0: 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a 20  G_CLEARCACHE);. 
87b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
87c0: 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
87d0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
87e0: 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42  ort, iTab, addrB
87f0: 72 65 61 6b 29 3b 0a 20 20 20 20 63 6f 64 65 4f  reak);.    codeO
8800: 66 66 73 65 74 28 76 2c 20 70 2c 20 61 64 64 72  ffset(v, p, addr
8810: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73  Continue);.    s
8820: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8830: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
8840: 54 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  Tab, pOrderBy->n
8850: 45 78 70 72 2b 31 2c 20 72 65 67 52 6f 77 29 3b  Expr+1, regRow);
8860: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65  .  }.  switch( e
8870: 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65  Dest ){.    case
8880: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
8890: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
88a0: 62 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  b: {.      testc
88b0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
88c0: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74  Table );.      t
88d0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
88e0: 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a  SRT_EphemTab );.
88f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8900: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
8910: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
8920: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
8930: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8940: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
8950: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72  iParm, regRow, r
8960: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
8970: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8980: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
8990: 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65  PEND);.      bre
89a0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
89b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
89c0: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
89d0: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
89e0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
89f0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
8a00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
8a10: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
8a20: 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67 52   regRow, 1, regR
8a30: 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20  owid,.          
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
8a50: 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31  Dest->affSdst, 1
8a60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8a70: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
8a80: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
8a90: 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20  regRow, 1);.    
8aa0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8ab0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
8ac0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
8ad0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65  owid);.      bre
8ae0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
8af0: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
8b00: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
8b10: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
8b20: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
8b30: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  ove(pParse, regR
8b40: 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  ow, iParm, 1);. 
8b50: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
8b60: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
8b70: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
8b80: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
8b90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
8ba0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
8bb0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  : {.      int i;
8bc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
8bd0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
8be0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
8bf0: 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20  oroutine ); .   
8c00: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
8c10: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
8c20: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8c30: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
8c40: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
8c50: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
8c60: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
8c70: 20 20 61 73 73 65 72 74 28 20 72 65 67 52 6f 77    assert( regRow
8c80: 21 3d 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 69  !=pDest->iSdst+i
8c90: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
8ca0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8cb0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65 75   OP_Column, pseu
8cc0: 64 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74 2d  doTab, i, pDest-
8cd0: 3e 69 53 64 73 74 2b 69 29 3b 0a 20 20 20 20 20  >iSdst+i);.     
8ce0: 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20     if( i==0 ){. 
8cf0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8d00: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
8d10: 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48  OPFLAG_CLEARCACH
8d20: 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  E);.        }.  
8d30: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8d40: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
8d50: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
8d60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8d70: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
8d80: 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43  pDest->iSdst, nC
8d90: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
8da0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
8db0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
8dc0: 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53  Parse, pDest->iS
8dd0: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
8de0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8df0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8e00: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
8e10: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
8e20: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
8e30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8e40: 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
8e50: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
8e60: 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73 71  e, regRow);.  sq
8e70: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
8e80: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
8e90: 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  owid);..  /* The
8ea0: 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c   bottom of the l
8eb0: 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
8ec0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
8ed0: 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e  el(v, addrContin
8ee0: 75 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65  ue);.  if( p->se
8ef0: 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 53  lFlags & SF_UseS
8f00: 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  orter ){.    sql
8f10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8f20: 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
8f30: 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20   iTab, addr);.  
8f40: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
8f50: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8f60: 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
8f70: 64 64 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ddr);.  }.  sqli
8f80: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
8f90: 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
8fa0: 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  );.  if( eDest==
8fb0: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
8fc0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
8fd0: 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ne ){.    sqlite
8fe0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8ff0: 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f 54  P_Close, pseudoT
9000: 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ab, 0);.  }.}../
9010: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
9020: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
9030: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  g containing the
9040: 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79   'declaration ty
9050: 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78  pe' of the.** ex
9060: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
9070: 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62  The string may b
9080: 65 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61  e treated as sta
9090: 74 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65  tic by the calle
90a0: 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72  r..**.** Also tr
90b0: 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  y to estimate th
90c0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65  e size of the re
90d0: 74 75 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64  turned value and
90e0: 20 72 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20   return that.** 
90f0: 72 65 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57  result in *pEstW
9100: 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  idth..**.** The 
9110: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
9120: 20 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61   is the exact da
9130: 74 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f  tatype definitio
9140: 6e 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  n extracted from
9150: 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
9160: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
9170: 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65  atement if the e
9180: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
9190: 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65  olumn. The.** de
91a0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
91b0: 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64  or a ROWID field
91c0: 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61   is INTEGER. Exa
91d0: 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70  ctly when an exp
91e0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  ression.** is co
91f0: 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d  nsidered a colum
9200: 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78  n can be complex
9210: 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65   in the presence
9220: 20 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20   of subqueries. 
9230: 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65  The.** result-se
9240: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  t expression in 
9250: 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
9260: 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74  wing SELECT stat
9270: 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f  ements is .** co
9280: 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d  nsidered a colum
9290: 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  n by this functi
92a0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  on..**.**   SELE
92b0: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
92c0: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
92d0: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
92e0: 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28  l;.**   SELECT (
92f0: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
9300: 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  tbl);.**   SELEC
9310: 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45  T abc FROM (SELE
9320: 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52  CT col AS abc FR
9330: 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20  OM tbl);.** .** 
9340: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
9350: 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70  type for any exp
9360: 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68  ression other th
9370: 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e  an a column is N
9380: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
9390: 72 6f 75 74 69 6e 65 20 68 61 73 20 65 69 74 68  routine has eith
93a0: 65 72 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65  er 3 or 6 parame
93b0: 74 65 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  ters depending o
93c0: 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
93d0: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45  .** the SQLITE_E
93e0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
93f0: 41 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69  ADATA compile-ti
9400: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65  me option is use
9410: 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  d..*/.#ifdef SQL
9420: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
9430: 4e 5f 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66  N_METADATA.# def
9440: 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41  ine columnType(A
9450: 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75  ,B,C,D,E,F) colu
9460: 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43  mnTypeImpl(A,B,C
9470: 2c 44 2c 45 2c 46 29 0a 73 74 61 74 69 63 20 63  ,D,E,F).static c
9480: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
9490: 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d  nTypeImpl(.  Nam
94a0: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a  eContext *pNC, .
94b0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20    Expr *pExpr,. 
94c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
94d0: 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20  OrigDb,.  const 
94e0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62  char **pzOrigTab
94f0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
9500: 2a 70 7a 4f 72 69 67 43 6f 6c 2c 0a 20 20 75 38  *pzOrigCol,.  u8
9510: 20 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a 20   *pEstWidth.){. 
9520: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
9530: 69 67 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72  igDb = 0;.  char
9540: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62   const *zOrigTab
9550: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
9560: 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  st *zOrigCol = 0
9570: 3b 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 21 64  ;.#else /* if !d
9580: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
9590: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
95a0: 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e  DATA) */.# defin
95b0: 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42  e columnType(A,B
95c0: 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e  ,C,D,E,F) column
95d0: 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 46 29 0a  TypeImpl(A,B,F).
95e0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
95f0: 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  r *columnTypeImp
9600: 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  l(.  NameContext
9610: 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a   *pNC, .  Expr *
9620: 70 45 78 70 72 2c 0a 20 20 75 38 20 2a 70 45 73  pExpr,.  u8 *pEs
9630: 74 57 69 64 74 68 0a 29 7b 0a 23 65 6e 64 69 66  tWidth.){.#endif
9640: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
9650: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
9660: 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 20  N_METADATA) */. 
9670: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79   char const *zTy
9680: 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b  pe = 0;.  int j;
9690: 0a 20 20 75 38 20 65 73 74 57 69 64 74 68 20 3d  .  u8 estWidth =
96a0: 20 31 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52   1;..  if( NEVER
96b0: 28 70 45 78 70 72 3d 3d 30 29 20 7c 7c 20 70 4e  (pExpr==0) || pN
96c0: 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20 29  C->pSrcList==0 )
96d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69   return 0;.  swi
96e0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
96f0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
9700: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
9710: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
9720: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
9730: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
9740: 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20  umn. Locate the 
9750: 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e  table the column
9760: 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20   is being.      
9770: 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ** extracted fro
9780: 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74  m in NameContext
9790: 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20  .pSrcList. This 
97a0: 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61  table may be rea
97b0: 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  l.      ** datab
97c0: 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73  ase table or a s
97d0: 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a  ubquery..      *
97e0: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
97f0: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
9800: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72      /* Table str
9810: 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73  ucture column is
9820: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
9830: 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
9840: 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *pS = 0;        
9850: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74       /* Select t
9860: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  he column is ext
9870: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
9880: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
9890: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20  pExpr->iColumn; 
98a0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
98b0: 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20  umn in pTab */. 
98c0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
98d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
98e0: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
98f0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
9900: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
9910: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
9920: 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a  pNC && !pTab ){.
9930: 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20          SrcList 
9940: 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d  *pTabList = pNC-
9950: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20  >pSrcList;.     
9960: 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61     for(j=0;j<pTa
9970: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
9980: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
9990: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
99a0: 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20  able;j++);.     
99b0: 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73     if( j<pTabLis
99c0: 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20  t->nSrc ){.     
99d0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
99e0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
99f0: 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20  .          pS = 
9a00: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
9a10: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
9a20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
9a30: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
9a40: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
9a50: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
9a60: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
9a70: 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d     /* At one tim
9a80: 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20  e, code such as 
9a90: 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77  "SELECT new.x" w
9aa0: 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20  ithin a trigger 
9ab0: 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  would.        **
9ac0: 20 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64   cause this cond
9ad0: 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53  ition to run.  S
9ae0: 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61  ince then, we ha
9af0: 76 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20  ve restructured 
9b00: 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  how.        ** t
9b10: 72 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67  rigger code is g
9b20: 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20  enerated and so 
9b30: 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  this condition i
9b40: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20  s no longer .   
9b50: 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65       ** possible
9b60: 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61  . However, it ca
9b70: 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20  n still be true 
9b80: 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c  for statements l
9b90: 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ike.        ** t
9ba0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
9bb0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
9bc0: 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
9bd0: 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45  LE t1(col INTEGE
9be0: 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  R);.        **  
9bf0: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
9c00: 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f  t1.col) FROM FRO
9c10: 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a  M t1;.        **
9c20: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  .        ** when
9c30: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
9c40: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
9c50: 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f  xpression "t1.co
9c60: 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20  l" in the .     
9c70: 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74     ** sub-select
9c80: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
9c90: 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  set the column t
9ca0: 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65  ype to NULL, eve
9cb0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f  n.        ** tho
9cc0: 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65  ugh it should re
9cd0: 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52  ally be "INTEGER
9ce0: 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  "..        **.  
9cf0: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
9d00: 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20   not a problem, 
9d10: 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  as the column ty
9d20: 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69  pe of "t1.col" i
9d30: 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20  s never.        
9d40: 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f  ** used. When co
9d50: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
9d60: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
9d70: 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20  ession .        
9d80: 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63  ** "(SELECT t1.c
9d90: 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63  ol)", the correc
9da0: 74 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e  t type is return
9db0: 65 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53  ed (see the TK_S
9dc0: 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a  ELECT.        **
9dd0: 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20   branch below.  
9de0: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
9df0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
9e00: 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
9e10: 20 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54   pExpr->pTab==pT
9e20: 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ab );.      if( 
9e30: 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pS ){.        /*
9e40: 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20   The "table" is 
9e50: 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73  actually a sub-s
9e60: 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20  elect or a view 
9e70: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
9e80: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  se.        ** of
9e90: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
9ea0: 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68  ement. Return th
9eb0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
9ec0: 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20  pe and origin.  
9ed0: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f        ** data fo
9ee0: 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  r the result-set
9ef0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73   column of the s
9f00: 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20  ub-select..     
9f10: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
9f20: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57  ( iCol>=0 && ALW
9f30: 41 59 53 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c  AYS(iCol<pS->pEL
9f40: 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
9f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69           /* If i
9f60: 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  Col is less than
9f70: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
9f80: 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65  expression reque
9f90: 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  sts the.        
9fa0: 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68    ** rowid of th
9fb0: 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  e sub-select or 
9fc0: 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65  view. This expre
9fd0: 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28  ssion is legal (
9fe0: 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  see .          *
9ff0: 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63  * test case misc
a000: 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61  2.2.2) - it alwa
a010: 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  ys evaluates to 
a020: 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20  NULL..          
a030: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d  */.          Nam
a040: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
a050: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20          Expr *p 
a060: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
a070: 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20  iCol].pExpr;.   
a080: 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c         sNC.pSrcL
a090: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
a0a0: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e            sNC.pN
a0b0: 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20  ext = pNC;.     
a0c0: 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20       sNC.pParse 
a0d0: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
a0e0: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
a0f0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
a100: 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f  , p,&zOrigDb,&zO
a110: 72 69 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c  rigTab,&zOrigCol
a120: 2c 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20  , &estWidth); . 
a130: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
a140: 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
a150: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 20 29  pTab->pSchema) )
a160: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72  {.        /* A r
a170: 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  eal table */.   
a180: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
a190: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
a1a0: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
a1b0: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
a1c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
a1d0: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
a1e0: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
a1f0: 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66 20  nCol) );.#ifdef 
a200: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
a210: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
a220: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
a230: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
a240: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
a250: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
a260: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
a270: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
a280: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
a290: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
a2a0: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  .zType;.        
a2b0: 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61    zOrigCol = pTa
a2c0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
a2d0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65  ame;.          e
a2e0: 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e  stWidth = pTab->
a2f0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74  aCol[iCol].szEst
a300: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a310: 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70      zOrigTab = p
a320: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
a330: 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61      if( pNC->pPa
a340: 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rse ){.         
a350: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
a360: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
a370: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  pNC->pParse->db,
a380: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
a390: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
a3a0: 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  Db = pNC->pParse
a3b0: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
a3c0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Name;.        }.
a3d0: 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  #else.        if
a3e0: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
a3f0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49        zType = "I
a400: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20  NTEGER";.       
a410: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a420: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
a430: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
a440: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57  ;.          estW
a450: 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f  idth = pTab->aCo
a460: 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20  l[iCol].szEst;. 
a470: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
a480: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
a490: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
a4a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
a4b0: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
a4c0: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
a4d0: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
a4e0: 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73  ssion is a sub-s
a4f0: 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68  elect. Return th
a500: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
a510: 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  pe and.      ** 
a520: 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20  origin info for 
a530: 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  the single colum
a540: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
a550: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
a560: 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  T.      ** state
a570: 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
a580: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
a590: 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65   sNC;.      Sele
a5a0: 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e  ct *pS = pExpr->
a5b0: 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
a5c0: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
a5d0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
a5e0: 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
a5f0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
a600: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
a610: 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73  lect) );.      s
a620: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
a630: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e  ->pSrc;.      sN
a640: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
a650: 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20       sNC.pParse 
a660: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
a670: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
a680: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
a690: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
a6a0: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c  gTab, &zOrigCol,
a6b0: 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20   &estWidth); .  
a6c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a6d0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
a6e0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
a6f0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
a700: 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67  A  .  if( pzOrig
a710: 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Db ){.    assert
a720: 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70  ( pzOrigTab && p
a730: 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20  zOrigCol );.    
a740: 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69  *pzOrigDb = zOri
a750: 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  gDb;.    *pzOrig
a760: 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a  Tab = zOrigTab;.
a770: 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d      *pzOrigCol =
a780: 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23   zOrigCol;.  }.#
a790: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45 73 74  endif.  if( pEst
a7a0: 57 69 64 74 68 20 29 20 2a 70 45 73 74 57 69 64  Width ) *pEstWid
a7b0: 74 68 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20  th = estWidth;. 
a7c0: 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d   return zType;.}
a7d0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
a7e0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
a7f0: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
a800: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
a810: 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  pes of columns.*
a820: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
a830: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  set..*/.static v
a840: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
a850: 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65  mnTypes(.  Parse
a860: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
a870: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
a880: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
a890: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
a8a0: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
a8b0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
a8c0: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
a8d0: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
a8e0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
a8f0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
a900: 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
a910: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
a920: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
a930: 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
a940: 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63   sNC;.  sNC.pSrc
a950: 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
a960: 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20  .  sNC.pParse = 
a970: 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d  pParse;.  for(i=
a980: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
a990: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
a9a0: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
a9b0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
a9c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
a9d0: 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
a9e0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
a9f0: 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73  ETADATA.    cons
aa00: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20  t char *zOrigDb 
aa10: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
aa20: 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  har *zOrigTab = 
aa30: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
aa40: 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  r *zOrigCol = 0;
aa50: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
aa60: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
aa70: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
aa80: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c  gTab, &zOrigCol,
aa90: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65   0);..    /* The
aaa0: 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20   vdbe must make 
aab0: 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20  its own copy of 
aac0: 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20  the column-type 
aad0: 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a  and other .    *
aae0: 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69  * column specifi
aaf0: 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61  c strings, in ca
ab00: 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73  se the schema is
ab10: 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68   reset before th
ab20: 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61  is.    ** virtua
ab30: 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c  l machine is del
ab40: 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
ab50: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
ab60: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
ab70: 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a  NAME_DATABASE, z
ab80: 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54  OrigDb, SQLITE_T
ab90: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
aba0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
abb0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
abc0: 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54  ME_TABLE, zOrigT
abd0: 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ab, SQLITE_TRANS
abe0: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
abf0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
ac00: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43  (v, i, COLNAME_C
ac10: 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c  OLUMN, zOrigCol,
ac20: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
ac30: 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54  T);.#else.    zT
ac40: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
ac50: 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
ac60: 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0, 0);.#endif.  
ac70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
ac80: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
ac90: 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20  LNAME_DECLTYPE, 
aca0: 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52  zType, SQLITE_TR
acb0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65  ANSIENT);.  }.#e
acc0: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
acd0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43  (SQLITE_OMIT_DEC
ace0: 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  LTYPE) */.}../*.
acf0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
ad00: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
ad10: 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d  the VDBE the nam
ad20: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
ad30: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
ad40: 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  et.  This inform
ad50: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
ad60: 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20   provide the.** 
ad70: 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69  azCol[] values i
ad80: 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  n the callback..
ad90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
ada0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
adb0: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
adc0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
add0: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
ade0: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
adf0: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
ae00: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
ae10: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
ae20: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
ae30: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
ae40: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56  lt set */.){.  V
ae50: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
ae60: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c  >pVdbe;.  int i,
ae70: 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   j;.  sqlite3 *d
ae80: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
ae90: 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c    int fullNames,
aea0: 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69   shortNames;..#i
aeb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
aec0: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49  T_EXPLAIN.  /* I
aed0: 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50  f this is an EXP
aee0: 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20  LAIN, skip this 
aef0: 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50  step */.  if( pP
af00: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
af10: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
af20: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
af30: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
af40: 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30  et || NEVER(v==0
af50: 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ) || db->mallocF
af60: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
af70: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
af80: 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c  esSet = 1;.  ful
af90: 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  lNames = (db->fl
afa0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
afb0: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  lColNames)!=0;. 
afc0: 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64   shortNames = (d
afd0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
afe0: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
aff0: 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  !=0;.  sqlite3Vd
b000: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
b010: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
b020: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
b030: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
b040: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20  {.    Expr *p;. 
b050: 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61     p = pEList->a
b060: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
b070: 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
b080: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
b090: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  f( pEList->a[i].
b0a0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63  zName ){.      c
b0b0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
b0c0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
b0d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b0e0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
b0f0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
b100: 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54   zName, SQLITE_T
b110: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
b120: 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d  else if( (p->op=
b130: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d  =TK_COLUMN || p-
b140: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
b150: 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74 20  MN) && pTabList 
b160: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
b170: 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72  pTab;.      char
b180: 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e   *zCol;.      in
b190: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c  t iCol = p->iCol
b1a0: 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  umn;.      for(j
b1b0: 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54 61  =0; ALWAYS(j<pTa
b1c0: 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b  bList->nSrc); j+
b1d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
b1e0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69  pTabList->a[j].i
b1f0: 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c  Cursor==p->iTabl
b200: 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  e ) break;.     
b210: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
b220: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
b230: 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20  c );.      pTab 
b240: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
b250: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  .pTab;.      if(
b260: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
b270: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
b280: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
b290: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
b2a0: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
b2b0: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66  Col) );.      if
b2c0: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
b2d0: 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69      zCol = "rowi
b2e0: 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d";.      }else{
b2f0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
b300: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
b310: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  .zName;.      }.
b320: 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74        if( !short
b330: 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61  Names && !fullNa
b340: 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  mes ){.        s
b350: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
b360: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
b370: 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20  ME_NAME, .      
b380: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53        sqlite3DbS
b390: 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  trDup(db, pEList
b3a0: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53  ->a[i].zSpan), S
b3b0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
b3c0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
b3d0: 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20  fullNames ){.   
b3e0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
b3f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e   = 0;.        zN
b400: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
b410: 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
b420: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
b430: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
b440: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
b450: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
b460: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
b470: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
b480: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b490: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b4a0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
b4b0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
b4c0: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
b4d0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a  SIENT);.      }.
b4e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b4f0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
b500: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
b510: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20  NAME_NAME, .    
b520: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53        sqlite3DbS
b530: 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  trDup(db, pEList
b540: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53  ->a[i].zSpan), S
b550: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
b560: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65      }.  }.  gene
b570: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
b580: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
b590: 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  , pEList);.}../*
b5a0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 61 6e 20 65  .** Given a an e
b5b0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28  xpression list (
b5c0: 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
b5d0: 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
b5e0: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
b5f0: 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20  form the result 
b600: 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20  set of a SELECT 
b610: 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75  statement) compu
b620: 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  te appropriate.*
b630: 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  * column names f
b640: 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  or a table that 
b650: 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
b660: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
b670: 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e  **.** All column
b680: 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75   names will be u
b690: 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  nique..**.** Onl
b6a0: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
b6b0: 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e  es are computed.
b6c0: 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20    Column.zType, 
b6d0: 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a  Column.zColl,.**
b6e0: 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64   and other field
b6f0: 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20  s of Column are 
b700: 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  zeroed..**.** Re
b710: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
b720: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61  n success.  If a
b730: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
b740: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
b750: 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69  .** store NULL i
b760: 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69  n *paCol and 0 i
b770: 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74  n *pnCol and ret
b780: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
b790: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b7a0: 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f  selectColumnsFro
b7b0: 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  mExprList(.  Par
b7c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
b7d0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
b7e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
b7f0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
b800: 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73       /* Expr lis
b810: 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  t from which to 
b820: 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61  derive column na
b830: 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e  mes */.  i16 *pn
b840: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
b850: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
b860: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
b870: 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  here */.  Column
b880: 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20   **paCol        
b890: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
b8a0: 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  ew column list h
b8b0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
b8c0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
b8d0: 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62  ->db;   /* Datab
b8e0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
b8f0: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
b900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b910: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
b920: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20   */.  int cnt;  
b930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b940: 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64    /* Index added
b950: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d   to make the nam
b960: 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f  e unique */.  Co
b970: 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f  lumn *aCol, *pCo
b980: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  l;        /* For
b990: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65   looping over re
b9a0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
b9b0: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b9d0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
b9e0: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
b9f0: 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a   set */.  Expr *
ba00: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
ba10: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
ba20: 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ion for a single
ba30: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a   result column *
ba40: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba60: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  /* Column name *
ba70: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20  /* Size of name 
baa0: 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20  in zName[] */.. 
bab0: 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20   if( pEList ){. 
bac0: 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74     nCol = pEList
bad0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43 6f  ->nExpr;.    aCo
bae0: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  l = sqlite3DbMal
baf0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
bb00: 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c  of(aCol[0])*nCol
bb10: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
bb20: 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65   aCol==0 );.  }e
bb30: 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
bb40: 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b  0;.    aCol = 0;
bb50: 0a 20 20 7d 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20  .  }.  *pnCol = 
bb60: 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d  nCol;.  *paCol =
bb70: 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d   aCol;..  for(i=
bb80: 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c  0, pCol=aCol; i<
bb90: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
bba0: 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61  +){.    /* Get a
bbb0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61  n appropriate na
bbc0: 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  me for the colum
bbd0: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d  n.    */.    p =
bbe0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
bbf0: 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e  Collate(pEList->
bc00: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
bc10: 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45   if( (zName = pE
bc20: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
bc30: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
bc40: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   If the column c
bc50: 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c  ontains an "AS <
bc60: 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75  name>" phrase, u
bc70: 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65  se <name> as the
bc80: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a   name */.      z
bc90: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
bca0: 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65  StrDup(db, zName
bcb0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
bcc0: 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78      Expr *pColEx
bcd0: 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54 68 65 20  pr = p;  /* The 
bce0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
bcf0: 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  is the result co
bd00: 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  lumn name */.   
bd10: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
bd20: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
bd30: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
bd40: 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
bd50: 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
bd60: 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54   pColExpr->op==T
bd70: 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20  K_DOT ){.       
bd80: 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c   pColExpr = pCol
bd90: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
bda0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
bdb0: 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  olExpr!=0 );.   
bdc0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
bdd0: 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ColExpr->op==TK_
bde0: 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59 53  COLUMN && ALWAYS
bdf0: 28 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 21  (pColExpr->pTab!
be00: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  =0) ){.        /
be10: 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73  * For columns us
be20: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
be30: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
be40: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f    int iCol = pCo
be50: 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  lExpr->iColumn;.
be60: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
be70: 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  ColExpr->pTab;. 
be80: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
be90: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
bea0: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
beb0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
bec0: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
bed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bee0: 20 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62    iCol>=0 ? pTab
bef0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
bf00: 6d 65 20 3a 20 22 72 6f 77 69 64 22 29 3b 0a 20  me : "rowid");. 
bf10: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
bf20: 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ColExpr->op==TK_
bf30: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ID ){.        as
bf40: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
bf50: 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72 2c  operty(pColExpr,
bf60: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
bf70: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
bf80: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
bf90: 64 62 2c 20 22 25 73 22 2c 20 70 43 6f 6c 45 78  db, "%s", pColEx
bfa0: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
bfb0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bfc0: 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f      /* Use the o
bfd0: 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20  riginal text of 
bfe0: 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65  the column expre
bff0: 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d  ssion as its nam
c000: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61  e */.        zNa
c010: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
c020: 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70 45  ntf(db, "%s", pE
c030: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
c040: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
c050: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
c060: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
c070: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
c080: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  (db, zName);.   
c090: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c0a0: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
c0b0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
c0c0: 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66  e is unique.  If
c0d0: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74   the name is not
c0e0: 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20   unique,.    ** 
c0f0: 61 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65 72  append a integer
c100: 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20   to the name so 
c110: 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20  that it becomes 
c120: 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20  unique..    */. 
c130: 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74     nName = sqlit
c140: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
c150: 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74  );.    for(j=cnt
c160: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
c170: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
c180: 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e  StrICmp(aCol[j].
c190: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  zName, zName)==0
c1a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
c1b0: 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20   *zNewName;.    
c1c0: 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
c1d0: 20 20 20 66 6f 72 28 6b 3d 6e 4e 61 6d 65 2d 31     for(k=nName-1
c1e0: 3b 20 6b 3e 31 20 26 26 20 73 71 6c 69 74 65 33  ; k>1 && sqlite3
c1f0: 49 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6b 5d  Isdigit(zName[k]
c200: 29 3b 20 6b 2d 2d 29 7b 7d 0a 20 20 20 20 20 20  ); k--){}.      
c210: 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6b 5d 3d 3d    if( zName[k]==
c220: 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6b 3b  ':' ) nName = k;
c230: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e  .        zName[n
c240: 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20  Name] = 0;.     
c250: 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71     zNewName = sq
c260: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
c270: 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c   "%s:%d", zName,
c280: 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20   ++cnt);.       
c290: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
c2a0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
c2b0: 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e     zName = zNewN
c2c0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  ame;.        j =
c2d0: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28   -1;.        if(
c2e0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61   zName==0 ) brea
c2f0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
c300: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  .    pCol->zName
c310: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20   = zName;.  }.  
c320: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
c330: 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28  iled ){.    for(
c340: 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  j=0; j<i; j++){.
c350: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
c360: 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e  ree(db, aCol[j].
c370: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
c380: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
c390: 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a  db, aCol);.    *
c3a0: 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a  paCol = 0;.    *
c3b0: 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72  pnCol = 0;.    r
c3c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
c3d0: 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  EM;.  }.  return
c3e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
c3f0: 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e  *.** Add type an
c400: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
c410: 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c  rmation to a col
c420: 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f  umn list based o
c430: 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74  n.** a SELECT st
c440: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20  atement..** .** 
c450: 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  The column list 
c460: 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20  presumably came 
c470: 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d  from selectColum
c480: 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69  nNamesFromExprLi
c490: 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c  st()..** The col
c4a0: 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c  umn list has onl
c4b0: 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70  y names, not typ
c4c0: 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73  es or collations
c4d0: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
c4e0: 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20  ne goes through 
c4f0: 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70  and adds the typ
c500: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
c510: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
c520: 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74  utine requires t
c530: 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69  hat all identifi
c540: 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ers in the SELEC
c550: 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62  T.** statement b
c560: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73  e resolved..*/.s
c570: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
c580: 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
c590: 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61  dCollation(.  Pa
c5a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
c5b0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
c5c0: 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62  ontexts */.  Tab
c5d0: 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
c5e0: 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e     /* Add column
c5f0: 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f   type informatio
c600: 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  n to this table 
c610: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
c620: 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45  lect       /* SE
c630: 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74  LECT used to det
c640: 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64  ermine types and
c650: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29   collations */.)
c660: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
c670: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
c680: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
c690: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
c6a0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
c6b0: 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  l;.  int i;.  Ex
c6c0: 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20  pr *p;.  struct 
c6d0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
c6e0: 3b 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20  ;.  u64 szAll = 
c6f0: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  0;..  assert( pS
c700: 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73  elect!=0 );.  as
c710: 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e  sert( (pSelect->
c720: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
c730: 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20  solved)!=0 );.  
c740: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
c750: 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ol==pSelect->pEL
c760: 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62  ist->nExpr || db
c770: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c780: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
c790: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
c7a0: 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  n;.  memset(&sNC
c7b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
c7c0: 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  );.  sNC.pSrcLis
c7d0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
c7e0: 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74  c;.  a = pSelect
c7f0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66  ->pEList->a;.  f
c800: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61  or(i=0, pCol=pTa
c810: 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d  b->aCol; i<pTab-
c820: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
c830: 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69  ++){.    p = a[i
c840: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 43 6f  ].pExpr;.    pCo
c850: 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74  l->zType = sqlit
c860: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 63  e3DbStrDup(db, c
c870: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
c880: 70 2c 30 2c 30 2c 30 2c 20 26 70 43 6f 6c 2d 3e  p,0,0,0, &pCol->
c890: 73 7a 45 73 74 29 29 3b 0a 20 20 20 20 73 7a 41  szEst));.    szA
c8a0: 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73  ll += pCol->szEs
c8b0: 74 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66  t;.    pCol->aff
c8c0: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
c8d0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a  xprAffinity(p);.
c8e0: 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66      if( pCol->af
c8f0: 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c  finity==0 ) pCol
c900: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
c910: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
c920: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
c930: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
c940: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  rse, p);.    if(
c950: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
c960: 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71  pCol->zColl = sq
c970: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
c980: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
c990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61  .    }.  }.  pTa
c9a0: 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71  b->szTabRow = sq
c9b0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c  lite3LogEst(szAl
c9c0: 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  l*4);.}../*.** G
c9d0: 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74  iven a SELECT st
c9e0: 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74  atement, generat
c9f0: 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  e a Table struct
ca00: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
ca10: 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  es.** the result
ca20: 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c   set of that SEL
ca30: 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ECT..*/.Table *s
ca40: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
ca50: 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  fSelect(Parse *p
ca60: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
ca70: 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65  Select){.  Table
ca80: 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65   *pTab;.  sqlite
ca90: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
caa0: 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46  db;.  int savedF
cab0: 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c  lags;..  savedFl
cac0: 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b  ags = db->flags;
cad0: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
cae0: 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e  ~SQLITE_FullColN
caf0: 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  ames;.  db->flag
cb00: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72  s |= SQLITE_Shor
cb10: 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c  tColNames;.  sql
cb20: 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70  ite3SelectPrep(p
cb30: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
cb40: 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  0);.  if( pParse
cb50: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20  ->nErr ) return 
cb60: 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c  0;.  while( pSel
cb70: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53  ect->pPrior ) pS
cb80: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d  elect = pSelect-
cb90: 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66  >pPrior;.  db->f
cba0: 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67  lags = savedFlag
cbb0: 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  s;.  pTab = sqli
cbc0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
cbd0: 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
cbe0: 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  ) );.  if( pTab=
cbf0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
cc00: 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65   0;.  }.  /* The
cc10: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
cc20: 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f  tOfSelect() is o
cc30: 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65  nly used n conte
cc40: 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73  xts where lookas
cc50: 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61  ide.  ** is disa
cc60: 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  bled */.  assert
cc70: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
cc80: 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20  bEnabled==0 );. 
cc90: 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b   pTab->nRef = 1;
cca0: 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d  .  pTab->zName =
ccb0: 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77   0;.  pTab->nRow
ccc0: 45 73 74 20 3d 20 31 30 34 38 35 37 36 3b 0a 20  Est = 1048576;. 
ccd0: 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
cce0: 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
ccf0: 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  e, pSelect->pELi
cd00: 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
cd10: 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
cd20: 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
cd30: 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
cd40: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
cd50: 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d  Select);.  pTab-
cd60: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69  >iPKey = -1;.  i
cd70: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
cd80: 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
cd90: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
cda0: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74  , pTab);.    ret
cdb0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
cdc0: 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
cdd0: 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f  ** Get a VDBE fo
cde0: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73  r the given pars
cdf0: 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65  er context.  Cre
ce00: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
ce10: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49   necessary..** I
ce20: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
ce30: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  s, return NULL a
ce40: 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61  nd leave a messa
ce50: 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
ce60: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65  .Vdbe *sqlite3Ge
ce70: 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61  tVdbe(Parse *pPa
ce80: 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  rse){.  Vdbe *v 
ce90: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
cea0: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
ceb0: 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70     v = pParse->p
cec0: 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Vdbe = sqlite3Vd
ced0: 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d  beCreate(pParse-
cee0: 3e 64 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  >db);.#ifndef SQ
cef0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
cf00: 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20      if( v ){.   
cf10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cf20: 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61 63 65  dOp0(v, OP_Trace
cf30: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
cf40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a    }.  return v;.
cf50: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  }.../*.** Comput
cf60: 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64  e the iLimit and
cf70: 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20   iOffset fields 
cf80: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61  of the SELECT ba
cf90: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c  sed on the.** pL
cfa0: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
cfb0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70   expressions.  p
cfc0: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
cfd0: 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  t hold the expre
cfe0: 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61  ssions.** that a
cff0: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69  ppear in the ori
d000: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
d010: 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49  ent after the LI
d020: 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a  MIT and OFFSET.*
d030: 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20  * keywords.  Or 
d040: 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65  NULL if those ke
d050: 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74  ywords are omitt
d060: 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  ed. iLimit and i
d070: 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74  Offset .** are t
d080: 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72  he integer memor
d090: 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  y register numbe
d0a0: 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20  rs for counters 
d0b0: 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
d0c0: 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e  .** the limit an
d0d0: 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68  d offset.  If th
d0e0: 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20  ere is no limit 
d0f0: 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74  and/or offset, t
d100: 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61  hen .** iLimit a
d110: 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e  nd iOffset are n
d120: 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  egative..**.** T
d130: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e  his routine chan
d140: 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ges the values o
d150: 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  f iLimit and iOf
d160: 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20  fset only if.** 
d170: 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65  a limit or offse
d180: 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
d190: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
d1a0: 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a  et.  iLimit and.
d1b0: 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c  ** iOffset shoul
d1c0: 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73  d have been pres
d1d0: 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74  et to appropriat
d1e0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73  e default values
d1f0: 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74  .** (usually but
d200: 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20   not always -1) 
d210: 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
d220: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
d230: 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74  * Only if pLimit
d240: 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d  !=0 or pOffset!=
d250: 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72  0 do the limit r
d260: 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20  egisters get.** 
d270: 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20  redefined.  The 
d280: 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
d290: 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f  or uses this pro
d2a0: 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a  perty to force.*
d2b0: 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74  * the reuse of t
d2c0: 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e  he same limit an
d2d0: 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65  d offset registe
d2e0: 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70  rs across multip
d2f0: 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  le.** SELECT sta
d300: 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  tements..*/.stat
d310: 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c  ic void computeL
d320: 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61  imitRegisters(Pa
d330: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
d340: 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65  ect *p, int iBre
d350: 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ak){.  Vdbe *v =
d360: 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74   0;.  int iLimit
d370: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66   = 0;.  int iOff
d380: 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31  set;.  int addr1
d390: 2c 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  , n;.  if( p->iL
d3a0: 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a  imit ) return;..
d3b0: 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49    /* .  ** "LIMI
d3c0: 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f  T -1" always sho
d3d0: 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68  ws all rows.  Th
d3e0: 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a  ere is some.  **
d3f0: 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f   controversy abo
d400: 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72  ut what the corr
d410: 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f  ect behavior sho
d420: 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65  uld be..  ** The
d430: 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
d440: 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65  ntation interpre
d450: 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20  ts "LIMIT 0" to 
d460: 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77  mean.  ** no row
d470: 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
d480: 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
d490: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
d4a0: 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
d4b0: 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30   || p->pLimit!=0
d4c0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   );.  if( p->pLi
d4d0: 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c  mit ){.    p->iL
d4e0: 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20  imit = iLimit = 
d4f0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
d500: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
d510: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
d520: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d      if( NEVER(v=
d530: 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  =0) ) return;  /
d540: 2a 20 56 44 42 45 20 73 68 6f 75 6c 64 20 68 61  * VDBE should ha
d550: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
d560: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20  allocated */.   
d570: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
d580: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69  IsInteger(p->pLi
d590: 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20  mit, &n) ){.    
d5a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d5b0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
d5c0: 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  r, n, iLimit);. 
d5d0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
d5e0: 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
d5f0: 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66  ter"));.      if
d600: 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
d610: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d620: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
d630: 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  0, iBreak);.    
d640: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30    }else if( n>=0
d650: 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f   && p->nSelectRo
d660: 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20 20 20 20  w>(u64)n ){.    
d670: 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
d680: 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  w = n;.      }. 
d690: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d6a0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
d6b0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69  pParse, p->pLimi
d6c0: 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  t, iLimit);.    
d6d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d6e0: 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
d6f0: 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  Int, iLimit);.  
d700: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
d710: 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74  (v, "LIMIT count
d720: 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  er"));.      sql
d730: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d740: 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69  , OP_IfZero, iLi
d750: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  mit, iBreak);.  
d760: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70    }.    if( p->p
d770: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
d780: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66  p->iOffset = iOf
d790: 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  fset = ++pParse-
d7a0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61  >nMem;.      pPa
d7b0: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f  rse->nMem++;   /
d7c0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78  * Allocate an ex
d7d0: 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72  tra register for
d7e0: 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f   limit+offset */
d7f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
d800: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
d810: 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73  ->pOffset, iOffs
d820: 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
d830: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d840: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f  OP_MustBeInt, iO
d850: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  ffset);.      Vd
d860: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  beComment((v, "O
d870: 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29  FFSET counter"))
d880: 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20  ;.      addr1 = 
d890: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d8a0: 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  1(v, OP_IfPos, i
d8b0: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
d8c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d8d0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
d8e0: 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  0, iOffset);.   
d8f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
d900: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
d910: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d920: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d930: 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66  Add, iLimit, iOf
d940: 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b 31 29  fset, iOffset+1)
d950: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
d960: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f  ent((v, "LIMIT+O
d970: 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 20 20  FFSET"));.      
d980: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
d990: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
d9a0: 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 0a  IfPos, iLimit);.
d9b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d9c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
d9d0: 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73  teger, -1, iOffs
d9e0: 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  et+1);.      sql
d9f0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
da00: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
da10: 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  }.  }.}..#ifndef
da20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
da30: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
da40: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70  ** Return the ap
da50: 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74  propriate collat
da60: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
da70: 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   the iCol-th col
da80: 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65  umn of.** the re
da90: 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65  sult set for the
daa0: 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
dab0: 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20   statement "p". 
dac0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a   Return NULL if.
dad0: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61  ** the column ha
dae0: 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c  s no default col
daf0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
db00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61  .**.** The colla
db10: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
db20: 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  r the compound s
db30: 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66  elect is taken f
db40: 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d  rom the.** left-
db50: 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65  most term of the
db60: 20 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73   select that has
db70: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
db80: 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  uence..*/.static
db90: 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53   CollSeq *multiS
dba0: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72  electCollSeq(Par
dbb0: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
dbc0: 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29  ct *p, int iCol)
dbd0: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65  {.  CollSeq *pRe
dbe0: 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  t;.  if( p->pPri
dbf0: 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  or ){.    pRet =
dc00: 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
dc10: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
dc20: 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20  Prior, iCol);.  
dc30: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20  }else{.    pRet 
dc40: 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
dc50: 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20  t( iCol>=0 );.  
dc60: 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20 69  if( pRet==0 && i
dc70: 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Col<p->pEList->n
dc80: 45 78 70 72 20 29 7b 0a 20 20 20 20 70 52 65 74  Expr ){.    pRet
dc90: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
dca0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
dcb0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
dcc0: 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72  .pExpr);.  }.  r
dcd0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
dce0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
dcf0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
dd00: 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61  ECT */../* Forwa
dd10: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
dd20: 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
dd30: 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20  SelectOrderBy(. 
dd40: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
dd50: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
dd60: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
dd70: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
dd80: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
dd90: 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
dda0: 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
ddb0: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
ddc0: 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
ddd0: 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
dde0: 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a  y results */.);.
ddf0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
de00: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
de10: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ELECT./*.** This
de20: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
de30: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20  ed to process a 
de40: 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66  compound query f
de50: 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20  orm from.** two 
de60: 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65  or more separate
de70: 20 71 75 65 72 69 65 73 20 75 73 69 6e 67 20 55   queries using U
de80: 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c  NION, UNION ALL,
de90: 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49   EXCEPT, or.** I
dea0: 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22  NTERSECT.**.** "
deb0: 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  p" points to the
dec0: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74   right-most of t
ded0: 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20  he two queries. 
dee0: 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68   the query on th
def0: 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e  e.** left is p->
df00: 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66  pPrior.  The lef
df10: 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c  t query could al
df20: 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64  so be a compound
df30: 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69   query.** in whi
df40: 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f 75  ch case this rou
df50: 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
df60: 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e  led recursively.
df70: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
df80: 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  lts of the total
df90: 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62 65   query are to be
dfa0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20   written into a 
dfb0: 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  destination.** o
dfc0: 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69 74  f type eDest wit
dfd0: 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61 72  h parameter iPar
dfe0: 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65  m..**.** Example
dff0: 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20   1:  Consider a 
e000: 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75  three-way compou
e010: 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  nd SQL statement
e020: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  ..**.**     SELE
e030: 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49  CT a FROM t1 UNI
e040: 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  ON SELECT b FROM
e050: 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t2 UNION SELECT
e060: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a   c FROM t3.**.**
e070: 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
e080: 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73 20  is parsed up as 
e090: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
e0a0: 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d     SELECT c FROM
e0b0: 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a   t3.**      |.**
e0c0: 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53        `----->  S
e0d0: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a  ELECT b FROM t2.
e0e0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
e0f0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
e100: 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20        `------>  
e110: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
e120: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77  .**.** The arrow
e130: 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d  s in the diagram
e140: 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74   above represent
e150: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69   the Select.pPri
e160: 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53  or pointer..** S
e170: 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
e180: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  e is called with
e190: 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20   p equal to the 
e1a0: 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  t3 query, then.*
e1b0: 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65  * pPrior will be
e1c0: 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20 20   the t2 query.  
e1d0: 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b  p->op will be TK
e1e0: 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63  _UNION in this c
e1f0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63  ase..**.** Notic
e200: 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20 6f  e that because o
e210: 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74 65  f the way SQLite
e220: 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64   parses compound
e230: 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a   SELECTs, the.**
e240: 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65   individual sele
e250: 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70  cts always group
e260: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
e270: 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ght..*/.static i
e280: 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a  nt multiSelect(.
e290: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e2a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
e2b0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
e2c0: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
e2d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
e2e0: 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
e2f0: 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
e300: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
e310: 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
e320: 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
e330: 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
e340: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e350: 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63  TE_OK;   /* Succ
e360: 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20  ess code from a 
e370: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
e380: 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
e390: 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
e3a0: 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74   SELECT immediat
e3b0: 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  ely to our left 
e3c0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
e3d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
e3e0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
e3f0: 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65  his VDBE */.  Se
e400: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
e410: 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69      /* Alternati
e420: 76 65 20 64 61 74 61 20 64 65 73 74 69 6e 61 74  ve data destinat
e430: 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
e440: 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f  *pDelete = 0;  /
e450: 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c  * Chain of simpl
e460: 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65 6c  e selects to del
e470: 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ete */.  sqlite3
e480: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f   *db;          /
e490: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
e4a0: 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65 66  ction */.#ifndef
e4b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
e4c0: 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31  LAIN.  int iSub1
e4d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e4e0: 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68  EQP id of left-h
e4f0: 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  and query */.  i
e500: 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20  nt iSub2;       
e510: 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
e520: 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65  f right-hand que
e530: 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ry */.#endif..  
e540: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
e550: 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
e560: 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73  Y or LIMIT claus
e570: 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43  e on prior SELEC
e580: 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74  Ts.  Only.  ** t
e590: 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d  he last (right-m
e5a0: 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74  ost) SELECT in t
e5b0: 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61  he series may ha
e5c0: 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  ve an ORDER BY o
e5d0: 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20  r LIMIT..  */.  
e5e0: 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e  assert( p && p->
e5f0: 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61  pPrior );  /* Ca
e600: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67  lling function g
e610: 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d  uarantees this m
e620: 75 63 68 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  uch */.  db = pP
e630: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69  arse->db;.  pPri
e640: 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
e650: 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
e660: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 50  ->pRightmost!=pP
e670: 72 69 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74  rior );.  assert
e680: 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74  ( pPrior->pRight
e690: 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d  most==p->pRightm
e6a0: 6f 73 74 20 29 3b 0a 20 20 64 65 73 74 20 3d 20  ost );.  dest = 
e6b0: 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50  *pDest;.  if( pP
e6c0: 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
e6d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
e6e0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52  orMsg(pParse,"OR
e6f0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68  DER BY clause sh
e700: 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
e710: 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
e720: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
e730: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
e740: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
e750: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
e760: 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72  d;.  }.  if( pPr
e770: 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ior->pLimit ){. 
e780: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
e790: 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54  sg(pParse,"LIMIT
e7a0: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
e7b0: 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
e7c0: 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
e7d0: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
e7e0: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
e7f0: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
e800: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
e810: 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
e820: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
e830: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
e840: 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61  ;  /* The VDBE a
e850: 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62  lready created b
e860: 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  y calling functi
e870: 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61  on */..  /* Crea
e880: 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  te the destinati
e890: 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  on temporary tab
e8a0: 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a  le if necessary.
e8b0: 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e    */.  if( dest.
e8c0: 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
e8d0: 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
e8e0: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
e8f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e900: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
e910: 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e  Ephemeral, dest.
e920: 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69  iSDParm, p->pELi
e930: 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
e940: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
e950: 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f  eP5(v, BTREE_UNO
e960: 52 44 45 52 45 44 29 3b 0a 20 20 20 20 64 65 73  RDERED);.    des
e970: 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61  t.eDest = SRT_Ta
e980: 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  ble;.  }..  /* M
e990: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c  ake sure all SEL
e9a0: 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74  ECTs in the stat
e9b0: 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73  ement have the s
e9c0: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  ame number of el
e9d0: 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74  ements.  ** in t
e9e0: 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73  heir result sets
e9f0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
ea00: 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50   p->pEList && pP
ea10: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  rior->pEList );.
ea20: 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
ea30: 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e  >nExpr!=pPrior->
ea40: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
ea50: 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  .    if( p->selF
ea60: 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73  lags & SF_Values
ea70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ea80: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
ea90: 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75  , "all VALUES mu
eaa0: 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  st have the same
eab0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   number of terms
eac0: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
ead0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
eae0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45  rMsg(pParse, "SE
eaf0: 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
eb00: 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25  t and right of %
eb10: 73 22 0a 20 20 20 20 20 20 20 20 22 20 64 6f 20  s".        " do 
eb20: 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  not have the sam
eb30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
eb40: 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c  lt columns", sel
eb50: 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
eb60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
eb70: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
eb80: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
eb90: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75    }..  /* Compou
eba0: 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61 74 20  nd SELECTs that 
ebb0: 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
ebc0: 20 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64   clause are hand
ebd0: 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a  led separately..
ebe0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f    */.  if( p->pO
ebf0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65  rderBy ){.    re
ec00: 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  turn multiSelect
ec10: 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20  OrderBy(pParse, 
ec20: 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a  p, pDest);.  }..
ec30: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
ec40: 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20  de for the left 
ec50: 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54  and right SELECT
ec60: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
ec70: 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  /.  switch( p->o
ec80: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
ec90: 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _ALL: {.      in
eca0: 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  t addr = 0;.    
ecb0: 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20    int nLimit;.  
ecc0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
ecd0: 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20  ior->pLimit );. 
ece0: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69       pPrior->iLi
ecf0: 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
ed00: 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69  .      pPrior->i
ed10: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
ed20: 73 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  set;.      pPrio
ed30: 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r->pLimit = p->p
ed40: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72  Limit;.      pPr
ed50: 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70  ior->pOffset = p
ed60: 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
ed70: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
ed80: 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
ed90: 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
eda0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
edb0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
edc0: 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74  e, pPrior, &dest
edd0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
ede0: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  it = 0;.      p-
edf0: 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
ee00: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
ee10: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
ee20: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
ee30: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
ee40: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
ee50: 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69  p->iLimit = pPri
ee60: 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  or->iLimit;.    
ee70: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70    p->iOffset = p
ee80: 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a  Prior->iOffset;.
ee90: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69        if( p->iLi
eea0: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  mit ){.        a
eeb0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
eec0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
eed0: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29  Zero, p->iLimit)
eee0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
eef0: 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20  mment((v, "Jump 
ef00: 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72  ahead if LIMIT r
ef10: 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20  eached"));.     
ef20: 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e   }.      explain
ef30: 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
ef40: 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
ef50: 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
ef60: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
ef70: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
ef80: 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
ef90: 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
efa0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65  _OK );.      pDe
efb0: 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
efc0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
efd0: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
efe0: 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
eff0: 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  += pPrior->nSele
f000: 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28  ctRow;.      if(
f010: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a   pPrior->pLimit.
f020: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
f030: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
f040: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26  Prior->pLimit, &
f050: 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26  nLimit).       &
f060: 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d  & nLimit>0 && p-
f070: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 28 75  >nSelectRow > (u
f080: 36 34 29 6e 4c 69 6d 69 74 20 0a 20 20 20 20 20  64)nLimit .     
f090: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
f0a0: 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 4c 69 6d  SelectRow = nLim
f0b0: 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
f0c0: 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20    if( addr ){.  
f0d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f0e0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
f0f0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
f100: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f110: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
f120: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  T:.    case TK_U
f130: 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NION: {.      in
f140: 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f  t unionTab;    /
f150: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
f160: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
f170: 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72   table holding r
f180: 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75  esult */.      u
f190: 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20  8 op = 0;       
f1a0: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52  /* One of the SR
f1b0: 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  T_ operations to
f1c0: 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a   apply to self *
f1d0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f  /.      int prio
f1e0: 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rOp;     /* The 
f1f0: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74  SRT_ operation t
f200: 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72  o apply to prior
f210: 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20   selects */.    
f220: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
f230: 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76  *pOffset; /* Sav
f240: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e  ed values of p->
f250: 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f  nLimit and p->nO
f260: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69  ffset */.      i
f270: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
f280: 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64  electDest uniond
f290: 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74  est;..      test
f2a0: 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
f2b0: 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20  EXCEPT );.      
f2c0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
f2d0: 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
f2e0: 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54     priorOp = SRT
f2f0: 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66  _Union;.      if
f300: 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72  ( dest.eDest==pr
f310: 69 6f 72 4f 70 20 26 26 20 41 4c 57 41 59 53 28  iorOp && ALWAYS(
f320: 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 21 70 2d  !p->pLimit &&!p-
f330: 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20 20  >pOffset) ){.   
f340: 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72       /* We can r
f350: 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79  euse a temporary
f360: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
f370: 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20   by a SELECT to 
f380: 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  our.        ** r
f390: 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ight..        */
f3a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f3b0: 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d   p->pRightmost!=
f3c0: 70 20 29 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c  p );  /* Can onl
f3d0: 79 20 68 61 70 70 65 6e 20 66 6f 72 20 6c 65 66  y happen for lef
f3e0: 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 0a 20  tward elements. 
f3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f410: 20 20 20 20 2a 2a 20 6f 66 20 61 20 33 2d 77 61      ** of a 3-wa
f420: 79 20 6f 72 20 6d 6f 72 65 20 63 6f 6d 70 6f 75  y or more compou
f430: 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  nd */.        as
f440: 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d  sert( p->pLimit=
f450: 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f  =0 );      /* No
f460: 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66  t allowed on lef
f470: 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a  tward elements *
f480: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
f490: 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
f4a0: 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c  );     /* Not al
f4b0: 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72  lowed on leftwar
f4c0: 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  d elements */.  
f4d0: 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
f4e0: 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
f4f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f500: 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e      /* We will n
f510: 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75  eed to create ou
f520: 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20  r own temporary 
f530: 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  table to hold th
f540: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  e.        ** int
f550: 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
f560: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
f570: 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
f580: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
f590: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f5a0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
f5b0: 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  );.        addr 
f5c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f5d0: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
f5e0: 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61  hemeral, unionTa
f5f0: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  b, 0);.        a
f600: 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
f610: 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
f620: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64  );.        p->ad
f630: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
f640: 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 70 2d  addr;.        p-
f650: 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c  >pRightmost->sel
f660: 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73  Flags |= SF_Uses
f670: 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20  Ephemeral;.     
f680: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
f690: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a  List );.      }.
f6a0: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
f6b0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
f6c0: 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ents to our left
f6d0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
f6e0: 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
f6f0: 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20  >pOrderBy );.   
f700: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
f710: 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64  DestInit(&uniond
f720: 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e  est, priorOp, un
f730: 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 65  ionTab);.      e
f740: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
f750: 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
f760: 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
f770: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f780: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
f790: 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64   pPrior, &uniond
f7a0: 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
f7b0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
f7c0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
f7d0: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
f7e0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
f7f0: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73  current SELECT s
f800: 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a  tatement.      *
f810: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f  /.      if( p->o
f820: 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a  p==TK_EXCEPT ){.
f830: 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54          op = SRT
f840: 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20 7d  _Except;.      }
f850: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
f860: 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
f870: 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20  UNION );.       
f880: 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b   op = SRT_Union;
f890: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
f8a0: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
f8b0: 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e      pLimit = p->
f8c0: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
f8d0: 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
f8e0: 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e     pOffset = p->
f8f0: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
f900: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
f910: 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65       uniondest.e
f920: 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20  Dest = op;.     
f930: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
f940: 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
f950: 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
f960: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
f970: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
f980: 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74  e, p, &uniondest
f990: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f9a0: 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
f9b0: 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65   );.      /* Que
f9c0: 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e  ry flattening in
f9d0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
f9e0: 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d   might refill p-
f9f0: 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20  >pOrderBy..     
fa00: 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64   ** Be sure to d
fa10: 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42  elete p->pOrderB
fa20: 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f  y, therefore, to
fa30: 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20   avoid a memory 
fa40: 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73  leak. */.      s
fa50: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
fa60: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
fa70: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70 44 65  erBy);.      pDe
fa80: 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
fa90: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
faa0: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
fab0: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
fac0: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  0;.      if( p->
fad0: 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 20 70  op==TK_UNION ) p
fae0: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20  ->nSelectRow += 
faf0: 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
fb00: 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ow;.      sqlite
fb10: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
fb20: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
fb30: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
fb40: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
fb50: 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
fb60: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69  ;.      p->iLimi
fb70: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
fb80: 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20  iOffset = 0;..  
fb90: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
fba0: 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  he data in the t
fbb0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
fbc0: 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
fbd0: 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73  m.      ** it is
fbe0: 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74   that we current
fbf0: 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ly need..      *
fc00: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
fc10: 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69  unionTab==dest.i
fc20: 53 44 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65  SDParm || dest.e
fc30: 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b  Dest!=priorOp );
fc40: 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
fc50: 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29  eDest!=priorOp )
fc60: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  {.        int iC
fc70: 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
fc80: 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  art;.        ass
fc90: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
fca0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65  ;.        if( de
fcb0: 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  st.eDest==SRT_Ou
fcc0: 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tput ){.        
fcd0: 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74    Select *pFirst
fce0: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
fcf0: 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
fd00: 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
fd10: 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
fd20: 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72  .          gener
fd30: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
fd40: 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74  Parse, 0, pFirst
fd50: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
fd60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72     }.        iBr
fd70: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
fd80: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
fd90: 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73         iCont = s
fda0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
fdb0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
fdc0: 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
fdd0: 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
fde0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
fdf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fe00: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
fe10: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65  , unionTab, iBre
fe20: 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74  ak);.        iSt
fe30: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
fe40: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
fe50: 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 49  .        selectI
fe60: 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
fe70: 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75   p, p->pEList, u
fe80: 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69  nionTab, p->pELi
fe90: 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  st->nExpr,.     
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
feb0: 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20     0, 0, &dest, 
fec0: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
fed0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
fee0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
fef0: 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
ff00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ff10: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
ff20: 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
ff30: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
ff40: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
ff50: 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
ff60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ff70: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ff80: 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
ff90: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
ffa0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ffb0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
ffc0: 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49  ert( p->op==TK_I
ffd0: 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20  NTERSECT ); {.  
ffe0: 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
fff0: 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b2;.      int iC
10000 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
10010 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  art;.      Expr 
10020 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
10030 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
10040 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
10050 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73  est intersectdes
10060 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b  t;.      int r1;
10070 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52  ..      /* INTER
10080 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
10090 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
100a0 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
100b0 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  res.      ** two
100c0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
100d0 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73  s.  Hence it has
100e0 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20   its own case.  
100f0 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  Begin.      ** b
10100 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  y allocating the
10110 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20   tables we will 
10120 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
10130 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72       tab1 = pPar
10140 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
10150 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
10160 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
10170 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
10180 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  By==0 );..      
10190 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
101a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
101b0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
101c0 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b1, 0);.      as
101d0 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
101e0 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
101f0 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
10200 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
10210 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 69 67  r;.      p->pRig
10220 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73  htmost->selFlags
10230 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
10240 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  eral;.      asse
10250 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
10260 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
10270 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f  the SELECTs to o
10280 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d  ur left into tem
10290 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
102a0 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  b1"..      */.  
102b0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
102c0 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72  tDestInit(&inter
102d0 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e  sectdest, SRT_Un
102e0 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20  ion, tab1);.    
102f0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
10300 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
10310 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
10320 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
10330 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
10340 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74  se, pPrior, &int
10350 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
10360 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
10370 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
10380 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
10390 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
103a0 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
103b0 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
103c0 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
103d0 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
103e0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
103f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10400 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
10410 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab2, 0);.      a
10420 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
10430 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20  enEphm[1] == -1 
10440 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
10450 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64  OpenEphm[1] = ad
10460 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  dr;.      p->pPr
10470 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
10480 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
10490 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
104a0 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
104b0 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
104c0 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
104d0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
104e0 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 53  intersectdest.iS
104f0 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20  DParm = tab2;.  
10500 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
10510 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
10520 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
10530 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
10540 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
10550 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73  arse, p, &inters
10560 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
10570 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
10580 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
10590 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
105a0 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
105b0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
105c0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
105d0 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e  lectRow>pPrior->
105e0 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e  nSelectRow ) p->
105f0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72  nSelectRow = pPr
10600 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
10610 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10620 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
10630 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
10640 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
10650 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
10660 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a  set = pOffset;..
10670 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
10680 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74  e code to take t
10690 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  he intersection 
106a0 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f  of the two tempo
106b0 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61  rary.      ** ta
106c0 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bles..      */. 
106d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
106e0 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
106f0 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
10700 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
10710 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46        Select *pF
10720 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  irst = p;.      
10730 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
10740 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
10750 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
10760 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72  r;.        gener
10770 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
10780 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74  Parse, 0, pFirst
10790 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
107a0 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20   }.      iBreak 
107b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
107c0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
107d0 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
107e0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
107f0 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c  ;.      computeL
10800 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
10810 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
10820 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10830 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10840 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42  Rewind, tab1, iB
10850 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 72 31 20  reak);.      r1 
10860 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
10870 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
10880 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
10890 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
108a0 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31   OP_RowKey, tab1
108b0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
108c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
108d0 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
108e0 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72  , tab2, iCont, r
108f0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
10900 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
10910 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
10920 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
10930 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
10940 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31   p->pEList, tab1
10950 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
10960 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
10970 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
10980 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
10990 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
109a0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
109b0 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
109c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
109d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
109e0 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74  xt, tab1, iStart
109f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10a00 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
10a10 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
10a20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10a30 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
10a40 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
10a50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10a60 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
10a70 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
10a80 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10a90 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70  }..  explainComp
10aa0 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d  osite(pParse, p-
10ab0 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62  >op, iSub1, iSub
10ac0 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  2, p->op!=TK_ALL
10ad0 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  );..  /* Compute
10ae0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
10af0 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20 20  nces used by .  
10b00 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
10b10 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d  les needed to im
10b20 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70  plement the comp
10b30 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
10b40 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79  * Attach the Key
10b50 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
10b60 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  o all temporary 
10b70 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
10b80 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69  * This section i
10b90 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67  s run by the rig
10ba0 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ht-most SELECT s
10bb0 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20  tatement only.. 
10bc0 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
10bd0 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66  ments to the lef
10be0 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68  t always skip th
10bf0 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69  is part.  The ri
10c00 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45  ght-most.  ** SE
10c10 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20  LECT might also 
10c20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69  skip this part i
10c30 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45  f it has no ORDE
10c40 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a  R BY clause and.
10c50 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62    ** no temp tab
10c60 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  les are required
10c70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
10c80 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73  selFlags & SF_Us
10c90 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20  esEphemeral ){. 
10ca0 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cc0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
10cd0 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   */.    KeyInfo 
10ce0 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20  *pKeyInfo;      
10cf0 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
10d00 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
10d10 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
10d20 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  /.    Select *pL
10d30 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
10d40 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
10d50 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43  ng through SELEC
10d60 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  T statements */.
10d70 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70      CollSeq **ap
10d80 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
10d90 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
10da0 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66   through pKeyInf
10db0 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20  o->aColl[] */.  
10dc0 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10de0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
10df0 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73  umns in result s
10e00 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  et */..    asser
10e10 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t( p->pRightmost
10e20 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20  ==p );.    nCol 
10e30 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
10e40 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  pr;.    pKeyInfo
10e50 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
10e60 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c  oAlloc(db, nCol,
10e70 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b   1);.    if( !pK
10e80 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
10e90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
10ea0 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  M;.      goto mu
10eb0 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
10ec0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
10ed0 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e  0, apColl=pKeyIn
10ee0 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f  fo->aColl; i<nCo
10ef0 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b  l; i++, apColl++
10f00 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  ){.      *apColl
10f10 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
10f20 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
10f30 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30   i);.      if( 0
10f40 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  ==*apColl ){.   
10f50 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64       *apColl = d
10f60 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
10f70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
10f80 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
10f90 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
10fa0 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
10fb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
10fc0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
10fd0 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61   addr = pLoop->a
10fe0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a  ddrOpenEphm[i];.
10ff0 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72          if( addr
11000 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
11010 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75  /* If [0] is unu
11020 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20  sed then [1] is 
11030 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f  also unused.  So
11040 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20   we can.        
11050 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65    ** always safe
11060 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e  ly abort as soon
11070 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e   as the first un
11080 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75  used slot is fou
11090 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
110a0 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61  assert( pLoop->a
110b0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30  ddrOpenEphm[1]<0
110c0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   );.          br
110d0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
110e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
110f0 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
11100 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  dr, nCol);.     
11110 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
11120 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20  angeP4(v, addr, 
11130 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65  (char*)sqlite3Ke
11140 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66  yInfoRef(pKeyInf
11150 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  o),.            
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11170 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
11180 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72       pLoop->addr
11190 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31  OpenEphm[i] = -1
111a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
111b0 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
111c0 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f  foUnref(pKeyInfo
111d0 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65  );.  }..multi_se
111e0 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73  lect_end:.  pDes
111f0 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74 2e  t->iSdst = dest.
11200 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e  iSdst;.  pDest->
11210 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53 64  nSdst = dest.nSd
11220 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  st;.  sqlite3Sel
11230 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  ectDelete(db, pD
11240 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e  elete);.  return
11250 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
11260 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
11270 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
11280 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f  ./*.** Code an o
11290 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
112a0 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65   for a coroutine
112b0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
112c0 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  of a.** SELECT s
112d0 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  tatment..**.** T
112e0 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75  he data to be ou
112f0 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65  tput is containe
11300 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e  d in pIn->iSdst.
11310 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70    There are.** p
11320 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e  In->nSdst column
11330 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20  s to be output. 
11340 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20   pDest is where 
11350 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c  the output shoul
11360 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a  d.** be sent..**
11370 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73  .** regReturn is
11380 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
11390 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  he register hold
113a0 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69  ing the subrouti
113b0 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64  ne.** return add
113c0 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  ress..**.** If r
113d0 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74  egPrev>0 then it
113e0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65   is the first re
113f0 67 69 73 74 65 72 20 69 6e 20 61 20 76 65 63 74  gister in a vect
11400 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72  or that.** recor
11410 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ds the previous 
11420 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67  output.  mem[reg
11430 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20  Prev] is a flag 
11440 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a  that is false.**
11450 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65   if there has be
11460 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f  en no previous o
11470 75 74 70 75 74 2e 20 20 49 66 20 72 65 67 50 72  utput.  If regPr
11480 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69  ev>0 then code i
11490 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74  s.** generated t
114a0 6f 20 73 75 70 70 72 65 73 73 20 64 75 70 6c 69  o suppress dupli
114b0 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f  cates.  pKeyInfo
114c0 20 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d   is used for com
114d0 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a  paring.** keys..
114e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d  **.** If the LIM
114f0 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69  IT found in p->i
11500 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64  Limit is reached
11510 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  , jump immediate
11520 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e  ly to.** iBreak.
11530 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
11540 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
11550 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65  routine(.  Parse
11560 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
11570 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
11580 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
11590 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
115a0 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
115b0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
115c0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c  SelectDest *pIn,
115d0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75          /* Corou
115e0 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64  tine supplying d
115f0 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ata */.  SelectD
11600 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20  est *pDest,     
11610 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e   /* Where to sen
11620 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  d the data */.  
11630 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20  int regReturn,  
11640 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
11650 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
11660 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
11670 72 65 67 50 72 65 76 2c 20 20 20 20 20 20 20 20  regPrev,        
11680 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
11690 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e  result register.
116a0 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20    No uniqueness 
116b0 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  if 0 */.  KeyInf
116c0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
116d0 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69    /* For compari
116e0 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f 75 73  ng with previous
116f0 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20   entry */.  int 
11700 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
11710 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
11720 20 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c   if we hit the L
11730 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  IMIT */.){.  Vdb
11740 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
11750 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e  Vdbe;.  int iCon
11760 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64  tinue;.  int add
11770 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  r;..  addr = sql
11780 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
11790 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69  ddr(v);.  iConti
117a0 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
117b0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
117c0 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75    /* Suppress du
117d0 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49  plicates for UNI
117e0 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
117f0 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a  INTERSECT .  */.
11800 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b    if( regPrev ){
11810 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b  .    int j1, j2;
11820 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  .    j1 = sqlite
11830 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
11840 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76  P_IfNot, regPrev
11850 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c 69  );.    j2 = sqli
11860 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
11870 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e   OP_Compare, pIn
11880 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
11890 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a  +1, pIn->nSdst,.
118a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
118c0 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
118d0 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
118e0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
118f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11900 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
11910 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65   j2+2, iContinue
11920 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20 73 71 6c  , j2+2);.    sql
11930 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
11940 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c  (v, j1);.    sql
11950 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11960 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e  , OP_Copy, pIn->
11970 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31  iSdst, regPrev+1
11980 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b  , pIn->nSdst-1);
11990 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
119a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
119b0 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76  eger, 1, regPrev
119c0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
119d0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
119e0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30  ailed ) return 0
119f0 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
11a00 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45   the first OFFSE
11a10 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65  T entries if the
11a20 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20  re is an OFFSET 
11a30 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f  clause.  */.  co
11a40 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69  deOffset(v, p, i
11a50 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77  Continue);..  sw
11a60 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65  itch( pDest->eDe
11a70 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f  st ){.    /* Sto
11a80 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
11a90 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
11aa0 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
11ab0 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
11ac0 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
11ad0 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
11ae0 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
11af0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
11b00 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e  Parse);.      in
11b10 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65  t r2 = sqlite3Ge
11b20 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
11b30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
11b40 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
11b50 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20  SRT_Table );.   
11b60 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65     testcase( pDe
11b70 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
11b80 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
11b90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11ba0 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
11bb0 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  ord, pIn->iSdst,
11bc0 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29   pIn->nSdst, r1)
11bd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11be0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11bf0 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d  NewRowid, pDest-
11c00 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20  >iSDParm, r2);. 
11c10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11c20 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
11c30 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ert, pDest->iSDP
11c40 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20  arm, r1, r2);.  
11c50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
11c60 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
11c70 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
11c80 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
11c90 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
11ca0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
11cb0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
11cc0 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
11cd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11ce0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11cf0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
11d00 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
11d10 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
11d20 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
11d30 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
11d40 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
11d50 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
11d60 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
11d70 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
11d80 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
11d90 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
11da0 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
11db0 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
11dc0 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
11dd0 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
11de0 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r1;.      assert
11df0 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20  ( pIn->nSdst==1 
11e00 29 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e  );.      pDest->
11e10 61 66 66 53 64 73 74 20 3d 20 0a 20 20 20 20 20  affSdst = .     
11e20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61      sqlite3Compa
11e30 72 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45  reAffinity(p->pE
11e40 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
11e50 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74  , pDest->affSdst
11e60 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
11e70 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
11e80 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
11e90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11ea0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
11eb0 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31  d, pIn->iSdst, 1
11ec0 2c 20 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66  , r1, &pDest->af
11ed0 66 53 64 73 74 2c 31 29 3b 0a 20 20 20 20 20 20  fSdst,1);.      
11ee0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
11ef0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
11f00 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
11f10 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 1);.      sql
11f20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11f30 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
11f40 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
11f50 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
11f60 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
11f70 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
11f80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11f90 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65 76 65  ..#if 0  /* Neve
11fa0 72 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e 20 4f  r occurs on an O
11fb0 52 44 45 52 20 42 59 20 71 75 65 72 79 20 2a 2f  RDER BY query */
11fc0 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72  .    /* If any r
11fd0 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20  ow exist in the 
11fe0 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f  result set, reco
11ff0 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64  rd that fact and
12000 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20   abort..    */. 
12010 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73     case SRT_Exis
12020 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts: {.      sqli
12030 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12040 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
12050 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
12060 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
12070 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
12080 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
12090 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
120a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
120b0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
120c0 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
120d0 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
120e0 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
120f0 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
12100 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
12110 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
12120 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
12130 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
12140 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
12150 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
12160 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
12170 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
12180 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74  sert( pIn->nSdst
12190 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
121a0 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
121b0 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
121c0 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  dst, pDest->iSDP
121d0 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  arm, 1);.      /
121e0 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
121f0 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74  se will jump out
12200 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
12210 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
12220 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
12230 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
12240 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
12250 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   */..    /* The 
12260 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
12270 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65  ed in a sequence
12280 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20   of registers.  
12290 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
122a0 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e 20 20   pDest->iSdst.  
122b0 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74  Then the co-rout
122c0 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20  ine yields..    
122d0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
122e0 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  Coroutine: {.   
122f0 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53     if( pDest->iS
12300 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dst==0 ){.      
12310 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d    pDest->iSdst =
12320 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
12330 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
12340 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
12350 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
12360 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20   pIn->nSdst;.   
12370 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
12380 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
12390 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
123a0 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  t, pDest->iSdst,
123b0 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 29 3b 0a   pDest->nSdst);.
123c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
123d0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
123e0 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  eld, pDest->iSDP
123f0 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  arm);.      brea
12400 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
12410 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
12420 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20  above, then the 
12430 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69  result destinati
12440 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a  on must be.    *
12450 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54  * SRT_Output.  T
12460 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
12470 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68  ever called with
12480 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a   any other.    *
12490 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74  * destination ot
124a0 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65  her than the one
124b0 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20  s handled above 
124c0 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20  or SRT_Output.. 
124d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
124e0 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73   SRT_Output, res
124f0 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
12500 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
12510 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20   registers.  .  
12520 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50    ** Then the OP
12530 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64  _ResultRow opcod
12540 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 61 75  e is used to cau
12550 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  se sqlite3_step(
12560 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75  ) to.    ** retu
12570 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  rn the next row 
12580 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a  of result..    *
12590 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
125a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
125b0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
125c0 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
125d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
125e0 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
125f0 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  ow, pIn->iSdst, 
12600 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
12610 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
12620 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
12630 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
12640 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
12650 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
12660 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12670 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
12680 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74  of the loop if t
12690 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
126a0 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hed..  */.  if( 
126b0 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
126c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
126d0 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p3(v, OP_IfZero,
126e0 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
126f0 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20  ak, -1);.  }..  
12700 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
12710 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72  subroutine retur
12720 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n.  */.  sqlite3
12730 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
12740 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  (v, iContinue);.
12750 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12760 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
12770 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20  , regReturn);.. 
12780 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
12790 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69  ./*.** Alternati
127a0 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  ve compound sele
127b0 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  ct code generato
127c0 72 20 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e  r for cases when
127d0 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20   there.** is an 
127e0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
127f0 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65  .**.** We assume
12800 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
12810 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a  following form:.
12820 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65  **.**      <sele
12830 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e  ctA>  <operator>
12840 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44    <selectB>  ORD
12850 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69  ER BY <orderbyli
12860 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61  st>.**.** <opera
12870 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55  tor> is one of U
12880 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c  NION ALL, UNION,
12890 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45   EXCEPT, or INTE
128a0 52 53 45 43 54 2e 20 20 54 68 65 20 69 64 65 61  RSECT.  The idea
128b0 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62  .** is to code b
128c0 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e  oth <selectA> an
128d0 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68  d <selectB> with
128e0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
128f0 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f  ause as.** co-ro
12900 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75  utines.  Then ru
12910 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
12920 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e  s in parallel an
12930 64 20 6d 65 72 67 65 20 74 68 65 20 72 65 73 75  d merge the resu
12940 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  lts.** into the 
12950 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69  output.  In addi
12960 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20  tion to the two 
12970 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c  coroutines (call
12980 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a  ed selectA and.*
12990 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65 72 65  * selectB) there
129a0 20 61 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e   are 7 subroutin
129b0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74  es:.**.**    out
129c0 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f  A:    Move the o
129d0 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c  utput of the sel
129e0 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69  ectA coroutine i
129f0 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  nto the output.*
12a00 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  *             of
12a10 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
12a20 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75  ery..**.**    ou
12a30 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20  tB:    Move the 
12a40 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65  output of the se
12a50 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20  lectB coroutine 
12a60 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  into the output.
12a70 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
12a80 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
12a90 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e  uery.  (Only gen
12aa0 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e  erated for UNION
12ab0 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
12ac0 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20      UNION ALL.  
12ad0 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52  EXCEPT and INSER
12ae0 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70  TSECT never outp
12af0 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a  ut a row that.**
12b00 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
12b10 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29  ears only in B.)
12b20 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20  .**.**    AltB: 
12b30 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
12b40 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
12b50 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
12b60 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a  s and A<B..**.**
12b70 20 20 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c      AeqB:    Cal
12b80 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
12b90 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
12ba0 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
12bb0 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  A==B..**.**    A
12bc0 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  gtB:    Called w
12bd0 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
12be0 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
12bf0 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a  utines and A>B..
12c00 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20  **.**    EofA:  
12c10 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61    Called when da
12c20 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
12c30 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a  from selectA..**
12c40 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20  .**    EofB:    
12c50 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
12c60 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
12c70 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a  om selectB..**.*
12c80 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
12c90 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74  tion of the latt
12ca0 65 72 20 66 69 76 65 20 73 75 62 72 6f 75 74 69  er five subrouti
12cb0 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68  nes depend on wh
12cc0 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  ich .** <operato
12cd0 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a  r> is used:.**.*
12ce0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
12cf0 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20   UNION ALL      
12d00 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20     UNION        
12d10 20 20 20 20 45 58 43 45 50 54 20 20 20 20 20 20      EXCEPT      
12d20 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a      INTERSECT.**
12d30 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
12d40 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
12d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
12d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
12d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
12d80 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c     AltB:   outA,
12d90 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41   nextA      outA
12da0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75  , nextA       ou
12db0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
12dc0 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20    nextA.**.**   
12dd0 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  AeqB:   outA, ne
12de0 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74  xtA         next
12df0 41 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  A             ne
12e00 78 74 41 20 20 20 20 20 20 20 20 20 6f 75 74 41  xtA         outA
12e10 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20  , nextA.**.**   
12e20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65  AgtB:   outB, ne
12e30 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e  xtB      outB, n
12e40 65 78 74 42 20 20 20 20 20 20 20 20 20 20 6e 65  extB          ne
12e50 78 74 42 20 20 20 20 20 20 20 20 20 20 20 20 6e  xtB            n
12e60 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66  extB.**.**   Eof
12e70 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42  A:   outB, nextB
12e80 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74        outB, next
12e90 42 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 20  B          halt 
12ea0 20 20 20 20 20 20 20 20 20 20 20 20 68 61 6c 74              halt
12eb0 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20  .**.**   EofB:  
12ec0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
12ed0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
12ee0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
12ef0 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a          halt.**.
12f00 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20  ** In the AltB, 
12f10 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73  AeqB, and AgtB s
12f20 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45  ubroutines, an E
12f30 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e  OF on A followin
12f40 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65  g nextA.** cause
12f50 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a  s an immediate j
12f60 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20  ump to EofA and 
12f70 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c  an EOF on B foll
12f80 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73  owing nextB caus
12f90 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61  es.** an immedia
12fa0 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e  te jump to EofB.
12fb0 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e    Within EofA an
12fc0 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20  d EofB, and EOF 
12fd0 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66  on entry or.** f
12fe0 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63  ollowing nextX c
12ff0 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20  auses a jump to 
13000 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73  the end of the s
13010 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67  elect processing
13020 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74  ..**.** Duplicat
13030 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65  e removal in the
13040 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
13050 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63 61  and INTERSECT ca
13060 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a  ses is handled.*
13070 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74  * within the out
13080 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  put subroutine. 
13090 20 54 68 65 20 72 65 67 50 72 65 76 20 72 65 67   The regPrev reg
130a0 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20  ister set holds 
130b0 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  the previously.*
130c0 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20  * output value. 
130d0 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73   A comparison is
130e0 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74 68   made against th
130f0 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  is value and the
13100 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b   output.** is sk
13110 69 70 70 65 64 20 69 66 20 74 68 65 20 6e 65 78  ipped if the nex
13120 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20  t results would 
13130 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
13140 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a  he previous..**.
13150 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
13160 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f  ation plan is to
13170 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74   implement the t
13180 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  wo coroutines an
13190 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f  d seven.** subro
131a0 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68  utines first, th
131b0 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72  en put the contr
131c0 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20  ol logic at the 
131d0 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68  bottom.  Like th
131e0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
131f0 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20     goto Init.** 
13200 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69      coA: corouti
13210 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72  ne for left quer
13220 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42  y (A).**     coB
13230 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  : coroutine for 
13240 72 69 67 68 74 20 71 75 65 72 79 20 28 42 29 0a  right query (B).
13250 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70  **    outA: outp
13260 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a  ut one row of A.
13270 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70  **    outB: outp
13280 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20  ut one row of B 
13290 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e  (UNION and UNION
132a0 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20   ALL only).**   
132b0 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   EofA: ....**   
132c0 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   EofB: ....**   
132d0 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AltB: ....**   
132e0 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AeqB: ....**   
132f0 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AgtB: ....**   
13300 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a   Init: initializ
13310 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69  e coroutine regi
13320 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20  sters.**        
13330 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20    yield coA.**  
13340 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 41          if eof(A
13350 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20  ) goto EofA.**  
13360 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
13370 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  B.**          if
13380 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66   eof(B) goto Eof
13390 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f  B.**    Cmpr: Co
133a0 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20  mpare A, B.**   
133b0 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42         Jump AltB
133c0 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20  , AeqB, AgtB.** 
133d0 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a      End: ....**.
133e0 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c  ** We call AltB,
133f0 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66   AeqB, AgtB, Eof
13400 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62  A, and EofB "sub
13410 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74 68  routines" but th
13420 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63  ey are not.** ac
13430 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73  tually called us
13440 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68  ing Gosub and th
13450 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e  ey do not Return
13460 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42  .  EofA and EofB
13470 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61   loop.** until a
13480 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68 61 75  ll data is exhau
13490 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74  sted then jump t
134a0 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65  o the "end" labe
134b0 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a  .  AltB, AeqB,.*
134c0 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20  * and AgtB jump 
134d0 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20  to either L2 or 
134e0 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f  to one of EofA o
134f0 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64  r EofB..*/.#ifnd
13500 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
13510 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73  OMPOUND_SELECT.s
13520 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
13530 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20  electOrderBy(.  
13540 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
13550 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
13560 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
13570 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
13580 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
13590 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
135a0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
135b0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
135c0 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
135d0 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
135e0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
135f0 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
13600 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
13610 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c  ounters */.  Sel
13620 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
13630 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
13640 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
13650 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
13660 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
13670 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
13680 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
13690 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63   VDBE */.  Selec
136a0 74 44 65 73 74 20 64 65 73 74 41 3b 20 20 20 20  tDest destA;    
136b0 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
136c0 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20  for coroutine A 
136d0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
136e0 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65  destB;     /* De
136f0 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f  stination for co
13700 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69  routine B */.  i
13710 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20 20 20  nt regAddrA;    
13720 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
13730 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
13740 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
13750 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 41  */.  int regEofA
13760 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  ;          /* Fl
13770 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77  ag to indicate w
13780 68 65 6e 20 73 65 6c 65 63 74 2d 41 20 69 73 20  hen select-A is 
13790 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  complete */.  in
137a0 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20  t regAddrB;     
137b0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
137c0 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
137d0 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
137e0 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 42 3b  /.  int regEofB;
137f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
13800 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68  g to indicate wh
13810 65 6e 20 73 65 6c 65 63 74 2d 42 20 69 73 20 63  en select-B is c
13820 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74  omplete */.  int
13830 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20   addrSelectA;   
13840 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
13850 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f   the select-A co
13860 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
13870 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20   addrSelectB;   
13880 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
13890 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f   the select-B co
138a0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
138b0 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20   regOutA;       
138c0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
138d0 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
138e0 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
138f0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ne */.  int regO
13900 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  utB;          /*
13910 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
13920 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74  r for the output
13930 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -B subroutine */
13940 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b  .  int addrOutA;
13950 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
13960 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
13970 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
13980 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42  /.  int addrOutB
13990 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64   = 0;     /* Add
139a0 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
139b0 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-B subroutine 
139c0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
139d0 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
139e0 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
139f0 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20  ect-A-exhausted 
13a00 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
13a10 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20  int addrEofB;   
13a20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
13a30 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
13a40 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
13a50 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
13a60 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20  ddrAltB;        
13a70 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
13a80 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e  he A<B subroutin
13a90 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
13aa0 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eqB;         /* 
13ab0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
13ac0 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ==B subroutine *
13ad0 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42  /.  int addrAgtB
13ae0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
13af0 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20  ress of the A>B 
13b00 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
13b10 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20  int regLimitA;  
13b20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
13b30 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
13b40 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
13b50 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20  gLimitB;        
13b60 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
13b70 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
13b80 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b  /.  int regPrev;
13b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72            /* A r
13ba0 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
13bb0 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f  s to hold previo
13bc0 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  us output */.  i
13bd0 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20  nt savedLimit;  
13be0 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
13bf0 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74  lue of p->iLimit
13c00 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f   */.  int savedO
13c10 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  ffset;      /* S
13c20 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
13c30 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  >iOffset */.  in
13c40 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20  t labelCmpr;    
13c50 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
13c60 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
13c70 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  e merge algorith
13c80 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  m */.  int label
13c90 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  End;         /* 
13ca0 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e  Label for the en
13cb0 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c  d of the overall
13cc0 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a   SELECT stmt */.
13cd0 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20    int j1;       
13ce0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
13cf0 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
13d00 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65  t get retargette
13d10 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  d */.  int op;  
13d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13d30 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54  One of TK_ALL, T
13d40 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
13d50 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  PT, TK_INTERSECT
13d60 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
13d70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43  KeyDup = 0; /* C
13d80 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
13d90 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
13da0 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20  ate removal */. 
13db0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65   KeyInfo *pKeyMe
13dc0 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72  rge;   /* Compar
13dd0 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
13de0 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77   for merging row
13df0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
13e00 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
13e10 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
13e20 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
13e30 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f  t *pOrderBy;   /
13e40 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
13e50 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
13e60 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
13e70 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
13e80 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
13e90 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
13ea0 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20  int *aPermute;  
13eb0 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
13ec0 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74   from ORDER BY t
13ed0 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73  erms to result s
13ee0 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69  et columns */.#i
13ef0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13f00 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
13f10 69 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20  iSub1;          
13f20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
13f30 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
13f40 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20  /.  int iSub2;  
13f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
13f60 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
13f70 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
13f80 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  f..  assert( p->
13f90 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20  pOrderBy!=0 );. 
13fa0 20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70   assert( pKeyDup
13fb0 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67  ==0 ); /* "Manag
13fc0 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74  ed" code needs t
13fd0 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33  his.  Ticket #33
13fe0 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  82. */.  db = pP
13ff0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20  arse->db;.  v = 
14000 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
14010 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
14020 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64         /* Alread
14030 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72  y thrown the err
14040 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63  or if VDBE alloc
14050 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62   failed */.  lab
14060 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  elEnd = sqlite3V
14070 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
14080 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73  .  labelCmpr = s
14090 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
140a0 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50  bel(v);...  /* P
140b0 61 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45  atch up the ORDE
140c0 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f  R BY clause.  */
140d0 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20  .  op = p->op;  
140e0 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
140f0 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
14100 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
14110 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72  y==0 );.  pOrder
14120 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
14130 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
14140 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72  erBy );.  nOrder
14150 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
14160 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  Expr;..  /* For 
14170 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20  operators other 
14180 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77  than UNION ALL w
14190 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73  e have to make s
141a0 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ure that.  ** th
141b0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
141c0 65 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74  e covers every t
141d0 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c  erm of the resul
141e0 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a  t set.  Add.  **
141f0 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52   terms to the OR
14200 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
14210 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
14220 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c  .  if( op!=TK_AL
14230 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  L ){.    for(i=1
14240 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ; db->mallocFail
14250 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70  ed==0 && i<=p->p
14260 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
14270 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
14280 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
14290 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72  pItem;.      for
142a0 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (j=0, pItem=pOrd
142b0 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65  erBy->a; j<nOrde
142c0 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; j++, pItem+
142d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
142e0 72 74 28 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65  rt( pItem->iOrde
142f0 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  rByCol>0 );.    
14300 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69      if( pItem->i
14310 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20  OrderByCol==i ) 
14320 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
14330 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64       if( j==nOrd
14340 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
14350 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
14360 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
14370 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20  INTEGER, 0);.   
14380 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30       if( pNew==0
14390 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
143a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
143b0 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
143c0 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
143d0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
143e0 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  ue = i;.        
143f0 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
14400 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
14410 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
14420 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  y, pNew);.      
14430 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
14440 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72   pOrderBy->a[nOr
14450 64 65 72 42 79 2b 2b 5d 2e 69 4f 72 64 65 72 42  derBy++].iOrderB
14460 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20  yCol = (u16)i;. 
14470 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
14480 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
14490 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65  he comparison pe
144a0 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65  rmutation and ke
144b0 79 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73  yinfo that is us
144c0 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65  ed with.  ** the
144d0 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65   permutation use
144e0 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
144f0 66 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20  f the next.  ** 
14500 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63  row of results c
14510 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  omes from select
14520 41 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41  A or selectB.  A
14530 6c 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74  lso add explicit
14540 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73  .  ** collations
14550 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
14560 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f   clause terms so
14570 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73   that when the s
14580 75 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74  ubqueries.  ** t
14590 6f 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20  o the right and 
145a0 74 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61  the left are eva
145b0 6c 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65  luated, they use
145c0 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a   the correct.  *
145d0 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a  * collation..  *
145e0 2f 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73  /.  aPermute = s
145f0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
14600 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74  w(db, sizeof(int
14610 29 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 69  )*nOrderBy);.  i
14620 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20  f( aPermute ){. 
14630 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
14640 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
14650 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
14660 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
14670 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c  i<nOrderBy; i++,
14680 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
14690 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
146a0 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 20 26  iOrderByCol>0  &
146b0 26 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42  & pItem->iOrderB
146c0 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  yCol<=p->pEList-
146d0 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
146e0 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49  aPermute[i] = pI
146f0 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c  tem->iOrderByCol
14700 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 1;.    }.    
14710 70 4b 65 79 4d 65 72 67 65 20 3d 20 73 71 6c 69  pKeyMerge = sqli
14720 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
14730 64 62 2c 20 6e 4f 72 64 65 72 42 79 2c 20 31 29  db, nOrderBy, 1)
14740 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 4d 65  ;.    if( pKeyMe
14750 72 67 65 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  rge ){.      for
14760 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
14770 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
14780 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
14790 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 54          Expr *pT
147a0 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  erm = pOrderBy->
147b0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
147c0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66      if( pTerm->f
147d0 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
147e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
147f0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
14800 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
14810 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
14820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14830 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69     pColl = multi
14840 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
14850 61 72 73 65 2c 20 70 2c 20 61 50 65 72 6d 75 74  arse, p, aPermut
14860 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  e[i]);.         
14870 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
14880 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
14890 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  tColl;.         
148a0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
148b0 70 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20 20  pExpr =.        
148c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
148d0 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67  AddCollateString
148e0 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
148f0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
14900 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14910 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14920 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
14930 6c 65 28 70 4b 65 79 4d 65 72 67 65 29 20 29 3b  le(pKeyMerge) );
14940 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72  .        pKeyMer
14950 67 65 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  ge->aColl[i] = p
14960 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4b  Coll;.        pK
14970 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72  eyMerge->aSortOr
14980 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42  der[i] = pOrderB
14990 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
149a0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
149b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b  .  }else{.    pK
149c0 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d  eyMerge = 0;.  }
149d0 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20  ..  /* Reattach 
149e0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
149f0 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79  use to the query
14a00 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64  ..  */.  p->pOrd
14a10 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
14a20 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  .  pPrior->pOrde
14a30 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
14a40 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d  rListDup(pParse-
14a50 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30  >db, pOrderBy, 0
14a60 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
14a70 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d  e a range of tem
14a80 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
14a90 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f   and the KeyInfo
14aa0 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72   needed.  ** for
14ab0 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20   the logic that 
14ac0 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74  removes duplicat
14ad0 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68  e result rows wh
14ae0 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72  en the.  ** oper
14af0 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45  ator is UNION, E
14b00 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
14b10 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49  ECT (but not UNI
14b20 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20  ON ALL)..  */.  
14b30 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
14b40 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  {.    regPrev = 
14b50 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
14b60 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70  int nExpr = p->p
14b70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
14b80 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72    assert( nOrder
14b90 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d  By>=nExpr || db-
14ba0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
14bb0 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70  .    regPrev = p
14bc0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
14bd0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
14be0 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20  += nExpr+1;.    
14bf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14c00 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
14c10 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   0, regPrev);.  
14c20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69    pKeyDup = sqli
14c30 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
14c40 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20  db, nExpr, 1);. 
14c50 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29     if( pKeyDup )
14c60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14c70 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
14c80 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75  Writeable(pKeyDu
14c90 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  p) );.      for(
14ca0 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  i=0; i<nExpr; i+
14cb0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  +){.        pKey
14cc0 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Dup->aColl[i] = 
14cd0 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
14ce0 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
14cf0 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75  ;.        pKeyDu
14d00 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  p->aSortOrder[i]
14d10 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
14d20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53    }.  }. .  /* S
14d30 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66 74  eparate the left
14d40 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20 71   and the right q
14d50 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e  uery from one an
14d60 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e  other.  */.  p->
14d70 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 73 71  pPrior = 0;.  sq
14d80 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
14d90 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
14da0 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c   p, p->pOrderBy,
14db0 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28   "ORDER");.  if(
14dc0 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d   pPrior->pPrior=
14dd0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
14de0 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f  3ResolveOrderGro
14df0 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 50 72  upBy(pParse, pPr
14e00 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72  ior, pPrior->pOr
14e10 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
14e20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
14e30 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67  te the limit reg
14e40 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70  isters */.  comp
14e50 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
14e60 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62  s(pParse, p, lab
14e70 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d  elEnd);.  if( p-
14e80 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54  >iLimit && op==T
14e90 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67  K_ALL ){.    reg
14ea0 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73  LimitA = ++pPars
14eb0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67  e->nMem;.    reg
14ec0 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73  LimitB = ++pPars
14ed0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
14ee0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14ef0 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f  , OP_Copy, p->iO
14f00 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73  ffset ? p->iOffs
14f10 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74  et+1 : p->iLimit
14f20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f40 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a      regLimitA);.
14f50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14f60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
14f70 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67  , regLimitA, reg
14f80 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65  LimitB);.  }else
14f90 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20  {.    regLimitA 
14fa0 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b  = regLimitB = 0;
14fb0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
14fc0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
14fd0 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c  pLimit);.  p->pL
14fe0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  imit = 0;.  sqli
14ff0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
15000 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20  , p->pOffset);. 
15010 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
15020 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b  ..  regAddrA = +
15030 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
15040 20 72 65 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61   regEofA = ++pPa
15050 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
15060 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65  AddrB = ++pParse
15070 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66  ->nMem;.  regEof
15080 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
15090 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20  em;.  regOutA = 
150a0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
150b0 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50    regOutB = ++pP
150c0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
150d0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
150e0 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f  nit(&destA, SRT_
150f0 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
15100 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  drA);.  sqlite3S
15110 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
15120 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74  estB, SRT_Corout
15130 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  ine, regAddrB);.
15140 0a 20 20 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20  .  /* Jump past 
15150 74 68 65 20 76 61 72 69 6f 75 73 20 73 75 62 72  the various subr
15160 6f 75 74 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f  outines and coro
15170 75 74 69 6e 65 73 20 74 6f 20 74 68 65 20 6d 61  utines to the ma
15180 69 6e 0a 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f  in.  ** merge lo
15190 6f 70 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73  op.  */.  j1 = s
151a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
151b0 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
151c0 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71  addrSelectA = sq
151d0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
151e0 41 64 64 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20  Addr(v);...  /* 
151f0 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
15200 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
15210 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
15220 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a  ement to the.  *
15230 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f  * left of the co
15240 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20  mpound operator 
15250 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74  - the "A" select
15260 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ..  */.  VdbeNoo
15270 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65  pComment((v, "Be
15280 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  gin coroutine fo
15290 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29  r left SELECT"))
152a0 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  ;.  pPrior->iLim
152b0 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a  it = regLimitA;.
152c0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
152d0 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
152e0 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
152f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
15300 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
15310 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71  r, &destA);.  sq
15320 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15330 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
15340 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71  , regEofA);.  sq
15350 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
15360 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
15370 41 64 64 72 41 29 3b 0a 20 20 56 64 62 65 4e 6f  AddrA);.  VdbeNo
15380 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  opComment((v, "E
15390 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  nd coroutine for
153a0 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b   left SELECT"));
153b0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
153c0 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
153d0 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
153e0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20  CT statement on 
153f0 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20  .  ** the right 
15400 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74  - the "B" select
15410 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65  .  */.  addrSele
15420 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ctB = sqlite3Vdb
15430 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
15440 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
15450 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 63 6f  nt((v, "Begin co
15460 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68  routine for righ
15470 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73  t SELECT"));.  s
15480 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  avedLimit = p->i
15490 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66  Limit;.  savedOf
154a0 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
154b0 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  t;.  p->iLimit =
154c0 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d   regLimitB;.  p-
154d0 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a  >iOffset = 0;  .
154e0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
154f0 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
15500 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
15510 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
15520 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
15530 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d  estB);.  p->iLim
15540 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b  it = savedLimit;
15550 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20  .  p->iOffset = 
15560 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73  savedOffset;.  s
15570 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15580 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
15590 31 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73  1, regEofB);.  s
155a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
155b0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
155c0 67 41 64 64 72 42 29 3b 0a 20 20 56 64 62 65 4e  gAddrB);.  VdbeN
155d0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
155e0 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  End coroutine fo
155f0 72 20 72 69 67 68 74 20 53 45 4c 45 43 54 22 29  r right SELECT")
15600 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
15610 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
15620 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
15630 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
15640 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he A.  ** select
15650 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
15660 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
15670 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
15680 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
15690 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
156a0 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41  ut routine for A
156b0 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20  "));.  addrOutA 
156c0 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
156d0 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
156e0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
156f0 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70      p, &destA, p
15700 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20  Dest, regOutA,. 
15710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15720 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
15730 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a  , labelEnd);.  .
15740 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
15750 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
15760 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
15770 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42  ent row of the B
15780 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
15790 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
157a0 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
157b0 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
157c0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
157d0 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
157e0 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  N ){.    VdbeNoo
157f0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
15800 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
15810 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f   B"));.    addrO
15820 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utB = generateOu
15830 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
15840 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
15850 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
15860 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  B, pDest, regOut
15870 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  B,.             
15880 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
15890 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  yDup, labelEnd);
158a0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65  .  }.  sqlite3Ke
158b0 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44  yInfoUnref(pKeyD
158c0 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  up);..  /* Gener
158d0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
158e0 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
158f0 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
15900 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20  lect A.  ** are 
15910 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
15920 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
15930 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t B remains..  *
15940 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
15950 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73  ent((v, "eof-A s
15960 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
15970 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50  if( op==TK_EXCEP
15980 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45  T || op==TK_INTE
15990 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
159a0 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56  rEofA = sqlite3V
159b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
159c0 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 45 6e  Goto, 0, labelEn
159d0 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  d);.  }else{  . 
159e0 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71     addrEofA = sq
159f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15a00 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
15a10 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  B, labelEnd);.  
15a20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15a30 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
15a40 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
15a50 74 42 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tB);.    sqlite3
15a60 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
15a70 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
15a80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15a90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
15aa0 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 41  oto, 0, addrEofA
15ab0 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  );.    p->nSelec
15ac0 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e  tRow += pPrior->
15ad0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 0a  nSelectRow;.  }.
15ae0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
15af0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
15b00 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
15b10 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
15b20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  B.  ** are exhau
15b30 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
15b40 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72  ta in select A r
15b50 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  emains..  */.  i
15b60 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  f( op==TK_INTERS
15b70 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45  ECT ){.    addrE
15b80 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a  ofB = addrEofA;.
15b90 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
15ba0 63 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e  ctRow > pPrior->
15bb0 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e  nSelectRow ) p->
15bc0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72  nSelectRow = pPr
15bd0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
15be0 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20  .  }else{  .    
15bf0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
15c00 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f  (v, "eof-B subro
15c10 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
15c20 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33  drEofB = sqlite3
15c30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15c40 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 6c 61  _If, regEofA, la
15c50 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c  belEnd);.    sql
15c60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15c70 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
15c80 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a  utA, addrOutA);.
15c90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15ca0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
15cb0 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  d, regAddrA);.  
15cc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15cd0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
15ce0 30 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20  0, addrEofB);.  
15cf0 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
15d00 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
15d10 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a  the case of A<B.
15d20 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
15d30 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74  omment((v, "A-lt
15d40 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
15d50 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73  ;.  addrAltB = s
15d60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15d70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
15d80 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29  gOutA, addrOutA)
15d90 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
15da0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
15db0 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  d, regAddrA);.  
15dc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15dd0 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
15de0 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  ofA, addrEofA);.
15df0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15e00 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
15e10 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  0, labelCmpr);..
15e20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
15e30 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
15e40 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20   case of A==B.  
15e50 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
15e60 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41  ALL ){.    addrA
15e70 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a  eqB = addrAltB;.
15e80 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
15e90 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
15ea0 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61      addrAeqB = a
15eb0 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64  ddrAltB;.    add
15ec0 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65  rAltB++;.  }else
15ed0 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
15ee0 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d  mment((v, "A-eq-
15ef0 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
15f00 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a  .    addrAeqB =.
15f10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15f20 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
15f30 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  d, regAddrA);.  
15f40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f50 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
15f60 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29  gEofA, addrEofA)
15f70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15f80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
15f90 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72  to, 0, labelCmpr
15fa0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
15fb0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
15fc0 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
15fd0 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65   A>B.  */.  Vdbe
15fe0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
15ff0 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69  "A-gt-B subrouti
16000 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74  ne"));.  addrAgt
16010 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
16020 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
16030 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
16040 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  || op==TK_UNION 
16050 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
16060 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
16070 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61  osub, regOutB, a
16080 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20  ddrOutB);.  }.  
16090 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
160a0 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
160b0 65 67 41 64 64 72 42 29 3b 0a 20 20 73 71 6c 69  egAddrB);.  sqli
160c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
160d0 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c   OP_If, regEofB,
160e0 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 73 71   addrEofB);.  sq
160f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16100 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
16110 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
16120 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20   This code runs 
16130 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  once to initiali
16140 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20  ze everything.. 
16150 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
16160 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
16170 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16180 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
16190 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66 41 29  ger, 0, regEofA)
161a0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
161b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
161c0 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66 42 29  ger, 0, regEofB)
161d0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
161e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
161f0 62 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64  b, regAddrA, add
16200 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 73 71 6c  rSelectA);.  sql
16210 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16220 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 41  , OP_Gosub, regA
16230 64 64 72 42 2c 20 61 64 64 72 53 65 6c 65 63 74  ddrB, addrSelect
16240 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  B);.  sqlite3Vdb
16250 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
16260 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45  , regEofA, addrE
16270 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofA);.  sqlite3V
16280 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16290 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64 64  If, regEofB, add
162a0 72 45 6f 66 42 29 3b 0a 0a 20 20 2f 2a 20 49 6d  rEofB);..  /* Im
162b0 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e  plement the main
162c0 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f   merge loop.  */
162d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
162e0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
162f0 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69  belCmpr);.  sqli
16300 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
16310 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c   OP_Permutation,
16320 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a   0, 0, 0, (char*
16330 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e  )aPermute, P4_IN
16340 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74  TARRAY);.  sqlit
16350 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
16360 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74  OP_Compare, dest
16370 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69  A.iSdst, destB.i
16380 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a  Sdst, nOrderBy,.
16390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163a0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
163b0 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45  pKeyMerge, P4_KE
163c0 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65  YINFO);.  sqlite
163d0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
163e0 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29   OPFLAG_PERMUTE)
163f0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16400 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
16410 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72  , addrAltB, addr
16420 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b  AeqB, addrAgtB);
16430 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
16440 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  he this point in
16450 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e   order to termin
16460 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20  ate the query.. 
16470 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
16480 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
16490 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f   labelEnd);..  /
164a0 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
164b0 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d   of output colum
164c0 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  ns.  */.  if( pD
164d0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
164e0 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 53 65  Output ){.    Se
164f0 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
16500 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65  Prior;.    while
16510 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
16520 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
16530 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
16540 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
16550 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
16560 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
16570 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65    }..  /* Reasse
16580 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e  mbly the compoun
16590 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74 20  d query so that 
165a0 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  it will be freed
165b0 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20   correctly.  ** 
165c0 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
165d0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28  unction */.  if(
165e0 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
165f0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
16600 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72  elete(db, p->pPr
16610 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  ior);.  }.  p->p
16620 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
16630 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e  .  /*** TBD:  In
16640 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20  sert subroutine 
16650 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63  calls to close c
16660 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70  ursors on incomp
16670 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71  lete.  **** subq
16680 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65  ueries ****/.  e
16690 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
166a0 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69  pParse, p->op, i
166b0 53 75 62 31 2c 20 69 53 75 62 32 2c 20 30 29 3b  Sub1, iSub2, 0);
166c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
166d0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
166e0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
166f0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
16700 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
16710 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
16720 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61  /* Forward Decla
16730 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  rations */.stati
16740 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
16750 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45  List(sqlite3*, E
16760 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45  xprList*, int, E
16770 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69  xprList*);.stati
16780 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65  c void substSele
16790 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c  ct(sqlite3*, Sel
167a0 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72  ect *, int, Expr
167b0 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  List *);../*.** 
167c0 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  Scan through the
167d0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
167e0 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72  r.  Replace ever
167f0 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a  y reference to.*
16800 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  * a column in ta
16810 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c  ble number iTabl
16820 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  e with a copy of
16830 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a   the iColumn-th.
16840 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69  ** entry in pELi
16850 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20  st.  (But leave 
16860 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
16870 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a  e ROWID column .
16880 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a  ** unchanged.).*
16890 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
168a0 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
168b0 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63   flattening proc
168c0 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65  edure.  A subque
168d0 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75  ry.** whose resu
168e0 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65  lt set is define
168f0 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65  d by pEList appe
16900 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20  ars as entry in 
16910 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  the.** FROM clau
16920 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
16930 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42  uch that the VDB
16940 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65  E cursor assigne
16950 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52  d to that.** FOR
16960 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69  M clause entry i
16970 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20  s iTable.  This 
16980 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65  routine make the
16990 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63   necessary .** c
169a0 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20  hanges to pExpr 
169b0 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72  so that it refer
169c0 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  s directly to th
169d0 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a  e source table.*
169e0 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
169f0 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73  y rather the res
16a00 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73  ult set of the s
16a10 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  ubquery..*/.stat
16a20 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45 78  ic Expr *substEx
16a30 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr(.  sqlite3 *d
16a40 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  b,        /* Rep
16a50 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
16a60 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63  s to this connec
16a70 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tion */.  Expr *
16a80 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a  pExpr,        /*
16a90 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73   Expr in which s
16aa0 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75  ubstitution occu
16ab0 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  rs */.  int iTab
16ac0 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  le,         /* T
16ad0 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74  able to be subst
16ae0 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  ituted */.  Expr
16af0 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
16b00 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 65 78  /* Substitute ex
16b10 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  pressions */.){.
16b20 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
16b30 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
16b40 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
16b50 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e  OLUMN && pExpr->
16b60 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29  iTable==iTable )
16b70 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
16b80 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
16b90 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
16ba0 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TK_NULL;.    }el
16bb0 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
16bc0 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65  pNew;.      asse
16bd0 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26  rt( pEList!=0 &&
16be0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
16bf0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
16c00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16c10 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26  Expr->pLeft==0 &
16c20 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  & pExpr->pRight=
16c30 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
16c40 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
16c50 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  p(db, pEList->a[
16c60 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
16c70 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
16c80 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
16c90 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  te(db, pExpr);. 
16ca0 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65       pExpr = pNe
16cb0 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  w;.    }.  }else
16cc0 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65  {.    pExpr->pLe
16cd0 66 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ft = substExpr(d
16ce0 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
16cf0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
16d00 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69  ;.    pExpr->pRi
16d10 67 68 74 20 3d 20 73 75 62 73 74 45 78 70 72 28  ght = substExpr(
16d20 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  db, pExpr->pRigh
16d30 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
16d40 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  t);.    if( Expr
16d50 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
16d60 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
16d70 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53   ){.      substS
16d80 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d  elect(db, pExpr-
16d90 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  >x.pSelect, iTab
16da0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
16db0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75   }else{.      su
16dc0 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
16dd0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20  pExpr->x.pList, 
16de0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
16df0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
16e00 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61  urn pExpr;.}.sta
16e10 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
16e20 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65  prList(.  sqlite
16e30 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f  3 *db,         /
16e40 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
16e50 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20  errors here */. 
16e60 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
16e70 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f  ,     /* List to
16e80 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69   scan and in whi
16e90 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
16ea0 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20  itutes */.  int 
16eb0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
16ec0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
16ed0 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20  substituted */. 
16ee0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
16ef0 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  t     /* Substit
16f00 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  ute values */.){
16f10 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
16f20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
16f30 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
16f40 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
16f50 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  +){.    pList->a
16f60 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73  [i].pExpr = subs
16f70 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d  tExpr(db, pList-
16f80 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61  >a[i].pExpr, iTa
16f90 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
16fa0 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
16fb0 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73  substSelect(.  s
16fc0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
16fd0 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
16fe0 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65  lloc errors here
16ff0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
17000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
17010 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
17020 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
17030 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f  substitutions */
17040 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
17050 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
17060 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20   to be replaced 
17070 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
17080 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62  EList     /* Sub
17090 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a  stitute values *
170a0 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  /.){.  SrcList *
170b0 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53  pSrc;.  struct S
170c0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
170d0 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
170e0 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a  f( !p ) return;.
170f0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
17100 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69  db, p->pEList, i
17110 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
17120 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
17130 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c  db, p->pGroupBy,
17140 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
17150 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
17160 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  t(db, p->pOrderB
17170 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  y, iTable, pELis
17180 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67  t);.  p->pHaving
17190 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
171a0 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61   p->pHaving, iTa
171b0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
171c0 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73  p->pWhere = subs
171d0 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68  tExpr(db, p->pWh
171e0 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ere, iTable, pEL
171f0 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c  ist);.  substSel
17200 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  ect(db, p->pPrio
17210 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
17220 74 29 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e  t);.  pSrc = p->
17230 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
17240 70 53 72 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e  pSrc );  /* Even
17250 20 66 6f 72 20 28 53 45 4c 45 43 54 20 31 29 20   for (SELECT 1) 
17260 77 65 20 68 61 76 65 3a 20 70 53 72 63 21 3d 30  we have: pSrc!=0
17270 20 62 75 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d   but pSrc->nSrc=
17280 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41  =0 */.  if( ALWA
17290 59 53 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20  YS(pSrc) ){.    
172a0 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
172b0 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b  , pItem=pSrc->a;
172c0 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
172d0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ++){.      subst
172e0 53 65 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d  Select(db, pItem
172f0 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c  ->pSelect, iTabl
17300 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
17310 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  }.  }.}.#endif /
17320 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
17330 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
17340 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
17350 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
17360 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
17370 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
17380 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
17390 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
173a0 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EW)./*.** This r
173b0 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
173c0 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75  to flatten subqu
173d0 65 72 69 65 73 20 61 73 20 61 20 70 65 72 66 6f  eries as a perfo
173e0 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74  rmance optimizat
173f0 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
17400 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 20 69  tine returns 1 i
17410 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67  f it makes chang
17420 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66  es and 0 if no f
17430 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63 75 72 73  lattening occurs
17440 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72  ..**.** To under
17450 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70  stand the concep
17460 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c  t of flattening,
17470 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f   consider the fo
17480 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79  llowing.** query
17490 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
174a0 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT a FROM (SELEC
174b0 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
174c0 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20  t1 WHERE z<100) 
174d0 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  WHERE a>5.**.** 
174e0 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79 20  The default way 
174f0 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  of implementing 
17500 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74 6f  this query is to
17510 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20   execute the.** 
17520 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20 61  subquery first a
17530 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
17540 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72  ults in a tempor
17550 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a  ary table, then.
17560 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72  ** run the outer
17570 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74   query on that t
17580 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
17590 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 74   This requires t
175a0 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65  wo.** passes ove
175b0 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75 72  r the data.  Fur
175c0 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73  thermore, becaus
175d0 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
175e0 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20  table.** has no 
175f0 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48 45  indices, the WHE
17600 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  RE clause on the
17610 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e   outer query can
17620 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69  not be.** optimi
17630 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  zed..**.** This 
17640 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
17650 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65 72   to rewrite quer
17660 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20  ies such as the 
17670 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20  above into.** a 
17680 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65  single flat sele
17690 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ct, like this:.*
176a0 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
176b0 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
176c0 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44   WHERE z<100 AND
176d0 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   a>5.**.** The c
176e0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f  ode generated fo
176f0 72 20 74 68 69 73 20 73 69 6d 70 69 66 69 63 61  r this simpifica
17700 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73  tion gives the s
17710 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75  ame result.** bu
17720 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63  t only has to sc
17730 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65  an the data once
17740 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69  .  And because i
17750 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a  ndices might .**
17760 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61   exist on the ta
17770 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65  ble t1, a comple
17780 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64  te scan of the d
17790 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  ata might be.** 
177a0 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  avoided..**.** F
177b0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c  lattening is onl
177c0 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61  y attempted if a
177d0 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
177e0 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
177f0 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73  .**   (1)  The s
17800 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
17810 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
17820 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72  ot both use aggr
17830 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  egates..**.**   
17840 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (2)  The subquer
17850 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
17860 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74  egate or the out
17870 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
17880 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
17890 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (3)  The subquer
178a0 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67  y is not the rig
178b0 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
178c0 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a  left outer join.
178d0 2a 2a 20 20 20 20 20 20 20 20 28 4f 72 69 67 69  **        (Origi
178e0 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30  nally ticket #30
178f0 36 2e 20 20 53 74 72 65 6e 67 74 68 65 6e 65 64  6.  Strengthened
17900 20 62 79 20 74 69 63 6b 65 74 20 23 33 33 30 30   by ticket #3300
17910 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54  ).**.**   (4)  T
17920 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
17930 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a  ot DISTINCT..**.
17940 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65  **  (**)  At one
17950 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69   point restricti
17960 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29 20  ons (4) and (5) 
17970 64 65 66 69 6e 65 64 20 61 20 73 75 62 73 65 74  defined a subset
17980 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20   of DISTINCT.** 
17990 20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72 69         sub-queri
179a0 65 73 20 74 68 61 74 20 77 65 72 65 20 65 78 63  es that were exc
179b0 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20  luded from this 
179c0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65  optimization. Re
179d0 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  striction .**   
179e0 20 20 20 20 20 28 34 29 20 68 61 73 20 73 69 6e       (4) has sin
179f0 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64  ce been expanded
17a00 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20   to exclude all 
17a10 44 49 53 54 49 4e 43 54 20 73 75 62 71 75 65 72  DISTINCT subquer
17a20 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29  ies..**.**   (6)
17a30 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
17a40 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
17a50 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
17a60 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
17a70 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
17a80 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29  NCT..**.**   (7)
17a90 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68    The subquery h
17aa0 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  as a FROM clause
17ab0 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75  .  TODO:  For su
17ac0 62 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74  bqueries without
17ad0 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f  .**        A FRO
17ae0 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64  M clause, consid
17af0 65 72 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d  er adding a FROM
17b00 20 63 6c 6f 73 65 20 77 69 74 68 20 74 68 65 20   close with the 
17b10 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20  special.**      
17b20 20 20 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f    table sqlite_o
17b30 6e 63 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74  nce that consist
17b40 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f  s of a single ro
17b50 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a  w containing a.*
17b60 2a 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20  *        single 
17b70 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38  NULL..**.**   (8
17b80 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
17b90 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
17ba0 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
17bb0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
17bc0 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29  oin..**.**   (9)
17bd0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
17be0 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
17bf0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
17c00 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
17c10 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72  e.**        aggr
17c20 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  egates..**.**  (
17c30 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65 72  10)  The subquer
17c40 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
17c50 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
17c60 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
17c70 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
17c80 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a  use LIMIT..**.**
17c90 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71    (11)  The subq
17ca0 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
17cb0 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
17cc0 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20  both have ORDER 
17cd0 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  BY clauses..**.*
17ce0 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70  *  (**)  Not imp
17cf0 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75  lemented.  Subsu
17d00 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63  med into restric
17d10 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70  tion (3).  Was p
17d20 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20  reviously.**    
17d30 20 20 20 20 61 20 73 65 70 61 72 61 74 65 20 72      a separate r
17d40 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76  estriction deriv
17d50 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20  ing from ticket 
17d60 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33  #350..**.**  (13
17d70 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
17d80 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20  and outer query 
17d90 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
17da0 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  LIMIT..**.**  (1
17db0 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
17dc0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46   does not use OF
17dd0 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35  FSET..**.**  (15
17de0 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  )  The outer que
17df0 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ry is not part o
17e00 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
17e10 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20  ect or the.**   
17e20 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64 6f       subquery do
17e30 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49  es not have a LI
17e40 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20  MIT clause..**  
17e50 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65        (See ticke
17e60 74 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b  t #2339 and tick
17e70 65 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29  et [02a8e81d44])
17e80 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54  ..**.**  (16)  T
17e90 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
17ea0 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
17eb0 74 65 20 6f 72 20 74 68 65 20 73 75 62 71 75 65  te or the subque
17ec0 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20  ry does.**      
17ed0 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52    not contain OR
17ee0 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74  DER BY.  (Ticket
17ef0 20 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73   #2942)  This us
17f00 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72  ed to not matter
17f10 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c  .**        until
17f20 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74   we introduced t
17f30 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  he group_concat(
17f40 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a  ) function.  .**
17f50 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65 20 73  .**  (17)  The s
17f60 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20  ub-query is not 
17f70 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
17f80 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e  t, or it is a UN
17f90 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20  ION ALL .**     
17fa0 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75     compound clau
17fb0 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72  se made up entir
17fc0 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65  ely of non-aggre
17fd0 67 61 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e  gate queries, an
17fe0 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65  d .**        the
17ff0 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a   parent query:.*
18000 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20  *.**          * 
18010 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61  is not itself pa
18020 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  rt of a compound
18030 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20   select,.**     
18040 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e       * is not an
18050 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 44 49   aggregate or DI
18060 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e  STINCT query, an
18070 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20  d.**          * 
18080 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a  is not a join.**
18090 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 70  .**        The p
180a0 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75  arent and sub-qu
180b0 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ery may contain 
180c0 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53  WHERE clauses. S
180d0 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20  ubject to.**    
180e0 20 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20      rules (11), 
180f0 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74  (13) and (14), t
18100 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e  hey may also con
18110 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a  tain ORDER BY,.*
18120 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61  *        LIMIT a
18130 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  nd OFFSET clause
18140 73 2e 20 20 54 68 65 20 73 75 62 71 75 65 72 79  s.  The subquery
18150 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20   cannot use any 
18160 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20  compound.**     
18170 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65     operator othe
18180 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c  r than UNION ALL
18190 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65   because all the
181a0 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a   other compound.
181b0 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74  **        operat
181c0 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c  ors have an impl
181d0 69 65 64 20 44 49 53 54 49 4e 43 54 20 77 68 69  ied DISTINCT whi
181e0 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64  ch is disallowed
181f0 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65   by.**        re
18200 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a  striction (4)..*
18210 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f  *.**        Also
18220 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74  , each component
18230 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   of the sub-quer
18240 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68  y must return th
18250 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
18260 20 20 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c          of resul
18270 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20  t columns. This 
18280 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65  is actually a re
18290 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e  quirement for an
182a0 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  y compound.**   
182b0 20 20 20 20 20 53 45 4c 45 43 54 20 73 74 61 74       SELECT stat
182c0 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74  ement, but all t
182d0 68 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65  he code here doe
182e0 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74  s is make sure t
182f0 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20  hat no.**       
18300 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20   such (illegal) 
18310 73 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61  sub-query is fla
18320 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c  ttened. The call
18330 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74  er will detect t
18340 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e  he.**        syn
18350 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65  tax error and re
18360 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20  turn a detailed 
18370 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20  message..**.**  
18380 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62  (18)  If the sub
18390 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
183a0 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
183b0 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
183c0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44  he.**        ORD
183d0 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20  ER by clause of 
183e0 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20  the parent must 
183f0 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65  be simple refere
18400 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20  nces to .**     
18410 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68     columns of th
18420 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a  e sub-query..**.
18430 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20 73 75  **  (19)  The su
18440 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
18450 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
18460 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
18470 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
18480 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61  have a WHERE cla
18490 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29  use..**.**  (20)
184a0 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
184b0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
184c0 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74   select, then it
184d0 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a   must not use.**
184e0 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52          an ORDER
184f0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63   BY clause.  Tic
18500 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65 20 63  ket #3773.  We c
18510 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20  ould relax this 
18520 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20  constraint.**   
18530 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79       somewhat by
18540 20 73 61 79 69 6e 67 20 74 68 61 74 20 74 68 65   saying that the
18550 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
18560 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75  DER BY clause mu
18570 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70  st.**        app
18580 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65  ear as unmodifie
18590 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  d result columns
185a0 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
185b0 65 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20  ery.  But we.** 
185c0 20 20 20 20 20 20 20 68 61 76 65 20 6f 74 68 65         have othe
185d0 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  r optimizations 
185e0 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20  in mind to deal 
185f0 77 69 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a  with that case..
18600 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54 68 65  **.**  (21)  The
18610 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
18620 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
18630 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
18640 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
18650 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65   DISTINCT.  (See
18660 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34   ticket [752e164
18670 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  6fc])..**.** In 
18680 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
18690 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20  e "p" parameter 
186a0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
186b0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
186c0 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79  .** The subquery
186d0 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69   is p->pSrc->a[i
186e0 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73  From].  isAgg is
186f0 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74   true if the out
18700 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73  er query.** uses
18710 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20   aggregates and 
18720 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73  subqueryIsAgg is
18730 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62   true if the sub
18740 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
18750 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  gates..**.** If 
18760 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f  flattening is no
18770 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69  t attempted, thi
18780 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
18790 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73  o-op and returns
187a0 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65   0..** If flatte
187b0 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65  ning is attempte
187c0 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
187d0 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20  eturns 1..**.** 
187e0 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65  All of the expre
187f0 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d  ssion analysis m
18800 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74  ust occur on bot
18810 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  h the outer quer
18820 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62  y and.** the sub
18830 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69  query before thi
18840 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a  s routine runs..
18850 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
18860 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20  attenSubquery(. 
18870 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
18880 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
18890 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
188a0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
188b0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
188c0 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54   or outer SELECT
188d0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
188e0 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
188f0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
18900 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   p->pSrc->a[] of
18910 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75   the inner subqu
18920 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ery */.  int isA
18930 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gg,           /*
18940 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53   True if outer S
18950 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65  ELECT uses aggre
18960 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
18970 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79  /.  int subquery
18980 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65  IsAgg    /* True
18990 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
189a0 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
189b0 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  functions */.){.
189c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
189d0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
189e0 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  = pParse->zAuthC
189f0 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74  ontext;.  Select
18a00 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c   *pParent;.  Sel
18a10 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20  ect *pSub;      
18a20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75   /* The inner qu
18a30 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79  ery or "subquery
18a40 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  " */.  Select *p
18a50 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f  Sub1;      /* Po
18a60 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67  inter to the rig
18a70 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e  htmost select in
18a80 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20   sub-query */.  
18a90 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
18aa0 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
18ab0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
18ac0 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53  ter query */.  S
18ad0 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b  rcList *pSubSrc;
18ae0 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
18af0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
18b00 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c  query */.  ExprL
18b10 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f  ist *pList;    /
18b20 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
18b30 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
18b40 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ery */.  int iPa
18b50 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  rent;        /* 
18b60 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
18b70 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72  er of the pSub r
18b80 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74  esult set temp t
18b90 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  able */.  int i;
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18bb0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
18bc0 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18be0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
18bf0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
18c00 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
18c10 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a   *pSubitem;   /*
18c20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   The subquery */
18c30 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
18c40 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
18c50 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
18c60 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  if flattening is
18c70 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74   permitted.  Ret
18c80 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20  urn 0 if not..  
18c90 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  */.  assert( p!=
18ca0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
18cb0 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20  ->pPrior==0 );  
18cc0 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61  /* Unable to fla
18cd0 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75  tten compound qu
18ce0 65 72 69 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f  eries */.  if( O
18cf0 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
18d00 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51  led(db, SQLITE_Q
18d10 75 65 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29  ueryFlattener) )
18d20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72   return 0;.  pSr
18d30 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
18d40 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69  ssert( pSrc && i
18d50 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d  From>=0 && iFrom
18d60 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20  <pSrc->nSrc );. 
18d70 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72   pSubitem = &pSr
18d80 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69  c->a[iFrom];.  i
18d90 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65  Parent = pSubite
18da0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53  m->iCursor;.  pS
18db0 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  ub = pSubitem->p
18dc0 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74  Select;.  assert
18dd0 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69  ( pSub!=0 );.  i
18de0 66 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71  f( isAgg && subq
18df0 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
18e00 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
18e10 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
18e20 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69  tion (1)  */.  i
18e30 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67  f( subqueryIsAgg
18e40 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31   && pSrc->nSrc>1
18e50 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
18e60 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
18e70 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70  tion (2)  */.  p
18e80 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
18e90 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
18ea0 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50  SubSrc );.  /* P
18eb0 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20  rior to version 
18ec0 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49  3.1.2, when LIMI
18ed0 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64  T and OFFSET had
18ee0 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f   to be simple co
18ef0 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f  nstants,.  ** no
18f00 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  t arbitrary expr
18f10 65 73 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c  esssions, we all
18f20 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e  owed some combin
18f30 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64  ing of LIMIT and
18f40 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
18f50 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20  ause they could 
18f60 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63  be computed at c
18f70 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75  ompile-time.  Bu
18f80 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  t when LIMIT and
18f90 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
18fa0 61 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78  ame arbitrary ex
18fb0 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65  pressions, we we
18fc0 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64  re forced to add
18fd0 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31   restrictions (1
18fe0 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29  3).  ** and (14)
18ff0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  . */.  if( pSub-
19000 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c  >pLimit && p->pL
19010 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
19020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19030 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33   Restriction (13
19040 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
19050 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72  >pOffset ) retur
19060 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
19070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19080 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34   Restriction (14
19090 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 52  ) */.  if( p->pR
190a0 69 67 68 74 6d 6f 73 74 20 26 26 20 70 53 75 62  ightmost && pSub
190b0 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
190c0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
190d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190f0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
19100 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a  ion (15) */.  }.
19110 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e    if( pSubSrc->n
19120 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
19130 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
19140 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
19150 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a  riction (7)  */.
19160 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
19170 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
19180 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ct ) return 0;  
19190 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
191a0 72 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a  riction (5)  */.
191b0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
191c0 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72  it && (pSrc->nSr
191d0 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b  c>1 || isAgg) ){
191e0 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
191f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
19200 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a  ictions (8)(9) *
19210 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
19220 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
19230 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75  stinct)!=0 && su
19240 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20  bqueryIsAgg ){. 
19250 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
19260 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
19270 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d  tion (6)  */.  }
19280 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
19290 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  By && pSub->pOrd
192a0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74  erBy ){.     ret
192b0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
192c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192e0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
192f0 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (11) */.  }.  if
19300 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d  ( isAgg && pSub-
19310 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
19320 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
19330 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
19340 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66  ion (16) */.  if
19350 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
19360 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  & p->pWhere ) re
19370 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
19380 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
19390 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66  ion (19) */.  if
193a0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
193b0 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
193c0 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
193d0 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
193e0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
193f0 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a  striction (21) *
19400 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f  /.  }..  /* OBSO
19410 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a  LETE COMMENT 1:.
19420 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    ** Restriction
19430 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71   3:  If the subq
19440 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20  uery is a join, 
19450 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
19460 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20  bquery is .  ** 
19470 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20  not used as the 
19480 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
19490 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20   an outer join. 
194a0 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79   Examples of why
194b0 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f   this.  ** is no
194c0 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
194d0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
194e0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
194f0 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a  (t2 JOIN t3).  *
19500 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
19510 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
19520 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
19530 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
19540 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
19550 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20  IN t2) JOIN t3. 
19560 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69   **.  ** which i
19570 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65  s not at all the
19580 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a   same thing..  *
19590 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20  *.  ** OBSOLETE 
195a0 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20  COMMENT 2:.  ** 
195b0 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20  Restriction 12: 
195c0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
195d0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
195e0 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20  erand of a left 
195f0 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c  outer.  ** join,
19600 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
19610 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57  ubquery has no W
19620 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a  HERE clause..  *
19630 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66  * An examples of
19640 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74   why this is not
19650 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
19660 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
19670 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
19680 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
19690 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20   WHERE t2.x>0). 
196a0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
196b0 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
196c0 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
196d0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
196e0 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
196f0 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74  JOIN t2) WHERE t
19700 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20  2.x>0.  **.  ** 
19710 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74  But the t2.x>0 t
19720 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  est will always 
19730 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72  fail on a NULL r
19740 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a  ow of t2, which.
19750 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79    ** effectively
19760 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55   converts the OU
19770 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e  TER JOIN into an
19780 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a   INNER JOIN..  *
19790 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52  *.  ** THIS OVER
197a0 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43  RIDES OBSOLETE C
197b0 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20  OMMENTS 1 AND 2 
197c0 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b  ABOVE:.  ** Tick
197d0 65 74 20 23 33 33 30 30 20 73 68 6f 77 73 20 74  et #3300 shows t
197e0 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74  hat flattening t
197f0 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66  he right term of
19800 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a   a LEFT JOIN.  *
19810 2a 20 69 73 20 66 72 61 75 67 68 74 20 77 69 74  * is fraught wit
19820 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20  h danger.  Best 
19830 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f  to avoid the who
19840 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68  le thing.  If th
19850 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
19860 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72  is the right ter
19870 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  m of a LEFT JOIN
19880 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c  , then do not fl
19890 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  atten..  */.  if
198a0 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69  ( (pSubitem->joi
198b0 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
198c0 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
198d0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
198e0 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20  Restriction 17: 
198f0 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
19900 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
19910 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d  ELECT, then it m
19920 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c  ust.  ** use onl
19930 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20  y the UNION ALL 
19940 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f  operator. And no
19950 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65  ne of the simple
19960 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a   select queries.
19970 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75    ** that make u
19980 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53  p the compound S
19990 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65  ELECT are allowe
199a0 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61 74  d to be aggregat
199b0 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20  e or distinct.  
199c0 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f  ** queries..  */
199d0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72  .  if( pSub->pPr
199e0 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ior ){.    if( p
199f0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
19a00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
19a10 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
19a20 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20   20 */.    }.   
19a30 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70   if( isAgg || (p
19a40 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
19a50 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20  Distinct)!=0 || 
19a60 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b  pSrc->nSrc!=1 ){
19a70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
19a80 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
19a90 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31  Sub1=pSub; pSub1
19aa0 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70  ; pSub1=pSub1->p
19ab0 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65  Prior){.      te
19ac0 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e  stcase( (pSub1->
19ad0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
19ae0 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
19af0 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
19b00 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  nct );.      tes
19b10 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73  tcase( (pSub1->s
19b20 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
19b30 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
19b40 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67  ate))==SF_Aggreg
19b50 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ate );.      ass
19b60 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63 21  ert( pSub->pSrc!
19b70 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
19b80 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
19b90 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
19ba0 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d  SF_Aggregate))!=
19bb0 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75  0.       || (pSu
19bc0 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53  b1->pPrior && pS
19bd0 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ub1->op!=TK_ALL)
19be0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62   .       || pSub
19bf0 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a  1->pSrc->nSrc<1.
19c00 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 2d 3e         || pSub->
19c10 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70  pEList->nExpr!=p
19c20 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  Sub1->pEList->nE
19c30 78 70 72 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  xpr.      ){.   
19c40 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
19c50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
19c60 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53  tcase( pSub1->pS
19c70 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20  rc->nSrc>1 );.  
19c80 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74    }..    /* Rest
19c90 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20  riction 18. */. 
19ca0 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
19cb0 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
19cc0 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  ii;.      for(ii
19cd0 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72  =0; ii<p->pOrder
19ce0 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  By->nExpr; ii++)
19cf0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
19d00 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d  >pOrderBy->a[ii]
19d10 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20  .iOrderByCol==0 
19d20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
19d30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
19d40 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65   /***** If we re
19d50 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
19d60 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
19d70 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a  rmitted. *****/.
19d80 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20  .  /* Authorize 
19d90 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
19da0 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
19db0 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74 65  ontext = pSubite
19dc0 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54  m->zName;.  TEST
19dd0 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74 65  ONLY(i =) sqlite
19de0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
19df0 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e, SQLITE_SELECT
19e00 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65  , 0, 0, 0);.  te
19e10 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49 54  stcase( i==SQLIT
19e20 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61 72  E_DENY );.  pPar
19e30 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
19e40 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e   = zSavedAuthCon
19e50 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  text;..  /* If t
19e60 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
19e70 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
19e80 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  T statement, the
19e90 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69 6f  n (by restrictio
19ea0 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31  ns.  ** 17 and 1
19eb0 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74  8 above) it must
19ec0 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   be a UNION ALL 
19ed0 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 71  and the parent q
19ee0 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20  uery must .  ** 
19ef0 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  be of the form:.
19f00 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
19f10 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e  LECT <expr-list>
19f20 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72   FROM (<sub-quer
19f30 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73  y>) <where-claus
19f40 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f  e> .  **.  ** fo
19f50 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52  llowed by any OR
19f60 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e  DER BY, LIMIT an
19f70 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75  d/or OFFSET clau
19f80 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a  ses. This block.
19f90 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31    ** creates N-1
19fa0 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
19fb0 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68  arent query with
19fc0 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59  out any ORDER BY
19fd0 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a  , LIMIT or .  **
19fe0 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20   OFFSET clauses 
19ff0 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74  and joins them t
1a000 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d  o the left-hand-
1a010 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67  side of the orig
1a020 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20  inal.  ** using 
1a030 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
1a040 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ors. In this cas
1a050 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
1a060 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a  r of simple.  **
1a070 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
1a080 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75  ts in the compou
1a090 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20  nd sub-query..  
1a0a0 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  **.  ** Example:
1a0b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
1a0c0 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28  ELECT a+1 FROM (
1a0d0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
1a0e0 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20  ECT x FROM tab. 
1a0f0 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e   **        UNION
1a100 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20   ALL.  **       
1a110 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74   SELECT y FROM t
1a120 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
1a130 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
1a140 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
1a150 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20  z*2) FROM tab2. 
1a160 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45 20   **     ) WHERE 
1a170 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a  a!=5 ORDER BY 1.
1a180 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66    **.  ** Transf
1a190 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a  ormed into:.  **
1a1a0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1a1b0 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48   x+1 FROM tab WH
1a1c0 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20  ERE x+1!=5.  ** 
1a1d0 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
1a1e0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b  **     SELECT y+
1a1f0 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45  1 FROM tab WHERE
1a200 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20   y+1!=5.  **    
1a210 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
1a220 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a      SELECT abs(z
1a230 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20  *2)+1 FROM tab2 
1a240 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31  WHERE abs(z*2)+1
1a250 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44  !=5.  **     ORD
1a260 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a  ER BY 1.  **.  *
1a270 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74  * We call this t
1a280 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  he "compound-sub
1a290 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  query flattening
1a2a0 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53  "..  */.  for(pS
1a2b0 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b  ub=pSub->pPrior;
1a2c0 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62   pSub; pSub=pSub
1a2d0 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53  ->pPrior){.    S
1a2e0 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20  elect *pNew;.   
1a2f0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
1a300 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
1a310 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69  y;.    Expr *pLi
1a320 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
1a330 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66 73  .    Expr *pOffs
1a340 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
1a350 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72  .    Select *pPr
1a360 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
1a370 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
1a380 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72   = 0;.    p->pSr
1a390 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50  c = 0;.    p->pP
1a3a0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rior = 0;.    p-
1a3b0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
1a3c0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
1a3d0 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
1a3e0 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
1a3f0 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70   p, 0);.    p->p
1a400 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
1a410 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20  ;.    p->pLimit 
1a420 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d  = pLimit;.    p-
1a430 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
1a440 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72  erBy;.    p->pSr
1a450 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d  c = pSrc;.    p-
1a460 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20  >op = TK_ALL;.  
1a470 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20    p->pRightmost 
1a480 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  = 0;.    if( pNe
1a490 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e  w==0 ){.      pN
1a4a0 65 77 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  ew = pPrior;.   
1a4b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
1a4c0 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72  ew->pPrior = pPr
1a4d0 69 6f 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ior;.      pNew-
1a4e0 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b  >pRightmost = 0;
1a4f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 50  .    }.    p->pP
1a500 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  rior = pNew;.   
1a510 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1a520 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
1a530 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
1a540 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65  n flattening the
1a550 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20   iFrom-th entry 
1a560 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
1a570 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  se .  ** in the 
1a580 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
1a590 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31  /.  pSub = pSub1
1a5a0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
1a5b0 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  lect;..  /* Dele
1a5c0 74 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  te the transient
1a5d0 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
1a5e0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1a5f0 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
1a600 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ry.  */.  sqlite
1a610 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
1a620 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  item->zDatabase)
1a630 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1a640 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
1a650 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
1a660 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
1a670 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  item->zAlias);. 
1a680 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
1a690 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62  base = 0;.  pSub
1a6a0 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  item->zName = 0;
1a6b0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  .  pSubitem->zAl
1a6c0 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ias = 0;.  pSubi
1a6d0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30  tem->pSelect = 0
1a6e0 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65  ;..  /* Defer de
1a6f0 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65  leting the Table
1a700 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
1a710 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
1a720 20 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20   subquery until 
1a730 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  code generation 
1a740 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65  is.  ** complete
1a750 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61  , since there ma
1a760 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78  y still exist Ex
1a770 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20  pr.pTab entries 
1a780 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20  that.  ** refer 
1a790 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
1a7a0 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74  even after flatt
1a7b0 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23  ening.  Ticket #
1a7c0 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  3346..  **.  ** 
1a7d0 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69  pSubitem->pTab i
1a7e0 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c  s always non-NUL
1a7f0 4c 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69  L by test restri
1a800 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73  ctions and tests
1a810 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69   above..  */.  i
1a820 66 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74  f( ALWAYS(pSubit
1a830 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a  em->pTab!=0) ){.
1a840 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54      Table *pTabT
1a850 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d  oDel = pSubitem-
1a860 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
1a870 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d  TabToDel->nRef==
1a880 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65  1 ){.      Parse
1a890 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
1a8a0 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
1a8b0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
1a8c0 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65    pTabToDel->pNe
1a8d0 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c  xtZombie = pTopl
1a8e0 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
1a8f0 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65  ;.      pTopleve
1a900 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20  l->pZombieTab = 
1a910 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d  pTabToDel;.    }
1a920 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62  else{.      pTab
1a930 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  ToDel->nRef--;. 
1a940 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65     }.    pSubite
1a950 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d  m->pTab = 0;.  }
1a960 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
1a970 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f  wing loop runs o
1a980 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 65 72  nce for each ter
1a990 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d  m in a compound-
1a9a0 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c  subquery.  ** fl
1a9b0 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73  attening (as des
1a9c0 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20  cribed above).  
1a9d0 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
1a9e0 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64  a different kind
1a9f0 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e  .  ** of flatten
1aa00 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69  ing - a flatteni
1aa10 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
1aa20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
1aa30 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20  y flattening -. 
1aa40 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f   ** then this lo
1aa50 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63  op only runs onc
1aa60 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
1aa70 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c  s loop moves all
1aa80 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65   of the FROM ele
1aa90 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62  ments of the sub
1aaa0 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
1aab0 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
1aac0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1aad0 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20   query.  Before 
1aae0 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65  doing this, reme
1aaf0 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75  mber.  ** the cu
1ab00 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
1ab10 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74  the original out
1ab20 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c  er query FROM el
1ab30 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50  ement in.  ** iP
1ab40 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72  arent.  The iPar
1ab50 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ent cursor will 
1ab60 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20  never be used.  
1ab70 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a  Subsequent code.
1ab80 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65    ** will scan e
1ab90 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69  xpressions looki
1aba0 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72  ng for iParent r
1abb0 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65  eferences and re
1abc0 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65  place.  ** those
1abd0 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68   references with
1abe0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1abf0 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65  t resolve to the
1ac00 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20   subquery FROM. 
1ac10 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20   ** elements we 
1ac20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20  are now copying 
1ac30 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  in..  */.  for(p
1ac40 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e  Parent=p; pParen
1ac50 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65  t; pParent=pPare
1ac60 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62  nt->pPrior, pSub
1ac70 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
1ac80 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b      int nSubSrc;
1ac90 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65  .    u8 jointype
1aca0 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72   = 0;.    pSubSr
1acb0 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20  c = pSub->pSrc; 
1acc0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
1acd0 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a  se of subquery *
1ace0 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20  /.    nSubSrc = 
1acf0 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20  pSubSrc->nSrc;  
1ad00 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
1ad10 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79 20 46  ms in subquery F
1ad20 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
1ad30 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74    pSrc = pParent
1ad40 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46  ->pSrc;     /* F
1ad50 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1ad60 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
1ad70 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 20 29  ..    if( pSrc )
1ad80 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1ad90 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f  pParent==p );  /
1ada0 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 72  * First time thr
1adb0 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  ough the loop */
1adc0 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
1add0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e  = pSubitem->join
1ade0 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  type;.    }else{
1adf0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ae00 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a  Parent!=p );  /*
1ae10 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
1ae20 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67  ent times throug
1ae30 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
1ae40 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
1ae50 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74  nt->pSrc = sqlit
1ae60 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1ae70 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  db, 0, 0, 0);.  
1ae80 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20      if( pSrc==0 
1ae90 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1aea0 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
1aeb0 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62  led );.        b
1aec0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1aed0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
1aee0 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20  subquery uses a 
1aef0 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74  single slot of t
1af00 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1af10 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20  f the outer.    
1af20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68  ** query.  If th
1af30 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d  e subquery has m
1af40 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65  ore than one ele
1af50 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d  ment in its FROM
1af60 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20   clause,.    ** 
1af70 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20  then expand the 
1af80 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d  outer query to m
1af90 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74  ake space for it
1afa0 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65   to hold all ele
1afb0 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20  ments.    ** of 
1afc0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
1afd0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
1afe0 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
1aff0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
1b000 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43  ROM tabA, (SELEC
1b010 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73  T * FROM sub1, s
1b020 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20  ub2), tabB;.    
1b030 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75  **.    ** The ou
1b040 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20  ter query has 3 
1b050 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f  slots in its FRO
1b060 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73  M clause.  One s
1b070 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  lot of the.    *
1b080 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74  * outer query (t
1b090 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20  he middle slot) 
1b0a0 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  is used by the s
1b0b0 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65  ubquery.  The ne
1b0c0 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  xt.    ** block 
1b0d0 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70  of code will exp
1b0e0 61 6e 64 20 74 68 65 20 6f 75 74 20 71 75 65 72  and the out quer
1b0f0 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20 20 54  y to 4 slots.  T
1b100 68 65 20 6d 69 64 64 6c 65 0a 20 20 20 20 2a 2a  he middle.    **
1b110 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65   slot is expande
1b120 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69  d to two slots i
1b130 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20  n order to make 
1b140 73 70 61 63 65 20 66 6f 72 20 74 68 65 0a 20 20  space for the.  
1b150 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74    ** two element
1b160 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
1b170 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
1b180 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
1b190 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29   if( nSubSrc>1 )
1b1a0 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
1b1b0 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73  >pSrc = pSrc = s
1b1c0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
1b1d0 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e  arge(db, pSrc, n
1b1e0 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31  SubSrc-1,iFrom+1
1b1f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
1b200 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1b210 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1b220 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1b230 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74     /* Transfer t
1b240 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
1b250 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75  erms from the su
1b260 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
1b270 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
1b280 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ry..    */.    f
1b290 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72  or(i=0; i<nSubSr
1b2a0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
1b2b0 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1b2c0 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69  te(db, pSrc->a[i
1b2d0 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b  +iFrom].pUsing);
1b2e0 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  .      pSrc->a[i
1b2f0 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72  +iFrom] = pSubSr
1b300 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d  c->a[i];.      m
1b310 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e  emset(&pSubSrc->
1b320 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  a[i], 0, sizeof(
1b330 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b  pSubSrc->a[i]));
1b340 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d  .    }.    pSrc-
1b350 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79  >a[iFrom].jointy
1b360 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20  pe = jointype;. 
1b370 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67   .    /* Now beg
1b380 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20  in substituting 
1b390 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20  subquery result 
1b3a0 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  set expressions 
1b3b0 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65  for .    ** refe
1b3c0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50  rences to the iP
1b3d0 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74  arent in the out
1b3e0 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  er query..    **
1b3f0 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65   .    ** Example
1b400 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1b410 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a    SELECT a+5, b*
1b420 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  10 FROM (SELECT 
1b430 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41  x*3 AS a, y+10 A
1b440 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45  S b FROM t1) WHE
1b450 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20  RE a>b;.    **  
1b460 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
1b470 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
1b480 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f  _____ subquery _
1b490 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  _________/      
1b4a0 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20      /.    **    
1b4b0 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
1b4c0 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65  ______ outer que
1b4d0 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ry _____________
1b4e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1b4f0 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  _/.    **.    **
1b500 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72   We look at ever
1b510 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
1b520 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1b530 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
1b540 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61  we see.    ** "a
1b550 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
1b560 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20  "x*3" and every 
1b570 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22  place we see "b"
1b580 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
1b590 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20  y+10"..    */.  
1b5a0 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72 65 6e    pList = pParen
1b5b0 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66  t->pEList;.    f
1b5c0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1b5d0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1b5e0 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
1b5f0 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  [i].zName==0 ){.
1b600 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
1b610 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
1b620 74 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d  trDup(db, pList-
1b630 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20  >a[i].zSpan);.  
1b640 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
1b650 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  uote(zName);.   
1b660 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d       pList->a[i]
1b670 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  .zName = zName;.
1b680 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b690 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1b6a0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c  db, pParent->pEL
1b6b0 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ist, iParent, pS
1b6c0 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
1b6d0 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20   if( isAgg ){.  
1b6e0 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1b6f0 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  t(db, pParent->p
1b700 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74  GroupBy, iParent
1b710 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
1b720 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1b730 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45  pHaving = substE
1b740 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  xpr(db, pParent-
1b750 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e  >pHaving, iParen
1b760 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1b770 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b780 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
1b790 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1b7a0 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
1b7b0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  y==0 );.      pP
1b7c0 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20  arent->pOrderBy 
1b7d0 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  = pSub->pOrderBy
1b7e0 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f  ;.      pSub->pO
1b7f0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
1b800 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 65 6e  }else if( pParen
1b810 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  t->pOrderBy ){. 
1b820 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
1b830 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  st(db, pParent->
1b840 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e  pOrderBy, iParen
1b850 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1b860 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b870 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a  pSub->pWhere ){.
1b880 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 73        pWhere = s
1b890 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
1b8a0 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20  , pSub->pWhere, 
1b8b0 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
1b8c0 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b       pWhere = 0;
1b8d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
1b8e0 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
1b8f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1b900 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d  arent->pHaving==
1b910 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
1b920 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 50  nt->pHaving = pP
1b930 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20  arent->pWhere;. 
1b940 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
1b950 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
1b960 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
1b970 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70  aving = substExp
1b980 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  r(db, pParent->p
1b990 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
1b9a0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
1b9b0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1b9c0 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
1b9d0 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72  ExprAnd(db, pPar
1b9e0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20  ent->pHaving, . 
1b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba10 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
1ba20 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e  db, pSub->pHavin
1ba30 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61 73  g, 0));.      as
1ba40 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
1ba50 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20  GroupBy==0 );.  
1ba60 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72      pParent->pGr
1ba70 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
1ba80 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
1ba90 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30  Sub->pGroupBy, 0
1baa0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1bab0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
1bac0 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28  ere = substExpr(
1bad0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  db, pParent->pWh
1bae0 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ere, iParent, pS
1baf0 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
1bb00 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
1bb10 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
1bb20 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  And(db, pParent-
1bb30 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29  >pWhere, pWhere)
1bb40 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
1bb50 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20  * The flattened 
1bb60 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
1bb70 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20  t if either the 
1bb80 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20  inner or the.   
1bb90 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
1bba0 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20  is distinct. .  
1bbb0 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74    */.    pParent
1bbc0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53  ->selFlags |= pS
1bbd0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
1bbe0 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20  F_Distinct;.  . 
1bbf0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c     /*.    ** SEL
1bc00 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45  ECT ... FROM (SE
1bc10 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61  LECT ... LIMIT a
1bc20 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54   OFFSET b) LIMIT
1bc30 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20   x OFFSET y;.   
1bc40 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69   **.    ** One i
1bc50 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79  s tempted to try
1bc60 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20   to add a and b 
1bc70 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c  to combine the l
1bc80 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73  imits.  But this
1bc90 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  .    ** does not
1bca0 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20   work if either 
1bcb0 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
1bcc0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1bcd0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  ( pSub->pLimit )
1bce0 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
1bcf0 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e  >pLimit = pSub->
1bd00 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53  pLimit;.      pS
1bd10 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a  ub->pLimit = 0;.
1bd20 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1bd30 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65  Finially, delete
1bd40 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66   what is left of
1bd50 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   the subquery an
1bd60 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75  d return.  ** su
1bd70 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ccess..  */.  sq
1bd80 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
1bd90 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 20  e(db, pSub1);.. 
1bda0 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
1bdb0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
1bdc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1bdd0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1bde0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1bdf0 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61  EW) */../*.** Ba
1be00 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
1be10 6e 74 73 20 6f 66 20 74 68 65 20 41 67 67 49 6e  nts of the AggIn
1be20 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 64  fo structure ind
1be30 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66 69  icated by the fi
1be40 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c  rst.** argument,
1be50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
1be60 68 65 63 6b 73 20 69 66 20 74 68 65 20 66 6f 6c  hecks if the fol
1be70 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
1be80 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
1be90 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 6a  query contains j
1bea0 75 73 74 20 61 20 73 69 6e 67 6c 65 20 61 67 67  ust a single agg
1beb0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c  regate function,
1bec0 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 67 67  .**    * the agg
1bed0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
1bee0 69 73 20 65 69 74 68 65 72 20 6d 69 6e 28 29 20  is either min() 
1bef0 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a 2a  or max(), and.**
1bf00 20 20 20 20 2a 20 74 68 65 20 61 72 67 75 6d 65      * the argume
1bf10 6e 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  nt to the aggreg
1bf20 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ate function is 
1bf30 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a  a column value..
1bf40 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  **.** If all of 
1bf50 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 74 72  the above are tr
1bf60 75 65 2c 20 74 68 65 6e 20 57 48 45 52 45 5f 4f  ue, then WHERE_O
1bf70 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48  RDERBY_MIN or WH
1bf80 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 0a  ERE_ORDERBY_MAX.
1bf90 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  ** is returned a
1bfa0 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 41  s appropriate. A
1bfb0 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69  lso, *ppMinMax i
1bfc0 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
1bfd0 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20 6f  o the .** list o
1bfe0 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
1bff0 65 64 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ed to the aggreg
1c000 61 74 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ate before retur
1c010 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ning..**.** Or, 
1c020 69 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  if the condition
1c030 73 20 61 62 6f 76 65 20 61 72 65 20 6e 6f 74 20  s above are not 
1c040 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69  met, *ppMinMax i
1c050 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a  s set to 0 and.*
1c060 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  * WHERE_ORDERBY_
1c070 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74 75 72 6e  NORMAL is return
1c080 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ed..*/.static u8
1c090 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 41 67 67   minMaxQuery(Agg
1c0a0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c 20  Info *pAggInfo, 
1c0b0 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e  ExprList **ppMin
1c0c0 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74  Max){.  int eRet
1c0d0 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
1c0e0 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20 20  _NORMAL;        
1c0f0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1c100 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61  e */..  *ppMinMa
1c110 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 41 67  x = 0;.  if( pAg
1c120 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20  gInfo->nFunc==1 
1c130 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
1c140 70 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  pr = pAggInfo->a
1c150 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20 2f  Func[0].pExpr; /
1c160 2a 20 41 67 67 72 65 67 61 74 65 20 66 75 6e 63  * Aggregate func
1c170 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72  tion */.    Expr
1c180 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
1c190 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20  Expr->x.pList;  
1c1a0 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73      /* Arguments
1c1b0 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e   to agg function
1c1c0 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
1c1d0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
1c1e0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
1c1f0 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26     if( pEList &&
1c200 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
1c210 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30  1 && pEList->a[0
1c220 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
1c230 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  AGG_COLUMN ){.  
1c240 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1c250 7a 46 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e 75  zFunc = pExpr->u
1c260 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69  .zToken;.      i
1c270 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1c280 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d  p(zFunc, "min")=
1c290 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52  =0 ){.        eR
1c2a0 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
1c2b0 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20  BY_MIN;.        
1c2c0 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69  *ppMinMax = pELi
1c2d0 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  st;.      }else 
1c2e0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1c2f0 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29  mp(zFunc, "max")
1c300 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
1c310 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
1c320 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20 20  RBY_MAX;.       
1c330 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c   *ppMinMax = pEL
1c340 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
1c350 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
1c360 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c  ( *ppMinMax==0 |
1c370 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e  | (*ppMinMax)->n
1c380 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65 74  Expr==1 );.  ret
1c390 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn eRet;.}../*.
1c3a0 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74  ** The select st
1c3b0 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
1c3c0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
1c3d0 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65  ment is an aggre
1c3e0 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54  gate query..** T
1c3f0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 6d 65 6e  he second argmen
1c400 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61  t is the associa
1c410 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e  ted aggregate-in
1c420 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20  fo object. This 
1c430 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73  .** function tes
1c440 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  ts if the SELECT
1c450 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
1c460 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
1c470 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74  count(*) FROM <t
1c480 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  bl>.**.** where 
1c490 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62  table is a datab
1c4a0 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  ase table, not a
1c4b0 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
1c4c0 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72  iew. If the quer
1c4d0 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20  y.** does match 
1c4e0 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68  this pattern, th
1c4f0 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  en a pointer to 
1c500 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
1c510 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a   representing.**
1c520 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e   <tbl> is return
1c530 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
1c540 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1c550 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69  .static Table *i
1c560 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c  sSimpleCount(Sel
1c570 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20  ect *p, AggInfo 
1c580 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61  *pAggInfo){.  Ta
1c590 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70  ble *pTab;.  Exp
1c5a0 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73  r *pExpr;..  ass
1c5b0 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42  ert( !p->pGroupB
1c5c0 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  y );..  if( p->p
1c5d0 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69  Where || p->pELi
1c5e0 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20  st->nExpr!=1 .  
1c5f0 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72   || p->pSrc->nSr
1c600 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d  c!=1 || p->pSrc-
1c610 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20  >a[0].pSelect.  
1c620 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1c630 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d  .  }.  pTab = p-
1c640 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
1c650 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70  ;.  pExpr = p->p
1c660 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
1c670 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  r;.  assert( pTa
1c680 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c  b && !pTab->pSel
1c690 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a  ect && pExpr );.
1c6a0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
1c6b0 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
1c6c0 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
1c6d0 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
1c6e0 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
1c6f0 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67 67    if( NEVER(pAgg
1c700 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20  Info->nFunc==0) 
1c710 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1c720 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  ( (pAggInfo->aFu
1c730 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e  nc[0].pFunc->fun
1c740 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55  cFlags&SQLITE_FU
1c750 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72  NC_COUNT)==0 ) r
1c760 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
1c770 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44  Expr->flags&EP_D
1c780 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
1c790 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54   0;..  return pT
1c7a0 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ab;.}../*.** If 
1c7b0 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
1c7c0 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61  item passed as a
1c7d0 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61  n argument was a
1c7e0 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e  ugmented with an
1c7f0 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63  .** INDEXED BY c
1c800 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20  lause, then try 
1c810 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70  to locate the sp
1c820 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49  ecified index. I
1c830 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73  f there.** was s
1c840 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64  uch a clause and
1c850 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
1c860 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
1c870 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
1c880 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65  ITE_ERROR and le
1c890 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
1c8a0 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73  pParse. Otherwis
1c8b0 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20  e, populate .** 
1c8c0 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e  pFrom->pIndex an
1c8d0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
1c8e0 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
1c8f0 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75  e3IndexedByLooku
1c900 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
1c910 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1c920 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  item *pFrom){.  
1c930 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
1c940 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78  && pFrom->zIndex
1c950 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
1c960 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
1c970 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e  b;.    char *zIn
1c980 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e  dex = pFrom->zIn
1c990 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  dex;.    Index *
1c9a0 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
1c9b0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
1c9c0 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26   .        pIdx &
1c9d0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
1c9e0 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49  (pIdx->zName, zI
1c9f0 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20 20  ndex); .        
1ca00 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
1ca10 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
1ca20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73  !pIdx ){.      s
1ca30 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1ca40 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
1ca50 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64  index: %s", zInd
1ca60 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  ex, 0);.      pP
1ca70 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
1ca80 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  a = 1;.      ret
1ca90 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
1caa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f  ;.    }.    pFro
1cab0 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  m->pIndex = pIdx
1cac0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1cad0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  QLITE_OK;.}./*.*
1cae0 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e  * Detect compoun
1caf0 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
1cb00 6e 74 73 20 74 68 61 74 20 75 73 65 20 61 6e 20  nts that use an 
1cb10 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1cb20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65  with .** an alte
1cb30 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e  rnative collatin
1cb40 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
1cb50 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20  *    SELECT ... 
1cb60 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
1cb70 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
1cb80 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20 43 4f  2 ORDER BY .. CO
1cb90 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  LLATE ....**.** 
1cba0 54 68 65 73 65 20 61 72 65 20 72 65 77 72 69 74  These are rewrit
1cbb0 74 65 6e 20 61 73 20 61 20 73 75 62 71 75 65 72  ten as a subquer
1cbc0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  y:.**.**    SELE
1cbd0 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
1cbe0 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58  T ... FROM t1 EX
1cbf0 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20  CEPT SELECT ... 
1cc00 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20  FROM t2).**     
1cc10 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c  ORDER BY ... COL
1cc20 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54  LATE ....**.** T
1cc30 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
1cc40 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  on is necessary 
1cc50 62 65 63 61 75 73 65 20 74 68 65 20 6d 75 6c 74  because the mult
1cc60 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29  iSelectOrderBy()
1cc70 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76   routine.** abov
1cc80 65 20 74 68 61 74 20 67 65 6e 65 72 61 74 65 73  e that generates
1cc90 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20   the code for a 
1cca0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
1ccb0 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
1ccc0 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73 20   clause.** uses 
1ccd0 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  a merge algorith
1cce0 6d 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  m that requires 
1ccf0 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69  the same collati
1cd00 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 74  ng sequence on t
1cd10 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c  he.** result col
1cd20 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65 20 4f  umns as on the O
1cd30 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
1cd40 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68   See ticket.** h
1cd50 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65  ttp://www.sqlite
1cd60 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37  .org/src/info/67
1cd70 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54  09574d2a.**.** T
1cd80 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
1cd90 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65  on is only neede
1cda0 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20 49 4e  d for EXCEPT, IN
1cdb0 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55 4e 49  TERSECT, and UNI
1cdc0 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e  ON..** The UNION
1cdd0 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f   ALL operator wo
1cde0 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20 6d 75  rks fine with mu
1cdf0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
1ce00 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20  () even when.** 
1ce10 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c 41 54  there are COLLAT
1ce20 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  E terms in the O
1ce30 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74  RDER BY..*/.stat
1ce40 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f  ic int convertCo
1ce50 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75  mpoundSelectToSu
1ce60 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20 2a 70  bquery(Walker *p
1ce70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
1ce80 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  p){.  int i;.  S
1ce90 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53  elect *pNew;.  S
1cea0 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c  elect *pX;.  sql
1ceb0 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 72 75  ite3 *db;.  stru
1cec0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1ced0 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   *a;.  SrcList *
1cee0 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72 73 65  pNewSrc;.  Parse
1cef0 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65   *pParse;.  Toke
1cf00 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20  n dummy;..  if( 
1cf10 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72  p->pPrior==0 ) r
1cf20 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
1cf30 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72  ue;.  if( p->pOr
1cf40 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
1cf50 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1cf60 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58 20 26    for(pX=p; pX &
1cf70 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  & (pX->op==TK_AL
1cf80 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  L || pX->op==TK_
1cf90 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e  SELECT); pX=pX->
1cfa0 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20  pPrior){}.  if( 
1cfb0 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  pX==0 ) return W
1cfc0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61  RC_Continue;.  a
1cfd0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e   = p->pOrderBy->
1cfe0 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f  a;.  for(i=p->pO
1cff0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b  rderBy->nExpr-1;
1d000 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
1d010 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d   if( a[i].pExpr-
1d020 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
1d030 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ate ) break;.  }
1d040 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74  .  if( i<0 ) ret
1d050 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
1d060 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  ;..  /* If we re
1d070 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
1d080 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 74  that means the t
1d090 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
1d0a0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20   required. */.. 
1d0b0 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65   pParse = pWalke
1d0c0 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  r->pParse;.  db 
1d0d0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1d0e0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
1d0f0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
1d100 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
1d110 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
1d120 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1d130 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d  ;.  memset(&dumm
1d140 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d  y, 0, sizeof(dum
1d150 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72 63 20  my));.  pNewSrc 
1d160 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1d170 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70  AppendFromTerm(p
1d180 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d  Parse,0,0,0,&dum
1d190 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20  my,pNew,0,0);.  
1d1a0 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30 20 29  if( pNewSrc==0 )
1d1b0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
1d1c0 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b  t;.  *pNew = *p;
1d1d0 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65  .  p->pSrc = pNe
1d1e0 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73  wSrc;.  p->pELis
1d1f0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
1d200 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1d210 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72  , 0, sqlite3Expr
1d220 28 64 62 2c 20 54 4b 5f 41 4c 4c 2c 20 30 29 29  (db, TK_ALL, 0))
1d230 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53  ;.  p->op = TK_S
1d240 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65  ELECT;.  p->pWhe
1d250 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  re = 0;.  pNew->
1d260 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20  pGroupBy = 0;.  
1d270 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
1d280 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  0;.  pNew->pOrde
1d290 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50  rBy = 0;.  p->pP
1d2a0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77  rior = 0;.  pNew
1d2b0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
1d2c0 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
1d2d0 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
1d2e0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
1d2f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d300 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c  is a Walker call
1d310 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64  back for "expand
1d320 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74  ing" a SELECT st
1d330 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70  atement..** "Exp
1d340 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f  anding" means to
1d350 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   do the followin
1d360 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  g:.**.**    (1) 
1d370 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20   Make sure VDBE 
1d380 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
1d390 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
1d3a0 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20  d to every.**   
1d3b0 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66        element of
1d3c0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1d3d0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
1d3e0 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62  Fill in the pTab
1d3f0 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  List->a[].pTab f
1d400 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63  ields in the Src
1d410 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
1d420 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52        defines FR
1d430 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e  OM clause.  When
1d440 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e   views appear in
1d450 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1d460 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c  ,.**         fil
1d470 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  l pTabList->a[].
1d480 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63  pSelect with a c
1d490 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
1d4a0 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  T statement.**  
1d4b0 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c         that impl
1d4c0 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e  ements the view.
1d4d0 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65    A copy is made
1d4e0 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53   of the view's S
1d4f0 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
1d500 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68   statement so th
1d510 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79  at we can freely
1d520 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74   modify or delet
1d530 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
1d540 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68  .**         with
1d550 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f  out worrying abo
1d560 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68  ut messing up th
1d570 65 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70  e presistent rep
1d580 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20  resentation.**  
1d590 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69         of the vi
1d5a0 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  ew..**.**    (3)
1d5b0 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
1d5c0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1d5d0 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68  to accomodate th
1d5e0 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
1d5f0 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20  d.**         on 
1d600 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e  joins and the ON
1d610 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
1d620 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a  e of joins..**.*
1d630 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74  *    (4)  Scan t
1d640 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
1d650 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
1d660 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f   set (pEList) lo
1d670 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oking.**        
1d680 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f   for instances o
1d690 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74  f the "*" operat
1d6a0 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e  or or the TABLE.
1d6b0 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20  * operator..**  
1d6c0 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c         If found,
1d6d0 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22   expand each "*"
1d6e0 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
1d6f0 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62  umn in every tab
1d700 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e  le.**         an
1d710 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20  d TABLE.* to be 
1d720 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
1d730 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61  TABLE..**.*/.sta
1d740 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78  tic int selectEx
1d750 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70  pander(Walker *p
1d760 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
1d770 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
1d780 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
1d790 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20  Parse;.  int i, 
1d7a0 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20  j, k;.  SrcList 
1d7b0 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70  *pTabList;.  Exp
1d7c0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
1d7d0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1d7e0 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73  item *pFrom;.  s
1d7f0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1d800 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
1d810 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70  *pE, *pRight, *p
1d820 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46  Expr;.  u16 selF
1d830 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
1d840 67 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  gs;..  p->selFla
1d850 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65  gs |= SF_Expande
1d860 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  d;.  if( db->mal
1d870 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20  locFailed  ){.  
1d880 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
1d890 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45  rt;.  }.  if( NE
1d8a0 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20  VER(p->pSrc==0) 
1d8b0 7c 7c 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53  || (selFlags & S
1d8c0 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29  F_Expanded)!=0 )
1d8d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
1d8e0 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54  _Prune;.  }.  pT
1d8f0 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
1d900 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
1d910 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61  pEList;..  /* Ma
1d920 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e  ke sure cursor n
1d930 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
1d940 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
1d950 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a   entries in.  **
1d960 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1d970 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
1d980 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
1d990 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1d9a0 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
1d9b0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a  rse, pTabList);.
1d9c0 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
1d9d0 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  ery table named 
1d9e0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1d9f0 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  se of the select
1da00 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e  .  If.  ** an en
1da10 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
1da20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71  clause is a subq
1da30 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20  uery instead of 
1da40 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c  a table or view,
1da50 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  .  ** then creat
1da60 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61  e a transient ta
1da70 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ble structure to
1da80 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75   describe the su
1da90 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  bquery..  */.  f
1daa0 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
1dab0 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
1dac0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
1dad0 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
1dae0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
1daf0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
1db00 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
1db10 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68  This statement h
1db20 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1db30 70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65  prepared.  There
1db40 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
1db50 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68    ** to go furth
1db60 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  er. */.      ass
1db70 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20  ert( i==0 );.   
1db80 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
1db90 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  une;.    }.    i
1dba0 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d  f( pFrom->zName=
1dbb0 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
1dbc0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1dbd0 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  RY.      Select 
1dbe0 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSel = pFrom->p
1dbf0 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a  Select;.      /*
1dc00 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
1dc10 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1dc20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
1dc30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65       assert( pSe
1dc40 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  l!=0 );.      as
1dc50 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
1dc60 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  b==0 );.      sq
1dc70 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
1dc80 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a  pWalker, pSel);.
1dc90 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
1dca0 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
1dcb0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
1dcc0 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
1dcd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
1dce0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
1dcf0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70  C_Abort;.      p
1dd00 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Tab->nRef = 1;. 
1dd10 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
1dd20 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
1dd30 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 71  f(db, "sqlite_sq
1dd40 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29 70 54 61  _%p", (void*)pTa
1dd50 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  b);.      while(
1dd60 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b   pSel->pPrior ){
1dd70 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
1dd80 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 65  rior; }.      se
1dd90 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  lectColumnsFromE
1dda0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
1ddb0 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70  pSel->pEList, &p
1ddc0 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
1ddd0 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70  ->aCol);.      p
1dde0 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
1ddf0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f  .      pTab->nRo
1de00 77 45 73 74 20 3d 20 31 30 34 38 35 37 36 3b 0a  wEst = 1048576;.
1de10 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46        pTab->tabF
1de20 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d  lags |= TF_Ephem
1de30 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  eral;.#endif.   
1de40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
1de50 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62   An ordinary tab
1de60 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
1de70 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1de80 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  se */.      asse
1de90 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
1dea0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f  =0 );.      pFro
1deb0 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
1dec0 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
1ded0 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
1dee0 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20  0, pFrom);.     
1def0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
1df00 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
1df10 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
1df20 3e 6e 52 65 66 3d 3d 30 78 66 66 66 66 20 29 7b  >nRef==0xffff ){
1df30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1df40 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1df50 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72   "too many refer
1df60 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a  ences to \"%s\":
1df70 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20 20 20   max 65535",.   
1df80 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
1df90 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 46  ame);.        pF
1dfa0 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  rom->pTab = 0;. 
1dfb0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
1dfc0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
1dfd0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65  .      pTab->nRe
1dfe0 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  f++;.#if !define
1dff0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1e000 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20  EW) || !defined 
1e010 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
1e020 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20  TUALTABLE).     
1e030 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
1e040 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28  ct || IsVirtual(
1e050 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
1e060 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65 72   /* We reach her
1e070 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74  e if the named t
1e080 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79  able is a really
1e090 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20   a view */.     
1e0a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69     if( sqlite3Vi
1e0b0 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
1e0c0 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
1e0d0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
1e0e0 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
1e0f0 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  t( pFrom->pSelec
1e100 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
1e110 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
1e120 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
1e130 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c  p(db, pTab->pSel
1e140 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
1e150 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
1e160 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f  ct(pWalker, pFro
1e170 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
1e180 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1e190 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65  }..    /* Locate
1e1a0 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64   the index named
1e1b0 20 62 79 20 74 68 65 20 49 4e 44 45 58 45 44 20   by the INDEXED 
1e1c0 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e  BY clause, if an
1e1d0 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  y. */.    if( sq
1e1e0 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f  lite3IndexedByLo
1e1f0 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46 72  okup(pParse, pFr
1e200 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  om) ){.      ret
1e210 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
1e220 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
1e230 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b  rocess NATURAL k
1e240 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20  eywords, and ON 
1e250 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
1e260 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f  s of joins..  */
1e270 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1e280 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74  cFailed || sqlit
1e290 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61  eProcessJoin(pPa
1e2a0 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72  rse, p) ){.    r
1e2b0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
1e2c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65  .  }..  /* For e
1e2d0 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63  very "*" that oc
1e2e0 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75  curs in the colu
1e2f0 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20  mn list, insert 
1e300 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a  the names of.  *
1e310 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  * all columns in
1e320 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e   all tables.  An
1e330 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c  d for every TABL
1e340 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e  E.* insert the n
1e350 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c  ames.  ** of all
1e360 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c   columns in TABL
1e370 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  E.  The parser i
1e380 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61  nserted a specia
1e390 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  l expression.  *
1e3a0 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c  * with the TK_AL
1e3b0 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65  L operator for e
1e3c0 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20  ach "*" that it 
1e3d0 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c  found in the col
1e3e0 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54  umn list..  ** T
1e3f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
1e400 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f  e just has to lo
1e410 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20  cate the TK_ALL 
1e420 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20  expressions and 
1e430 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68  expand.  ** each
1e440 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74   one to the list
1e450 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
1e460 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20  in all tables.. 
1e470 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
1e480 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65  st loop just che
1e490 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68  cks to see if th
1e4a0 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20  ere are any "*" 
1e4b0 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74  operators.  ** t
1e4c0 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69  hat need expandi
1e4d0 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b  ng..  */.  for(k
1e4e0 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
1e4f0 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70  xpr; k++){.    p
1e500 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d  E = pEList->a[k]
1e510 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
1e520 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  pE->op==TK_ALL )
1e530 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65   break;.    asse
1e540 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
1e550 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74  OT || pE->pRight
1e560 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
1e570 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
1e580 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21  T || (pE->pLeft!
1e590 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d  =0 && pE->pLeft-
1e5a0 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20  >op==TK_ID) );. 
1e5b0 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
1e5c0 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69  K_DOT && pE->pRi
1e5d0 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  ght->op==TK_ALL 
1e5e0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
1e5f0 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
1e600 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
1e610 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
1e620 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
1e630 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
1e640 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
1e650 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
1e660 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
1e670 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
1e680 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
1e690 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
1e6a0 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
1e6b0 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
1e6c0 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
1e6d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
1e6e0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1e6f0 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
1e700 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
1e710 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e  pNew = 0;.    in
1e720 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65  t flags = pParse
1e730 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ->db->flags;.   
1e740 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d   int longNames =
1e750 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1e760 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
1e770 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
1e780 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67          && (flag
1e790 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
1e7a0 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20  ColNames)==0;.. 
1e7b0 20 20 20 2f 2a 20 57 68 65 6e 20 70 72 6f 63 65     /* When proce
1e7c0 73 73 69 6e 67 20 46 52 4f 4d 2d 63 6c 61 75 73  ssing FROM-claus
1e7d0 65 20 73 75 62 71 75 65 72 69 65 73 2c 20 69 74  e subqueries, it
1e7e0 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 63   is always the c
1e7f0 61 73 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ase.    ** that 
1e800 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  full_column_name
1e810 73 3d 4f 46 46 20 61 6e 64 20 73 68 6f 72 74 5f  s=OFF and short_
1e820 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 4e 2e  column_names=ON.
1e830 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c    The.    ** sql
1e840 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
1e850 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65 20  elect() routine 
1e860 6d 61 6b 65 73 20 69 74 20 73 6f 2e 20 2a 2f 0a  makes it so. */.
1e870 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
1e880 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
1e890 73 74 65 64 46 72 6f 6d 29 3d 3d 30 0a 20 20 20  stedFrom)==0.   
1e8a0 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61 67         || ((flag
1e8b0 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
1e8c0 6f 6c 4e 61 6d 65 73 29 3d 3d 30 20 26 26 0a 20  olNames)==0 &&. 
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c               (fl
1e8e0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
1e8f0 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 29 20  rtColNames)!=0) 
1e900 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b  );..    for(k=0;
1e910 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
1e920 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45  ; k++){.      pE
1e930 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20   = a[k].pExpr;. 
1e940 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45       pRight = pE
1e950 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
1e960 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
1e970 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74  TK_DOT || pRight
1e980 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
1e990 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20   pE->op!=TK_ALL 
1e9a0 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  && (pE->op!=TK_D
1e9b0 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70  OT || pRight->op
1e9c0 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20  !=TK_ALL) ){.   
1e9d0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72       /* This par
1e9e0 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69  ticular expressi
1e9f0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  on does not need
1ea00 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
1ea10 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1ea20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1ea30 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
1ea40 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61  (pParse, pNew, a
1ea50 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [k].pExpr);.    
1ea60 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
1ea70 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
1ea80 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
1ea90 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e  .zName = a[k].zN
1eaa0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ame;.          p
1eab0 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
1eac0 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b  pr-1].zSpan = a[
1ead0 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20  k].zSpan;.      
1eae0 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d      a[k].zName =
1eaf0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b   0;.          a[
1eb00 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20  k].zSpan = 0;.  
1eb10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1eb20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a  a[k].pExpr = 0;.
1eb30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1eb40 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70       /* This exp
1eb50 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22  ression is a "*"
1eb60 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20   or a "TABLE.*" 
1eb70 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  and needs to be.
1eb80 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e          ** expan
1eb90 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ded. */.        
1eba0 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20  int tableSeen = 
1ebb0 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  0;      /* Set t
1ebc0 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d  o 1 when TABLE m
1ebd0 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
1ebe0 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d    char *zTName =
1ebf0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78   0;       /* tex
1ec00 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42  t of name of TAB
1ec10 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  LE */.        if
1ec20 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
1ec30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
1ec40 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21  sert( pE->pLeft!
1ec50 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
1ec60 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1ec70 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65  Property(pE->pLe
1ec80 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  ft, EP_IntValue)
1ec90 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   );.          zT
1eca0 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74  Name = pE->pLeft
1ecb0 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
1ecc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
1ecd0 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
1ece0 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
1ecf0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1ed00 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
1ed10 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
1ed20 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
1ed30 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74            Select
1ed40 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pSub = pFrom->
1ed50 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
1ed60 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
1ed70 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  e = pFrom->zAlia
1ed80 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  s;.          con
1ed90 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61  st char *zSchema
1eda0 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
1edb0 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
1edc0 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
1edd0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
1ede0 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d        zTabName =
1edf0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
1ee00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ee10 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
1ee20 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b  ocFailed ) break
1ee30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1ee40 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62  pSub==0 || (pSub
1ee50 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1ee60 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29  NestedFrom)==0 )
1ee70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
1ee80 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ub = 0;.        
1ee90 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26      if( zTName &
1eea0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
1eeb0 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d  (zTName, zTabNam
1eec0 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
1eed0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1eee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1eef0 20 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d             iDb =
1ef00 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
1ef10 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
1ef20 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
1ef30 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d        zSchemaNam
1ef40 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d  e = iDb>=0 ? db-
1ef50 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20  >aDb[iDb].zName 
1ef60 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20 20  : "*";.         
1ef70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72   }.          for
1ef80 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
1ef90 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
1efa0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
1efb0 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  e = pTab->aCol[j
1efc0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
1efd0 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e       char *zColn
1efe0 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  ame;  /* The com
1eff0 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  puted column nam
1f000 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
1f010 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20   char *zToFree; 
1f020 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74    /* Malloced st
1f030 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20  ring that needs 
1f040 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
1f050 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e             Token
1f060 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43   sColname;  /* C
1f070 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e  omputed column n
1f080 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a  ame as a token *
1f090 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  /..            a
1f0a0 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a  ssert( zName );.
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1f0c0 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a 20  zTName && pSub. 
1f0d0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
1f0e0 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e  qlite3MatchSpanN
1f0f0 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73 74  ame(pSub->pEList
1f100 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c  ->a[j].zSpan, 0,
1f110 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20   zTName, 0)==0. 
1f120 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
1f130 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
1f140 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1f150 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1f160 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20   /* If a column 
1f170 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69  is marked as 'hi
1f180 64 64 65 6e 27 20 28 63 75 72 72 65 6e 74 6c 79  dden' (currently
1f190 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20   only possible. 
1f1a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f             ** fo
1f1b0 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  r virtual tables
1f1c0 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64  ), do not includ
1f1d0 65 20 69 74 20 69 6e 20 74 68 65 20 65 78 70 61  e it in the expa
1f1e0 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  nded.           
1f1f0 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c   ** result-set l
1f200 69 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ist..           
1f210 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1f220 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f 6c 75  if( IsHiddenColu
1f230 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  mn(&pTab->aCol[j
1f240 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
1f250 20 20 20 20 61 73 73 65 72 74 28 49 73 56 69 72      assert(IsVir
1f260 74 75 61 6c 28 70 54 61 62 29 29 3b 0a 20 20 20  tual(pTab));.   
1f270 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
1f280 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
1f290 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74   }.            t
1f2a0 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20  ableSeen = 1;.. 
1f2b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
1f2c0 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20  >0 && zTName==0 
1f2d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1f2e0 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69   if( (pFrom->joi
1f2f0 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
1f300 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  AL)!=0.         
1f310 20 20 20 20 20 20 20 26 26 20 74 61 62 6c 65 41         && tableA
1f320 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54  ndColumnIndex(pT
1f330 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65  abList, i, zName
1f340 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20  , 0, 0).        
1f350 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1f360 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
1f370 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f   NATURAL join, o
1f380 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c  mit the join col
1f390 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20  umns from the . 
1f3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1f3b0 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72  * table to the r
1f3c0 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  ight of the join
1f3d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1f3e0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1f400 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1f410 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
1f420 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67  ex(pFrom->pUsing
1f430 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
1f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f450 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68  * In a join with
1f460 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c   a USING clause,
1f470 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e   omit columns in
1f480 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
1f490 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c       ** using cl
1f4a0 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61  ause from the ta
1f4b0 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
1f4c0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
1f4d0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1f4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1f4f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1f500 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
1f510 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
1f520 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b  , TK_ID, zName);
1f530 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f  .            zCo
1f540 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  lname = zName;. 
1f550 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
1f560 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ee = 0;.        
1f570 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
1f580 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s || pTabList->n
1f590 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  Src>1 ){.       
1f5a0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65         Expr *pLe
1f5b0 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ft;.            
1f5c0 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65    pLeft = sqlite
1f5d0 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
1f5e0 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20   zTabName);.    
1f5f0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
1f600 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
1f610 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
1f620 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29  Left, pRight, 0)
1f630 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1f640 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20  if( zSchemaName 
1f650 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1f660 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
1f670 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
1f680 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a  , zSchemaName);.
1f690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6a0 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  pExpr = sqlite3P
1f6b0 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
1f6c0 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45 78 70  DOT, pLeft, pExp
1f6d0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
1f6e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1f6f0 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d       if( longNam
1f700 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
1f710 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d        zColname =
1f720 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1f730 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61  db, "%s.%s", zTa
1f740 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  bName, zName);. 
1f750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
1f760 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d  ToFree = zColnam
1f770 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
1f780 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
1f790 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1f7a0 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67      pExpr = pRig
1f7b0 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht;.            
1f7c0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  }.            pN
1f7d0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
1f7e0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
1f7f0 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b  e, pNew, pExpr);
1f800 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f  .            sCo
1f810 6c 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61  lname.z = zColna
1f820 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
1f830 73 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c  sColname.n = sql
1f840 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f  ite3Strlen30(zCo
1f850 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  lname);.        
1f860 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
1f870 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73  istSetName(pPars
1f880 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61  e, pNew, &sColna
1f890 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  me, 0);.        
1f8a0 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20      if( pNew && 
1f8b0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1f8c0 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30  F_NestedFrom)!=0
1f8d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f8e0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1f8f0 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e  t_item *pX = &pN
1f900 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
1f910 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  r-1];.          
1f920 20 20 20 20 69 66 28 20 70 53 75 62 20 29 7b 0a      if( pSub ){.
1f930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f940 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  pX->zSpan = sqli
1f950 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
1f960 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  pSub->pEList->a[
1f970 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20  j].zSpan);.     
1f980 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1f990 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d  ase( pX->zSpan==
1f9a0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
1f9b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f9c0 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53            pX->zS
1f9d0 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  pan = sqlite3MPr
1f9e0 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 2e  intf(db, "%s.%s.
1f9f0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61  zSchemaName, zTa
1fa30 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29  bName, zColname)
1fa40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1fa50 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
1fa60 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  zSpan==0 );.    
1fa70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1fa80 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 62 53            pX->bS
1fa90 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20 20  panIsTab = 1;.  
1faa0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1fab0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
1fac0 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65  bFree(db, zToFre
1fad0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
1fae0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1faf0 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e    if( !tableSeen
1fb00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1fb10 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( zTName ){.    
1fb20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1fb30 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1fb40 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
1fb50 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20  %s", zTName);.  
1fb60 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1fb70 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1fb80 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1fb90 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70  e, "no tables sp
1fba0 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20  ecified");.     
1fbb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1fbc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1fbd0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
1fbe0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c  stDelete(db, pEL
1fbf0 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c  ist);.    p->pEL
1fc00 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
1fc10 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
1fc20 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70  OLUMN.  if( p->p
1fc30 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69  EList && p->pELi
1fc40 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c  st->nExpr>db->aL
1fc50 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
1fc60 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20  T_COLUMN] ){.   
1fc70 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1fc80 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
1fc90 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65  ny columns in re
1fca0 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 7d 0a  sult set");.  }.
1fcb0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
1fcc0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
1fcd0 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75  ./*.** No-op rou
1fce0 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72  tine for the par
1fcf0 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a  se-tree walker..
1fd00 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1fd10 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 57  routine is the W
1fd20 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
1fd30 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73  ack then express
1fd40 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65  ion trees.** are
1fd50 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20   walked without 
1fd60 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e  any actions bein
1fd70 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20  g taken at each 
1fd80 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c  node.  Presumabl
1fd90 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  y,.** when this 
1fda0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1fdb0 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72  for Walker.xExpr
1fdc0 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a  Callback then .*
1fdd0 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  * Walker.xSelect
1fde0 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20  Callback is set 
1fdf0 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  to do something 
1fe00 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79  useful for every
1fe10 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e   .** subquery in
1fe20 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65   the parser tree
1fe30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1fe40 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c  exprWalkNoop(Wal
1fe50 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78  ker *NotUsed, Ex
1fe60 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20  pr *NotUsed2){. 
1fe70 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1fe80 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
1fe90 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
1fea0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
1feb0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1fec0 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20  ine "expands" a 
1fed0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1fee0 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
1fef0 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46  subqueries..** F
1ff00 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
1ff10 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61  formation on wha
1ff20 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65  t it means to "e
1ff30 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a  xpand" a SELECT.
1ff40 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65  ** statement, se
1ff50 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
1ff60 20 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e   the selectExpan
1ff70 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63  d worker callbac
1ff80 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45  k above..**.** E
1ff90 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43  xpanding a SELEC
1ffa0 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74  T statement is t
1ffb0 68 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e  he first step in
1ffc0 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a   processing a.**
1ffd0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1ffe0 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73  t.  The SELECT s
1fff0 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65  tatement must be
20000 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65   expanded before
20010 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  .** name resolut
20020 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ion is performed
20030 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68  ..**.** If anyth
20040 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
20050 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
20060 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
20070 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20   pParse..** The 
20080 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
20090 20 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20   can detect the 
200a0 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69  problem by looki
200b0 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45  ng at pParse->nE
200c0 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61  rr.** and/or pPa
200d0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
200e0 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ailed..*/.static
200f0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c   void sqlite3Sel
20100 65 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20  ectExpand(Parse 
20110 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
20120 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c  *pSelect){.  Wal
20130 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
20140 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
20150 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  );.  w.xExprCall
20160 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e  back = exprWalkN
20170 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
20180 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20  = pParse;.  if( 
20190 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f  pParse->hasCompo
201a0 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78 53 65  und ){.    w.xSe
201b0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63  lectCallback = c
201c0 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65  onvertCompoundSe
201d0 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a  lectToSubquery;.
201e0 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
201f0 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
20200 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c  t);.  }.  w.xSel
20210 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
20220 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20  lectExpander;.  
20230 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
20240 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
20250 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
20260 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
20270 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
20280 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43   Walker.xSelectC
20290 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b  allback callback
202a0 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
202b0 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29  SelectTypeInfo()
202c0 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
202d0 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52  *.** For each FR
202e0 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
202f0 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a  ry, add Column.z
20300 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e  Type and Column.
20310 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  zColl.** informa
20320 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c  tion to the Tabl
20330 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
20340 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
20350 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66  result set.** of
20360 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a   that subquery..
20370 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  **.** The Table 
20380 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
20390 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
203a0 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e  sult set was con
203b0 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73  structed.** by s
203c0 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20  electExpander() 
203d0 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  but the type and
203e0 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
203f0 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74  mation was omitt
20400 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f  ed.** at that po
20410 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e  int because iden
20420 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20  tifiers had not 
20430 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  yet been resolve
20440 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  d.  This.** rout
20450 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
20460 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72  ter identifier r
20470 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  esolution..*/.st
20480 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 41  atic int selectA
20490 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
204a0 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  fo(Walker *pWalk
204b0 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
204c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
204d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c  .  int i;.  SrcL
204e0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
204f0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
20500 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20  item *pFrom;..  
20510 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
20520 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
20530 64 20 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73  d );.  if( (p->s
20540 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73  elFlags & SF_Has
20550 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a  TypeInfo)==0 ){.
20560 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
20570 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66  |= SF_HasTypeInf
20580 6f 3b 0a 20 20 20 20 70 50 61 72 73 65 20 3d 20  o;.    pParse = 
20590 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
205a0 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
205b0 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f 72  p->pSrc;.    for
205c0 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
205d0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
205e0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
205f0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
20600 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
20610 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  rom->pTab;.     
20620 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61 62   if( ALWAYS(pTab
20630 21 3d 30 29 20 26 26 20 28 70 54 61 62 2d 3e 74  !=0) && (pTab->t
20640 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
20650 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20  emeral)!=0 ){.  
20660 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
20670 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
20680 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
20690 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  ECT */.        S
206a0 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46  elect *pSel = pF
206b0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
206c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
206d0 65 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68  el );.        wh
206e0 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
206f0 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d  r ) pSel = pSel-
20700 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
20710 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
20720 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
20730 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
20740 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sel);.      }.  
20750 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
20760 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
20770 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
20780 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
20790 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63  s datatype and c
207a0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
207b0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
207c0 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74  .** the Table st
207d0 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20  ructures of all 
207e0 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
207f0 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53  ueries in a.** S
20800 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
20810 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20  .**.** Use this 
20820 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61  routine after na
20830 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  me resolution..*
20840 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
20850 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
20860 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  peInfo(Parse *pP
20870 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
20880 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20  elect){.#ifndef 
20890 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
208a0 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b  UERY.  Walker w;
208b0 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
208c0 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
208d0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
208e0 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62 71   = selectAddSubq
208f0 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20  ueryTypeInfo;.  
20900 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
20910 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  = exprWalkNoop;.
20920 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
20930 72 73 65 3b 0a 20 20 77 2e 62 53 65 6c 65 63 74  rse;.  w.bSelect
20940 44 65 70 74 68 46 69 72 73 74 20 3d 20 31 3b 0a  DepthFirst = 1;.
20950 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
20960 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
20970 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
20980 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20990 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43 54  sets up a SELECT
209a0 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70   statement for p
209b0 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a  rocessing.  The.
209c0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
209d0 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a  accomplished:.**
209e0 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20  .**     *  VDBE 
209f0 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61  Cursor numbers a
20a00 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  re assigned to a
20a10 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74  ll FROM-clause t
20a20 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  erms..**     *  
20a30 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  Ephemeral Table 
20a40 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
20a50 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d  ted for all FROM
20a60 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
20a70 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e  es..**     *  ON
20a80 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
20a90 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69  es are shifted i
20aa0 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d  nto WHERE statem
20ab0 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57  ents.**     *  W
20ac0 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64  ildcards "*" and
20ad0 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65   "TABLE.*" in re
20ae0 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78  sult sets are ex
20af0 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a  panded..**     *
20b00 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e    Identifiers in
20b10 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20   expression are 
20b20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65  matched to table
20b30 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
20b40 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72  utine acts recur
20b50 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75  sively on all su
20b60 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20  bqueries within 
20b70 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
20b80 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
20b90 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a  tPrep(.  Parse *
20ba0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
20bb0 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
20bc0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
20bd0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
20be0 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
20bf0 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
20c00 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65  coded. */.  Name
20c10 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e  Context *pOuterN
20c20 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65  C  /* Name conte
20c30 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72  xt for container
20c40 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
20c50 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45   *db;.  if( NEVE
20c60 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(p==0) ) return
20c70 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
20c80 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  >db;.  if( db->m
20c90 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
20ca0 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73  turn;.  if( p->s
20cb0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73  elFlags & SF_Has
20cc0 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72  TypeInfo ) retur
20cd0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  n;.  sqlite3Sele
20ce0 63 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c  ctExpand(pParse,
20cf0 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   p);.  if( pPars
20d00 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
20d10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
20d20 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52  turn;.  sqlite3R
20d30 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65  esolveSelectName
20d40 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75  s(pParse, p, pOu
20d50 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50  terNC);.  if( pP
20d60 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
20d70 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
20d80 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
20d90 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49  e3SelectAddTypeI
20da0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  nfo(pParse, p);.
20db0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74  }../*.** Reset t
20dc0 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
20dd0 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  umulator..**.** 
20de0 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  The aggregate ac
20df0 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73  cumulator is a s
20e00 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  et of memory cel
20e10 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20  ls that hold.** 
20e20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
20e30 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75  ults while calcu
20e40 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67  lating an aggreg
20e50 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ate.  This.** ro
20e60 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
20e70 63 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65 73  code that stores
20e80 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66   NULLs in all of
20e90 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a   those memory.**
20ea0 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   cells..*/.stati
20eb0 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75  c void resetAccu
20ec0 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
20ed0 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
20ee0 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
20ef0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
20f00 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
20f10 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
20f20 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69  func *pFunc;.  i
20f30 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  f( pAggInfo->nFu
20f40 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f  nc+pAggInfo->nCo
20f50 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72  lumn==0 ){.    r
20f60 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72  eturn;.  }.  for
20f70 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
20f80 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
20f90 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
20fa0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
20fb0 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  l, 0, pAggInfo->
20fc0 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b 0a 20  aCol[i].iMem);. 
20fd0 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70   }.  for(pFunc=p
20fe0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20  AggInfo->aFunc, 
20ff0 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
21000 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75  >nFunc; i++, pFu
21010 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  nc++){.    sqlit
21020 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21030 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46 75 6e  OP_Null, 0, pFun
21040 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 69 66  c->iMem);.    if
21050 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  ( pFunc->iDistin
21060 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  ct>=0 ){.      E
21070 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d  xpr *pE = pFunc-
21080 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
21090 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
210a0 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49  operty(pE, EP_xI
210b0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
210c0 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73    if( pE->x.pLis
210d0 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c  t==0 || pE->x.pL
210e0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b  ist->nExpr!=1 ){
210f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21100 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
21110 20 22 44 49 53 54 49 4e 43 54 20 61 67 67 72 65   "DISTINCT aggre
21120 67 61 74 65 73 20 6d 75 73 74 20 68 61 76 65 20  gates must have 
21130 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20  exactly one ".  
21140 20 20 20 20 20 20 20 20 20 22 61 72 67 75 6d 65           "argume
21150 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46  nt");.        pF
21160 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  unc->iDistinct =
21170 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
21180 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66  {.        KeyInf
21190 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65  o *pKeyInfo = ke
211a0 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
211b0 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e  t(pParse, pE->x.
211c0 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pList);.        
211d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
211e0 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
211f0 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44  meral, pFunc->iD
21200 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20  istinct, 0, 0,. 
21210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21220 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
21230 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
21240 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  INFO);.      }. 
21250 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
21260 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f  * Invoke the OP_
21270 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f  AggFinalize opco
21280 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67  de for every agg
21290 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a  regate function.
212a0 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66  ** in the AggInf
212b0 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  o structure..*/.
212c0 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61  static void fina
212d0 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
212e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
212f0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
21300 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
21310 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
21320 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
21330 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
21340 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  F;.  for(i=0, pF
21350 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
21360 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
21370 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
21380 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
21390 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
213a0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
213b0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
213c0 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
213d0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
213e0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
213f0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
21400 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d  AggFinal, pF->iM
21410 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  em, pList ? pLis
21420 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c  t->nExpr : 0, 0,
21430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21440 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46         (void*)pF
21450 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
21460 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  DEF);.  }.}../*.
21470 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63  ** Update the ac
21480 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79  cumulator memory
21490 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67   cells for an ag
214a0 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e  gregate based on
214b0 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
214c0 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
214d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
214e0 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
214f0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
21500 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
21510 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
21520 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
21530 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
21540 65 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  egHit = 0;.  int
21550 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 30   addrHitTest = 0
21560 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
21570 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73  fo_func *pF;.  s
21580 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
21590 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e  l *pC;..  pAggIn
215a0 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
215b0 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   1;.  sqlite3Exp
215c0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
215d0 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  se);.  for(i=0, 
215e0 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  pF=pAggInfo->aFu
215f0 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  nc; i<pAggInfo->
21600 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b  nFunc; i++, pF++
21610 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  ){.    int nArg;
21620 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78  .    int addrNex
21630 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
21640 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c  egAgg;.    ExprL
21650 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
21660 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b  >pExpr->x.pList;
21670 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
21680 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
21690 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
216a0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66  elect) );.    if
216b0 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
216c0 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e   nArg = pList->n
216d0 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41  Expr;.      regA
216e0 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  gg = sqlite3GetT
216f0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
21700 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71   nArg);.      sq
21710 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
21720 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c  rList(pParse, pL
21730 69 73 74 2c 20 72 65 67 41 67 67 2c 20 31 29 3b  ist, regAgg, 1);
21740 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21750 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20    nArg = 0;.    
21760 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20    regAgg = 0;.  
21770 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e    }.    if( pF->
21780 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
21790 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d        addrNext =
217a0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
217b0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
217c0 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20  assert( nArg==1 
217d0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73  );.      codeDis
217e0 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46  tinct(pParse, pF
217f0 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64  ->iDistinct, add
21800 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67  rNext, 1, regAgg
21810 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
21820 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63   pF->pFunc->func
21830 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
21840 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
21850 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
21860 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Coll = 0;.      
21870 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
21880 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
21890 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
218a0 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
218b0 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30   );  /* pList!=0
218c0 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61   if pF->pFunc ha
218d0 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20  s NEEDCOLL */.  
218e0 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
218f0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43  em=pList->a; !pC
21900 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a  oll && j<nArg; j
21910 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
21920 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
21930 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
21940 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
21950 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
21960 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
21970 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
21980 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
21990 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
219a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 67   }.      if( reg
219b0 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e  Hit==0 && pAggIn
219c0 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
219d0 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50   ) regHit = ++pP
219e0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
219f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21a00 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
21a10 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c  q, regHit, 0, 0,
21a20 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
21a30 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
21a40 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
21a50 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
21a60 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67  ggStep, 0, regAg
21a70 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20  g, pF->iMem,.   
21a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a90 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46     (void*)pF->pF
21aa0 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
21ab0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
21ac0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
21ad0 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69  )nArg);.    sqli
21ae0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
21af0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
21b00 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29  e, regAgg, nArg)
21b10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
21b20 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
21b30 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
21b40 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  rg);.    if( add
21b50 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73  rNext ){.      s
21b60 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
21b70 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65  eLabel(v, addrNe
21b80 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xt);.      sqlit
21b90 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
21ba0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
21bb0 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65    }..  /* Before
21bc0 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20   populating the 
21bd0 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
21be0 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65  sters, clear the
21bf0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20   column cache.. 
21c00 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
21c10 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71  f any of the req
21c20 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c  uired column val
21c30 75 65 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  ues are already 
21c40 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e  present .  ** in
21c50 20 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69   registers, sqli
21c60 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61  te3ExprCode() ma
21c70 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74  y use OP_SCopy t
21c80 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65  o copy the value
21c90 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65  .  ** to pC->iMe
21ca0 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20 74 69  m. But by the ti
21cb0 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  me the value is 
21cc0 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e  used, the origin
21cd0 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a  al register.  **
21ce0 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
21cf0 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e  sed, invalidatin
21d00 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  g the underlying
21d10 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20   buffer holding 
21d20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72  the.  ** text or
21d30 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65   blob value. See
21d40 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64   ticket [883034d
21d50 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  cb5]..  **.  ** 
21d60 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e  Another solution
21d70 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61   would be to cha
21d80 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79  nge the OP_SCopy
21d90 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61   used to copy ca
21da0 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73  ched.  ** values
21db0 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a   to an OP_Copy..
21dc0 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69    */.  if( regHi
21dd0 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74  t ){.    addrHit
21de0 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Test = sqlite3Vd
21df0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
21e00 66 2c 20 72 65 67 48 69 74 29 3b 0a 20 20 7d 0a  f, regHit);.  }.
21e10 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
21e20 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
21e30 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70  .  for(i=0, pC=p
21e40 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69  AggInfo->aCol; i
21e50 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75  <pAggInfo->nAccu
21e60 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43  mulator; i++, pC
21e70 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
21e80 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
21e90 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e   pC->pExpr, pC->
21ea0 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67  iMem);.  }.  pAg
21eb0 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
21ec0 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
21ed0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
21ee0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61 64  Parse);.  if( ad
21ef0 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20  drHitTest ){.   
21f00 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
21f10 48 65 72 65 28 76 2c 20 61 64 64 72 48 69 74 54  Here(v, addrHitT
21f20 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  est);.  }.}../*.
21f30 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20  ** Add a single 
21f40 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
21f50 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44  uction to the VD
21f60 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20  BE to explain a 
21f70 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28  simple.** count(
21f80 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c 45 43  *) query ("SELEC
21f90 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
21fa0 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64  pTab")..*/.#ifnd
21fb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
21fc0 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f  XPLAIN.static vo
21fd0 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  id explainSimple
21fe0 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  Count(.  Parse *
21ff0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
22000 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
22010 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
22020 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
22030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22040 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75  * Table being qu
22050 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  eried */.  Index
22060 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
22070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
22080 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69  dex used to opti
22090 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55  mize scan, or NU
220a0 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  LL */.){.  if( p
220b0 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
220c0 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  2 ){.    char *z
220d0 45 71 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Eqp = sqlite3MPr
220e0 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
220f0 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25   "SCAN TABLE %s%
22100 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54  s%s",.        pT
22110 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  ab->zName, .    
22120 20 20 20 20 70 49 64 78 20 3f 20 22 20 55 53 49      pIdx ? " USI
22130 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
22140 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20  X " : "",.      
22150 20 20 70 49 64 78 20 3f 20 70 49 64 78 2d 3e 7a    pIdx ? pIdx->z
22160 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b  Name : "".    );
22170 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
22180 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20  AddOp4(.        
22190 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
221a0 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
221b0 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
221c0 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e   0, zEqp, P4_DYN
221d0 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  AMIC.    );.  }.
221e0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
221f0 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f   explainSimpleCo
22200 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69  unt(a,b,c).#endi
22210 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
22220 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53  e code for the S
22230 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
22240 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61  given in the p a
22250 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  rgument.  .**.**
22260 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
22270 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
22280 76 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70  various ways dep
22290 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a  ending on the.**
222a0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
222b0 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75   SelectDest stru
222c0 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
222d0 20 62 79 20 61 72 67 75 6d 65 6e 74 20 70 44 65   by argument pDe
222e0 73 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73  st.** as follows
222f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73  :.**.**     pDes
22300 74 2d 3e 65 44 65 73 74 20 20 20 20 52 65 73 75  t->eDest    Resu
22310 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d  lt.**     ------
22320 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
22330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22350 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54  -----.**     SRT
22360 5f 4f 75 74 70 75 74 20 20 20 20 20 20 47 65 6e  _Output      Gen
22370 65 72 61 74 65 20 61 20 72 6f 77 20 6f 66 20 6f  erate a row of o
22380 75 74 70 75 74 20 28 75 73 69 6e 67 20 74 68 65  utput (using the
22390 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 0a 2a 2a   OP_ResultRow.**
223a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223b0 20 20 20 20 20 6f 70 63 6f 64 65 29 20 66 6f 72       opcode) for
223c0 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65   each row in the
223d0 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a   result set..**.
223e0 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20  **     SRT_Mem  
223f0 20 20 20 20 20 20 20 4f 6e 6c 79 20 76 61 6c 69         Only vali
22400 64 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20  d if the result 
22410 69 73 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  is a single colu
22420 6d 6e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  mn..**          
22430 20 20 20 20 20 20 20 20 20 20 20 53 74 6f 72 65             Store
22440 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d   the first colum
22450 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  n of the first r
22460 65 73 75 6c 74 20 72 6f 77 0a 2a 2a 20 20 20 20  esult row.**    
22470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22480 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 44 65   in register pDe
22490 73 74 2d 3e 69 53 44 50 61 72 6d 20 74 68 65 6e  st->iSDParm then
224a0 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 65 73   abandon the res
224b0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
224c0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
224d0 71 75 65 72 79 2e 20 20 54 68 69 73 20 64 65 73  query.  This des
224e0 74 69 6e 61 74 69 6f 6e 20 69 6d 70 6c 69 65 73  tination implies
224f0 20 22 4c 49 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a   "LIMIT 1"..**.*
22500 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20 20 20  *     SRT_Set   
22510 20 20 20 20 20 20 54 68 65 20 72 65 73 75 6c 74        The result
22520 20 6d 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c   must be a singl
22530 65 20 63 6f 6c 75 6d 6e 2e 20 20 53 74 6f 72 65  e column.  Store
22540 20 65 61 63 68 0a 2a 2a 20 20 20 20 20 20 20 20   each.**        
22550 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 77               row
22560 20 6f 66 20 72 65 73 75 6c 74 20 61 73 20 74 68   of result as th
22570 65 20 6b 65 79 20 69 6e 20 74 61 62 6c 65 20 70  e key in table p
22580 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e 20 0a  Dest->iSDParm. .
22590 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
225a0 20 20 20 20 20 20 20 41 70 70 6c 79 20 74 68 65         Apply the
225b0 20 61 66 66 69 6e 69 74 79 20 70 44 65 73 74 2d   affinity pDest-
225c0 3e 61 66 66 53 64 73 74 20 62 65 66 6f 72 65 20  >affSdst before 
225d0 73 74 6f 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20  storing.**      
225e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
225f0 65 73 75 6c 74 73 2e 20 20 55 73 65 64 20 74 6f  esults.  Used to
22600 20 69 6d 70 6c 65 6d 65 6e 74 20 22 49 4e 20 28   implement "IN (
22610 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a  SELECT ...)"..**
22620 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f  .**     SRT_Unio
22630 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  n       Store re
22640 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69  sults as a key i
22650 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
22660 62 6c 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ble .**         
22670 20 20 20 20 20 20 20 20 20 20 20 20 69 64 65 6e              iden
22680 74 69 66 69 65 64 20 62 79 20 70 44 65 73 74 2d  tified by pDest-
22690 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  >iSDParm..**.** 
226a0 20 20 20 20 53 52 54 5f 45 78 63 65 70 74 20 20      SRT_Except  
226b0 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c      Remove resul
226c0 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70  ts from the temp
226d0 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73  orary table pDes
226e0 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a 0a 2a  t->iSDParm..**.*
226f0 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20  *     SRT_Table 
22700 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
22710 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  lts in temporary
22720 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 53   table pDest->iS
22730 44 50 61 72 6d 2e 0a 2a 2a 20 20 20 20 20 20 20  DParm..**       
22740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68                Th
22750 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54 5f 45  is is like SRT_E
22760 70 68 65 6d 54 61 62 20 65 78 63 65 70 74 20 74  phemTab except t
22770 68 61 74 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a  hat the table.**
22780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22790 20 20 20 20 20 69 73 20 61 73 73 75 6d 65 64 20       is assumed 
227a0 74 6f 20 61 6c 72 65 61 64 79 20 62 65 20 6f 70  to already be op
227b0 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  en..**.**     SR
227c0 54 5f 45 70 68 65 6d 54 61 62 20 20 20 20 43 72  T_EphemTab    Cr
227d0 65 61 74 65 20 61 6e 20 74 65 6d 70 6f 72 61 72  eate an temporar
227e0 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
227f0 53 44 50 61 72 6d 20 61 6e 64 20 73 74 6f 72 65  SDParm and store
22800 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22810 20 20 20 20 20 20 20 20 74 68 65 20 72 65 73 75          the resu
22820 6c 74 20 74 68 65 72 65 2e 20 54 68 65 20 63 75  lt there. The cu
22830 72 73 6f 72 20 69 73 20 6c 65 66 74 20 6f 70 65  rsor is left ope
22840 6e 20 61 66 74 65 72 0a 2a 2a 20 20 20 20 20 20  n after.**      
22850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
22860 65 74 75 72 6e 69 6e 67 2e 20 20 54 68 69 73 20  eturning.  This 
22870 69 73 20 6c 69 6b 65 20 53 52 54 5f 54 61 62 6c  is like SRT_Tabl
22880 65 20 65 78 63 65 70 74 20 74 68 61 74 0a 2a 2a  e except that.**
22890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228a0 20 20 20 20 20 74 68 69 73 20 64 65 73 74 69 6e       this destin
228b0 61 74 69 6f 6e 20 75 73 65 73 20 4f 50 5f 4f 70  ation uses OP_Op
228c0 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 6f 20 63  enEphemeral to c
228d0 72 65 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20  reate.**        
228e0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
228f0 20 74 61 62 6c 65 20 66 69 72 73 74 2e 0a 2a 2a   table first..**
22900 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 6f 72 6f  .**     SRT_Coro
22910 75 74 69 6e 65 20 20 20 47 65 6e 65 72 61 74 65  utine   Generate
22920 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68   a co-routine th
22930 61 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77  at returns a new
22940 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20 20 20   row of.**      
22950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
22960 65 73 75 6c 74 73 20 65 61 63 68 20 74 69 6d 65  esults each time
22970 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20   it is invoked. 
22980 20 54 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74   The entry point
22990 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
229a0 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
229b0 6f 2d 72 6f 75 74 69 6e 65 20 69 73 20 73 74 6f  o-routine is sto
229c0 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
229d0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e 0a  pDest->iSDParm..
229e0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
229f0 69 73 74 73 20 20 20 20 20 20 53 74 6f 72 65 20  ists      Store 
22a00 61 20 31 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  a 1 in memory ce
22a10 6c 6c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  ll pDest->iSDPar
22a20 6d 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 0a  m if the result.
22a30 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22a40 20 20 20 20 20 20 20 73 65 74 20 69 73 20 6e 6f         set is no
22a50 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20  t empty..**.**  
22a60 20 20 20 53 52 54 5f 44 69 73 63 61 72 64 20 20     SRT_Discard  
22a70 20 20 20 54 68 72 6f 77 20 74 68 65 20 72 65 73     Throw the res
22a80 75 6c 74 73 20 61 77 61 79 2e 20 20 54 68 69 73  ults away.  This
22a90 20 69 73 20 75 73 65 64 20 62 79 20 53 45 4c 45   is used by SELE
22aa0 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  CT.**           
22ab0 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d            statem
22ac0 65 6e 74 73 20 77 69 74 68 69 6e 20 74 72 69 67  ents within trig
22ad0 67 65 72 73 20 77 68 6f 73 65 20 6f 6e 6c 79 20  gers whose only 
22ae0 70 75 72 70 6f 73 65 20 69 73 0a 2a 2a 20 20 20  purpose is.**   
22af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b00 20 20 74 68 65 20 73 69 64 65 2d 65 66 66 65 63    the side-effec
22b10 74 73 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73 2e  ts of functions.
22b20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
22b30 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
22b40 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
22b50 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73  .  If any errors
22b60 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65   are.** encounte
22b70 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70  red, then an app
22b80 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d  ropriate error m
22b90 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69  essage is left i
22ba0 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72  n.** pParse->zEr
22bb0 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rMsg..**.** This
22bc0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f   routine does NO
22bd0 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63  T free the Selec
22be0 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
22bf0 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63  ed in.  The.** c
22c00 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
22c10 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74  needs to do that
22c20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22c30 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
22c40 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
22c50 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
22c60 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
22c70 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
22c80 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
22c90 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
22ca0 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c   coded. */.  Sel
22cb0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
22cc0 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
22cd0 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72 79  o with the query
22ce0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
22cf0 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
22d00 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
22d10 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68  counters */.  Wh
22d20 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
22d30 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66       /* Return f
22d40 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65  rom sqlite3Where
22d50 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62  Begin() */.  Vdb
22d60 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
22d70 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
22d80 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72  al machine under
22d90 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
22da0 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20  .  int isAgg;   
22db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
22dc0 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73  e for select lis
22dd0 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a  ts like "count(*
22de0 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  )" */.  ExprList
22df0 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f   *pEList;      /
22e00 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * List of column
22e10 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f  s to extract. */
22e20 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
22e30 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73  List;     /* Lis
22e40 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73  t of tables to s
22e50 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  elect from */.  
22e60 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
22e70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
22e80 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ERE clause.  May
22e90 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
22ea0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
22eb0 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  ;    /* The ORDE
22ec0 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  R BY clause.  Ma
22ed0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
22ee0 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
22ef0 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f  y;    /* The GRO
22f00 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  UP BY clause.  M
22f10 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
22f20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20  Expr *pHaving;  
22f30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41         /* The HA
22f40 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61  VING clause.  Ma
22f50 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  y be NULL */.  i
22f60 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20  nt rc = 1;      
22f70 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
22f80 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68  o return from th
22f90 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
22fa0 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64   int addrSortInd
22fb0 65 78 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65  ex;     /* Addre
22fc0 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e  ss of an OP_Open
22fd0 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
22fe0 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69  ction */.  Disti
22ff0 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e 63 74  nctCtx sDistinct
23000 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77  ; /* Info on how
23010 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53   to code the DIS
23020 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f  TINCT keyword */
23030 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49  .  AggInfo sAggI
23040 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66  nfo;      /* Inf
23050 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79  ormation used by
23060 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
23070 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  es */.  int iEnd
23080 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
23090 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
230a0 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72   end of the quer
230b0 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  y */.  sqlite3 *
230c0 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
230d0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
230e0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66  nnection */..#if
230f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23100 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
23110 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 20  RestoreSelectId 
23120 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  = pParse->iSelec
23130 74 49 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69  tId;.  pParse->i
23140 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73  SelectId = pPars
23150 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
23160 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62  ++;.#endif..  db
23170 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
23180 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d   if( p==0 || db-
23190 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
231a0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
231b0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
231c0 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
231d0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
231e0 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
231f0 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
23200 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26  rn 1;.  memset(&
23210 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  sAggInfo, 0, siz
23220 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a  eof(sAggInfo));.
23230 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65  .  if( Ignorable
23240 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29  Orderby(pDest) )
23250 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65  {.    assert(pDe
23260 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
23270 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e  xists || pDest->
23280 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e  eDest==SRT_Union
23290 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
232a0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
232b0 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73  T_Except || pDes
232c0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
232d0 73 63 61 72 64 29 3b 0a 20 20 20 20 2f 2a 20 49  scard);.    /* I
232e0 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73  f ORDER BY makes
232f0 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69   no difference i
23300 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74 68 65  n the output the
23310 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20  n neither does. 
23320 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73     ** DISTINCT s
23330 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f  o it can be remo
23340 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20  ved too. */.    
23350 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
23360 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
23370 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70  derBy);.    p->p
23380 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
23390 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
233a0 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20  ~SF_Distinct;.  
233b0 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  }.  sqlite3Selec
233c0 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c  tPrep(pParse, p,
233d0 20 30 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20   0);.  pOrderBy 
233e0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
233f0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
23400 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
23410 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
23420 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
23430 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
23440 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  d ){.    goto se
23450 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
23460 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46  isAgg = (p->selF
23470 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
23480 61 74 65 29 21 3d 30 3b 0a 20 20 61 73 73 65 72  ate)!=0;.  asser
23490 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
234a0 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
234b0 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a  rating code..  *
234c0 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
234d0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
234e0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
234f0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
23500 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74   /* If writing t
23510 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65  o memory or gene
23520 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a  rating a set.  *
23530 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
23540 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75  column may be ou
23550 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  tput..  */.#ifnd
23560 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
23570 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 63 68  UBQUERY.  if( ch
23580 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d  eckForMultiColum
23590 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  nSelectError(pPa
235a0 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69  rse, pDest, pELi
235b0 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
235c0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
235d0 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  d;.  }.#endif.. 
235e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
235f0 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
23600 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
23610 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69  M clause.  */.#i
23620 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
23630 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
23640 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
23650 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
23660 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50   for(i=0; !p->pP
23670 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69  rior && i<pTabLi
23680 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
23690 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
236a0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
236b0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
236c0 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74  ;.    SelectDest
236d0 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63   dest;.    Selec
236e0 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
236f0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e  >pSelect;.    in
23700 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20 20  t isAggSub;..   
23710 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63   if( pSub==0 ) c
23720 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
23730 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63   Sometimes the c
23740 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71 75 65  ode for a subque
23750 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  ry will be gener
23760 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ated more than. 
23770 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74     ** once, if t
23780 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
23790 61 72 74 20 6f 66 20 74 68 65 20 57 48 45 52 45  art of the WHERE
237a0 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46   clause in a LEF
237b0 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66  T JOIN,.    ** f
237c0 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20  or example.  In 
237d0 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f  that case, do no
237e0 74 20 72 65 67 65 6e 65 72 61 74 65 20 74 68 65  t regenerate the
237f0 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73   code to manifes
23800 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20  t.    ** a view 
23810 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  or the co-routin
23820 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  e to implement a
23830 20 76 69 65 77 2e 20 20 54 68 65 20 66 69 72 73   view.  The firs
23840 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a  t instance.    *
23850 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c  * is sufficient,
23860 20 74 68 6f 75 67 68 20 74 68 65 20 73 75 62 72   though the subr
23870 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65  outine to manife
23880 73 74 20 74 68 65 20 76 69 65 77 20 64 6f 65 73  st the view does
23890 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
238a0 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e  be invoked again
238b0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74  . */.    if( pIt
238c0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
238d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
238e0 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
238f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
23900 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
23910 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49  (v, OP_Gosub, pI
23920 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  tem->regReturn, 
23930 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
23940 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ub);.      }.   
23950 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
23960 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
23970 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67  ment Parse.nHeig
23980 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74  ht by the height
23990 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
239a0 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
239b0 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20  * tree referred 
239c0 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
239d0 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
239e0 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
239f0 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
23a00 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
23a10 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
23a20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
23a30 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
23a40 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
23a50 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
23a60 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
23a70 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
23a80 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
23a90 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
23aa0 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
23ab0 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
23ac0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
23ad0 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
23ae0 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
23af0 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
23b00 69 73 41 67 67 53 75 62 20 3d 20 28 70 53 75 62  isAggSub = (pSub
23b10 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
23b20 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20  Aggregate)!=0;. 
23b30 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75     if( flattenSu
23b40 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  bquery(pParse, p
23b50 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67  , i, isAgg, isAg
23b60 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 2f  gSub) ){.      /
23b70 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79 20  * This subquery 
23b80 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20  can be absorbed 
23b90 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e  into its parent.
23ba0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
23bb0 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20  AggSub ){.      
23bc0 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20    isAgg = 1;.   
23bd0 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
23be0 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65   |= SF_Aggregate
23bf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23c00 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  i = -1;.    }els
23c10 65 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e  e if( pTabList->
23c20 6e 53 72 63 3d 3d 31 20 26 26 20 28 70 2d 3e 73  nSrc==1 && (p->s
23c30 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 61 74  elFlags & SF_Mat
23c40 65 72 69 61 6c 69 7a 65 29 3d 3d 30 0a 20 20 20  erialize)==0.   
23c50 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
23c60 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
23c70 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69  LITE_SubqCorouti
23c80 6e 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ne).    ){.     
23c90 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20   /* Implement a 
23ca0 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20  co-routine that 
23cb0 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69  will return a si
23cc0 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
23cd0 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
23ce0 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f  set on each invo
23cf0 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  cation..      */
23d00 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
23d10 6f 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  op;.      int ad
23d20 64 72 45 6f 66 3b 0a 20 20 20 20 20 20 70 49 74  drEof;.      pIt
23d30 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
23d40 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
23d50 20 20 20 20 20 20 61 64 64 72 45 6f 66 20 3d 20        addrEof = 
23d60 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
23d70 20 20 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20        /* Before 
23d80 63 6f 64 69 6e 67 20 74 68 65 20 4f 50 5f 47 6f  coding the OP_Go
23d90 74 6f 20 74 6f 20 6a 75 6d 70 20 74 6f 20 74 68  to to jump to th
23da0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d  e start of the m
23db0 61 69 6e 20 72 6f 75 74 69 6e 65 2c 0a 20 20 20  ain routine,.   
23dc0 20 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61     ** ensure tha
23dd0 74 20 74 68 65 20 6a 75 6d 70 20 74 6f 20 74 68  t the jump to th
23de0 65 20 76 65 72 69 66 79 2d 73 63 68 65 6d 61 20  e verify-schema 
23df0 72 6f 75 74 69 6e 65 20 68 61 73 20 61 6c 72 65  routine has alre
23e00 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 65  ady.      ** bee
23e10 6e 20 63 6f 64 65 64 2e 20 4f 74 68 65 72 77 69  n coded. Otherwi
23e20 73 65 2c 20 74 68 65 20 76 65 72 69 66 79 2d 73  se, the verify-s
23e30 63 68 65 6d 61 20 77 6f 75 6c 64 20 6c 69 6b 65  chema would like
23e40 6c 79 20 62 65 20 63 6f 64 65 64 20 61 73 20 0a  ly be coded as .
23e50 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20 6f 66        ** part of
23e60 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 2e   the co-routine.
23e70 20 49 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 75   If the main rou
23e80 74 69 6e 65 20 74 68 65 6e 20 61 63 63 65 73 73  tine then access
23e90 65 64 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ed the .      **
23ea0 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
23eb0 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f   invoking the co
23ec0 2d 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65  -routine for the
23ed0 20 66 69 72 73 74 20 74 69 6d 65 20 28 66 6f 72   first time (for
23ee0 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70   .      ** examp
23ef0 6c 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  le to initialize
23f00 20 61 20 4c 49 4d 49 54 20 72 65 67 69 73 74 65   a LIMIT registe
23f10 72 20 66 72 6f 6d 20 61 20 73 75 62 2d 73 65 6c  r from a sub-sel
23f20 65 63 74 29 2c 20 69 74 20 77 6f 75 6c 64 20 0a  ect), it would .
23f30 20 20 20 20 20 20 2a 2a 20 62 65 20 64 6f 69 6e        ** be doin
23f40 67 20 73 6f 20 77 69 74 68 6f 75 74 20 68 61 76  g so without hav
23f50 69 6e 67 20 76 65 72 69 66 69 65 64 20 74 68 65  ing verified the
23f60 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 20   schema version 
23f70 61 6e 64 20 6f 62 74 61 69 6e 65 64 20 0a 20 20  and obtained .  
23f80 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 69      ** the requi
23f90 72 65 64 20 64 62 20 6c 6f 63 6b 73 2e 20 53 65  red db locks. Se
23fa0 65 20 74 69 63 6b 65 74 20 64 36 62 33 36 62 65  e ticket d6b36be
23fb0 33 38 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73 71  38.  */.      sq
23fc0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
23fd0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31  chema(pParse, -1
23fe0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23ff0 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
24000 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20 61 64  _Goto);.      ad
24010 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
24020 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
24030 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 49 74 65  OpenPseudo, pIte
24040 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
24050 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
24060 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20  angeP5(v, 1);.  
24070 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
24080 28 76 2c 20 22 63 6f 72 6f 75 74 69 6e 65 20 66  (v, "coroutine f
24090 6f 72 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  or %s", pItem->p
240a0 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
240b0 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46      pItem->addrF
240c0 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70  illSub = addrTop
240d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
240e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
240f0 49 6e 74 65 67 65 72 2c 20 30 2c 20 61 64 64 72  Integer, 0, addr
24100 45 6f 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Eof);.      sqli
24110 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
24120 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  v, 1);.      sql
24130 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
24140 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f  it(&dest, SRT_Co
24150 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e  routine, pItem->
24160 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
24170 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
24180 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65  ger(pItem->iSele
24190 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73 65  ctId, (u8)pParse
241a0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
241b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
241c0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
241d0 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ub, &dest);.    
241e0 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e    pItem->pTab->n
241f0 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e  RowEst = (unsign
24200 65 64 29 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74  ed)pSub->nSelect
24210 52 6f 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  Row;.      pItem
24220 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d  ->viaCoroutine =
24230 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
24240 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
24250 20 61 64 64 72 54 6f 70 2c 20 64 65 73 74 2e 69   addrTop, dest.i
24260 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
24270 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
24280 28 76 2c 20 61 64 64 72 54 6f 70 2c 20 64 65 73  (v, addrTop, des
24290 74 2e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  t.nSdst);.      
242a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
242b0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
242c0 20 31 2c 20 61 64 64 72 45 6f 66 29 3b 0a 20 20   1, addrEof);.  
242d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
242e0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
242f0 64 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  d, pItem->regRet
24300 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65  urn);.      Vdbe
24310 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
24320 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61   %s", pItem->pTa
24330 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
24340 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
24350 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
24360 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
24370 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
24380 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  che(pParse);.   
24390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
243a0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
243b0 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
243c0 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72   fill an ephemer
243d0 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20  al table with.  
243e0 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65      ** the conte
243f0 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62 71 75  nt of this subqu
24400 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64  ery.  pItem->add
24410 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f  rFillSub will po
24420 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  int.      ** to 
24430 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
24440 68 65 20 67 65 6e 65 72 61 74 65 64 20 73 75 62  he generated sub
24450 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d  routine.  pItem-
24460 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20  >regReturn.     
24470 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74 65   ** is a registe
24480 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68  r allocated to h
24490 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74 69  old the subrouti
244a0 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  ne return addres
244b0 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  s.      */.     
244c0 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20   int topAddr;.  
244d0 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72      int onceAddr
244e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
244f0 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20 61  retAddr;.      a
24500 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 61 64  ssert( pItem->ad
24510 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a  drFillSub==0 );.
24520 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67        pItem->reg
24530 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
24540 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74  e->nMem;.      t
24550 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  opAddr = sqlite3
24560 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
24570 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 49 74  _Integer, 0, pIt
24580 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
24590 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64        pItem->add
245a0 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64  rFillSub = topAd
245b0 64 72 2b 31 3b 0a 20 20 20 20 20 20 56 64 62 65  dr+1;.      Vdbe
245c0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
245d0 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 25 73 22  "materialize %s"
245e0 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
245f0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 69 66  Name));.      if
24600 28 20 70 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65  ( pItem->isCorre
24610 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  lated==0 ){.    
24620 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75      /* If the su
24630 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 63 6f  bquery is not co
24640 72 72 65 6c 61 74 65 64 20 61 6e 64 20 69 66 20  rrelated and if 
24650 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 73 69 64  we are not insid
24660 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
24670 61 20 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20  a trigger, then 
24680 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20  we only need to 
24690 63 6f 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75  compute the valu
246a0 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
246b0 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63  y.        ** onc
246c0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e  e. */.        on
246d0 63 65 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  ceAddr = sqlite3
246e0 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29  CodeOnce(pParse)
246f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24700 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
24710 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
24720 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d  _EphemTab, pItem
24730 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
24740 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
24750 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65  ger(pItem->iSele
24760 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73 65  ctId, (u8)pParse
24770 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
24780 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
24790 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
247a0 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ub, &dest);.    
247b0 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e    pItem->pTab->n
247c0 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e  RowEst = (unsign
247d0 65 64 29 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74  ed)pSub->nSelect
247e0 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  Row;.      if( o
247f0 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69 74 65  nceAddr ) sqlite
24800 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
24810 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20   onceAddr);.    
24820 20 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69    retAddr = sqli
24830 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
24840 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65   OP_Return, pIte
24850 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
24860 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
24870 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70  ((v, "end %s", p
24880 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
24890 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e));.      sqlit
248a0 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  e3VdbeChangeP1(v
248b0 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64  , topAddr, retAd
248c0 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dr);.      sqlit
248d0 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
248e0 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  che(pParse);.   
248f0 20 7d 0a 20 20 20 20 69 66 28 20 2f 2a 70 50 61   }.    if( /*pPa
24900 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64  rse->nErr ||*/ d
24910 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
24920 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
24930 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
24940 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
24950 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65  ght -= sqlite3Se
24960 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
24970 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20  );.    pTabList 
24980 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69  = p->pSrc;.    i
24990 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64  f( !IgnorableOrd
249a0 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
249b0 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
249c0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
249d0 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
249e0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e  = p->pEList;.#en
249f0 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70  dif.  pWhere = p
24a00 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
24a10 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
24a20 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
24a30 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44  p->pHaving;.  sD
24a40 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d  istinct.isTnct =
24a50 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
24a60 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b  SF_Distinct)!=0;
24a70 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
24a80 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
24a90 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68  ELECT.  /* If th
24aa0 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71  ere is are a seq
24ab0 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73  uence of queries
24ac0 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72  , do the earlier
24ad0 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a   ones first..  *
24ae0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
24af0 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r ){.    if( p->
24b00 70 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b  pRightmost==0 ){
24b10 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
24b20 4c 6f 6f 70 2c 20 2a 70 52 69 67 68 74 20 3d 20  Loop, *pRight = 
24b30 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74  0;.      int cnt
24b40 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
24b50 6d 78 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  mxSelect;.      
24b60 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f  for(pLoop=p; pLo
24b70 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
24b80 3e 70 50 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b  >pPrior, cnt++){
24b90 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
24ba0 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a  pRightmost = p;.
24bb0 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70          pLoop->p
24bc0 4e 65 78 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  Next = pRight;. 
24bd0 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20         pRight = 
24be0 70 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20  pLoop;.      }. 
24bf0 20 20 20 20 20 6d 78 53 65 6c 65 63 74 20 3d 20       mxSelect = 
24c00 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
24c10 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
24c20 5f 53 45 4c 45 43 54 5d 3b 0a 20 20 20 20 20 20  _SELECT];.      
24c30 69 66 28 20 6d 78 53 65 6c 65 63 74 20 26 26 20  if( mxSelect && 
24c40 63 6e 74 3e 6d 78 53 65 6c 65 63 74 20 29 7b 0a  cnt>mxSelect ){.
24c50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
24c60 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
24c70 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20  "too many terms 
24c80 69 6e 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  in compound SELE
24c90 43 54 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  CT");.        go
24ca0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
24cb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
24cc0 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63   rc = multiSelec
24cd0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  t(pParse, p, pDe
24ce0 73 74 29 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e  st);.    explain
24cf0 53 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73  SetInteger(pPars
24d00 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52  e->iSelectId, iR
24d10 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b  estoreSelectId);
24d20 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
24d30 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
24d40 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74   If there is bot
24d50 68 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64  h a GROUP BY and
24d60 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
24d70 75 73 65 20 61 6e 64 20 74 68 65 79 20 61 72 65  use and they are
24d80 0a 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c  .  ** identical,
24d90 20 74 68 65 6e 20 64 69 73 61 62 6c 65 20 74 68   then disable th
24da0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
24db0 65 20 73 69 6e 63 65 20 74 68 65 20 47 52 4f 55  e since the GROU
24dc0 50 20 42 59 0a 20 20 2a 2a 20 77 69 6c 6c 20 63  P BY.  ** will c
24dd0 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f  ause elements to
24de0 20 63 6f 6d 65 20 6f 75 74 20 69 6e 20 74 68 65   come out in the
24df0 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20   correct order. 
24e00 20 54 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 6e   This is.  ** an
24e10 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20   optimization - 
24e20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
24e30 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74  er should result
24e40 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 2a   regardless..  *
24e50 2a 20 55 73 65 20 74 68 65 20 53 51 4c 49 54 45  * Use the SQLITE
24e60 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c  _GroupByOrder fl
24e70 61 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54  ag with SQLITE_T
24e80 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45  ESTCTRL_OPTIMIZE
24e90 52 0a 20 20 2a 2a 20 74 6f 20 64 69 73 61 62 6c  R.  ** to disabl
24ea0 65 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  e this optimizat
24eb0 69 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e 67 20  ion for testing 
24ec0 70 75 72 70 6f 73 65 73 2e 0a 20 20 2a 2f 0a 20  purposes..  */. 
24ed0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
24ee0 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 2d 3e 70  ListCompare(p->p
24ef0 47 72 6f 75 70 42 79 2c 20 70 4f 72 64 65 72 42  GroupBy, pOrderB
24f00 79 2c 20 2d 31 29 3d 3d 30 0a 20 20 20 20 20 20  y, -1)==0.      
24f10 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
24f20 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
24f30 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
24f40 72 29 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72  r) ){.    pOrder
24f50 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  By = 0;.  }..  /
24f60 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  * If the query i
24f70 73 20 44 49 53 54 49 4e 43 54 20 77 69 74 68 20  s DISTINCT with 
24f80 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74 20  an ORDER BY but 
24f90 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
24fa0 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69  ate, and .  ** i
24fb0 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73  f the select-lis
24fc0 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  t is the same as
24fd0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69   the ORDER BY li
24fe0 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75  st, then this qu
24ff0 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20  ery.  ** can be 
25000 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 47  rewritten as a G
25010 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65  ROUP BY. In othe
25020 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20  r words, this:. 
25030 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
25040 45 43 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a  ECT DISTINCT xyz
25050 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20   FROM ... ORDER 
25060 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a  BY xyz.  **.  **
25070 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   is transformed 
25080 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
25090 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f    SELECT xyz FRO
250a0 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78  M ... GROUP BY x
250b0 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  yz.  **.  ** The
250c0 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20   second form is 
250d0 70 72 65 66 65 72 72 65 64 20 61 73 20 61 20 73  preferred as a s
250e0 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20  ingle index (or 
250f0 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20  temp-table) may 
25100 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f  be .  ** used fo
25110 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52  r both the ORDER
25120 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
25130 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20   processing. As 
25140 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a  originally .  **
25150 20 77 72 69 74 74 65 6e 20 74 68 65 20 71 75 65   written the que
25160 72 79 20 6d 75 73 74 20 75 73 65 20 61 20 74 65  ry must use a te
25170 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20  mp-table for at 
25180 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65  least one of the
25190 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20   ORDER .  ** BY 
251a0 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e  and DISTINCT, an
251b0 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65  d an index or se
251c0 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c  parate temp-tabl
251d0 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e  e for the other.
251e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  .  */.  if( (p->
251f0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
25200 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
25210 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
25220 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74  nct .   && sqlit
25230 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
25240 65 28 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70  e(pOrderBy, p->p
25250 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20  EList, -1)==0.  
25260 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  ){.    p->selFla
25270 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e  gs &= ~SF_Distin
25280 63 74 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75  ct;.    p->pGrou
25290 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
252a0 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
252b0 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20  pEList, 0);.    
252c0 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
252d0 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 4f 72 64  roupBy;.    pOrd
252e0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 2f 2a  erBy = 0;.    /*
252f0 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65 76 65   Notice that eve
25300 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44 69 73  n thought SF_Dis
25310 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e 20 63  tinct has been c
25320 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73  leared from p->s
25330 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20  elFlags,.    ** 
25340 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e 69 73  the sDistinct.is
25350 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20 73 65  Tnct is still se
25360 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54 6e 63  t.  Hence, isTnc
25370 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
25380 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  .    ** original
25390 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20   setting of the 
253a0 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c 61 67  SF_Distinct flag
253b0 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72 65 6e  , not the curren
253c0 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20  t setting */.   
253d0 20 61 73 73 65 72 74 28 20 73 44 69 73 74 69 6e   assert( sDistin
253e0 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 20 20 7d  ct.isTnct );.  }
253f0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
25400 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
25410 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 69 73  lause, then this
25420 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e   sorting.  ** in
25430 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70  dex might end up
25440 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66   being unused if
25450 20 74 68 65 20 64 61 74 61 20 63 61 6e 20 62 65   the data can be
25460 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64   .  ** extracted
25470 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f   in pre-sorted o
25480 72 64 65 72 2e 20 20 49 66 20 74 68 61 74 20 69  rder.  If that i
25490 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
254a0 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65   the.  ** OP_Ope
254b0 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
254c0 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63  uction will be c
254d0 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f  hanged to an OP_
254e0 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77  Noop once.  ** w
254f0 65 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 61  e figure out tha
25500 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  t the sorting in
25510 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65  dex is not neede
25520 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f 72 74  d.  The addrSort
25530 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61  Index.  ** varia
25540 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 66  ble is used to f
25550 61 63 69 6c 69 74 61 74 65 20 74 68 61 74 20 63  acilitate that c
25560 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  hange..  */.  if
25570 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
25580 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
25590 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  nfo;.    pKeyInf
255a0 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
255b0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
255c0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70  pOrderBy);.    p
255d0 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
255e0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
255f0 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f  ++;.    p->addrO
25600 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64  penEphm[2] = add
25610 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20  rSortIndex =.   
25620 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25630 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
25640 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20  phemeral,.      
25650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25660 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69       pOrderBy->i
25670 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42  ECursor, pOrderB
25680 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20  y->nExpr+2, 0,. 
25690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256a0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
256b0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
256c0 59 49 4e 46 4f 29 3b 0a 20 20 7d 65 6c 73 65 7b  YINFO);.  }else{
256d0 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e 64  .    addrSortInd
256e0 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ex = -1;.  }..  
256f0 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
25700 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
25710 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
25720 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
25730 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
25740 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
25750 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
25760 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25770 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
25780 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e  hemeral, pDest->
25790 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  iSDParm, pEList-
257a0 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  >nExpr);.  }..  
257b0 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74  /* Set the limit
257c0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20  er..  */.  iEnd 
257d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
257e0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e  eLabel(v);.  p->
257f0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 4c 41 52  nSelectRow = LAR
25800 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 63 6f  GEST_INT64;.  co
25810 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
25820 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
25830 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  End);.  if( p->i
25840 4c 69 6d 69 74 3d 3d 30 20 26 26 20 61 64 64 72  Limit==0 && addr
25850 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a  SortIndex>=0 ){.
25860 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
25870 65 74 4f 70 28 76 2c 20 61 64 64 72 53 6f 72 74  etOp(v, addrSort
25880 49 6e 64 65 78 29 2d 3e 6f 70 63 6f 64 65 20 3d  Index)->opcode =
25890 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 3b 0a   OP_SorterOpen;.
258a0 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
258b0 7c 3d 20 53 46 5f 55 73 65 53 6f 72 74 65 72 3b  |= SF_UseSorter;
258c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
258d0 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20  a virtual index 
258e0 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
258f0 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a  istinct set..  *
25900 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
25910 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
25920 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e  t ){.    sDistin
25930 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61  ct.tabTnct = pPa
25940 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
25950 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54   sDistinct.addrT
25960 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nct = sqlite3Vdb
25970 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
25980 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
25990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259a0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 44 69               sDi
259b0 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20  stinct.tabTnct, 
259c0 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
259d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259e0 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b 65 79        (char*)key
259f0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
25a00 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
25a10 73 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  st),.           
25a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a30 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29       P4_KEYINFO)
25a40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
25a50 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52  eChangeP5(v, BTR
25a60 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20  EE_UNORDERED);. 
25a70 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
25a80 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44  ctType = WHERE_D
25a90 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
25aa0 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
25ab0 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
25ac0 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54  ype = WHERE_DIST
25ad0 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a  INCT_NOOP;.  }..
25ae0 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20    if( !isAgg && 
25af0 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
25b00 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61     /* No aggrega
25b10 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  te functions and
25b20 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
25b30 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77  use */.    u16 w
25b40 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69  ctrlFlags = (sDi
25b50 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20  stinct.isTnct ? 
25b60 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
25b70 4e 43 54 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f  NCT : 0);..    /
25b80 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
25b90 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20  base scan. */.  
25ba0 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
25bb0 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
25bc0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
25bd0 57 68 65 72 65 2c 20 70 4f 72 64 65 72 42 79 2c  Where, pOrderBy,
25be0 20 70 2d 3e 70 45 4c 69 73 74 2c 0a 20 20 20 20   p->pEList,.    
25bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c00 20 20 20 20 20 20 20 20 20 20 20 77 63 74 72 6c             wctrl
25c10 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 69  Flags, 0);.    i
25c20 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
25c30 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
25c40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
25c50 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75  hereOutputRowCou
25c60 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e  nt(pWInfo) < p->
25c70 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20  nSelectRow ){.  
25c80 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
25c90 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  w = sqlite3Where
25ca0 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70  OutputRowCount(p
25cb0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  WInfo);.    }.  
25cc0 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e    if( sDistinct.
25cd0 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69 74 65  isTnct && sqlite
25ce0 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74  3WhereIsDistinct
25cf0 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pWInfo) ){.    
25d00 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
25d10 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 57  tType = sqlite3W
25d20 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70  hereIsDistinct(p
25d30 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  WInfo);.    }.  
25d40 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26    if( pOrderBy &
25d50 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  & sqlite3WhereIs
25d60 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 20  Ordered(pWInfo) 
25d70 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ) pOrderBy = 0;.
25d80 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69  .    /* If sorti
25d90 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61  ng index that wa
25da0 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
25db0 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65  rior OP_OpenEphe
25dc0 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e  meral .    ** in
25dd0 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20  struction ended 
25de0 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65  up not being nee
25df0 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65  ded, then change
25e00 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
25e10 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74  meral.    ** int
25e20 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20  o an OP_Noop..  
25e30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 64 64    */.    if( add
25e40 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26  rSortIndex>=0 &&
25e50 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
25e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25e70 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
25e80 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b   addrSortIndex);
25e90 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
25ea0 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a  enEphm[2] = -1;.
25eb0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73      }..    /* Us
25ec0 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  e the standard i
25ed0 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20  nner loop. */.  
25ee0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
25ef0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
25f00 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
25f10 72 42 79 2c 20 26 73 44 69 73 74 69 6e 63 74 2c  rBy, &sDistinct,
25f20 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
25f30 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
25f40 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65  te3WhereContinue
25f50 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20  Label(pWInfo),. 
25f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f70 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
25f80 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f  reakLabel(pWInfo
25f90 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20  ));..    /* End 
25fa0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
25fb0 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
25fc0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
25fd0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65  nd(pWInfo);.  }e
25fe0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
25ff0 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72 65   case when there
26000 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74 65   exist aggregate
26010 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20   functions or a 
26020 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a  GROUP BY clause.
26030 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a      ** or both *
26040 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  /.    NameContex
26050 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d  t sNC;    /* Nam
26060 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72  e context for pr
26070 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61  ocessing aggrega
26080 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  te information *
26090 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b  /.    int iAMem;
260a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
260b0 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
260c0 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65  or storing curre
260d0 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  nt GROUP BY */. 
260e0 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20     int iBMem;   
260f0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
26100 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
26110 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42  previous GROUP B
26120 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73  Y */.    int iUs
26130 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  eFlag;       /* 
26140 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64  Mem address hold
26150 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74  ing flag indicat
26160 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73  ing that at leas
26170 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
26180 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65            ** one
26190 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75   row of the inpu
261a0 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  t to the aggrega
261b0 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20  tor has been.   
261c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261d0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
261e0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62  d */.    int iAb
261f0 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20  ortFlag;     /* 
26200 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63  Mem address whic
26210 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61  h causes query a
26220 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65  bort if positive
26230 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75   */.    int grou
26240 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52  pBySort;    /* R
26250 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f  ows come from so
26260 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59  urce in GROUP BY
26270 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e   order */.    in
26280 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
26290 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63    /* End of proc
262a0 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20  essing for this 
262b0 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e  SELECT */.    in
262c0 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20  t sortPTab = 0; 
262d0 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65    /* Pseudotable
262e0 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20   used to decode 
262f0 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20  sorting results 
26300 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f  */.    int sortO
26310 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75  ut = 0;    /* Ou
26320 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66 72  tput register fr
26330 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  om the sorter */
26340 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
26350 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61  any and all alia
26360 73 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ses between the 
26370 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74  result set and t
26380 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20  he.    ** GROUP 
26390 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a  BY clause..    *
263a0 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
263b0 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
263c0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
263d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
263e0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
263f0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
26400 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
26410 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
26420 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  over expression 
26430 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20  in a list */..  
26440 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c      for(k=p->pEL
26450 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
26460 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20  m=p->pEList->a; 
26470 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b  k>0; k--, pItem+
26480 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
26490 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20  m->iAlias = 0;. 
264a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
264b0 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  (k=pGroupBy->nEx
264c0 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70  pr, pItem=pGroup
264d0 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c  By->a; k>0; k--,
264e0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
264f0 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73     pItem->iAlias
26500 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
26510 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
26520 63 74 52 6f 77 3e 31 30 30 20 29 20 70 2d 3e 6e  ctRow>100 ) p->n
26530 53 65 6c 65 63 74 52 6f 77 20 3d 20 31 30 30 3b  SelectRow = 100;
26540 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26550 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
26560 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 0a 20 20  = 1;.    }.. .  
26570 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61    /* Create a la
26580 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77  bel to jump to w
26590 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61  hen we want to a
265a0 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a  bort the query *
265b0 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20  /.    addrEnd = 
265c0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
265d0 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  abel(v);..    /*
265e0 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55   Convert TK_COLU
265f0 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b  MN nodes into TK
26600 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20  _AGG_COLUMN and 
26610 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a  make entries in.
26620 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20      ** sAggInfo 
26630 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46  for all TK_AGG_F
26640 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e  UNCTION nodes in
26650 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   expressions of 
26660 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43  the.    ** SELEC
26670 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  T statement..   
26680 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
26690 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
266a0 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50  NC));.    sNC.pP
266b0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
266c0 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
266d0 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  = pTabList;.    
266e0 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26  sNC.pAggInfo = &
266f0 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41  sAggInfo;.    sA
26700 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
26710 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79  olumn = pGroupBy
26720 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   ? pGroupBy->nEx
26730 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73 41  pr+1 : 0;.    sA
26740 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20  ggInfo.pGroupBy 
26750 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = pGroupBy;.    
26760 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
26770 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
26780 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
26790 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
267a0 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72  ggList(&sNC, pOr
267b0 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
267c0 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
267d0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
267e0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73  yzeAggregates(&s
267f0 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20  NC, pHaving);.  
26800 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
26810 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20  .nAccumulator = 
26820 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
26830 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
26840 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
26850 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
26860 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
26870 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61  perty(sAggInfo.a
26880 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45  Func[i].pExpr, E
26890 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
268a0 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
268b0 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e  s |= NC_InAggFun
268c0 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
268d0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
268e0 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66  st(&sNC, sAggInf
268f0 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
26900 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
26910 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d    sNC.ncFlags &=
26920 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a   ~NC_InAggFunc;.
26930 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
26940 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
26950 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
26960 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73  ;..    /* Proces
26970 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  sing for aggrega
26980 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42  tes with GROUP B
26990 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72  Y is very differ
269a0 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d  ent and.    ** m
269b0 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  uch more complex
269c0 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73   than aggregates
269d0 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50   without a GROUP
269e0 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   BY..    */.    
269f0 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
26a00 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
26a10 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79  KeyInfo;  /* Key
26a20 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
26a30 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79  for the group by
26a40 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
26a50 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20   int j1;        
26a60 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63       /* A-vs-B c
26a70 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20  omparision jump 
26a80 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
26a90 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20  rOutputRow;  /* 
26aa0 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74  Start of subrout
26ab0 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
26ac0 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f   a result row */
26ad0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75  .      int regOu
26ae0 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65  tputRow;   /* Re
26af0 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
26b00 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74  ister for output
26b10 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
26b20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74       int addrSet
26b30 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20  Abort;   /* Set 
26b40 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61  the abort flag a
26b50 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20  nd return */.   
26b60 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66     int addrTopOf
26b70 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66  Loop;  /* Top of
26b80 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20   the input loop 
26b90 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
26ba0 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20  rSortingIdx; /* 
26bb0 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
26bc0 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72  eral for the sor
26bd0 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ting index */.  
26be0 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65      int addrRese
26bf0 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f  t;      /* Subro
26c00 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74  utine for resett
26c10 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
26c20 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tor */.      int
26c30 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20   regReset;      
26c40 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
26c50 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
26c60 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65  reset subroutine
26c70 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   */..      /* If
26c80 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55   there is a GROU
26c90 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d  P BY clause we m
26ca0 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74  ight need a sort
26cb0 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20  ing index to.   
26cc0 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20     ** implement 
26cd0 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68  it.  Allocate th
26ce0 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  at sorting index
26cf0 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72   now.  If it tur
26d00 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20  ns out.      ** 
26d10 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e  that we do not n
26d20 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c  eed it after all
26d30 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f  , the OP_SorterO
26d40 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  pen instruction.
26d50 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
26d60 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
26d70 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20  a Noop.  .      
26d80 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66  */.      sAggInf
26d90 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70  o.sortingIdx = p
26da0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
26db0 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
26dc0 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
26dd0 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ist(pParse, pGro
26de0 75 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64 64  upBy);.      add
26df0 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71  rSortingIdx = sq
26e00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
26e10 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  v, OP_SorterOpen
26e20 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  , .          sAg
26e30 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
26e40 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74  , sAggInfo.nSort
26e50 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20  ingColumn, .    
26e60 20 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29        0, (char*)
26e70 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
26e80 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  INFO);..      /*
26e90 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
26ea0 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65  ry locations use
26eb0 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67  d by GROUP BY ag
26ec0 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69  gregate processi
26ed0 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ng.      */.    
26ee0 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70    iUseFlag = ++p
26ef0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
26f00 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20     iAbortFlag = 
26f10 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
26f20 20 20 20 20 20 20 72 65 67 4f 75 74 70 75 74 52        regOutputR
26f30 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ow = ++pParse->n
26f40 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f  Mem;.      addrO
26f50 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74  utputRow = sqlit
26f60 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
26f70 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73  v);.      regRes
26f80 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
26f90 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52  Mem;.      addrR
26fa0 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64  eset = sqlite3Vd
26fb0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
26fc0 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50        iAMem = pP
26fd0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
26fe0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
26ff0 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
27000 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d  nExpr;.      iBM
27010 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
27020 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61  m + 1;.      pPa
27030 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
27040 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
27050 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27060 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
27070 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c  ger, 0, iAbortFl
27080 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
27090 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61  omment((v, "clea
270a0 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  r abort flag"));
270b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
270c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
270d0 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46  nteger, 0, iUseF
270e0 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
270f0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
27100 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  icate accumulato
27110 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20  r empty"));.    
27120 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27130 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
27140 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b  0, iAMem, iAMem+
27150 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d  pGroupBy->nExpr-
27160 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65  1);..      /* Be
27170 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20  gin a loop that 
27180 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c  will extract all
27190 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20   source rows in 
271a0 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a  GROUP BY order..
271b0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69        ** This mi
271c0 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20  ght involve two 
271d0 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77  separate loops w
271e0 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69  ith an OP_Sort i
271f0 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20  n between, or.  
27200 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
27210 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70  be a single loop
27220 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e   that uses an in
27230 64 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69  dex to extract i
27240 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20  nformation.     
27250 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74   ** in the right
27260 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20   order to begin 
27270 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  with..      */. 
27280 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27290 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
272a0 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64  ub, regReset, ad
272b0 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
272c0 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
272d0 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
272e0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
272f0 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30  ere, pGroupBy, 0
27300 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
27310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27320 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42      WHERE_GROUPB
27330 59 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  Y, 0);.      if(
27340 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
27350 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
27360 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
27370 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
27380 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  Info) ){.       
27390 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65   /* The optimize
273a0 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c  r is able to del
273b0 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f  iver rows in gro
273c0 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20  up by order so. 
273d0 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20         ** we do 
273e0 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74  not have to sort
273f0 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  .  The OP_OpenEp
27400 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
27410 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
27420 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72   cancelled later
27430 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c   because we stil
27440 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68  l need to use th
27450 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20  e pKeyInfo.     
27460 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72     */.        gr
27470 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20  oupBySort = 0;. 
27480 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27490 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20      /* Rows are 
274a0 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e  coming out in un
274b0 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72  determined order
274c0 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75  .  We have to pu
274d0 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61  sh.        ** ea
274e0 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f  ch row into a so
274f0 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72  rting index, ter
27500 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74  minate the first
27510 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a   loop,.        *
27520 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72  * then loop over
27530 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
27540 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ex in order to g
27550 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  et the output.  
27560 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74        ** in sort
27570 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  ed order.       
27580 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
27590 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20  regBase;.       
275a0 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a   int regRecord;.
275b0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c          int nCol
275c0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47  ;.        int nG
275d0 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20  roupBy;..       
275e0 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
275f0 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
27600 20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63         (sDistinc
27610 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e  t.isTnct && (p->
27620 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74  selFlags&SF_Dist
27630 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20  inct)==0) ?.    
27640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27650 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52  "DISTINCT" : "GR
27660 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20  OUP BY");..     
27670 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
27680 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f   1;.        nGro
27690 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d  upBy = pGroupBy-
276a0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
276b0 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20  nCol = nGroupBy 
276c0 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  + 1;.        j =
276d0 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20   nGroupBy+1;.   
276e0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
276f0 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
27700 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
27710 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61    if( sAggInfo.a
27720 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f  Col[i].iSorterCo
27730 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
27740 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20         nCol++;. 
27750 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a             j++;.
27760 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27770 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
27780 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47  gBase = sqlite3G
27790 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
277a0 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  se, nCol);.     
277b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
277c0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
277d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
277e0 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
277f0 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
27800 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b  By, regBase, 0);
27810 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27820 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
27830 5f 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49  _Sequence, sAggI
27840 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72  nfo.sortingIdx,r
27850 65 67 42 61 73 65 2b 6e 47 72 6f 75 70 42 79 29  egBase+nGroupBy)
27860 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
27870 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20  roupBy+1;.      
27880 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
27890 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
278a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
278b0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
278c0 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49  l *pCol = &sAggI
278d0 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20  nfo.aCol[i];.   
278e0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
278f0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  >iSorterColumn>=
27900 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
27910 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65   int r1 = j + re
27920 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20  gBase;.         
27930 20 20 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20     int r2;..    
27940 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
27950 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
27960 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20  olumn(pParse, . 
27970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
27990 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e  ol->pTab, pCol->
279a0 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69  iColumn, pCol->i
279b0 54 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20  Table, r1, 0);. 
279c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
279d0 31 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20  1!=r2 ){.       
279e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
279f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
27a00 43 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20  Copy, r2, r1);. 
27a10 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27a20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
27a30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27a40 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52    }.        regR
27a50 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
27a60 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
27a70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
27a80 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
27a90 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
27aa0 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65  egBase, nCol, re
27ab0 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
27ac0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27ad0 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
27ae0 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f  Insert, sAggInfo
27af0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67  .sortingIdx, reg
27b00 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
27b10 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
27b20 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
27b30 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
27b40 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
27b50 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
27b60 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  e, regBase, nCol
27b70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
27b80 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
27b90 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  o);.        sAgg
27ba0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50  Info.sortingIdxP
27bb0 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d  Tab = sortPTab =
27bc0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
27bd0 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74  .        sortOut
27be0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
27bf0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
27c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27c10 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
27c20 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54  enPseudo, sortPT
27c30 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f  ab, sortOut, nCo
27c40 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
27c50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
27c60 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20   OP_SorterSort, 
27c70 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
27c80 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  Idx, addrEnd);. 
27c90 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
27ca0 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59  nt((v, "GROUP BY
27cb0 20 73 6f 72 74 22 29 29 3b 0a 20 20 20 20 20 20   sort"));.      
27cc0 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f    sAggInfo.useSo
27cd0 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20  rtingIdx = 1;.  
27ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27cf0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
27d00 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  se);.      }..  
27d10 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
27d20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
27d30 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73  P BY terms and s
27d40 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20  tore in b0, b1, 
27d50 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28  b2....      ** (
27d60 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63  b0 is memory loc
27d70 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62  ation iBMem+0, b
27d80 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e  1 is iBMem+1, an
27d90 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20  d so forth).    
27da0 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72    ** Then compar
27db0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
27dc0 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61  OUP BY terms aga
27dd0 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42  inst the GROUP B
27de0 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a  Y terms.      **
27df0 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
27e00 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79  us row currently
27e10 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61   stored in a0, a
27e20 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, a2....      *
27e30 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f  /.      addrTopO
27e40 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  fLoop = sqlite3V
27e50 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
27e60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27e70 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
27e80 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66  Parse);.      if
27e90 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
27ea0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27eb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
27ec0 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67  _SorterData, sAg
27ed0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
27ee0 2c 20 73 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20  , sortOut);.    
27ef0 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
27f00 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; j<pGroupBy->n
27f10 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
27f20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
27f30 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ort ){.         
27f40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27f50 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
27f60 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42   sortPTab, j, iB
27f70 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
27f80 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 73 71 6c    if( j==0 ) sql
27f90 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
27fa0 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52  (v, OPFLAG_CLEAR
27fb0 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20 20  CACHE);.        
27fc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
27fd0 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74   sAggInfo.direct
27fe0 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Mode = 1;.      
27ff0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
28000 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ode(pParse, pGro
28010 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  upBy->a[j].pExpr
28020 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
28030 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
28040 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28050 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
28060 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65  are, iAMem, iBMe
28070 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  m, pGroupBy->nEx
28080 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
28090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
280a0 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
280b0 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
280c0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
280d0 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65       j1 = sqlite
280e0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
280f0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
28100 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
28110 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30  OP_Jump, j1+1, 0
28120 2c 20 6a 31 2b 31 29 3b 0a 0a 20 20 20 20 20 20  , j1+1);..      
28130 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
28140 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65   that runs whene
28150 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59  ver the GROUP BY
28160 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20   changes..      
28170 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68  ** Changes in th
28180 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64  e GROUP BY are d
28190 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70  etected by the p
281a0 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20  revious code.   
281b0 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66     ** block.  If
281c0 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63   there were no c
281d0 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f  hanges, this blo
281e0 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20  ck is skipped.. 
281f0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
28200 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65   This code copie
28210 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20  s current group 
28220 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62  by terms in b0,b
28230 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a  1,b2,....      *
28240 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c  * over to a0,a1,
28250 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c  a2.  It then cal
28260 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  ls the output su
28270 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
28280 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65  * and resets the
28290 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
282a0 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
282b0 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a   in preparation.
282c0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
282d0 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62   next GROUP BY b
282e0 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  atch..      */. 
282f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28300 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
28310 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70   iBMem, iAMem, p
28320 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b  GroupBy->nExpr);
28330 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
28340 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
28350 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52  osub, regOutputR
28360 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ow, addrOutputRo
28370 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
28380 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75  mment((v, "outpu
28390 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20  t one row"));.  
283a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
283b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp2(v, OP_IfPo
283c0 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61  s, iAbortFlag, a
283d0 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 56  ddrEnd);.      V
283e0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
283f0 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67  check abort flag
28400 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
28410 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
28420 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
28430 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
28440 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
28450 74 28 28 76 2c 20 22 72 65 73 65 74 20 61 63 63  t((v, "reset acc
28460 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
28470 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
28480 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
28490 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f  mulators based o
284a0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
284b0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
284c0 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20  rrent row.      
284d0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
284e0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
284f0 6a 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74  j1);.      updat
28500 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
28510 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
28520 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
28530 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
28540 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46  nteger, 1, iUseF
28550 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
28560 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
28570 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63  icate data in ac
28580 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
28590 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74       /* End of t
285a0 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f  he loop.      */
285b0 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70  .      if( group
285c0 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
285d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
285e0 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
285f0 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Next, sAggInfo.s
28600 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54  ortingIdx, addrT
28610 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  opOfLoop);.     
28620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28630 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
28640 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
28650 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
28660 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
28670 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20  SortingIdx);.   
28680 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f     }..      /* O
28690 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20  utput the final 
286a0 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20  row of result.  
286b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
286c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
286d0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
286e0 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
286f0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
28700 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
28710 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f  "output final ro
28720 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  w"));..      /* 
28730 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75  Jump over the su
28740 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20  broutines.      
28750 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
28760 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
28770 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6e  _Goto, 0, addrEn
28780 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  d);..      /* Ge
28790 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
287a0 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
287b0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
287c0 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
287d0 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20    ** set.  This 
287e0 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74  subroutine first
287f0 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55   looks at the iU
28800 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65  seFlag.  If iUse
28810 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  Flag.      ** is
28820 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
28830 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ual to zero, the
28840 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61   subroutine is a
28850 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20   no-op.  If.    
28860 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
28870 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  ing calls for th
28880 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74  e query to abort
28890 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  , this subroutin
288a0 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65  e.      ** incre
288b0 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74  ments the iAbort
288c0 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  Flag memory loca
288d0 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75  tion before retu
288e0 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a  rning in.      *
288f0 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61  * order to signa
28900 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  l the caller to 
28910 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  abort..      */.
28920 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f        addrSetAbo
28930 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
28940 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
28950 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28960 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
28970 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74  teger, 1, iAbort
28980 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
28990 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
289a0 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  t abort flag"));
289b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
289c0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
289d0 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74  eturn, regOutput
289e0 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Row);.      sqli
289f0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
28a00 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75  bel(v, addrOutpu
28a10 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64  tRow);.      add
28a20 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
28a30 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
28a40 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
28a50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
28a60 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73  v, OP_IfPos, iUs
28a70 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75  eFlag, addrOutpu
28a80 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56  tRow+2);.      V
28a90 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
28aa0 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  Groupby result g
28ab0 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70  enerator entry p
28ac0 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73  oint"));.      s
28ad0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
28ae0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
28af0 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
28b00 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
28b10 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
28b20 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
28b30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
28b40 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
28b50 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75  aving, addrOutpu
28b60 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a  tRow+1, SQLITE_J
28b70 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
28b80 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
28b90 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
28ba0 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
28bb0 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
28bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
28bd0 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c  Distinct, pDest,
28be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28bf0 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75         addrOutpu
28c00 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41  tRow+1, addrSetA
28c10 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  bort);.      sql
28c20 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
28c30 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
28c40 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
28c50 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
28c60 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72  , "end groupby r
28c70 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22  esult generator"
28c80 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  ));..      /* Ge
28c90 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
28ca0 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
28cb0 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79  set the group-by
28cc0 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20   accumulator.   
28cd0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
28ce0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
28cf0 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74  bel(v, addrReset
28d00 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63  );.      resetAc
28d10 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
28d20 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
28d30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28d40 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
28d50 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20  rn, regReset);. 
28d60 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e      .    } /* en
28d70 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42  dif pGroupBy.  B
28d80 65 67 69 6e 20 61 67 67 72 65 67 61 74 65 20 71  egin aggregate q
28d90 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 20 47  ueries without G
28da0 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20  ROUP BY: */.    
28db0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70  else {.      Exp
28dc0 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b  rList *pDel = 0;
28dd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
28de0 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a  OMIT_BTREECOUNT.
28df0 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
28e00 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  b;.      if( (pT
28e10 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75  ab = isSimpleCou
28e20 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29  nt(p, &sAggInfo)
28e30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
28e40 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f  /* If isSimpleCo
28e50 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61 20  unt() returns a 
28e60 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62  pointer to a Tab
28e70 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  le structure, th
28e80 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  en.        ** th
28e90 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
28ea0 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
28eb0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
28ec0 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63     **   SELECT c
28ed0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62  ount(*) FROM <tb
28ee0 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  l>.        **.  
28ef0 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74        ** where t
28f00 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
28f10 72 65 20 72 65 74 75 72 6e 65 64 20 72 65 70 72  re returned repr
28f20 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62  esents table <tb
28f30 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  l>..        **. 
28f40 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73         ** This s
28f50 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63  tatement is so c
28f60 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73  ommon that it is
28f70 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69   optimized speci
28f80 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20  ally. The.      
28f90 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e    ** OP_Count in
28fa0 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65  struction is exe
28fb0 63 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20  cuted either on 
28fc0 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65  the intkey table
28fd0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
28fe0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
28ff0 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62  ta for table <tb
29000 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20  l> or on one of 
29010 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a  its indexes. It.
29020 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65          ** is be
29030 74 74 65 72 20 74 6f 20 65 78 65 63 75 74 65 20  tter to execute 
29040 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64  the op on an ind
29050 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61  ex, as indexes a
29060 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20  re almost.      
29070 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65    ** always spre
29080 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70  ad across less p
29090 61 67 65 73 20 74 68 61 6e 20 74 68 65 69 72 20  ages than their 
290a0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
290b0 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bles..        */
290c0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
290d0 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
290e0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
290f0 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
29100 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
29110 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72    const int iCsr
29120 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
29130 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  +;     /* Cursor
29140 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20   to scan b-tree 
29150 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  */.        Index
29160 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
29170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29180 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
29190 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
291a0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
291b0 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  o = 0;          
291c0 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20       /* Keyinfo 
291d0 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65  for scanned inde
291e0 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64  x */.        Ind
291f0 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20  ex *pBest = 0;  
29200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29210 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20    /* Best index 
29220 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a  found so far */.
29230 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f          int iRoo
29240 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20  t = pTab->tnum; 
29250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29260 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61  Root page of sca
29270 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a  nned b-tree */..
29280 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
29290 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
292a0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
292b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
292c0 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
292d0 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
292e0 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
292f0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61  ..        /* Sea
29300 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65  rch for the inde
29310 78 20 74 68 61 74 20 68 61 73 20 74 68 65 20 6c  x that has the l
29320 6f 77 65 73 74 20 73 63 61 6e 20 63 6f 73 74 2e  owest scan cost.
29330 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
29340 20 20 20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d      ** (2011-04-
29350 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20  15) Do not do a 
29360 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20  full scan of an 
29370 75 6e 6f 72 64 65 72 65 64 20 69 6e 64 65 78 2e  unordered index.
29380 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
29390 20 20 20 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d      ** (2013-10-
293a0 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74  03) Do not count
293b0 20 74 68 65 20 65 6e 74 69 72 65 73 20 69 6e 20   the entires in 
293c0 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e  a partial index.
293d0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
293e0 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69      ** In practi
293f0 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ce the KeyInfo s
29400 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f  tructure will no
29410 74 20 62 65 20 75 73 65 64 2e 20 49 74 20 69 73  t be used. It is
29420 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a   only .        *
29430 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70  * passed to keep
29440 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70   OP_OpenRead hap
29450 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  py..        */. 
29460 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d         for(pIdx=
29470 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
29480 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
29490 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  Next){.         
294a0 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72   if( pIdx->bUnor
294b0 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  dered==0.       
294c0 20 20 20 20 26 26 20 70 49 64 78 2d 3e 73 7a 49      && pIdx->szI
294d0 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61  dxRow<pTab->szTa
294e0 62 52 6f 77 0a 20 20 20 20 20 20 20 20 20 20 20  bRow.           
294f0 26 26 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  && pIdx->pPartId
29500 78 57 68 65 72 65 3d 3d 30 0a 20 20 20 20 20 20  xWhere==0.      
29510 20 20 20 20 20 26 26 20 28 21 70 42 65 73 74 20       && (!pBest 
29520 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  || pIdx->szIdxRo
29530 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f  w<pBest->szIdxRo
29540 77 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  w).          ){.
29550 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73              pBes
29560 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  t = pIdx;.      
29570 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
29580 20 20 20 20 20 20 20 20 69 66 28 20 70 42 65 73          if( pBes
29590 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t ){.          i
295a0 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e  Root = pBest->tn
295b0 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b  um;.          pK
295c0 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
295d0 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
295e0 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20  Parse, pBest);. 
295f0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
29600 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64    /* Open a read
29610 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78  -only cursor, ex
29620 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75  ecute the OP_Cou
29630 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75  nt, close the cu
29640 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rsor. */.       
29650 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29660 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e  p4Int(v, OP_Open
29670 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f  Read, iCsr, iRoo
29680 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20  t, iDb, 1);.    
29690 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
296a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
296b0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
296c0 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a  4(v, -1, (char *
296d0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
296e0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
296f0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
29700 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
29710 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73  P_Count, iCsr, s
29720 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d  AggInfo.aFunc[0]
29730 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  .iMem);.        
29740 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29750 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
29760 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78  Csr);.        ex
29770 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
29780 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
29790 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Best);.      }el
297a0 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
297b0 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f  ITE_OMIT_BTREECO
297c0 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20  UNT */.      {. 
297d0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
297e0 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  if the query is 
297f0 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  of one of the fo
29800 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20  llowing forms:. 
29810 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
29820 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69    **   SELECT mi
29830 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  n(x) FROM ....  
29840 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
29850 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e  T max(x) FROM ..
29860 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
29870 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73       ** If it is
29880 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63  , then ask the c
29890 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74  ode in where.c t
298a0 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72  o attempt to sor
298b0 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  t results.      
298c0 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65    ** as if there
298d0 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f   was an "ORDER O
298e0 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f  N x" or "ORDER O
298f0 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73 65  N x DESC" clause
29900 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66  . .        ** If
29910 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65   where.c is able
29920 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75   to produce resu
29930 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68  lts sorted in th
29940 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20  is order, then. 
29950 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64         ** add vd
29960 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b  be code to break
29970 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63   out of the proc
29980 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65  essing loop afte
29990 72 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  r the .        *
299a0 2a 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  * first iteratio
299b0 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66 69 72  n (since the fir
299c0 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
299d0 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20  the loop is .   
299e0 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65       ** guarante
299f0 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ed to operate on
29a00 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74 68   the row with th
29a10 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78  e minimum or max
29a20 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a  imum .        **
29a30 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65   value of x, the
29a40 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72   only row requir
29a50 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ed)..        **.
29a60 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65          ** A spe
29a70 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62  cial flag must b
29a80 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  e passed to sqli
29a90 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
29aa0 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20  to slightly.    
29ab0 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65      ** modify be
29ac0 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f 77  havior as follow
29ad0 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s:.        **.  
29ae0 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20        **   + If 
29af0 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20 22  the query is a "
29b00 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20  SELECT min(x)", 
29b10 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f  then the loop co
29b20 64 65 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a  ded by.        *
29b30 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73 68  *     where.c sh
29b40 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65  ould not iterate
29b50 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73   over any values
29b60 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c   with a NULL val
29b70 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ue.        **   
29b80 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 20    for x..       
29b90 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
29ba0 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72   + The optimizer
29bb0 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63   code in where.c
29bc0 20 28 74 68 65 20 74 68 69 6e 67 20 74 68 61 74   (the thing that
29bd0 20 64 65 63 69 64 65 73 20 77 68 69 63 68 0a 20   decides which. 
29be0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e         **     in
29bf0 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74  dex or indices t
29c00 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c  o use) should pl
29c10 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74 20  ace a different 
29c20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20  priority on .   
29c30 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69       **     sati
29c40 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45  sfying the 'ORDE
29c50 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68 61  R BY' clause tha
29c60 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68  n it does in oth
29c70 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20  er cases..      
29c80 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74    **     Refer t
29c90 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65  o code and comme
29ca0 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66  nts in where.c f
29cb0 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20  or details..    
29cc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 45      */.        E
29cd0 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78  xprList *pMinMax
29ce0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38   = 0;.        u8
29cf0 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52   flag = WHERE_OR
29d00 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  DERBY_NORMAL;.  
29d10 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 61        .        a
29d20 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70  ssert( p->pGroup
29d30 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By==0 );.       
29d40 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30   assert( flag==0
29d50 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
29d60 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 7b  p->pHaving==0 ){
29d70 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  .          flag 
29d80 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 26 73  = minMaxQuery(&s
29d90 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61  AggInfo, &pMinMa
29da0 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
29db0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
29dc0 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d 61  ag==0 || (pMinMa
29dd0 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78 2d  x!=0 && pMinMax-
29de0 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a 20  >nExpr==1) );.. 
29df0 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 20         if( flag 
29e00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69  ){.          pMi
29e10 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78  nMax = sqlite3Ex
29e20 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4d  prListDup(db, pM
29e30 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20 20  inMax, 0);.     
29e40 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e       pDel = pMin
29e50 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Max;.          i
29e60 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21 64  f( pMinMax && !d
29e70 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
29e80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
29e90 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72  MinMax->a[0].sor
29ea0 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57  tOrder = flag!=W
29eb0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
29ec0 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20   ?1:0;.         
29ed0 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
29ee0 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f  .pExpr->op = TK_
29ef0 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
29f00 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
29f10 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
29f20 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74 68   case runs if th
29f30 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20  e aggregate has 
29f40 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
29f50 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  se.  The.       
29f60 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69   ** processing i
29f70 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73  s much simpler s
29f80 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e  ince there is on
29f90 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a  ly a single row.
29fa0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75          ** of ou
29fb0 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tput..        */
29fc0 0a 20 20 20 20 20 20 20 20 72 65 73 65 74 41 63  .        resetAc
29fd0 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
29fe0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
29ff0 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
2a000 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2a010 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
2a020 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d  t, pWhere, pMinM
2a030 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a 20 20  ax,0,flag,0);.  
2a040 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
2a050 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2a060 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2a070 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29  Delete(db, pDel)
2a080 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2a090 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2a0a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
2a0b0 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
2a0c0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
2a0d0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  fo);.        ass
2a0e0 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d 3d 30 20  ert( pMinMax==0 
2a0f0 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70  || pMinMax->nExp
2a100 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  r==1 );.        
2a110 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2a120 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f  IsOrdered(pWInfo
2a130 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
2a140 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2a150 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
2a160 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
2a170 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b  kLabel(pWInfo));
2a180 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
2a190 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29  omment((v, "%s()
2a1a0 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20 20   by index",.    
2a1b0 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61              (fla
2a1c0 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g==WHERE_ORDERBY
2a1d0 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22  _MIN?"min":"max"
2a1e0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  )));.        }. 
2a1f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
2a200 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
2a210 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65          finalize
2a220 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
2a230 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
2a240 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2a250 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
2a260 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
2a270 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
2a280 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c  Having, addrEnd,
2a290 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
2a2a0 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63  LL);.      selec
2a2b0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
2a2c0 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
2a2d0 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 0a 20 20   0, 0, 0, 0, .  
2a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2f0 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45      pDest, addrE
2a300 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  nd, addrEnd);.  
2a310 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
2a320 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
2a330 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  el);.    }.    s
2a340 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2a350 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e  eLabel(v, addrEn
2a360 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20  d);.    .  } /* 
2a370 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20  endif aggregate 
2a380 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20  query */..  if( 
2a390 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
2a3a0 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  ype==WHERE_DISTI
2a3b0 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b  NCT_UNORDERED ){
2a3c0 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70  .    explainTemp
2a3d0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44  Table(pParse, "D
2a3e0 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a  ISTINCT");.  }..
2a3f0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
2a400 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
2a410 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65  use, then we nee
2a420 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65  d to sort the re
2a430 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73  sults.  ** and s
2a440 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20  end them to the 
2a450 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20  callback one by 
2a460 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
2a470 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
2a480 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
2a490 28 70 50 61 72 73 65 2c 20 22 4f 52 44 45 52 20  (pParse, "ORDER 
2a4a0 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65 72 61  BY");.    genera
2a4b0 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73  teSortTail(pPars
2a4c0 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d  e, p, v, pEList-
2a4d0 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a  >nExpr, pDest);.
2a4e0 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68    }..  /* Jump h
2a4f0 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73  ere to skip this
2a500 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71   query.  */.  sq
2a510 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2a520 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a  Label(v, iEnd);.
2a530 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54  .  /* The SELECT
2a540 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
2a550 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74  y coded.   Set t
2a560 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
2a570 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  o 0.  ** to indi
2a580 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a  cate no errors..
2a590 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a    */.  rc = 0;..
2a5a0 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d    /* Control jum
2a5b0 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e  ps to here if an
2a5c0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
2a5d0 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20  tered above, or 
2a5e0 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  upon.  ** succes
2a5f0 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74  sful coding of t
2a600 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a  he SELECT..  */.
2a610 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78  select_end:.  ex
2a620 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
2a630 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
2a640 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  d, iRestoreSelec
2a650 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e  tId);..  /* Iden
2a660 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  tify column name
2a670 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20  s if results of 
2a680 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 74  the SELECT are t
2a690 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  o be output..  *
2a6a0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2a6b0 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e  TE_OK && pDest->
2a6c0 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
2a6d0 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  t ){.    generat
2a6e0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
2a6f0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
2a700 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73  EList);.  }..  s
2a710 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2a720 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b   sAggInfo.aCol);
2a730 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
2a740 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  (db, sAggInfo.aF
2a750 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unc);.  return r
2a760 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  c;.}..#if define
2a770 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
2a780 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a  TREE_EXPLAIN)./*
2a790 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68  .** Generate a h
2a7a0 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 64 65  uman-readable de
2a7b0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61 20 74  scription of a t
2a7c0 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74  he Select object
2a7d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2a7e0 20 65 78 70 6c 61 69 6e 4f 6e 65 53 65 6c 65 63   explainOneSelec
2a7f0 74 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53  t(Vdbe *pVdbe, S
2a800 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c  elect *p){.  sql
2a810 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2a820 66 28 70 56 64 62 65 2c 20 22 53 45 4c 45 43 54  f(pVdbe, "SELECT
2a830 20 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65   ");.  if( p->se
2a840 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
2a850 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
2a860 74 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  te) ){.    if( p
2a870 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2a880 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
2a890 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2a8a0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 44  Printf(pVdbe, "D
2a8b0 49 53 54 49 4e 43 54 20 22 29 3b 0a 20 20 20 20  ISTINCT ");.    
2a8c0 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c  }.    if( p->sel
2a8d0 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
2a8e0 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71  gate ){.      sq
2a8f0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2a900 74 66 28 70 56 64 62 65 2c 20 22 61 67 67 5f 66  tf(pVdbe, "agg_f
2a910 6c 61 67 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20  lag ");.    }.  
2a920 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2a930 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73  NL(pVdbe);.    s
2a940 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2a950 6e 74 66 28 70 56 64 62 65 2c 20 22 20 20 20 22  ntf(pVdbe, "   "
2a960 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
2a970 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
2a980 70 56 64 62 65 2c 20 70 2d 3e 70 45 4c 69 73 74  pVdbe, p->pEList
2a990 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  );.  sqlite3Expl
2a9a0 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
2a9b0 69 66 28 20 70 2d 3e 70 53 72 63 20 26 26 20 70  if( p->pSrc && p
2a9c0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a  ->pSrc->nSrc ){.
2a9d0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
2a9e0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2a9f0 6e 74 66 28 70 56 64 62 65 2c 20 22 46 52 4f 4d  ntf(pVdbe, "FROM
2aa00 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
2aa10 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64 62  ExplainPush(pVdb
2aa20 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  e);.    for(i=0;
2aa30 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63   i<p->pSrc->nSrc
2aa40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
2aa50 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2aa60 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70  m *pItem = &p->p
2aa70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
2aa80 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2aa90 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 7b 25  rintf(pVdbe, "{%
2aaa0 64 2c 2a 7d 20 3d 20 22 2c 20 70 49 74 65 6d 2d  d,*} = ", pItem-
2aab0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
2aac0 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
2aad0 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
2aae0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c  qlite3ExplainSel
2aaf0 65 63 74 28 70 56 64 62 65 2c 20 70 49 74 65 6d  ect(pVdbe, pItem
2ab00 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
2ab10 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
2ab20 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Tab ){.         
2ab30 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2ab40 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 28  rintf(pVdbe, " (
2ab50 74 61 62 6e 61 6d 65 3d 25 73 29 22 2c 20 70 49  tabname=%s)", pI
2ab60 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2ab70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2ab80 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74     }else if( pIt
2ab90 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  em->zName ){.   
2aba0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
2abb0 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2abc0 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e   "%s", pItem->zN
2abd0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
2abe0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
2abf0 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20  Alias ){.       
2ac00 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2ac10 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 28  rintf(pVdbe, " (
2ac20 41 53 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e  AS %s)", pItem->
2ac30 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d  zAlias);.      }
2ac40 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
2ac50 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
2ac60 4c 45 46 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LEFT ){.        
2ac70 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2ac80 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 4c 45  intf(pVdbe, " LE
2ac90 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20 20 20 20  FT-JOIN");.     
2aca0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2acb0 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
2acc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2acd0 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 56  te3ExplainPop(pV
2ace0 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  dbe);.  }.  if( 
2acf0 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  p->pWhere ){.   
2ad00 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2ad10 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 57 48  rintf(pVdbe, "WH
2ad20 45 52 45 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  ERE ");.    sqli
2ad30 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
2ad40 56 64 62 65 2c 20 70 2d 3e 70 57 68 65 72 65 29  Vdbe, p->pWhere)
2ad50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2ad60 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
2ad70 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f   }.  if( p->pGro
2ad80 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  upBy ){.    sqli
2ad90 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2ada0 28 70 56 64 62 65 2c 20 22 47 52 4f 55 50 42 59  (pVdbe, "GROUPBY
2adb0 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
2adc0 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
2add0 70 56 64 62 65 2c 20 70 2d 3e 70 47 72 6f 75 70  pVdbe, p->pGroup
2ade0 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
2adf0 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
2ae00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
2ae10 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71  Having ){.    sq
2ae20 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2ae30 74 66 28 70 56 64 62 65 2c 20 22 48 41 56 49 4e  tf(pVdbe, "HAVIN
2ae40 47 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  G ");.    sqlite
2ae50 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64  3ExplainExpr(pVd
2ae60 62 65 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  be, p->pHaving);
2ae70 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2ae80 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
2ae90 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  }.  if( p->pOrde
2aea0 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
2aeb0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2aec0 70 56 64 62 65 2c 20 22 4f 52 44 45 52 42 59 20  pVdbe, "ORDERBY 
2aed0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ");.    sqlite3E
2aee0 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70  xplainExprList(p
2aef0 56 64 62 65 2c 20 70 2d 3e 70 4f 72 64 65 72 42  Vdbe, p->pOrderB
2af00 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
2af10 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
2af20 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c  .  }.  if( p->pL
2af30 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
2af40 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2af50 28 70 56 64 62 65 2c 20 22 4c 49 4d 49 54 20 22  (pVdbe, "LIMIT "
2af60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2af70 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c  plainExpr(pVdbe,
2af80 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
2af90 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
2afa0 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20  L(pVdbe);.  }.  
2afb0 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29  if( p->pOffset )
2afc0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2afd0 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2afe0 2c 20 22 4f 46 46 53 45 54 20 22 29 3b 0a 20 20  , "OFFSET ");.  
2aff0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2b000 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70  Expr(pVdbe, p->p
2b010 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c  Offset);.    sql
2b020 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
2b030 64 62 65 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64  dbe);.  }.}.void
2b040 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53   sqlite3ExplainS
2b050 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56 64 62  elect(Vdbe *pVdb
2b060 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
2b070 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
2b080 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2b090 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 28 6e  rintf(pVdbe, "(n
2b0a0 75 6c 6c 2d 73 65 6c 65 63 74 29 22 29 3b 0a 20  ull-select)");. 
2b0b0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
2b0c0 20 77 68 69 6c 65 28 20 70 2d 3e 70 50 72 69 6f   while( p->pPrio
2b0d0 72 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69  r ){.    p->pPri
2b0e0 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  or->pNext = p;. 
2b0f0 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72     p = p->pPrior
2b100 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
2b110 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64 62 65  xplainPush(pVdbe
2b120 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  );.  while( p ){
2b130 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53  .    explainOneS
2b140 65 6c 65 63 74 28 70 56 64 62 65 2c 20 70 29 3b  elect(pVdbe, p);
2b150 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
2b160 74 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  t;.    if( p==0 
2b170 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c  ) break;.    sql
2b180 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
2b190 64 62 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dbe);.    sqlite
2b1a0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2b1b0 56 64 62 65 2c 20 22 25 73 5c 6e 22 2c 20 73 65  Vdbe, "%s\n", se
2b1c0 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
2b1d0 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ));.  }.  sqlite
2b1e0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2b1f0 56 64 62 65 2c 20 22 45 4e 44 22 29 3b 0a 20 20  Vdbe, "END");.  
2b200 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f  sqlite3ExplainPo
2b210 70 28 70 56 64 62 65 29 3b 0a 7d 0a 0a 2f 2a 20  p(pVdbe);.}../* 
2b220 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75 63  End of the struc
2b230 74 75 72 65 20 64 65 62 75 67 20 70 72 69 6e 74  ture debug print
2b240 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a  ing code.*******
2b250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b290 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f  ******/.#endif /
2b2a0 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
2b2b0 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50  _ENABLE_TREE_EXP
2b2c0 4c 41 49 4e 29 20 2a 2f 0a                       LAIN) */.