]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Do not attempt to use the sub-journal file descriptor if it is not opened (as in...
authordanielk1977 <danielk1977@noemail.net>
Wed, 4 Feb 2009 10:09:04 +0000 (10:09 +0000)
committerdanielk1977 <danielk1977@noemail.net>
Wed, 4 Feb 2009 10:09:04 +0000 (10:09 +0000)
FossilOrigin-Name: 20bd76055463c85f62a450e368f4bcf7d2215f94

manifest
manifest.uuid
src/pager.c
test/savepoint.test

index 3830cc8c8e93755666dfc427027f2f9c607df680..442b2baa042b3a5b25db2caa80855976c38d5f4d 100644 (file)
--- 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
index 1e4216dba1e1696894528016a27d48adc7a300d7..b664fbceadfb07d826ff01db48ff2e88ac216b13 100644 (file)
@@ -1 +1 @@
-72745bde90a9b4ffae1496f1668e4bb0678bd400
\ No newline at end of file
+20bd76055463c85f62a450e368f4bcf7d2215f94
\ No newline at end of file
index e26a402687ebaf66d4a106dfcec31b320b27a1ca..eb794de5784124b340a0c8e915939418ee1df407 100644 (file)
@@ -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++;
index 342da5e549255c874a824673436d291c9db68973..0629b19da8a785ebae1282c1ca3b94dd11a61ad4 100644 (file)
@@ -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