Make VACUUM work when the page size is different than the default 1024.

Ticket #890. (CVS 1939)

FossilOrigin-Name: fa82becae7e41c47a6387061932f692c6f9f472e
This commit is contained in:
drh 2004-09-05 00:33:43 +00:00
parent ad3e010547
commit f2a611c988
5 changed files with 135 additions and 27 deletions

View File

@ -1,5 +1,5 @@
C Fix\sa\scomment.\s(CVS\s1938) C Make\sVACUUM\swork\swhen\sthe\spage\ssize\sis\sdifferent\sthan\sthe\sdefault\s1024.\nTicket\s#890.\s(CVS\s1939)
D 2004-09-03T23:32:19 D 2004-09-05T00:33:43
F Makefile.in 65a7c43fcaf9a710d62f120b11b6e435eeb4a450 F Makefile.in 65a7c43fcaf9a710d62f120b11b6e435eeb4a450
F Makefile.linux-gcc a9e5a0d309fa7c38e7c14d3ecf7690879d3a5457 F Makefile.linux-gcc a9e5a0d309fa7c38e7c14d3ecf7690879d3a5457
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
@ -28,7 +28,7 @@ F sqlite3.def 84215604aa7b547d75e0f7b437966e7ad18fa8b2
F sqlite3.pc.in 985b9bf34192a549d7d370e0f0b6b34a4f61369a F sqlite3.pc.in 985b9bf34192a549d7d370e0f0b6b34a4f61369a
F src/attach.c 0bd4f11da6999665da30625665a4096ba7898de6 F src/attach.c 0bd4f11da6999665da30625665a4096ba7898de6
F src/auth.c 60db23b98bb94c8b0178180faaf49dc116674217 F src/auth.c 60db23b98bb94c8b0178180faaf49dc116674217
F src/btree.c fd5e339c83459ea42fb055f0e59c0a682b0da422 F src/btree.c fe763fde639793ef2010d5388d0d135ecc02b4eb
F src/btree.h 94dfec0a1722d33359b23e7e310f2b64ffedf029 F src/btree.h 94dfec0a1722d33359b23e7e310f2b64ffedf029
F src/build.c 35275654d9c5ce6c1c0c78e391f85e6915a8a66b F src/build.c 35275654d9c5ce6c1c0c78e391f85e6915a8a66b
F src/date.c edff4aa851eeca8abbc737dc3933a2f0671156ce F src/date.c edff4aa851eeca8abbc737dc3933a2f0671156ce
@ -74,7 +74,7 @@ F src/trigger.c 40e10f4b219b55e56478bc17480ce77654300e8d
F src/update.c bbe126c67529bd699016af2d72bc4ceb8fd41527 F src/update.c bbe126c67529bd699016af2d72bc4ceb8fd41527
F src/utf.c 328890099db492dda5620ee5f924e244c6e57ff7 F src/utf.c 328890099db492dda5620ee5f924e244c6e57ff7
F src/util.c d5aaf211543fb6e285654fada50252c857ac78aa F src/util.c d5aaf211543fb6e285654fada50252c857ac78aa
F src/vacuum.c 47bf6837d39f5849b8eda7d037d3e21a26f736bc F src/vacuum.c c5f11bf25e49479940133d1bb882ad2a5d6fa021
F src/vdbe.c 45f659497b479f001c2f4e8251474aba3975b9f8 F src/vdbe.c 45f659497b479f001c2f4e8251474aba3975b9f8
F src/vdbe.h e081c72cd0f7c19d49b1927460aeefcf0fbc85ac F src/vdbe.h e081c72cd0f7c19d49b1927460aeefcf0fbc85ac
F src/vdbeInt.h f8df57a9dc272967991f806e612628e0aa57e705 F src/vdbeInt.h f8df57a9dc272967991f806e612628e0aa57e705
@ -151,7 +151,7 @@ F test/null.test 642428b6a5408cc5b954b49e1b6e5025e4458b2b
F test/pager.test 059cc5c58d3b5a851343dff8c56cf7286425d03a F test/pager.test 059cc5c58d3b5a851343dff8c56cf7286425d03a
F test/pager2.test 55469c7c1c1a54d6b32d7b3cc99001e90101a1ce F test/pager2.test 55469c7c1c1a54d6b32d7b3cc99001e90101a1ce
F test/pager3.test 16f546293bb751b8151dc17df613fca938bbec8b F test/pager3.test 16f546293bb751b8151dc17df613fca938bbec8b
F test/pagesize.test ada866e3d8bad7ec252d5131e2fd4d892b8fef8d F test/pagesize.test f8b46ec46b9fe9f708a8d757dda232588dfb7217
F test/pragma.test 66a66b7f3b273b93325c9a5794acb418f52fdcbf F test/pragma.test 66a66b7f3b273b93325c9a5794acb418f52fdcbf
F test/printf.test 5a30fb0d736148fca64cb1b7ed0390be7414e024 F test/printf.test 5a30fb0d736148fca64cb1b7ed0390be7414e024
F test/progress.test 76c722f090b1ccb575e7e4e203a71608c5763beb x F test/progress.test 76c722f090b1ccb575e7e4e203a71608c5763beb x
@ -248,7 +248,7 @@ F www/tclsqlite.tcl 560ecd6a916b320e59f2917317398f3d59b7cc25
F www/vdbe.tcl 59288db1ac5c0616296b26dce071c36cb611dfe9 F www/vdbe.tcl 59288db1ac5c0616296b26dce071c36cb611dfe9
F www/version3.tcl 092a01f5ef430d2c4acc0ae558d74c4bb89638a0 F www/version3.tcl 092a01f5ef430d2c4acc0ae558d74c4bb89638a0
F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4 F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4
P 4595292f936bdbec10734f42682824e91ff71d11 P af44ddeea110576bf9c475b5e6e3540ee50c5edf
R a6a2c4ff901213b63bfaa0048bce9198 R afb470c685b393383d09d5ee609f260e
U drh U drh
Z c9eae4290234a644b3110522f8908fc1 Z 341c14103181636b02bfc0ae91fe7a33

View File

@ -1 +1 @@
af44ddeea110576bf9c475b5e6e3540ee50c5edf fa82becae7e41c47a6387061932f692c6f9f472e

View File

@ -9,7 +9,7 @@
** May you share freely, never taking more than you give. ** May you share freely, never taking more than you give.
** **
************************************************************************* *************************************************************************
** $Id: btree.c,v 1.187 2004/09/03 23:32:19 drh Exp $ ** $Id: btree.c,v 1.188 2004/09/05 00:33:43 drh Exp $
** **
** This file implements a external (disk-based) database using BTrees. ** This file implements a external (disk-based) database using BTrees.
** For a detailed discussion of BTrees, refer to ** For a detailed discussion of BTrees, refer to
@ -1145,7 +1145,7 @@ int sqlite3BtreeSetPageSize(Btree *pBt, int pageSize, int nReserve){
if( nReserve<0 ){ if( nReserve<0 ){
nReserve = pBt->pageSize - pBt->usableSize; nReserve = pBt->pageSize - pBt->usableSize;
} }
if( pageSize>512 && pageSize<SQLITE_MAX_PAGE_SIZE ){ if( pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE ){
pBt->pageSize = pageSize; pBt->pageSize = pageSize;
sqlite3pager_set_pagesize(pBt->pPager, pageSize); sqlite3pager_set_pagesize(pBt->pPager, pageSize);
} }
@ -1225,7 +1225,6 @@ static int lockBtree(Btree *pBt){
} }
assert( pBt->maxLeaf + 23 <= MX_CELL_SIZE(pBt) ); assert( pBt->maxLeaf + 23 <= MX_CELL_SIZE(pBt) );
pBt->pPage1 = pPage1; pBt->pPage1 = pPage1;
pBt->pageSizeFixed = 1;
return SQLITE_OK; return SQLITE_OK;
page1_init_failed: page1_init_failed:
@ -1283,6 +1282,7 @@ static int newDatabase(Btree *pBt){
data[23] = pBt->minLeafFrac; data[23] = pBt->minLeafFrac;
memset(&data[24], 0, 100-24); memset(&data[24], 0, 100-24);
zeroPage(pP1, PTF_INTKEY|PTF_LEAF|PTF_LEAFDATA ); zeroPage(pP1, PTF_INTKEY|PTF_LEAF|PTF_LEAFDATA );
pBt->pageSizeFixed = 1;
return SQLITE_OK; return SQLITE_OK;
} }

View File

@ -14,7 +14,7 @@
** Most of the code in this file may be omitted by defining the ** Most of the code in this file may be omitted by defining the
** SQLITE_OMIT_VACUUM macro. ** SQLITE_OMIT_VACUUM macro.
** **
** $Id: vacuum.c,v 1.29 2004/09/02 15:27:42 drh Exp $ ** $Id: vacuum.c,v 1.30 2004/09/05 00:33:43 drh Exp $
*/ */
#include "sqliteInt.h" #include "sqliteInt.h"
#include "os.h" #include "os.h"
@ -98,6 +98,7 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite *db){
int nFilename; /* number of characters in zFilename[] */ int nFilename; /* number of characters in zFilename[] */
char *zTemp = 0; /* a temporary file in same directory as zFilename */ char *zTemp = 0; /* a temporary file in same directory as zFilename */
int i; /* Loop counter */ int i; /* Loop counter */
Btree *pMain; /* The database being vacuumed */
Btree *pTemp; Btree *pTemp;
char *zSql = 0; char *zSql = 0;
@ -111,7 +112,8 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite *db){
/* Get the full pathname of the database file and create a /* Get the full pathname of the database file and create a
** temporary filename in the same directory as the original file. ** temporary filename in the same directory as the original file.
*/ */
zFilename = sqlite3BtreeGetFilename(db->aDb[0].pBt); pMain = db->aDb[0].pBt;
zFilename = sqlite3BtreeGetFilename(pMain);
assert( zFilename ); assert( zFilename );
if( zFilename[0]=='\0' ){ if( zFilename[0]=='\0' ){
/* The in-memory database. Do nothing. Return directly to avoid causing /* The in-memory database. Do nothing. Return directly to avoid causing
@ -150,7 +152,11 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite *db){
sqliteFree(zSql); sqliteFree(zSql);
zSql = 0; zSql = 0;
if( rc!=SQLITE_OK ) goto end_of_vacuum; if( rc!=SQLITE_OK ) goto end_of_vacuum;
execSql(db, "PRAGMA vacuum_db.synchronous = off;"); assert( strcmp(db->aDb[db->nDb-1].zName,"vacuum_db")==0 );
pTemp = db->aDb[db->nDb-1].pBt;
sqlite3BtreeSetPageSize(pTemp, sqlite3BtreeGetPageSize(pMain), 0);
assert( sqlite3BtreeGetPageSize(pTemp)==sqlite3BtreeGetPageSize(pMain) );
execSql(db, "PRAGMA vacuum_db.synchronous=OFF");
/* Begin a transaction */ /* Begin a transaction */
rc = execSql(db, "BEGIN;"); rc = execSql(db, "BEGIN;");
@ -206,9 +212,7 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite *db){
** opened for writing. This way, the SQL transaction used to create the ** opened for writing. This way, the SQL transaction used to create the
** temporary database never needs to be committed. ** temporary database never needs to be committed.
*/ */
pTemp = db->aDb[db->nDb-1].pBt;
if( sqlite3BtreeIsInTrans(pTemp) ){ if( sqlite3BtreeIsInTrans(pTemp) ){
Btree *pMain = db->aDb[0].pBt;
u32 meta; u32 meta;
assert( 0==sqlite3BtreeIsInTrans(pMain) ); assert( 0==sqlite3BtreeIsInTrans(pMain) );

View File

@ -11,7 +11,7 @@
# This file implements regression tests for SQLite library. # This file implements regression tests for SQLite library.
# This file implements tests for the page_size PRAGMA. # This file implements tests for the page_size PRAGMA.
# #
# $Id: pagesize.test,v 1.2 2004/09/02 15:49:08 drh Exp $ # $Id: pagesize.test,v 1.3 2004/09/05 00:33:44 drh Exp $
set testdir [file dirname $argv0] set testdir [file dirname $argv0]
@ -30,27 +30,131 @@ do_test pagesize-1.3 {
PRAGMA page_size; PRAGMA page_size;
} }
} 1024 } 1024
do_test pagesize-1.4 { do_test pagesize-1.4 {
db close db close
file delete -force test.db file delete -force test.db
sqlite3 db test.db sqlite3 db test.db
execsql { execsql {
PRAGMA page_size=2048; PRAGMA page_size=511;
CREATE TABLE t1(a);
PRAGMA page_size; PRAGMA page_size;
} }
} 2048 } 1024
do_test pagesize-1.5 { do_test pagesize-1.5 {
db close
sqlite3 db test.db
execsql { execsql {
PRAGMA page_size PRAGMA page_size=512;
PRAGMA page_size;
} }
} 2048 } 512
do_test pagesize-1.6 { do_test pagesize-1.6 {
file size test.db execsql {
} 4096 PRAGMA page_size=8192;
PRAGMA page_size;
}
} 8192
do_test pagesize-1.7 {
execsql {
PRAGMA page_size=65537;
PRAGMA page_size;
}
} 8192
foreach PGSZ {512 2000 2048 3000 4096} {
do_test pagesize-2.$PGSZ.1 {
db close
file delete -force test.db
sqlite3 db test.db
execsql "PRAGMA page_size=$PGSZ"
execsql {
CREATE TABLE t1(x);
PRAGMA page_size;
}
} $PGSZ
do_test pagesize-2.$PGSZ.2 {
db close
sqlite3 db test.db
execsql {
PRAGMA page_size
}
} $PGSZ
do_test pagesize-2.$PGSZ.3 {
file size test.db
} [expr {$PGSZ*2}]
do_test pagesize-2.$PGSZ.4 {
execsql {VACUUM}
} {}
integrity_check pagesize-2.$PGSZ.5
do_test pagesize-2.$PGSZ.6 {
db close
sqlite3 db test.db
execsql {PRAGMA page_size}
} $PGSZ
do_test pagesize-2.$PGSZ.7 {
execsql {
INSERT INTO t1 VALUES(randstr(10,9000));
INSERT INTO t1 VALUES(randstr(10,9000));
INSERT INTO t1 VALUES(randstr(10,9000));
BEGIN;
INSERT INTO t1 SELECT x||x FROM t1;
INSERT INTO t1 SELECT x||x FROM t1;
INSERT INTO t1 SELECT x||x FROM t1;
INSERT INTO t1 SELECT x||x FROM t1;
SELECT count(*) FROM t1;
}
} 48
do_test pagesize-2.$PGSZ.8 {
execsql {
ROLLBACK;
SELECT count(*) FROM t1;
}
} 3
integrity_check pagesize-2.$PGSZ.9
do_test pagesize-2.$PGSZ.10 {
db close
sqlite3 db test.db
execsql {PRAGMA page_size}
} $PGSZ
do_test pagesize-2.$PGSZ.11 {
execsql {
INSERT INTO t1 SELECT x||x FROM t1;
INSERT INTO t1 SELECT x||x FROM t1;
INSERT INTO t1 SELECT x||x FROM t1;
INSERT INTO t1 SELECT x||x FROM t1;
INSERT INTO t1 SELECT x||x FROM t1;
INSERT INTO t1 SELECT x||x FROM t1;
SELECT count(*) FROM t1;
}
} 192
do_test pagesize-2.$PGSZ.12 {
execsql {
BEGIN;
DELETE FROM t1 WHERE rowid%5!=0;
SELECT count(*) FROM t1;
}
} 38
do_test pagesize-2.$PGSZ.13 {
execsql {
ROLLBACK;
SELECT count(*) FROM t1;
}
} 192
integrity_check pagesize-2.$PGSZ.14
do_test pagesize-2.$PGSZ.15 {
execsql {
DELETE FROM t1 WHERE rowid%5!=0;
VACUUM;
SELECT count(*) FROM t1;
}
} 38
do_test pagesize-2.$PGSZ.16 {
execsql {
DROP TABLE t1;
VACUUM;
}
} {}
integrity_check pagesize-2.$PGSZ.17
}
finish_test finish_test