1# 2009 January 8 2# 3# The author disclaims copyright to this source code. In place of 4# a legal notice, here is a blessing: 5# 6# May you do good and not evil. 7# May you find forgiveness for yourself and forgive others. 8# May you share freely, never taking more than you give. 9# 10#*********************************************************************** 11# 12# This script attempts to reproduce the circumstances of ticket #2565. 13# 14# More specifically, this script attempts to generate rollback journals 15# that contain headers with nRec==0 that are followed by additional 16# valid headers. 17# 18# $Id: tkt2565.test,v 1.2 2009/04/09 01:23:49 drh Exp $ 19 20set testdir [file dirname $argv0] 21source $testdir/tester.tcl 22 23# Use the alternative pcache and rig it to call pagerStress() 24# very frequently. 25# 26db close 27sqlite3_shutdown 28sqlite3_config_alt_pcache 1 100 0 1 29 30# Open two database connections to database "test.db". 31# 32proc reopen_database {} { 33 catch {db close} 34 sqlite3 db test.db 35 db cache size 0 36 execsql { 37 pragma page_size=512; 38 pragma auto_vacuum=2; 39 pragma cache_size=16; 40 } 41} 42 43# Open two database connections and create a single table in the db. 44# 45do_test tkt2565-1.0 { 46 reopen_database 47 execsql { CREATE TABLE A(Id INTEGER, Name TEXT) } 48} {} 49 50for {set iFail 1} {$iFail<200} {incr iFail} { 51 reopen_database 52 execsql { pragma locking_mode=exclusive } 53 set nRow [db one {SELECT count(*) FROM a}] 54 55 # Dirty (at least) one of the pages in the cache. 56 do_test tkt2565-1.$iFail.1 { 57 execsql { 58 BEGIN EXCLUSIVE; 59 INSERT INTO a VALUES(1, 'ABCDEFGHIJKLMNOP'); 60 } 61 } {} 62 63 # Now try to commit the transaction. Cause an IO error to occur 64 # within this operation, which moves the pager into the error state. 65 # 66 set ::sqlite_io_error_persist 1 67 set ::sqlite_io_error_pending $iFail 68 do_test tkt2565-1.$iFail.2 { 69 set rc [catchsql {COMMIT}] 70 list 71 } {} 72 set ::sqlite_io_error_persist 0 73 set ::sqlite_io_error_pending 0 74 if {!$::sqlite_io_error_hit} break 75 set ::sqlite_io_error_hit 0 76} 77 78# Make sure this test script doesn't leave any files open. 79# 80do_test tkt2565-1.X { 81 catch { db close } 82 set sqlite_open_file_count 83} 0 84 85# Restore the pcache configuration for subsequent tests. 86# 87sqlite3_shutdown 88sqlite3_config_alt_pcache 0 89sqlite3_initialize 90autoinstall_test_functions 91 92finish_test 93