xref: /sqlite-3.40.0/test/pagerfault2.test (revision 5822d6fe)
1273f3f0dSdan# 2010 June 15
2273f3f0dSdan#
3273f3f0dSdan# The author disclaims copyright to this source code.  In place of
4273f3f0dSdan# a legal notice, here is a blessing:
5273f3f0dSdan#
6273f3f0dSdan#    May you do good and not evil.
7273f3f0dSdan#    May you find forgiveness for yourself and forgive others.
8273f3f0dSdan#    May you share freely, never taking more than you give.
9273f3f0dSdan#
10273f3f0dSdan#***********************************************************************
11273f3f0dSdan#
12273f3f0dSdan# The tests in this file test the pager modules response to various
13273f3f0dSdan# fault conditions (OOM, IO error, disk full etc.). They are similar
14273f3f0dSdan# to those in file pagerfault1.test.
15273f3f0dSdan#
16273f3f0dSdan# More specifically, the tests in this file are those deemed too slow to
17273f3f0dSdan# run as part of pagerfault1.test.
18273f3f0dSdan#
19273f3f0dSdan
20273f3f0dSdanset testdir [file dirname $argv0]
21273f3f0dSdansource $testdir/tester.tcl
22273f3f0dSdansource $testdir/lock_common.tcl
23273f3f0dSdansource $testdir/malloc_common.tcl
24273f3f0dSdan
25*b3f4351fSdanif {[permutation] == "inmemory_journal"} {
26*b3f4351fSdan  finish_test
27*b3f4351fSdan  return
28*b3f4351fSdan}
29*b3f4351fSdan
30c396d4afSdansqlite3_memdebug_vfs_oom_test 0
31c396d4afSdan
32273f3f0dSdanset a_string_counter 1
33273f3f0dSdanproc a_string {n} {
34273f3f0dSdan  global a_string_counter
35273f3f0dSdan  incr a_string_counter
36273f3f0dSdan  string range [string repeat "${a_string_counter}." $n] 1 $n
37273f3f0dSdan}
38273f3f0dSdandb func a_string a_string
39273f3f0dSdan
40273f3f0dSdando_test pagerfault2-1-pre1 {
41273f3f0dSdan  faultsim_delete_and_reopen
42273f3f0dSdan  db func a_string a_string
43273f3f0dSdan  execsql {
44f43d7fceSdan    PRAGMA auto_vacuum = 0;
45273f3f0dSdan    PRAGMA journal_mode = DELETE;
46c396d4afSdan    PRAGMA page_size = 1024;
47273f3f0dSdan    CREATE TABLE t1(a, b);
48273f3f0dSdan    INSERT INTO t1 VALUES(a_string(401), a_string(402));
49273f3f0dSdan  }
50c396d4afSdan  for {set ii 0} {$ii < 13} {incr ii} {
51273f3f0dSdan    execsql { INSERT INTO t1 SELECT a_string(401), a_string(402) FROM t1 }
52273f3f0dSdan  }
53273f3f0dSdan  faultsim_save_and_close
54c396d4afSdan  file size test.db
55c396d4afSdan} [expr 1024 * 8268]
56c396d4afSdan
57c396d4afSdando_faultsim_test pagerfault2-1 -faults oom-transient -prep {
58273f3f0dSdan  faultsim_restore_and_reopen
59c396d4afSdan  sqlite3_db_config_lookaside db 0 256 4096
60273f3f0dSdan  execsql {
61273f3f0dSdan    BEGIN;
62c396d4afSdan      SELECT * FROM t1;
63273f3f0dSdan      INSERT INTO t1 VALUES(5, 6);
64273f3f0dSdan      SAVEPOINT abc;
65c396d4afSdan        UPDATE t1 SET a = a||'x' WHERE rowid<3700;
66273f3f0dSdan  }
67273f3f0dSdan} -body {
68c396d4afSdan  execsql { UPDATE t1 SET a = a||'x' WHERE rowid>=3700 AND rowid<=4200 }
69273f3f0dSdan  execsql { ROLLBACK TO abc }
70273f3f0dSdan} -test {
71273f3f0dSdan  faultsim_test_result {0 {}}
72273f3f0dSdan}
73273f3f0dSdan
74c396d4afSdando_test pagerfault2-2-pre1 {
75c396d4afSdan  faultsim_restore_and_reopen
76c396d4afSdan  execsql { DELETE FROM t1 }
77c396d4afSdan  faultsim_save_and_close
78c396d4afSdan} {}
79c396d4afSdan
80c396d4afSdando_faultsim_test pagerfault2-2 -faults oom-transient -prep {
81c396d4afSdan  faultsim_restore_and_reopen
82c396d4afSdan  sqlite3_db_config_lookaside db 0 256 4096
83c396d4afSdan  db func a_string a_string
84c396d4afSdan
85c396d4afSdan  execsql {
86c396d4afSdan    PRAGMA cache_size = 20;
87c396d4afSdan    BEGIN;
88c396d4afSdan      INSERT INTO t1 VALUES(a_string(401), a_string(402));
89c396d4afSdan      SAVEPOINT abc;
90c396d4afSdan  }
91c396d4afSdan} -body {
92c396d4afSdan  execsql { INSERT INTO t1 VALUES (a_string(2000000), a_string(2500000)) }
93c396d4afSdan} -test {
94c396d4afSdan  faultsim_test_result {0 {}}
95c396d4afSdan}
96c396d4afSdan
97c396d4afSdansqlite3_memdebug_vfs_oom_test 1
98273f3f0dSdanfinish_test
99