-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
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
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
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
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
-e2d05ea3c3e4a11bc1c0cc4c4403a445b9c2b64d
\ No newline at end of file
+79f573cc7be89b3dd5540c45ef132b5cedc98e9b
\ No newline at end of file
** 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"
** - 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 ){
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);
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 ){
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
--- /dev/null
+# 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
#***********************************************************************
# 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
crash2.test
crash3.test
crash4.test
+ crash6.test
exclusive3.test
fts3.test
fuzz.test