Annotation of embedaddon/sqlite3/test/tkt2565.test, revision 1.1.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>