mirror of https://github.com/sqlite/sqlite
Try to avoid reading pages when moving overflow chains to the free-list. (CVS 3886)
FossilOrigin-Name: 8cccec68bd9073b2b19d3d31cf0b77b0ce76172e
This commit is contained in:
parent
b4626a3e16
commit
8c0a959f35
12
manifest
12
manifest
|
@ -1,5 +1,5 @@
|
|||
C Add\ssome\stests\s(and\s2\sresulting\sbug\sfixes)\sto\sincr\svacuum\smode.\s(CVS\s3885)
|
||||
D 2007-04-28T15:47:44
|
||||
C Try\sto\savoid\sreading\spages\swhen\smoving\soverflow\schains\sto\sthe\sfree-list.\s(CVS\s3886)
|
||||
D 2007-04-30T16:55:01
|
||||
F Makefile.in 8cab54f7c9f5af8f22fd97ddf1ecfd1e1860de62
|
||||
F Makefile.linux-gcc 2d8574d1ba75f129aba2019f0b959db380a90935
|
||||
F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
|
||||
|
@ -59,7 +59,7 @@ F src/alter.c 2c79ec40f65e33deaf90ca493422c74586e481a3
|
|||
F src/analyze.c 4bbf5ddf9680587c6d4917e02e378b6037be3651
|
||||
F src/attach.c a16ada4a4654a0d126b8223ec9494ebb81bc5c3c
|
||||
F src/auth.c 902f4722661c796b97f007d9606bd7529c02597f
|
||||
F src/btree.c 066ca57368d814ba8940d926a491f70c6866033f
|
||||
F src/btree.c abdbd0261d2ab4fed65332cc93f959906c185d22
|
||||
F src/btree.h 4c0b5855cef3e4e6627358aa69541d21a2015947
|
||||
F src/build.c 02e01ec7907c7d947ab3041fda0e81eaed05db42
|
||||
F src/callback.c 6414ed32d55859d0f65067aa5b88d2da27b3af9e
|
||||
|
@ -465,7 +465,7 @@ F www/tclsqlite.tcl bb0d1357328a42b1993d78573e587c6dcbc964b9
|
|||
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
|
||||
F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
|
||||
F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5
|
||||
P 9466367d65f43d58020e709428268dc2ff98aa35
|
||||
R 7cca5d0f43767198fb71376aeea99069
|
||||
P 89b1b3f897bda1fffceb9cf72fa4d42b809ccb8e
|
||||
R 25da30ea21a3fd3e2f878c36734a5bb9
|
||||
U danielk1977
|
||||
Z 03907aab221cf0da66dda4d095ab65a6
|
||||
Z f3a814360f6db57fb203458a6b31fb7b
|
||||
|
|
|
@ -1 +1 @@
|
|||
89b1b3f897bda1fffceb9cf72fa4d42b809ccb8e
|
||||
8cccec68bd9073b2b19d3d31cf0b77b0ce76172e
|
62
src/btree.c
62
src/btree.c
|
@ -9,7 +9,7 @@
|
|||
** May you share freely, never taking more than you give.
|
||||
**
|
||||
*************************************************************************
|
||||
** $Id: btree.c,v 1.361 2007/04/28 15:47:44 danielk1977 Exp $
|
||||
** $Id: btree.c,v 1.362 2007/04/30 16:55:01 danielk1977 Exp $
|
||||
**
|
||||
** This file implements a external (disk-based) database using BTrees.
|
||||
** For a detailed discussion of BTrees, refer to
|
||||
|
@ -4046,6 +4046,60 @@ static int freePage(MemPage *pPage){
|
|||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
** Get a MemPage structure for overflow page number ovfl. If it
|
||||
** is not zero, the page number of the overflow page following the
|
||||
** one retrieved is written to *pPgnoNext.
|
||||
**
|
||||
** If it is possible to figure out the page-number of the next
|
||||
** overflow page without reading the data of page ovfl, then
|
||||
** sqlite3PagerAcquire() is passed the "noContent" flag when
|
||||
** page ovfl is retrieved.
|
||||
*/
|
||||
static int getOverflowPage(
|
||||
BtShared *pBt,
|
||||
Pgno ovfl,
|
||||
MemPage **ppPage,
|
||||
Pgno *pPgnoNext
|
||||
){
|
||||
Pgno next = 0;
|
||||
int rc;
|
||||
|
||||
if( !pPgnoNext ){
|
||||
return getPage(pBt, ovfl, ppPage, 1);
|
||||
}
|
||||
|
||||
#ifndef SQLITE_OMIT_AUTOVACUUM
|
||||
if( pBt->autoVacuum ){
|
||||
Pgno pgno;
|
||||
Pgno iGuess = ovfl+1;
|
||||
u8 eType;
|
||||
|
||||
while( PTRMAP_ISPAGE(pBt, iGuess) || iGuess==PENDING_BYTE_PAGE(pBt) ){
|
||||
iGuess++;
|
||||
}
|
||||
|
||||
if( iGuess<sqlite3PagerPagecount(pBt->pPager) ){
|
||||
rc = ptrmapGet(pBt, iGuess, &eType, &pgno);
|
||||
if( rc!=SQLITE_OK ){
|
||||
return rc;
|
||||
}
|
||||
if( eType==PTRMAP_OVERFLOW2 && pgno==ovfl ){
|
||||
next = iGuess;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
rc = getPage(pBt, ovfl, ppPage, 0);
|
||||
if( rc==SQLITE_OK ){
|
||||
assert(next==0 || next==get4byte((*ppPage)->aData));
|
||||
next = get4byte((*ppPage)->aData);
|
||||
}
|
||||
*pPgnoNext = next;
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
** Free any overflow pages associated with the given Cell.
|
||||
*/
|
||||
|
@ -4070,11 +4124,9 @@ static int clearCell(MemPage *pPage, unsigned char *pCell){
|
|||
if( ovflPgno==0 || ovflPgno>sqlite3PagerPagecount(pBt->pPager) ){
|
||||
return SQLITE_CORRUPT_BKPT;
|
||||
}
|
||||
rc = getPage(pBt, ovflPgno, &pOvfl, nOvfl==0);
|
||||
|
||||
rc = getOverflowPage(pBt, ovflPgno, &pOvfl, (nOvfl==0)?0:&ovflPgno);
|
||||
if( rc ) return rc;
|
||||
if( nOvfl ){
|
||||
ovflPgno = get4byte(pOvfl->aData);
|
||||
}
|
||||
rc = freePage(pOvfl);
|
||||
sqlite3PagerUnref(pOvfl->pDbPage);
|
||||
if( rc ) return rc;
|
||||
|
|
Loading…
Reference in New Issue