From 06249db14107404066eaa0cf015da16b50b714c7 Mon Sep 17 00:00:00 2001 From: danielk1977 Date: Sat, 23 Aug 2008 16:17:55 +0000 Subject: [PATCH] Do not incorrectly detect corruption when an auto-vacuum database is converted to a non-auto-vacuum database within a vacuum. Ticket #3332. (CVS 5603) FossilOrigin-Name: cb869946d68f2abbd1322fababbe4aa74a4e08aa --- manifest | 20 +++++++++---------- manifest.uuid | 2 +- src/btree.c | 4 ++-- src/vacuum.c | 5 ++++- test/vacuum2.test | 36 +++++++++++++++++++++++++++++++++- test/vacuum3.test | 49 +++++++++++++++++++++++++++-------------------- 6 files changed, 80 insertions(+), 36 deletions(-) diff --git a/manifest b/manifest index 2f4deb2b54..7092a10367 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C quieting\scompiler\swarning\sabout\spointer/int\sconversion\ssize\smismatch\s(CVS\s5602) -D 2008-08-22T18:41:37 +C Do\snot\sincorrectly\sdetect\scorruption\swhen\san\sauto-vacuum\sdatabase\sis\sconverted\sto\sa\snon-auto-vacuum\sdatabase\swithin\sa\svacuum.\sTicket\s#3332.\s(CVS\s5603) +D 2008-08-23T16:17:56 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in 689e14735f862a5553bceef206d8c13e29504e44 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -96,7 +96,7 @@ F src/attach.c db3f4a60538733c1e4dcb9d0217a6e0d6ccd615b F src/auth.c c8b2ab5c8bad4bd90ed7c294694f48269162c627 F src/bitvec.c 95c86bd18d8fedf0533f5af196192546e10a7e7d F src/btmutex.c 709cad2cdca0afd013f0f612363810e53f59ec53 -F src/btree.c 4212dce1c446b8aa8bf2be7d39c6d93d169ace0b +F src/btree.c 9253ac92b434a5a556cb65cf67b9c101205bfdf2 F src/btree.h 6371c5e599fab391a150c96afbc10062b276d107 F src/btreeInt.h ab18c7b4980314e9e4b402e5dcde09f3c2545576 F src/build.c 160c71acca8f643f436ed6c1ee2f684c88df4dfe @@ -185,7 +185,7 @@ F src/trigger.c 649940b5bf5838a33721fb72372e7c9d1faf56a9 F src/update.c f2cf6f00d542956bd49ba4b9815c2900d9225bf2 F src/utf.c c63e6f69082f85c19ab88d62dedaf91d71ac1a50 F src/util.c afe659ccc05d1f8af9e8631dabfec3ee3a7144af -F src/vacuum.c ef342828002debc97514617af3424aea8ef8522c +F src/vacuum.c a5b10ae21ffbb73c79b7fa17e2ff40dc8ff33440 F src/vdbe.c adcc179a31d71466b7b4f20ab77555e1e137bfe5 F src/vdbe.h 41c99aaad9167c1b5431993db446de74b2f71fc3 F src/vdbeInt.h b48c74d86a9fb62b707a3186ccca76bb32f1c6be @@ -572,8 +572,8 @@ F test/unique.test 0253c4227a5dc533e312202ce21ecfad18058d18 F test/update.test 8bc86fd7ef1a00014f76dc6a6a7c974df4aef172 F test/utf16align.test 7360e84472095518c56746f76b1f9d4dce99fb4d F test/vacuum.test 0bc75ee74ab9c69322d6563aa2287375697e630b -F test/vacuum2.test d3b9691541fe6ed5c711f547a1c7d70e9760ac6f -F test/vacuum3.test 306b65554980d8d4a3b6eeb7b3ccd11c65ebb540 +F test/vacuum2.test e7c5f5bf5e1f2266ca668d420393820cf501fdfc +F test/vacuum3.test 54a7152f004fb1647702c2f7be9a7e7abfafd70e F test/varint.test ab7b110089a08b9926ed7390e7e97bdefeb74102 F test/veryquick.test e265401afefa994cdf2fe4b6f286b1e87c2f9b9d F test/view.test 7fba28a47f76541f6aea9542f62f3412e3519bad @@ -623,7 +623,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 1dbced29de5f59ba2ebf877edcadf171540374d1 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e -P 6de9c084fc533fbb22af6a4cd3e4e9a461b13876 -R ef30e25c72527afbee7daff10fc9c47e -U aswift -Z e2eb11c438fcd3621bc862059e4c76f6 +P f8a70501c234545b3030144ac6bcbfaa0d2b0069 +R aef83607149c9c342bce05a1b1fbac8b +U danielk1977 +Z 1527ca57bd02efd33a253e2eb002c3ed diff --git a/manifest.uuid b/manifest.uuid index 75a1094022..07d14badb7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f8a70501c234545b3030144ac6bcbfaa0d2b0069 \ No newline at end of file +cb869946d68f2abbd1322fababbe4aa74a4e08aa \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index a2da681258..bbcd0822b9 100644 --- a/src/btree.c +++ b/src/btree.c @@ -9,7 +9,7 @@ ** May you share freely, never taking more than you give. ** ************************************************************************* -** $Id: btree.c,v 1.501 2008/08/22 17:34:45 drh Exp $ +** $Id: btree.c,v 1.502 2008/08/23 16:17:56 danielk1977 Exp $ ** ** This file implements a external (disk-based) database using BTrees. ** See the header comment on "btreeInt.h" for additional information. @@ -7145,7 +7145,7 @@ static int btreeCopyFile(Btree *pTo, Btree *pFrom){ rc = sqlite3PagerGet(pBtFrom->pPager, iFrom, &pFromPage); if( rc==SQLITE_OK ){ char *zFrom = sqlite3PagerGetData(pFromPage); - rc = sqlite3OsWrite(pFile, zFrom, nFromPageSize, iOff); + rc = sqlite3OsWrite(pFile, zFrom, nFromPageSize, iOff); sqlite3PagerUnref(pFromPage); } } diff --git a/src/vacuum.c b/src/vacuum.c index 45bc61e214..e2fb42e84d 100644 --- a/src/vacuum.c +++ b/src/vacuum.c @@ -14,7 +14,7 @@ ** Most of the code in this file may be omitted by defining the ** SQLITE_OMIT_VACUUM macro. ** -** $Id: vacuum.c,v 1.81 2008/07/08 19:34:07 drh Exp $ +** $Id: vacuum.c,v 1.82 2008/08/23 16:17:56 danielk1977 Exp $ */ #include "sqliteInt.h" #include "vdbeInt.h" @@ -258,6 +258,9 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){ if( rc!=SQLITE_OK ) goto end_of_vacuum; rc = sqlite3BtreeCommit(pTemp); if( rc!=SQLITE_OK ) goto end_of_vacuum; +#ifndef SQLITE_OMIT_AUTOVACUUM + sqlite3BtreeSetAutoVacuum(pMain, sqlite3BtreeGetAutoVacuum(pTemp)); +#endif rc = sqlite3BtreeCommit(pMain); } diff --git a/test/vacuum2.test b/test/vacuum2.test index 5c46d0c899..4e51c1e703 100644 --- a/test/vacuum2.test +++ b/test/vacuum2.test @@ -11,7 +11,7 @@ # This file implements regression tests for SQLite library. The # focus of this file is testing the VACUUM statement. # -# $Id: vacuum2.test,v 1.7 2008/01/17 02:36:28 drh Exp $ +# $Id: vacuum2.test,v 1.8 2008/08/23 16:17:56 danielk1977 Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -125,4 +125,38 @@ do_test vacuum2-3.17 { db2 close +ifcapable autovacuum { + do_test vacuum2-4.1 { + db close + file delete -force test.db + sqlite3 db test.db + execsql { + pragma auto_vacuum=1; + create table t(a, b); + insert into t values(1, 2); + insert into t values(1, 2); + pragma auto_vacuum=0; + vacuum; + pragma auto_vacuum; + } + } {0} + do_test vacuum2-4.2 { + execsql { + pragma auto_vacuum=1; + vacuum; + pragma auto_vacuum; + } + } {1} + do_test vacuum2-4.3 { + execsql { + pragma integrity_check + } + } {ok} + do_test vacuum2-4.4 { + execsql { + pragma auto_vacuum; + } + } {1} +} + finish_test diff --git a/test/vacuum3.test b/test/vacuum3.test index fb97a601cb..eac3f0b5d7 100644 --- a/test/vacuum3.test +++ b/test/vacuum3.test @@ -12,7 +12,7 @@ # focus of this file is changing the database page size using a # VACUUM statement. # -# $Id: vacuum3.test,v 1.7 2008/08/02 03:50:40 drh Exp $ +# $Id: vacuum3.test,v 1.8 2008/08/23 16:17:56 danielk1977 Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -237,8 +237,7 @@ do_test vacuum3-4.6 { db2 close -do_ioerr_test vacuum3-ioerr-1 -cksum true -sqlprep { - PRAGMA page_size = 1024; +set create_database_sql { BEGIN; CREATE TABLE t1(a, b, c); INSERT INTO t1 VALUES(1, randstr(50,50), randstr(50,50)); @@ -254,32 +253,40 @@ do_ioerr_test vacuum3-ioerr-1 -cksum true -sqlprep { CREATE TABLE t3 AS SELECT * FROM t1; COMMIT; DROP TABLE t2; -} -sqlbody { +} + +do_ioerr_test vacuum3-ioerr-1 -cksum true -sqlprep " + PRAGMA page_size = 1024; + $create_database_sql +" -sqlbody { PRAGMA page_size = 4096; VACUUM; } -do_ioerr_test vacuum3-ioerr-2 -cksum true -sqlprep { +do_ioerr_test vacuum3-ioerr-2 -cksum true -sqlprep " PRAGMA page_size = 2048; - BEGIN; - CREATE TABLE t1(a, b, c); - INSERT INTO t1 VALUES(1, randstr(50,50), randstr(50,50)); - INSERT INTO t1 SELECT a+2, b||'-'||rowid, c||'-'||rowid FROM t1; - INSERT INTO t1 SELECT a+4, b||'-'||rowid, c||'-'||rowid FROM t1; - INSERT INTO t1 SELECT a+8, b||'-'||rowid, c||'-'||rowid FROM t1; - INSERT INTO t1 SELECT a+16, b||'-'||rowid, c||'-'||rowid FROM t1; - INSERT INTO t1 SELECT a+32, b||'-'||rowid, c||'-'||rowid FROM t1; - INSERT INTO t1 SELECT a+64, b||'-'||rowid, c||'-'||rowid FROM t1; - INSERT INTO t1 SELECT a+128, b||'-'||rowid, c||'-'||rowid FROM t1; - INSERT INTO t1 VALUES(1, randstr(600,600), randstr(600,600)); - CREATE TABLE t2 AS SELECT * FROM t1; - CREATE TABLE t3 AS SELECT * FROM t1; - COMMIT; - DROP TABLE t2; -} -sqlbody { + $create_database_sql +" -sqlbody { PRAGMA page_size = 512; VACUUM; } +ifcapable autovacuum { + do_ioerr_test vacuum3-ioerr-3 -cksum true -sqlprep " + PRAGMA auto_vacuum = 0; + $create_database_sql + " -sqlbody { + PRAGMA auto_vacuum = 1; + VACUUM; + } + do_ioerr_test vacuum3-ioerr-4 -cksum true -sqlprep " + PRAGMA auto_vacuum = 1; + $create_database_sql + " -sqlbody { + PRAGMA auto_vacuum = 0; + VACUUM; + } +} + source $testdir/malloc_common.tcl if {$MEMDEBUG} { do_malloc_test vacuum3-malloc-1 -sqlprep {