Annotation of embedaddon/sqlite3/test/tkt2565.test, revision 1.1
1.1 ! misho 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
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>