xref: /sqlite-3.40.0/test/mmapfault.test (revision f6b1a8e1)
1*789efdb9Sdan# 2013-05-23
2*789efdb9Sdan#
3*789efdb9Sdan# The author disclaims copyright to this source code.  In place of
4*789efdb9Sdan# a legal notice, here is a blessing:
5*789efdb9Sdan#
6*789efdb9Sdan#    May you do good and not evil.
7*789efdb9Sdan#    May you find forgiveness for yourself and forgive others.
8*789efdb9Sdan#    May you share freely, never taking more than you give.
9*789efdb9Sdan#
10*789efdb9Sdan#***********************************************************************
11*789efdb9Sdan#
12*789efdb9Sdan
13*789efdb9Sdanset testdir [file dirname $argv0]
14*789efdb9Sdansource $testdir/tester.tcl
15*789efdb9Sdansource $testdir/malloc_common.tcl
16*789efdb9Sdanifcapable !mmap {
17*789efdb9Sdan  finish_test
18*789efdb9Sdan  return
19*789efdb9Sdan}
20*789efdb9Sdanset testprefix mmapfault
21*789efdb9Sdan
22*789efdb9Sdanset a_string_counter 1
23*789efdb9Sdanproc a_string {n} {
24*789efdb9Sdan  global a_string_counter
25*789efdb9Sdan  incr a_string_counter
26*789efdb9Sdan  string range [string repeat "${a_string_counter}." $n] 1 $n
27*789efdb9Sdan}
28*789efdb9Sdandb func a_string a_string
29*789efdb9Sdan
30*789efdb9Sdando_test 1-pre {
31*789efdb9Sdan  execsql {
32*789efdb9Sdan    CREATE TABLE t1(a UNIQUE, b UNIQUE);
33*789efdb9Sdan    INSERT INTO t1 VALUES(a_string(200), a_string(300));
34*789efdb9Sdan    INSERT INTO t1 SELECT a_string(200), a_string(300) FROM t1;
35*789efdb9Sdan    INSERT INTO t1 SELECT a_string(200), a_string(300) FROM t1;
36*789efdb9Sdan  }
37*789efdb9Sdan  faultsim_save_and_close
38*789efdb9Sdan} {}
39*789efdb9Sdan
40*789efdb9Sdan
41*789efdb9Sdando_faultsim_test 1 -prep {
42*789efdb9Sdan  faultsim_restore_and_reopen
43*789efdb9Sdan  db func a_string a_string
44*789efdb9Sdan  execsql {
45*789efdb9Sdan    PRAGMA mmap_size = 1000000;
46*789efdb9Sdan    PRAGMA cache_size = 5;
47*789efdb9Sdan    BEGIN;
48*789efdb9Sdan      INSERT INTO t1 SELECT a_string(200), a_string(300) FROM t1;
49*789efdb9Sdan      INSERT INTO t1 SELECT a_string(200), a_string(300) FROM t1;
50*789efdb9Sdan      INSERT INTO t1 SELECT a_string(200), a_string(300) FROM t1;
51*789efdb9Sdan      INSERT INTO t1 SELECT a_string(200), a_string(300) FROM t1;
52*789efdb9Sdan  }
53*789efdb9Sdan} -body {
54*789efdb9Sdan  execsql { INSERT INTO t1 VALUES(a_string(200), a_string(300)) }
55*789efdb9Sdan} -test {
56*789efdb9Sdan  faultsim_test_result {0 {}}
57*789efdb9Sdan
58*789efdb9Sdan  if {[sqlite3_get_autocommit db]} {
59*789efdb9Sdan    sqlite3 db2 test.db
60*789efdb9Sdan    set nRow [db2 one {SELECT count(*) FROM t1}]
61*789efdb9Sdan    if {$nRow!=4} { error "Database content appears incorrect (1)" }
62*789efdb9Sdan    db2 close
63*789efdb9Sdan  }
64*789efdb9Sdan
65*789efdb9Sdan  execsql { INSERT INTO t1 VALUES(a_string(201), a_string(301)) }
66*789efdb9Sdan  set nRow [db one {SELECT count(*) FROM t1}]
67*789efdb9Sdan  if {$nRow!=5 && $nRow!=66 && $nRow!=65} {
68*789efdb9Sdan    error "Database content appears incorrect (2) ($nRow)"
69*789efdb9Sdan  }
70*789efdb9Sdan
71*789efdb9Sdan  catch { execsql COMMIT }
72*789efdb9Sdan}
73*789efdb9Sdan
74*789efdb9Sdan
75*789efdb9Sdan
76*789efdb9Sdanfinish_test
77