xref: /sqlite-3.40.0/test/atomic2.test (revision 140a5987)
1*140a5987Sdan# 2018-07-15
2*140a5987Sdan#
3*140a5987Sdan# The author disclaims copyright to this source code.  In place of
4*140a5987Sdan# a legal notice, here is a blessing:
5*140a5987Sdan#
6*140a5987Sdan#    May you do good and not evil.
7*140a5987Sdan#    May you find forgiveness for yourself and forgive others.
8*140a5987Sdan#    May you share freely, never taking more than you give.
9*140a5987Sdan#
10*140a5987Sdan#***********************************************************************
11*140a5987Sdan# This file implements regression tests for SQLite library.  The
12*140a5987Sdan# focus of this file is testing that if an IO error is encountered
13*140a5987Sdan# as part of an atomic F2FS commit, an attempt is made to commit the
14*140a5987Sdan# transaction using a legacy journal commit.
15*140a5987Sdan#
16*140a5987Sdan
17*140a5987Sdanset testdir [file dirname $argv0]
18*140a5987Sdansource $testdir/tester.tcl
19*140a5987Sdansource $testdir/malloc_common.tcl
20*140a5987Sdanset ::testprefix atomic2
21*140a5987Sdan
22*140a5987Sdandb close
23*140a5987Sdanif {[atomic_batch_write test.db]==0} {
24*140a5987Sdan  puts "No f2fs atomic-batch-write support. Skipping tests..."
25*140a5987Sdan  finish_test
26*140a5987Sdan  return
27*140a5987Sdan}
28*140a5987Sdan
29*140a5987Sdanreset_db
30*140a5987Sdan
31*140a5987Sdando_execsql_test 1.0 {
32*140a5987Sdan  CREATE TABLE t1(x, y);
33*140a5987Sdan  CREATE INDEX i1x ON t1(x);
34*140a5987Sdan  CREATE INDEX i2x ON t1(y);
35*140a5987Sdan
36*140a5987Sdan  WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100 )
37*140a5987Sdan  INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM s;
38*140a5987Sdan}
39*140a5987Sdan
40*140a5987Sdanset setup [list \
41*140a5987Sdan  -injectstart at_injectstart \
42*140a5987Sdan  -injectstop  at_injectstop  \
43*140a5987Sdan]
44*140a5987Sdan
45*140a5987Sdanset ::at_fail  0
46*140a5987Sdanset ::at_nfail 0
47*140a5987Sdan
48*140a5987Sdanproc at_injectstart {iFail} {
49*140a5987Sdan  set ::at_fail $iFail
50*140a5987Sdan  set ::at_nfail 0
51*140a5987Sdan}
52*140a5987Sdanproc at_injectstop {} {
53*140a5987Sdan  set ::at_fail 0
54*140a5987Sdan  return $::at_nfail
55*140a5987Sdan}
56*140a5987Sdan
57*140a5987Sdanproc at_vfs_callback {method file z args} {
58*140a5987Sdan  if {$::at_fail>0} {
59*140a5987Sdan    incr ::at_fail -1
60*140a5987Sdan    if {$::at_fail==0} {
61*140a5987Sdan      incr ::at_nfail
62*140a5987Sdan      return SQLITE_IOERR
63*140a5987Sdan    } elseif {$method=="xFileControl" && $z=="COMMIT_ATOMIC_WRITE"} {
64*140a5987Sdan      set ::at_fail 0
65*140a5987Sdan    }
66*140a5987Sdan  }
67*140a5987Sdan  return SQLITE_OK
68*140a5987Sdan}
69*140a5987Sdan
70*140a5987Sdantestvfs tvfs -default 1
71*140a5987Sdantvfs script at_vfs_callback
72*140a5987Sdantvfs filter {xFileControl xWrite}
73*140a5987Sdan
74*140a5987Sdanfaultsim_save_and_close
75*140a5987Sdan
76*140a5987Sdando_one_faultsim_test 2.0 {*}$setup -prep {
77*140a5987Sdan  faultsim_restore_and_reopen
78*140a5987Sdan} -body {
79*140a5987Sdan  execsql {
80*140a5987Sdan    WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100 )
81*140a5987Sdan    INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM s;
82*140a5987Sdan  }
83*140a5987Sdan} -test {
84*140a5987Sdan  faultsim_test_result {0 {}}
85*140a5987Sdan
86*140a5987Sdan  set res [execsql {SELECT count(*) FROM t1; PRAGMA integrity_check}]
87*140a5987Sdan  if {$res!="200 ok"} {
88*140a5987Sdan    error "expected {200 ok}, got $res"
89*140a5987Sdan  }
90*140a5987Sdan}
91*140a5987Sdan
92*140a5987Sdandb close
93*140a5987Sdantvfs delete
94*140a5987Sdan
95*140a5987Sdanfinish_test
96