gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/atomic2.test (about) 1 # 2018-07-15 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 # This file implements regression tests for SQLite library. The 12 # focus of this file is testing that if an IO error is encountered 13 # as part of an atomic F2FS commit, an attempt is made to commit the 14 # transaction using a legacy journal commit. 15 # 16 17 set testdir [file dirname $argv0] 18 source $testdir/tester.tcl 19 source $testdir/malloc_common.tcl 20 set ::testprefix atomic2 21 22 db close 23 if {[atomic_batch_write test.db]==0} { 24 puts "No f2fs atomic-batch-write support. Skipping tests..." 25 finish_test 26 return 27 } 28 29 reset_db 30 31 do_execsql_test 1.0 { 32 CREATE TABLE t1(x, y); 33 CREATE INDEX i1x ON t1(x); 34 CREATE INDEX i2x ON t1(y); 35 36 WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100 ) 37 INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM s; 38 } 39 40 set setup [list \ 41 -injectstart at_injectstart \ 42 -injectstop at_injectstop \ 43 ] 44 45 set ::at_fail 0 46 set ::at_nfail 0 47 48 proc at_injectstart {iFail} { 49 set ::at_fail $iFail 50 set ::at_nfail 0 51 } 52 proc at_injectstop {} { 53 set ::at_fail 0 54 return $::at_nfail 55 } 56 57 proc at_vfs_callback {method file z args} { 58 if {$::at_fail>0} { 59 incr ::at_fail -1 60 if {$::at_fail==0} { 61 incr ::at_nfail 62 return SQLITE_IOERR 63 } elseif {$method=="xFileControl" && $z=="COMMIT_ATOMIC_WRITE"} { 64 set ::at_fail 0 65 } 66 } 67 return SQLITE_OK 68 } 69 70 testvfs tvfs -default 1 71 tvfs script at_vfs_callback 72 tvfs filter {xFileControl xWrite} 73 74 faultsim_save_and_close 75 76 do_one_faultsim_test 2.0 {*}$setup -prep { 77 faultsim_restore_and_reopen 78 } -body { 79 execsql { 80 WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100 ) 81 INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM s; 82 } 83 } -test { 84 faultsim_test_result {0 {}} 85 86 set res [execsql {SELECT count(*) FROM t1; PRAGMA integrity_check}] 87 if {$res!="200 ok"} { 88 error "expected {200 ok}, got $res" 89 } 90 } 91 92 db close 93 tvfs delete 94 95 finish_test