blob: 8df0419c65abd7bbe2fd717bd164eadbaa64a88e [file] [log] [blame]
drh4fd18c42009-01-08 15:24:01 +00001# 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#
drhbb77b752009-04-09 01:23:49 +000018# $Id: tkt2565.test,v 1.2 2009/04/09 01:23:49 drh Exp $
drh4fd18c42009-01-08 15:24:01 +000019
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
drhbb77b752009-04-09 01:23:49 +000089sqlite3_initialize
90autoinstall_test_functions
drh4fd18c42009-01-08 15:24:01 +000091
92finish_test