From: danielk1977 Date: Wed, 4 Feb 2009 10:09:04 +0000 (+0000) Subject: Do not attempt to use the sub-journal file descriptor if it is not opened (as in... X-Git-Tag: version-3.6.15~498 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=651a52fac2c273ff263dab123595d74501251805;p=thirdparty%2Fsqlite.git Do not attempt to use the sub-journal file descriptor if it is not opened (as in journal_mode=off mode). Ticket #3636. (CVS 6252) FossilOrigin-Name: 20bd76055463c85f62a450e368f4bcf7d2215f94 --- diff --git a/manifest b/manifest index 3830cc8c8e..442b2baa04 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbug\sin\smalloc.test\scausing\sthe\sexclusive\spermutation\sto\sfail.\sChanges\sto\stest\scode\sonly.\s(CVS\s6251) -D 2009-02-04T08:17:57 +C Do\snot\sattempt\sto\suse\sthe\ssub-journal\sfile\sdescriptor\sif\sit\sis\snot\sopened\s(as\sin\sjournal_mode=off\smode).\sTicket\s#3636.\s(CVS\s6252) +D 2009-02-04T10:09:04 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in c7a5a30fb6852bd7839b1024e1661da8549878ee F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -143,7 +143,7 @@ F src/os_common.h 24525d8b7bce66c374dfc1810a6c9043f3359b60 F src/os_os2.c bed77dc26e3a95ce4a204936b9a1ca6fe612fcc5 F src/os_unix.c f0fce3042011d462b8ae633564a5668260bd3636 F src/os_win.c b83b57c24ec5bca07cb0eca6f620e796209e952f -F src/pager.c 1181eac160b1bc58108deb013624437ed695d15f +F src/pager.c ce4a0a0f10ebfd8b2f70a5edf5af30d233ab8ce7 F src/pager.h 0c9f3520c00d8a3b8e792ca56c9a11b6b02b4b0f F src/parse.y 4f4d16aee0d11f69fec2adb77dac88878043ed8d F src/pcache.c fcf7738c83c4d3e9d45836b2334c8a368cc41274 @@ -502,7 +502,7 @@ F test/rollback.test 1f70ab4301d8d105d41438a436cad1fc8897f5e5 F test/rowid.test 1c8fc43c60d273e6ea44dfb992db587f3164312c F test/rtree.test b85fd4f0861a40ca366ac195e363be2528dcfadf F test/safety.test b69e2b2dd5d52a3f78e216967086884bbc1a09c6 -F test/savepoint.test 19b4027d78e04dd6936498bd85a0a71a39b32e6e +F test/savepoint.test 4fc56354c7cd9c6be40d6f18e06ee90d92be0cd9 F test/savepoint2.test 18f6c75d5c133b93838019df8988b8cdf379d3de F test/savepoint3.test 5b76f93ffcb5c53bd6ec68e9d57d3b535936c45e F test/savepoint4.test fd8850063e3c40565545f5c291e7f79a30591670 @@ -700,7 +700,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e -P 5cef400023205b55152b91441acc78f9cd8d58a9 -R 8a047b5321fafe0b6dd980b42ce1d91f +P 72745bde90a9b4ffae1496f1668e4bb0678bd400 +R ba0b4ba1dc1a735a483dbc0860550e91 U danielk1977 -Z bae95d6f7b65009f90955deca10a86e3 +Z ed7dbdace1bc5288c3b2fdab4664488f diff --git a/manifest.uuid b/manifest.uuid index 1e4216dba1..b664fbcead 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -72745bde90a9b4ffae1496f1668e4bb0678bd400 \ No newline at end of file +20bd76055463c85f62a450e368f4bcf7d2215f94 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index e26a402687..eb794de578 100644 --- a/src/pager.c +++ b/src/pager.c @@ -18,7 +18,7 @@ ** file simultaneously, or one process from reading the database while ** another is writing. ** -** @(#) $Id: pager.c,v 1.564 2009/02/04 01:49:30 shane Exp $ +** @(#) $Id: pager.c,v 1.565 2009/02/04 10:09:04 danielk1977 Exp $ */ #ifndef SQLITE_OMIT_DISKIO #include "sqliteInt.h" @@ -2927,18 +2927,20 @@ static int pager_write_pagelist(PgHdr *pList){ ** bitvec. */ static int subjournalPage(PgHdr *pPg){ - int rc; - void *pData = pPg->pData; + int rc = SQLITE_OK; Pager *pPager = pPg->pPager; - i64 offset = pPager->nSubRec*(4+pPager->pageSize); - char *pData2 = CODEC2(pPager, pData, pPg->pgno, 7); - - PAGERTRACE(("STMT-JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno)); - - assert( pageInJournal(pPg) || pPg->pgno>pPager->dbOrigSize ); - rc = write32bits(pPager->sjfd, offset, pPg->pgno); - if( rc==SQLITE_OK ){ - rc = sqlite3OsWrite(pPager->sjfd, pData2, pPager->pageSize, offset+4); + if( isOpen(pPager->sjfd) ){ + void *pData = pPg->pData; + i64 offset = pPager->nSubRec*(4+pPager->pageSize); + char *pData2 = CODEC2(pPager, pData, pPg->pgno, 7); + + PAGERTRACE(("STMT-JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno)); + + assert( pageInJournal(pPg) || pPg->pgno>pPager->dbOrigSize ); + rc = write32bits(pPager->sjfd, offset, pPg->pgno); + if( rc==SQLITE_OK ){ + rc = sqlite3OsWrite(pPager->sjfd, pData2, pPager->pageSize, offset+4); + } } if( rc==SQLITE_OK ){ pPager->nSubRec++; diff --git a/test/savepoint.test b/test/savepoint.test index 342da5e549..0629b19da8 100644 --- a/test/savepoint.test +++ b/test/savepoint.test @@ -9,7 +9,7 @@ # #*********************************************************************** # -# $Id: savepoint.test,v 1.11 2009/01/11 00:18:38 drh Exp $ +# $Id: savepoint.test,v 1.12 2009/02/04 10:09:04 danielk1977 Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -814,4 +814,49 @@ do_test savepoint-12.4 { execsql { SAVEPOINT one } } {} +#------------------------------------------------------------------------- +# The following tests - savepoint-13.* - test the interaction of +# savepoints and "journal_mode = off". +# +do_test savepoint-13.1 { + db close + catch {file delete -force test.db} + sqlite3 db test.db + execsql { + BEGIN; + CREATE TABLE t1(a PRIMARY KEY, b); + INSERT INTO t1 VALUES(1, 2); + COMMIT; + PRAGMA journal_mode = off; + } +} {off} +do_test savepoint-13.2 { + execsql { + BEGIN; + INSERT INTO t1 VALUES(3, 4); + INSERT INTO t1 SELECT a+4,b+4 FROM t1; + COMMIT; + } +} {} +do_test savepoint-13.3 { + execsql { + BEGIN; + INSERT INTO t1 VALUES(9, 10); + SAVEPOINT s1; + INSERT INTO t1 VALUES(11, 12); + COMMIT; + } +} {} +do_test savepoint-13.4 { + execsql { + BEGIN; + INSERT INTO t1 VALUES(13, 14); + SAVEPOINT s1; + INSERT INTO t1 VALUES(15, 16); + ROLLBACK TO s1; + ROLLBACK; + SELECT * FROM t1; + } +} {1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16} + finish_test