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