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 20 set testdir [file dirname $argv0] 21 source $testdir/tester.tcl 22 23 # Use the alternative pcache and rig it to call pagerStress() 24 # very frequently. 25 # 26 db close 27 sqlite3_shutdown 28 sqlite3_config_alt_pcache 1 100 0 1 29 30 # Open two database connections to database "test.db". 31 # 32 proc 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 # 45 do_test tkt2565-1.0 { 46 reopen_database 47 execsql { CREATE TABLE A(Id INTEGER, Name TEXT) } 48 } {} 49 50 for {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 # 80 do_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 # 87 sqlite3_shutdown 88 sqlite3_config_alt_pcache 0 89 sqlite3_initialize 90 autoinstall_test_functions 91 92 finish_test 93