-C Require\sthat\sthe\spage\ssize\sbe\sa\spower\sof\s2.\s(CVS\s2038)
-D 2004-11-02T14:24:34
+C Fix\san\sauto-vacuum\sbug\sfor\sbtree\sentries\sthat\sspan\smore\sthan\sone\soverflow\spage.\s(CVS\s2039)
+D 2004-11-02T14:40:32
F Makefile.in 9e90c685d69f09039015a6b1f3b0a48e9738c9e5
F Makefile.linux-gcc a9e5a0d309fa7c38e7c14d3ecf7690879d3a5457
F README a01693e454a00cc117967e3f9fdab2d4d52e9bc1
F sqlite3.pc.in 985b9bf34192a549d7d370e0f0b6b34a4f61369a
F src/attach.c e49d09dad9f5f9fb10b4b0c1be5a70ae4c45e689
F src/auth.c 3b81f2a42f48a62c2c9c9b0eda31a157c681edea
-F src/btree.c 057e97744f4e9ca02d4815db554fd95fdabd60d5
+F src/btree.c 5958f65a3795e91fd017e4902b6ee7fe98169eb0
F src/btree.h 94dfec0a1722d33359b23e7e310f2b64ffedf029
F src/build.c bb896c5f85ab749d17ae5d730235134c12c08033
F src/date.c 34bdb0082db7ec2a83ef00063f7b44e61ee19dad
F test/attach2.test f7795123d3051ace1672b6d23973da6435de3745
F test/attach3.test 6d060986ff004ebb89e1876a331d96c6bb62269e
F test/auth.test 1cc252d9e7b3bdc1314199cbf3a0d3c5ed026c21
-F test/autovacuum.test 77eec318b1be7764b8dcb3198c035edc30cd319f
+F test/autovacuum.test 9ab4fcfb98ac1537548d61ce1e1718794aac4719
F test/bigfile.test d3744a8821ce9abb8697f2826a3e3d22b719e89f
F test/bigrow.test f0aeb7573dcb8caaafea76454be3ade29b7fc747
F test/bind.test a8682ba41433b93bb36a4213a43f282ca9aec5a9
F www/vdbe.tcl 59288db1ac5c0616296b26dce071c36cb611dfe9
F www/version3.tcl 092a01f5ef430d2c4acc0ae558d74c4bb89638a0
F www/whentouse.tcl fdacb0ba2d39831e8a6240d05a490026ad4c4e4c
-P d12481f09cbe51c7ea499bc22afec5de3af14ad4
-R ce7547bdb8b99a29e1e65ec61753f1b6
-U drh
-Z ac7564dbdf799e2f506094e004f86e98
+P c33b34dbe9657b151b9ab00a6b50a255fae623f8
+R 6249b189aa86705bd047e7b6eada805a
+U danielk1977
+Z d61c7336a7d899fa402be79ab44af7cd
** May you share freely, never taking more than you give.
**
*************************************************************************
-** $Id: btree.c,v 1.197 2004/11/02 14:24:34 drh Exp $
+** $Id: btree.c,v 1.198 2004/11/02 14:40:32 danielk1977 Exp $
**
** This file implements a external (disk-based) database using BTrees.
** For a detailed discussion of BTrees, refer to
static void modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){
if( eType==PTRMAP_OVERFLOW2 ){
+ /* The pointer is always the first 4 bytes of the page in this case. */
assert( get4byte(pPage->aData)==iFrom );
- put4byte(pPage->aData, iFrom);
+ put4byte(pPage->aData, iTo);
}else{
int isInitOrig = pPage->isInit;
int i;
initPage(pPage, 0);
nCell = pPage->nCell;
- /* assert( !pPage->leaf && eType==PTRMAP_BTREE ); */
-
for(i=0; i<nCell; i++){
u8 *pCell = findCell(pPage, i);
if( eType==PTRMAP_OVERFLOW1 ){
}while( iFreePage>finDbSize );
/* Move page iDbPage from it's current location to page number iFreePage */
- TRACE(("AUTOVACUUM: Moving %d to free page %d (ptr page %d)\n",
- iDbPage, iFreePage, iPtrPage));
+ TRACE(("AUTOVACUUM: Moving %d to free page %d (ptr page %d type %d)\n",
+ iDbPage, iFreePage, iPtrPage, eType));
releasePage(pFreeMemPage);
pFreeMemPage = 0;
rc = sqlite3pager_movepage(pPager, pDbPage, iFreePage);
/* If pDbPage was a btree-page, then it may have child pages and/or cells
** that point to overflow pages. The pointer map entries for all these
** pages need to be changed.
+ **
+ ** If pDbPage is an overflow page, then the first 4 bytes may store a
+ ** pointer to a subsequent overflow page. If this is the case, then
+ ** the pointer map needs to be updated for the subsequent overflow page.
*/
if( eType==PTRMAP_BTREE ){
rc = setChildPtrmaps(pDbMemPage);
if( rc!=SQLITE_OK ) goto autovacuum_out;
+ }else{
+ Pgno nextOvfl = get4byte(pDbPage);
+ if( nextOvfl!=0 ){
+ assert( nextOvfl<=origDbSize );
+ rc = ptrmapPut(pBt, nextOvfl, PTRMAP_OVERFLOW2, iFreePage);
+ if( rc!=SQLITE_OK ) goto autovacuum_out;
+ }
}
releasePage(pDbMemPage);
pDbMemPage = 0;
# This file implements regression tests for SQLite library. The
# focus of this file is testing the SELECT statement.
#
-# $Id: autovacuum.test,v 1.1 2004/11/02 12:56:41 danielk1977 Exp $
+# $Id: autovacuum.test,v 1.2 2004/11/02 14:40:32 danielk1977 Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
do_test autovacuum-1.1 {
execsql {
CREATE TABLE av1(a);
+ -- CREATE INDEX av1_idx ON av1(a);
}
} {}
-set ENTRY_LEN 1100
+set ENTRY_LEN 3000
set delete_orders [list]
lappend delete_orders {1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20}