xref: /sqlite-3.40.0/test/ioerr6.test (revision 5822d6fe)
1# 2012 December 18
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
13set testdir [file dirname $argv0]
14source $testdir/tester.tcl
15source $testdir/malloc_common.tcl
16set ::testprefix ioerr6
17
18ifcapable !atomicwrite {
19  puts "skipping tests - not compiled with SQLITE_ENABLE_ATOMIC_WRITE..."
20  finish_test
21  return
22}
23
24if {[permutation]=="inmemory_journal"} {
25  # These tests will not work with in-memory journals (as persistent VFS
26  # errors commencing after a transaction has started to write to the db
27  # cannot be recovered from).
28  finish_test
29  return
30}
31
32faultsim_save_and_close
33
34do_test 1.1 {
35  testvfs shmfault -default true
36  shmfault devchar atomic
37  sqlite3 db test.db
38  execsql {
39    CREATE TABLE t1(a, b);
40    CREATE INDEX i1 ON t1(a, b);
41    INSERT INTO t1 VALUES(1, 2);
42    INSERT INTO t1 VALUES(2, 4);
43    INSERT INTO t1 VALUES(3, 6);
44    INSERT INTO t1 VALUES(4, 8);
45  }
46
47  # Cause the first call to xWrite() to fail with SQLITE_FULL.
48  shmfault full 2 1
49  catchsql { INSERT INTO t1 VALUES(5, 10) }
50} {1 {database or disk is full}}
51
52do_test 1.2 {
53  execsql { PRAGMA integrity_check }
54} {ok}
55
56db close
57shmfault delete
58
59do_faultsim_test 2 -faults full* -prep {
60  shmfault devchar atomic
61  faultsim_restore
62  sqlite3 db test.db
63} -body {
64  db eval {
65    CREATE TABLE t1(x PRIMARY KEY);
66    INSERT INTO t1 VALUES('abc');
67  }
68} -test {
69  set res [db one { PRAGMA integrity_check }]
70  if {$res != "ok"} {
71    error "integrity check: $res"
72  }
73}
74
75do_faultsim_test 3 -faults full* -prep {
76  shmfault devchar atomic
77  faultsim_restore
78  sqlite3 db test.db
79} -body {
80  db eval {
81    CREATE TABLE t1(x);
82    CREATE TABLE t2(x);
83  }
84} -test {
85  db eval { CREATE TABLE t3(x) }
86  if {[db one { PRAGMA integrity_check }] != "ok"} {
87    error "integrity check failed"
88  }
89}
90
91finish_test
92