]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Write the page-size into the first journal-header of each journal file. (CVS 4894)
authordanielk1977 <danielk1977@noemail.net>
Thu, 20 Mar 2008 04:45:49 +0000 (04:45 +0000)
committerdanielk1977 <danielk1977@noemail.net>
Thu, 20 Mar 2008 04:45:49 +0000 (04:45 +0000)
FossilOrigin-Name: 79f573cc7be89b3dd5540c45ef132b5cedc98e9b

manifest
manifest.uuid
src/pager.c
test/crash6.test [new file with mode: 0644]
test/quick.test

index 2d3b9900e89ffc232eb41337357ab1e97ad91d2d..9aaa3fc9046b75f7b1c6d5fe18201c03ca4d8a9e 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Make\sout-of-tree\sbuilds\swork\sas\sexpected\swhen\susing\sconfigure\sscript\s(CVS\s4893)
-D 2008-03-20T02:25:35
+C Write\sthe\spage-size\sinto\sthe\sfirst\sjournal-header\sof\seach\sjournal\sfile.\s(CVS\s4894)
+D 2008-03-20T04:45:49
 F Makefile.arm-wince-mingw32ce-gcc ac5f7b2cef0cd850d6f755ba6ee4ab961b1fadf7
 F Makefile.in cf434ce8ca902e69126ae0f94fc9f7dc7428a5fa
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -129,7 +129,7 @@ F src/os_unix.c fdec4e5ee5dd555a6ad4a69f38ab35f0788536b4
 F src/os_unix.h 5768d56d28240d3fe4537fac08cc85e4fb52279e
 F src/os_win.c 3a60bddd07ea6f8adb2314dd5996ac97b988f403
 F src/os_win.h 41a946bea10f61c158ce8645e7646b29d44f122b
-F src/pager.c ed2fc0ff7297001d17e299f976e9167f265ad2a6
+F src/pager.c d3448e060afc840be75b09c83501e5f8c13bac54
 F src/pager.h 8174615ffd14ccc2cad2b081b919a398fa95e3f9
 F src/parse.y 00f2698c8ae84f315be5e3f10b63c94f531fdd6d
 F src/pragma.c 09128fe3e2b5108d322a66b19a6f2974dac64479
@@ -254,6 +254,7 @@ F test/crash2.test 26d7a4c5520201e5de2c696ea51ab946b59dc0e9
 F test/crash3.test 0b09687ae1a3ccbcefdfaeb4b963e26e36255d76
 F test/crash4.test 02ff4f15c149ca1e88a5c299b4896c84d9450c3b
 F test/crash5.test c7ddcf7ca83abc19901b977732144234ac72a938
+F test/crash6.test 873d851c5ba2a46e0f9974c54e1d4a77d9a587d5
 F test/crashtest1.c 09c1c7d728ccf4feb9e481671e29dda5669bbcc2
 F test/createtab.test 199cf68f44e5d9e87a0b8afc7130fdeb4def3272
 F test/date.test 8db95a0ba2c8f4c8762ce66859a036c51959a6be
@@ -419,7 +420,7 @@ F test/pragma2.test 5364893491b9231dd170e3459bfc2e2342658b47
 F test/printf.test c3405535b418d454e8a52196a0fc592ec9eec58d
 F test/progress.test 5b075c3c790c7b2a61419bc199db87aaf48b8301 x
 F test/ptrchng.test 83150cb7b513e33cce90fdc68f4b1817551857c0
-F test/quick.test 771a6b3a88fdd0e7e813ce013ceda29037bc9462
+F test/quick.test 3626d353162d0cfbe0959a73c5f9cf171c126091
 F test/quote.test 215897dbe8de1a6f701265836d6601cc6ed103e6
 F test/rdonly.test b34db316525440d3b42c32e83942c02c37d28ef0
 F test/reindex.test 38b138abe36bf9a08c791ed44d9f76cd6b97b78b
@@ -624,7 +625,7 @@ F www/tclsqlite.tcl 8be95ee6dba05eabcd27a9d91331c803f2ce2130
 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
 F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
 F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5
-P bee38c2dda50592fef5fedab01311d5486240b95
-R 04225780a6551fd57e8d1ce57e5e35c1
-U mlcreech
-Z fbdd87a89edb04e0bf69569a65fa198b
+P e2d05ea3c3e4a11bc1c0cc4c4403a445b9c2b64d
+R d9620fbfa7ae750a021d54c765dbeee0
+U danielk1977
+Z 293afa007eb6b6cbc79715bcc09819d5
index 1c13b7a8f7b1d277a848e8bbe3a8c1dca1e100e0..1d04a6ca074dab67666593a31fed0b9115cdce3e 100644 (file)
@@ -1 +1 @@
-e2d05ea3c3e4a11bc1c0cc4c4403a445b9c2b64d
\ No newline at end of file
+79f573cc7be89b3dd5540c45ef132b5cedc98e9b
\ No newline at end of file
index f9350673f3e1c7874bb98a7c79b44a809709f06d..5313404ccbb548d13ee564065a5c9090d36d36b6 100644 (file)
@@ -18,7 +18,7 @@
 ** file simultaneously, or one process from reading the database while
 ** another is writing.
 **
-** @(#) $Id: pager.c,v 1.418 2008/03/19 14:15:35 drh Exp $
+** @(#) $Id: pager.c,v 1.419 2008/03/20 04:45:49 danielk1977 Exp $
 */
 #ifndef SQLITE_OMIT_DISKIO
 #include "sqliteInt.h"
@@ -971,11 +971,12 @@ static void seekJournalHdr(Pager *pPager){
 ** - 4 bytes: Random number used for page hash.
 ** - 4 bytes: Initial database page count.
 ** - 4 bytes: Sector size used by the process that wrote this journal.
+** - 4 bytes: Database page size.
 ** 
-** Followed by (JOURNAL_HDR_SZ - 24) bytes of unused space.
+** Followed by (JOURNAL_HDR_SZ - 28) bytes of unused space.
 */
 static int writeJournalHdr(Pager *pPager){
-  char zHeader[sizeof(aJournalMagic)+16];
+  char zHeader[sizeof(aJournalMagic)+20];
   int rc;
 
   if( pPager->stmtHdrOff==0 ){
@@ -1023,6 +1024,10 @@ static int writeJournalHdr(Pager *pPager){
   put32bits(&zHeader[sizeof(aJournalMagic)+8], pPager->dbSize);
   /* The assumed sector size for this process */
   put32bits(&zHeader[sizeof(aJournalMagic)+12], pPager->sectorSize);
+  if( pPager->journalHdr==0 ){
+    /* The page size */
+    put32bits(&zHeader[sizeof(aJournalMagic)+16], pPager->pageSize);
+  }
   IOTRACE(("JHDR %p %lld %d\n", pPager, pPager->journalHdr, sizeof(zHeader)))
   rc = sqlite3OsWrite(pPager->jfd, zHeader, sizeof(zHeader),pPager->journalOff);
   pPager->journalOff += JOURNAL_HDR_SZ(pPager);
@@ -1062,6 +1067,7 @@ static int readJournalHdr(
   int rc;
   unsigned char aMagic[8]; /* A buffer to hold the magic header */
   i64 jrnlOff;
+  int iPageSize;
 
   seekJournalHdr(pPager);
   if( pPager->journalOff+JOURNAL_HDR_SZ(pPager) > journalSize ){
@@ -1086,6 +1092,17 @@ static int readJournalHdr(
   rc = read32bits(pPager->jfd, jrnlOff+8, pDbSize);
   if( rc ) return rc;
 
+  rc = read32bits(pPager->jfd, jrnlOff+16, (u32 *)&iPageSize);
+  if( rc==SQLITE_OK 
+   && iPageSize>=512 
+   && iPageSize<=SQLITE_MAX_PAGE_SIZE 
+   && ((iPageSize-1)&iPageSize)==0 
+  ){
+    u16 pagesize = iPageSize;
+    rc = sqlite3PagerSetPagesize(pPager, &pagesize);
+  }
+  if( rc ) return rc;
+
   /* Update the assumed sector-size to match the value used by 
   ** the process that created this journal. If this journal was
   ** created by a process other than this one, then this routine
diff --git a/test/crash6.test b/test/crash6.test
new file mode 100644 (file)
index 0000000..1ebad58
--- /dev/null
@@ -0,0 +1,115 @@
+# 2001 September 15
+#
+# The author disclaims copyright to this source code.  In place of
+# a legal notice, here is a blessing:
+#
+#    May you do good and not evil.
+#    May you find forgiveness for yourself and forgive others.
+#    May you share freely, never taking more than you give.
+#
+#***********************************************************************
+# This file tests that rollback journals for databases that use a 
+# page-size other than the default page-size can be rolled back Ok.
+#
+# $Id: crash6.test,v 1.1 2008/03/20 04:45:49 danielk1977 Exp $
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+
+ifcapable !crashtest {
+  finish_test
+  return
+}
+
+for {set ii 0} {$ii < 10} {incr ii} {
+  catch {db close}
+  file delete -force test.db test.db-journal
+  crashsql -delay 2 -file test.db {
+    PRAGMA auto_vacuum=OFF;
+    PRAGMA page_size=4096;
+    BEGIN;
+    CREATE TABLE abc AS SELECT 1 AS a, 2 AS b, 3 AS c;
+    COMMIT;
+    BEGIN;
+    CREATE TABLE def AS SELECT 1 AS d, 2 AS e, 3 AS f;
+    COMMIT;
+  }
+  sqlite3 db test.db
+  integrity_check crash6-1.$ii
+}
+
+for {set ii 0} {$ii < 10} {incr ii} {
+  catch {db close}
+  file delete -force test.db test.db-journal
+  sqlite3 db test.db
+  execsql {
+    PRAGMA auto_vacuum=OFF;
+    PRAGMA page_size=2048;
+    BEGIN;
+    CREATE TABLE abc AS SELECT 1 AS a, 2 AS b, 3 AS c;
+    COMMIT;
+  }
+  db close
+  crashsql -delay 1 -file test.db {
+    INSERT INTO abc VALUES(5, 6, 7);
+  }
+  sqlite3 db test.db
+  integrity_check crash6-2.$ii
+}
+
+proc signature {} {
+  return [db eval {SELECT count(*), md5sum(a), md5sum(b), md5sum(c) FROM abc}]
+}
+
+# Test case for crashing during database sync with page-size values 
+# from 1024 to 8192.
+#
+for {set ii 0} {$ii < 30} {incr ii} {
+  db close
+  file delete -force test.db
+  sqlite3 db test.db
+
+  set pagesize [expr 1024 << ($ii % 4)]
+  do_test crash6-3.$ii.0 {
+    execsql "pragma page_size = $pagesize"
+    execsql "pragma page_size"
+  } $pagesize
+
+  do_test crash6-3.$ii.1 {
+  
+    execsql BEGIN
+    execsql {CREATE TABLE abc(a, b, c)}
+    for {set n 0} {$n < 1000} {incr n} {
+      execsql "INSERT INTO abc VALUES($n, [expr 2*$n], [expr 3*$n])"
+    }
+    execsql {
+      INSERT INTO abc SELECT * FROM abc;
+      INSERT INTO abc SELECT * FROM abc;
+      INSERT INTO abc SELECT * FROM abc;
+      INSERT INTO abc SELECT * FROM abc;
+      INSERT INTO abc SELECT * FROM abc;
+    }
+    execsql COMMIT
+    expr ([file size test.db] / 1024) > 450
+  } {1}
+
+  set sig [signature]
+  db close
+
+  do_test crash6-3.$ii.2 {
+     crashsql -file test.db "
+       BEGIN;
+       SELECT random() FROM abc LIMIT $ii;
+       INSERT INTO abc SELECT randstr(10,10), 0, 0 FROM abc WHERE random()%2==0;
+       DELETE FROM abc WHERE random()%2!=0;
+       COMMIT;
+     "
+  } {1 {child process exited abnormally}}
+
+  do_test crash6-3.$ii.3 {
+    sqlite3 db test.db
+    signature
+  } $sig
+} 
+
+finish_test
index 7c4f371d06fffd436b87b2dcbedcefbdb9394473..5f8937a3dce363bf84b82389b45411849f12bc1b 100644 (file)
@@ -6,7 +6,7 @@
 #***********************************************************************
 # This file runs all tests.
 #
-# $Id: quick.test,v 1.69 2008/01/16 18:20:42 danielk1977 Exp $
+# $Id: quick.test,v 1.70 2008/03/20 04:45:49 danielk1977 Exp $
 
 proc lshift {lvar} {
   upvar $lvar l
@@ -49,6 +49,7 @@ set EXCLUDE {
   crash2.test
   crash3.test
   crash4.test
+  crash6.test
   exclusive3.test
   fts3.test
   fuzz.test