From: dan Date: Thu, 12 Aug 2010 16:36:34 +0000 (+0000) Subject: If an error occurs in PagerSetPagesize(), set the output variable to the unmodified... X-Git-Tag: version-3.7.2~45 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1879b088bd447dc8fcb50a63dba84e4d462e44f9;p=thirdparty%2Fsqlite.git If an error occurs in PagerSetPagesize(), set the output variable to the unmodified page-size before returning. FossilOrigin-Name: 02def8f92588b8a45dff3976d1e7f9e3f0359b3b --- diff --git a/manifest b/manifest index 5a1ef56a4d..4f8410dfe4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\scoverage\stests\sfor\spager.c. -D 2010-08-12T11:25:48 +C If\san\serror\soccurs\sin\sPagerSetPagesize(),\sset\sthe\soutput\svariable\sto\sthe\sunmodified\spage-size\sbefore\sreturning. +D 2010-08-12T16:36:35 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in ec08dc838fd8110fe24c92e5130bcd91cbb1ff2e F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -156,7 +156,7 @@ F src/os_common.h a8f95b81eca8a1ab8593d23e94f8a35f35d4078f F src/os_os2.c 72d0b2e562952a2464308c4ce5f7913ac10bef3e F src/os_unix.c 11194cbcf6a57456e58022dc537ab8c3497d9bb9 F src/os_win.c 51cb62f76262d961ea4249489383d714501315a7 -F src/pager.c ff51a76c802c51dc5b36645a2d9202d2a9462897 +F src/pager.c 4e144b452545838fdb226755a16d109e0198f513 F src/pager.h 985a83d35b0cfa8e1c23ef91ed5cdb9bde73695a F src/parse.y 12b7ebd61ea54f0e1b1083ff69cc2c8ce9353d58 F src/pcache.c 1e9aa2dbc0845b52e1b51cc39753b6d1e041cb07 @@ -539,10 +539,10 @@ F test/notify3.test d60923e186e0900f4812a845fcdfd8eea096e33a F test/notnull.test cc7c78340328e6112a13c3e311a9ab3127114347 F test/null.test a8b09b8ed87852742343b33441a9240022108993 F test/openv2.test af02ed0a9cbc0d2a61b8f35171d4d117e588e4ec -F test/pager1.test 8b6e57d8cdf4c9f5c31ddcd048e81b026b225f0c +F test/pager1.test 6922029d71a8090169c71a67a141b6b94ad17d50 F test/pager2.test 0fbb6b6dc40ce1fecfe758c555a748ad2e9beaa3 F test/pager3.test 3856d9c80839be0668efee1b74811b1b7f7fc95f -F test/pagerfault.test c08abb54b591ba704c913af9278428fa3cce42d5 +F test/pagerfault.test f025fbe0cbab8f3aec6cc5676af60d7b488f868c F test/pagerfault2.test 1f79ea40d1133b2683a2f811b00f2399f7ec2401 F test/pageropt.test 8146bf448cf09e87bb1867c2217b921fb5857806 F test/pagesize.test 76aa9f23ecb0741a4ed9d2e16c5fa82671f28efb @@ -843,7 +843,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 45362437d491fbe0f033a67b398f8ba68cbf1b3b -R 38d53c0088d37a8bc9ce3834465ac451 +P 228c5b16af80c22e97d9d4deb351e0d3f4523f89 +R 639f1bec1c909cc7434c6e41850105f7 U dan -Z ebb8f906eccfa5df91e15cf73afafb56 +Z 132d1fc4e540d643bf195378105a77c8 diff --git a/manifest.uuid b/manifest.uuid index c33d8e70ba..a47beca736 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -228c5b16af80c22e97d9d4deb351e0d3f4523f89 \ No newline at end of file +02def8f92588b8a45dff3976d1e7f9e3f0359b3b \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 3a7afd17cf..0ad95b123d 100644 --- a/src/pager.c +++ b/src/pager.c @@ -3354,6 +3354,8 @@ void sqlite3PagerSetBusyhandler( ** then *pPageSize is set to the old, retained page size before returning. */ int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nReserve){ + int rc = SQLITE_OK; + /* It is not possible to do a full assert_pager_state() here, as this ** function may be called from within PagerOpen(), before the state ** of the Pager object is internally consistent. @@ -3372,14 +3374,16 @@ int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nReserve){ ){ char *pNew; /* New temp space */ i64 nByte = 0; + if( pPager->eState>PAGER_OPEN && isOpen(pPager->fd) ){ - int rc = sqlite3OsFileSize(pPager->fd, &nByte); - if( rc!=SQLITE_OK ) return rc; + rc = sqlite3OsFileSize(pPager->fd, &nByte); } - pNew = (char *)sqlite3PageMalloc(pageSize); - if( !pNew ){ - return SQLITE_NOMEM; - }else{ + if( rc==SQLITE_OK ){ + pNew = (char *)sqlite3PageMalloc(pageSize); + if( !pNew ) rc = SQLITE_NOMEM; + } + + if( rc==SQLITE_OK ){ pager_reset(pPager); pPager->dbSize = nByte/pageSize; pPager->pageSize = pageSize; @@ -3390,11 +3394,13 @@ int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nReserve){ } *pPageSize = pPager->pageSize; - if( nReserve<0 ) nReserve = pPager->nReserve; - assert( nReserve>=0 && nReserve<1000 ); - pPager->nReserve = (i16)nReserve; - pagerReportSize(pPager); - return SQLITE_OK; + if( rc==SQLITE_OK ){ + if( nReserve<0 ) nReserve = pPager->nReserve; + assert( nReserve>=0 && nReserve<1000 ); + pPager->nReserve = (i16)nReserve; + pagerReportSize(pPager); + } + return rc; } /* diff --git a/test/pager1.test b/test/pager1.test index e469caf3d2..4eab17cf09 100644 --- a/test/pager1.test +++ b/test/pager1.test @@ -2328,5 +2328,24 @@ do_multiclient_test tn { do_test pager1-28.$tn.20 { sql2 { COMMIT } } {} } +do_test pager1-29.1 { + faultsim_delete_and_reopen + execsql { + PRAGMA page_size = 1024; + PRAGMA auto_vacuum = full; + PRAGMA locking_mode=exclusive; + CREATE TABLE t1(a, b); + INSERT INTO t1 VALUES(1, 2); + } + file size test.db +} [expr 1024*3] +do_test pager1-29.2 { + execsql { + PRAGMA page_size = 4096; + VACUUM; + } + file size test.db +} [expr 4096*3] + finish_test diff --git a/test/pagerfault.test b/test/pagerfault.test index 521e76b727..be9266149e 100644 --- a/test/pagerfault.test +++ b/test/pagerfault.test @@ -28,8 +28,6 @@ proc a_string {n} { } db func a_string a_string -if 1 { - #------------------------------------------------------------------------- # Test fault-injection while rolling back a hot-journal file. # @@ -1125,8 +1123,6 @@ do_faultsim_test pagerfault-24 -prep { if {$ic != "ok"} { error "Integrity check: $ic" } } -} - proc lockrows {n} { if {$n==0} { return "" } db eval { SELECT * FROM t1 WHERE oid = $n } { @@ -1134,6 +1130,7 @@ proc lockrows {n} { } } + do_test pagerfault-25-pre1 { faultsim_delete_and_reopen db func a_string a_string @@ -1150,7 +1147,7 @@ do_test pagerfault-25-pre1 { } faultsim_save_and_close } {} -do_faultsim_test pagerfault-25 -faults full -prep { +do_faultsim_test pagerfault-25 -prep { faultsim_restore_and_reopen db func a_string a_string set ::channel [db incrblob -readonly t1 a 1] @@ -1164,9 +1161,40 @@ do_faultsim_test pagerfault-25 -faults full -prep { lockrows 30 } -test { catch { lockrows 30 } + catch { db eval COMMIT } close $::channel faultsim_test_result {0 {}} } +do_faultsim_test pagerfault-26 -prep { + faultsim_delete_and_reopen + execsql { + PRAGMA page_size = 1024; + PRAGMA journal_mode = truncate; + PRAGMA auto_vacuum = full; + PRAGMA locking_mode=exclusive; + CREATE TABLE t1(a, b); + INSERT INTO t1 VALUES(1, 2); + PRAGMA page_size = 4096; + } +} -body { + execsql { + VACUUM; + } +} -test { + faultsim_test_result {0 {}} + + set contents [db eval {SELECT * FROM t1}] + if {$contents != "1 2"} { error "Bad database contents ($contents)" } + + set sz [file size test.db] + if {$testrc!=0 && $sz!=1024*3 && $sz!=4096*3} { + error "Expected file size to be 3072 or 12288 bytes - actual size $sz bytes" + } + if {$testrc==0 && $sz!=4096*3} { + error "Expected file size to be 12288 bytes - actual size $sz bytes" + } +} + finish_test