xref: /sqlite-3.40.0/test/btreefault.test (revision aa07b36d)
1f6653871Sdan# 2013 April 02
2f6653871Sdan#
3f6653871Sdan# The author disclaims copyright to this source code.  In place of
4f6653871Sdan# a legal notice, here is a blessing:
5f6653871Sdan#
6f6653871Sdan#    May you do good and not evil.
7f6653871Sdan#    May you find forgiveness for yourself and forgive others.
8f6653871Sdan#    May you share freely, never taking more than you give.
9f6653871Sdan#
10f6653871Sdan#***********************************************************************
11f6653871Sdan#
12f6653871Sdan# This file contains fault injection tests designed to test the btree.c
13f6653871Sdan# module.
14f6653871Sdan#
15f6653871Sdan
16f6653871Sdanset testdir [file dirname $argv0]
17f6653871Sdansource $testdir/tester.tcl
18f6653871Sdansource $testdir/malloc_common.tcl
19f6653871Sdanset testprefix btreefault
20f6653871Sdan
215b04dc51Sdan# This test will not work with an in-memory journal, as the database will
225b04dc51Sdan# become corrupt if an error is injected into a transaction after it starts
235b04dc51Sdan# writing data out to the db file.
245b04dc51Sdanif {[permutation]=="inmemory_journal"} {
255b04dc51Sdan  finish_test
265b04dc51Sdan  return
275b04dc51Sdan}
285b04dc51Sdan
29f6653871Sdando_test 1-pre1 {
30f6653871Sdan  execsql {
31f6653871Sdan    PRAGMA auto_vacuum = incremental;
32f6653871Sdan    PRAGMA journal_mode = DELETE;
33f6653871Sdan    CREATE TABLE t1(a PRIMARY KEY, b);
34f6653871Sdan    INSERT INTO t1 VALUES(randomblob(1000), randomblob(100));
35f6653871Sdan    INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1;
36f6653871Sdan    INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1;
37f6653871Sdan    INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1;
38f6653871Sdan    INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1;
39f6653871Sdan    DELETE FROM t1 WHERE rowid%2;
40f6653871Sdan  }
41f6653871Sdan  faultsim_save_and_close
42f6653871Sdan} {}
43f6653871Sdan
44f6653871Sdando_faultsim_test 1 -prep {
45f6653871Sdan  faultsim_restore_and_reopen
46f6653871Sdan  set ::STMT [sqlite3_prepare db "SELECT * FROM t1 ORDER BY a" -1 DUMMY]
47f6653871Sdan  sqlite3_step $::STMT
48f6653871Sdan  sqlite3_step $::STMT
49f6653871Sdan} -body {
50f6653871Sdan  execsql { PRAGMA incremental_vacuum = 10 }
51f6653871Sdan} -test {
52f6653871Sdan  sqlite3_finalize $::STMT
53f6653871Sdan  faultsim_test_result {0 {}}
54f6653871Sdan  faultsim_integrity_check
55f6653871Sdan}
56f6653871Sdan
57*aa07b36dSdan#-------------------------------------------------------------------------
58*aa07b36dSdan# dbsqlfuzz crash-6ef3cd3b18ccc5de86120950a0498641acd90a33.txt
59*aa07b36dSdan#
60*aa07b36dSdanreset_db
61*aa07b36dSdan
62*aa07b36dSdando_execsql_test 2.0 {
63*aa07b36dSdan  CREATE TABLE t1(i INTEGER PRIMARY KEY, a, b);
64*aa07b36dSdan  CREATE INDEX i1 ON t1(b);
65*aa07b36dSdan  CREATE TABLE t2(x, y);
66*aa07b36dSdan}
67*aa07b36dSdan
68*aa07b36dSdando_execsql_test 2.1 {
69*aa07b36dSdan  INSERT INTO t1 VALUES(25, 25, 25);
70*aa07b36dSdan  INSERT INTO t2 VALUES(25, 'a'), (25, 'b'), (25, 'c');
71*aa07b36dSdan}
72*aa07b36dSdan
73*aa07b36dSdanfaultsim_save
74*aa07b36dSdando_test 2.2 {
75*aa07b36dSdan  set res [list]
76*aa07b36dSdan  db eval {
77*aa07b36dSdan    SELECT x, y FROM t1 CROSS JOIN t2 WHERE t2.x=t1.i AND +t1.i=25 ORDER BY b
78*aa07b36dSdan  } {
79*aa07b36dSdan    lappend res $x $y
80*aa07b36dSdan    if {$y=="b"} {
81*aa07b36dSdan      db eval { DELETE FROM t1 WHERE i=25 }
82*aa07b36dSdan    }
83*aa07b36dSdan  }
84*aa07b36dSdan  set res
85*aa07b36dSdan} {25 a 25 b}
86*aa07b36dSdan
87*aa07b36dSdando_faultsim_test 2 -faults oom-t* -prep {
88*aa07b36dSdan  faultsim_restore_and_reopen
89*aa07b36dSdan  db eval {SELECT * FROM sqlite_master}
90*aa07b36dSdan} -body {
91*aa07b36dSdan  set ::myres [list]
92*aa07b36dSdan  db eval {
93*aa07b36dSdan    SELECT x, y FROM t1 CROSS JOIN t2 WHERE t2.x=t1.i AND +t1.i=25 ORDER BY b
94*aa07b36dSdan  } {
95*aa07b36dSdan    lappend ::myres $x $y
96*aa07b36dSdan    if {$y=="b"} {
97*aa07b36dSdan      db eval { DELETE FROM t1 WHERE i=25 }
98*aa07b36dSdan    }
99*aa07b36dSdan  }
100*aa07b36dSdan  set ::myres
101*aa07b36dSdan} -test {
102*aa07b36dSdan  faultsim_test_result {0 {25 a 25 b}}
103*aa07b36dSdan}
104*aa07b36dSdan
105*aa07b36dSdan
106f6653871Sdanfinish_test
107