1d1e3bee1Sdanielk1977# 2001 September 15 2d1e3bee1Sdanielk1977# 3d1e3bee1Sdanielk1977# The author disclaims copyright to this source code. In place of 4d1e3bee1Sdanielk1977# a legal notice, here is a blessing: 5d1e3bee1Sdanielk1977# 6d1e3bee1Sdanielk1977# May you do good and not evil. 7d1e3bee1Sdanielk1977# May you find forgiveness for yourself and forgive others. 8d1e3bee1Sdanielk1977# May you share freely, never taking more than you give. 9d1e3bee1Sdanielk1977# 10d1e3bee1Sdanielk1977#*********************************************************************** 11d1e3bee1Sdanielk1977# This file implements regression tests for SQLite library. 12d1e3bee1Sdanielk1977# 135260f7e9Sdrh# The focus of this file is testing the ability of the database to 145260f7e9Sdrh# uses its rollback journal to recover intact (no database corruption) 159c06c953Sdrh# from a power failure during the middle of a COMMIT. The OS interface 1659a33f98Sdanielk1977# modules are overloaded using the modified I/O routines found in test6.c. 1759a33f98Sdanielk1977# These routines allow us to simulate the kind of file damage that 1859a33f98Sdanielk1977# occurs after a power failure. 195260f7e9Sdrh# 20cb1f0f6cSdrh# $Id: crash.test,v 1.27 2008/01/08 15:18:52 drh Exp $ 21d1e3bee1Sdanielk1977 22d1e3bee1Sdanielk1977set testdir [file dirname $argv0] 23d1e3bee1Sdanielk1977source $testdir/tester.tcl 24d1e3bee1Sdanielk1977 2566560adaSdrhifcapable !crashtest { 2666560adaSdrh finish_test 2766560adaSdrh return 2866560adaSdrh} 2966560adaSdrh 3076f55968Sdanielk1977set repeats 100 3176f55968Sdanielk1977#set repeats 10 32ef317ab5Sdanielk1977 33ef317ab5Sdanielk1977# The following procedure computes a "signature" for table "abc". If 34ef317ab5Sdanielk1977# abc changes in any way, the signature should change. 35ef317ab5Sdanielk1977proc signature {} { 36ef317ab5Sdanielk1977 return [db eval {SELECT count(*), md5sum(a), md5sum(b), md5sum(c) FROM abc}] 37ef317ab5Sdanielk1977} 38ef317ab5Sdanielk1977proc signature2 {} { 39ef317ab5Sdanielk1977 return [db eval {SELECT count(*), md5sum(a), md5sum(b), md5sum(c) FROM abc2}] 40ef317ab5Sdanielk1977} 41ef317ab5Sdanielk1977 42ef317ab5Sdanielk1977#-------------------------------------------------------------------------- 43ece80f1eSdanielk1977# Simple crash test: 44ece80f1eSdanielk1977# 45ece80f1eSdanielk1977# crash-1.1: Create a database with a table with two rows. 46ece80f1eSdanielk1977# crash-1.2: Run a 'DELETE FROM abc WHERE a = 1' that crashes during 47ef317ab5Sdanielk1977# the first journal-sync. 48ece80f1eSdanielk1977# crash-1.3: Ensure the database is in the same state as after crash-1.1. 49ece80f1eSdanielk1977# crash-1.4: Run a 'DELETE FROM abc WHERE a = 1' that crashes during 50ef317ab5Sdanielk1977# the first database-sync. 51ece80f1eSdanielk1977# crash-1.5: Ensure the database is in the same state as after crash-1.1. 52f187bd9dSdanielk1977# crash-1.6: Run a 'DELETE FROM abc WHERE a = 1' that crashes during 53f187bd9dSdanielk1977# the second journal-sync. 54f187bd9dSdanielk1977# crash-1.7: Ensure the database is in the same state as after crash-1.1. 55ece80f1eSdanielk1977# 56f187bd9dSdanielk1977# Tests 1.8 through 1.11 test for crashes on the third journal sync and 57f187bd9dSdanielk1977# second database sync. Neither of these is required in such a small test 58f187bd9dSdanielk1977# case, so these tests are just to verify that the test infrastructure 59f187bd9dSdanielk1977# operates as expected. 60ef317ab5Sdanielk1977# 61d1e3bee1Sdanielk1977do_test crash-1.1 { 62d1e3bee1Sdanielk1977 execsql { 63d1e3bee1Sdanielk1977 CREATE TABLE abc(a, b, c); 64d1e3bee1Sdanielk1977 INSERT INTO abc VALUES(1, 2, 3); 65d1e3bee1Sdanielk1977 INSERT INTO abc VALUES(4, 5, 6); 66d1e3bee1Sdanielk1977 } 67ef317ab5Sdanielk1977 set ::sig [signature] 68ef317ab5Sdanielk1977 expr 0 69ef317ab5Sdanielk1977} {0} 70cb1f0f6cSdrhfor {set i 0} {$i<10} {incr i} { 71cb1f0f6cSdrh set seed [expr {int(abs(rand()*10000))}] 72cb1f0f6cSdrh do_test crash-1.2.$i { 73cb1f0f6cSdrh crashsql -delay 1 -file test.db-journal -seed $seed { 74ece80f1eSdanielk1977 DELETE FROM abc WHERE a = 1; 75ece80f1eSdanielk1977 } 76ef317ab5Sdanielk1977 } {1 {child process exited abnormally}} 77cb1f0f6cSdrh do_test crash-1.3.$i { 78ef317ab5Sdanielk1977 signature 79ef317ab5Sdanielk1977 } $::sig 80cb1f0f6cSdrh} 81d1e3bee1Sdanielk1977do_test crash-1.4 { 8259a33f98Sdanielk1977 crashsql -delay 1 -file test.db { 83ece80f1eSdanielk1977 DELETE FROM abc WHERE a = 1; 84ece80f1eSdanielk1977 } 85ef317ab5Sdanielk1977} {1 {child process exited abnormally}} 86d1e3bee1Sdanielk1977do_test crash-1.5 { 87ef317ab5Sdanielk1977 signature 88ef317ab5Sdanielk1977} $::sig 89ef317ab5Sdanielk1977do_test crash-1.6 { 9059a33f98Sdanielk1977 crashsql -delay 2 -file test.db-journal { 91ef317ab5Sdanielk1977 DELETE FROM abc WHERE a = 1; 92ef317ab5Sdanielk1977 } 93f187bd9dSdanielk1977} {1 {child process exited abnormally}} 94ef317ab5Sdanielk1977do_test crash-1.7 { 95ece80f1eSdanielk1977 catchsql { 96d1e3bee1Sdanielk1977 SELECT * FROM abc; 97d1e3bee1Sdanielk1977 } 98f187bd9dSdanielk1977} {0 {1 2 3 4 5 6}} 99f187bd9dSdanielk1977 100ef317ab5Sdanielk1977do_test crash-1.8 { 10159a33f98Sdanielk1977 crashsql -delay 3 -file test.db-journal { 102f187bd9dSdanielk1977 DELETE FROM abc WHERE a = 1; 103f187bd9dSdanielk1977 } 104f187bd9dSdanielk1977} {0 {}} 105f187bd9dSdanielk1977do_test crash-1.9 { 106f187bd9dSdanielk1977 catchsql { 107f187bd9dSdanielk1977 SELECT * FROM abc; 108f187bd9dSdanielk1977 } 109f187bd9dSdanielk1977} {0 {4 5 6}} 110f187bd9dSdanielk1977do_test crash-1.10 { 11159a33f98Sdanielk1977 crashsql -delay 2 -file test.db { 112ef317ab5Sdanielk1977 DELETE FROM abc WHERE a = 4; 113ef317ab5Sdanielk1977 } 114ef317ab5Sdanielk1977} {0 {}} 115f187bd9dSdanielk1977do_test crash-1.11 { 116ef317ab5Sdanielk1977 catchsql { 117ef317ab5Sdanielk1977 SELECT * FROM abc; 118ef317ab5Sdanielk1977 } 119ef317ab5Sdanielk1977} {0 {}} 120ef317ab5Sdanielk1977 121ef317ab5Sdanielk1977#-------------------------------------------------------------------------- 122*d5578433Smistachkin# The following tests test recovery when both the database file and the 123ef317ab5Sdanielk1977# journal file contain corrupt data. This can happen after pages are 124ef317ab5Sdanielk1977# written to the database file before a transaction is committed due to 125ef317ab5Sdanielk1977# cache-pressure. 126ef317ab5Sdanielk1977# 127ef317ab5Sdanielk1977# crash-2.1: Insert 18 pages of data into the database. 128ef317ab5Sdanielk1977# crash-2.2: Check the database file size looks ok. 129ef317ab5Sdanielk1977# crash-2.3: Delete 15 or so pages (with a 10 page page-cache), then crash. 130ef317ab5Sdanielk1977# crash-2.4: Ensure the database is in the same state as after crash-2.1. 131ef317ab5Sdanielk1977# 132ef317ab5Sdanielk1977# Test cases crash-2.5 and crash-2.6 check that the database is OK if the 133ef317ab5Sdanielk1977# crash occurs during the main database file sync. But this isn't really 134ef317ab5Sdanielk1977# different from the crash-1.* cases. 135ef317ab5Sdanielk1977# 136ef317ab5Sdanielk1977do_test crash-2.1 { 137ef317ab5Sdanielk1977 execsql { BEGIN } 138ef317ab5Sdanielk1977 for {set n 0} {$n < 1000} {incr n} { 139ef317ab5Sdanielk1977 execsql "INSERT INTO abc VALUES($n, [expr 2*$n], [expr 3*$n])" 140ef317ab5Sdanielk1977 } 141ef317ab5Sdanielk1977 execsql { COMMIT } 142ef317ab5Sdanielk1977 set ::sig [signature] 143ef317ab5Sdanielk1977 execsql { SELECT sum(a), sum(b), sum(c) from abc } 144f80bcd73Sdrh} {499500 999000 1498500} 145ef317ab5Sdanielk1977do_test crash-2.2 { 146ac11ee67Sdanielk1977 expr ([file size test.db] / 1024)>16 147ac11ee67Sdanielk1977} {1} 148ef317ab5Sdanielk1977do_test crash-2.3 { 14959a33f98Sdanielk1977 crashsql -delay 2 -file test.db-journal { 150ef317ab5Sdanielk1977 DELETE FROM abc WHERE a < 800; 151ef317ab5Sdanielk1977 } 152ef317ab5Sdanielk1977} {1 {child process exited abnormally}} 153ef317ab5Sdanielk1977do_test crash-2.4 { 154ef317ab5Sdanielk1977 signature 155ef317ab5Sdanielk1977} $sig 156ef317ab5Sdanielk1977do_test crash-2.5 { 15759a33f98Sdanielk1977 crashsql -delay 1 -file test.db { 158ef317ab5Sdanielk1977 DELETE FROM abc WHERE a<800; 159ef317ab5Sdanielk1977 } 160ef317ab5Sdanielk1977} {1 {child process exited abnormally}} 161ef317ab5Sdanielk1977do_test crash-2.6 { 162ef317ab5Sdanielk1977 signature 163ef317ab5Sdanielk1977} $sig 164ef317ab5Sdanielk1977 165ef317ab5Sdanielk1977#-------------------------------------------------------------------------- 166ef317ab5Sdanielk1977# The crash-3.* test cases are essentially the same test as test case 167ef317ab5Sdanielk1977# crash-2.*, but with a more complicated data set. 168ef317ab5Sdanielk1977# 169ef317ab5Sdanielk1977# The test is repeated a few times with different seeds for the random 170ef317ab5Sdanielk1977# number generator in the crashing executable. Because there is no way to 171ef317ab5Sdanielk1977# seed the random number generator directly, some SQL is added to the test 172ef317ab5Sdanielk1977# case to 'use up' a different quantity random numbers before the test SQL 173ef317ab5Sdanielk1977# is executed. 174ef317ab5Sdanielk1977# 175ef317ab5Sdanielk1977 176ef317ab5Sdanielk1977# Make sure the file is much bigger than the pager-cache (10 pages). This 177ef317ab5Sdanielk1977# ensures that cache-spills happen regularly. 178ef317ab5Sdanielk1977do_test crash-3.0 { 179ef317ab5Sdanielk1977 execsql { 180ef317ab5Sdanielk1977 INSERT INTO abc SELECT * FROM abc; 181ef317ab5Sdanielk1977 INSERT INTO abc SELECT * FROM abc; 182ef317ab5Sdanielk1977 INSERT INTO abc SELECT * FROM abc; 183ef317ab5Sdanielk1977 INSERT INTO abc SELECT * FROM abc; 184ef317ab5Sdanielk1977 INSERT INTO abc SELECT * FROM abc; 185ef317ab5Sdanielk1977 } 186ac11ee67Sdanielk1977 expr ([file size test.db] / 1024) > 450 187ac11ee67Sdanielk1977} {1} 188ef317ab5Sdanielk1977for {set i 1} {$i < $repeats} {incr i} { 189ef317ab5Sdanielk1977 set sig [signature] 190ef317ab5Sdanielk1977 do_test crash-3.$i.1 { 191cb1f0f6cSdrh set seed [expr {int(abs(rand()*10000))}] 192cb1f0f6cSdrh crashsql -delay [expr $i%5 + 1] -file test.db-journal -seed $seed " 193ef317ab5Sdanielk1977 BEGIN; 194ef317ab5Sdanielk1977 SELECT random() FROM abc LIMIT $i; 195ef317ab5Sdanielk1977 INSERT INTO abc VALUES(randstr(10,10), 0, 0); 196ef317ab5Sdanielk1977 DELETE FROM abc WHERE random()%10!=0; 197ef317ab5Sdanielk1977 COMMIT; 198ef317ab5Sdanielk1977 " 199ef317ab5Sdanielk1977 } {1 {child process exited abnormally}} 200ef317ab5Sdanielk1977 do_test crash-3.$i.2 { 201ef317ab5Sdanielk1977 signature 202ef317ab5Sdanielk1977 } $sig 203ef317ab5Sdanielk1977} 204ef317ab5Sdanielk1977 205ef317ab5Sdanielk1977#-------------------------------------------------------------------------- 206ef317ab5Sdanielk1977# The following test cases - crash-4.* - test the correct recovery of the 207ef317ab5Sdanielk1977# database when a crash occurs during a multi-file transaction. 208ef317ab5Sdanielk1977# 209ef317ab5Sdanielk1977# crash-4.1.*: Test recovery when crash occurs during sync() of the 210ef317ab5Sdanielk1977# main database journal file. 211ef317ab5Sdanielk1977# crash-4.2.*: Test recovery when crash occurs during sync() of an 212ef317ab5Sdanielk1977# attached database journal file. 213ef317ab5Sdanielk1977# crash-4.3.*: Test recovery when crash occurs during sync() of the master 214ef317ab5Sdanielk1977# journal file. 215ef317ab5Sdanielk1977# 2165a8f9374Sdanielk1977ifcapable attach { 217ef317ab5Sdanielk1977 do_test crash-4.0 { 218fda06befSmistachkin forcedelete test2.db 219fda06befSmistachkin forcedelete test2.db-journal 220ef317ab5Sdanielk1977 execsql { 221ef317ab5Sdanielk1977 ATTACH 'test2.db' AS aux; 222e35ee196Sdanielk1977 PRAGMA aux.default_cache_size = 10; 223ef317ab5Sdanielk1977 CREATE TABLE aux.abc2 AS SELECT 2*a as a, 2*b as b, 2*c as c FROM abc; 224ef317ab5Sdanielk1977 } 225ac11ee67Sdanielk1977 expr ([file size test2.db] / 1024) > 450 226ac11ee67Sdanielk1977 } {1} 227ef317ab5Sdanielk1977 22876f55968Sdanielk1977 set fin 0 229ef317ab5Sdanielk1977 for {set i 1} {$i<$repeats} {incr i} { 230cb1f0f6cSdrh set seed [expr {int(abs(rand()*10000))}] 231ef317ab5Sdanielk1977 set sig [signature] 232ef317ab5Sdanielk1977 set sig2 [signature2] 233ef317ab5Sdanielk1977 do_test crash-4.1.$i.1 { 234cb1f0f6cSdrh set c [crashsql -delay $i -file test.db-journal -seed $::seed " 235ef317ab5Sdanielk1977 ATTACH 'test2.db' AS aux; 236ef317ab5Sdanielk1977 BEGIN; 23776f55968Sdanielk1977 SELECT randstr($i,$i) FROM abc LIMIT $i; 238ef317ab5Sdanielk1977 INSERT INTO abc VALUES(randstr(10,10), 0, 0); 239ef317ab5Sdanielk1977 DELETE FROM abc WHERE random()%10!=0; 240ef317ab5Sdanielk1977 INSERT INTO abc2 VALUES(randstr(10,10), 0, 0); 241ef317ab5Sdanielk1977 DELETE FROM abc2 WHERE random()%10!=0; 242ef317ab5Sdanielk1977 COMMIT; 2438191bff0Sdanielk1977 "] 24476f55968Sdanielk1977 if { $c == {0 {}} } { 24576f55968Sdanielk1977 set ::fin 1 24676f55968Sdanielk1977 set c {1 {child process exited abnormally}} 24776f55968Sdanielk1977 } 2488191bff0Sdanielk1977 set c 249ef317ab5Sdanielk1977 } {1 {child process exited abnormally}} 25076f55968Sdanielk1977 if {$::fin} break 251ef317ab5Sdanielk1977 do_test crash-4.1.$i.2 { 252ef317ab5Sdanielk1977 signature 253ef317ab5Sdanielk1977 } $sig 254ef317ab5Sdanielk1977 do_test crash-4.1.$i.3 { 255ef317ab5Sdanielk1977 signature2 256ef317ab5Sdanielk1977 } $sig2 257ef317ab5Sdanielk1977 } 2588191bff0Sdanielk1977 set i 0 25976f55968Sdanielk1977 set fin 0 2608191bff0Sdanielk1977 while {[incr i]} { 261cb1f0f6cSdrh set seed [expr {int(abs(rand()*10000))}] 262ef317ab5Sdanielk1977 set sig [signature] 263ef317ab5Sdanielk1977 set sig2 [signature2] 2648191bff0Sdanielk1977 set ::fin 0 265ef317ab5Sdanielk1977 do_test crash-4.2.$i.1 { 266cb1f0f6cSdrh set c [crashsql -delay $i -file test2.db-journal -seed $::seed " 267ef317ab5Sdanielk1977 ATTACH 'test2.db' AS aux; 268ef317ab5Sdanielk1977 BEGIN; 26976f55968Sdanielk1977 SELECT randstr($i,$i) FROM abc LIMIT $i; 270ef317ab5Sdanielk1977 INSERT INTO abc VALUES(randstr(10,10), 0, 0); 271ef317ab5Sdanielk1977 DELETE FROM abc WHERE random()%10!=0; 272ef317ab5Sdanielk1977 INSERT INTO abc2 VALUES(randstr(10,10), 0, 0); 273ef317ab5Sdanielk1977 DELETE FROM abc2 WHERE random()%10!=0; 274ef317ab5Sdanielk1977 COMMIT; 2758191bff0Sdanielk1977 "] 2768191bff0Sdanielk1977 if { $c == {0 {}} } { 2778191bff0Sdanielk1977 set ::fin 1 2788191bff0Sdanielk1977 set c {1 {child process exited abnormally}} 2798191bff0Sdanielk1977 } 2808191bff0Sdanielk1977 set c 281ef317ab5Sdanielk1977 } {1 {child process exited abnormally}} 2828191bff0Sdanielk1977 if { $::fin } break 283ef317ab5Sdanielk1977 do_test crash-4.2.$i.2 { 284ef317ab5Sdanielk1977 signature 285ef317ab5Sdanielk1977 } $sig 286ef317ab5Sdanielk1977 do_test crash-4.2.$i.3 { 287ef317ab5Sdanielk1977 signature2 288ef317ab5Sdanielk1977 } $sig2 289ef317ab5Sdanielk1977 } 290ef317ab5Sdanielk1977 for {set i 1} {$i < 5} {incr i} { 291ef317ab5Sdanielk1977 set sig [signature] 292ef317ab5Sdanielk1977 set sig2 [signature2] 293ef317ab5Sdanielk1977 do_test crash-4.3.$i.1 { 29459a33f98Sdanielk1977 crashsql -delay 1 -file test.db-mj* " 295ef317ab5Sdanielk1977 ATTACH 'test2.db' AS aux; 296ef317ab5Sdanielk1977 BEGIN; 297ef317ab5Sdanielk1977 SELECT random() FROM abc LIMIT $i; 298ef317ab5Sdanielk1977 INSERT INTO abc VALUES(randstr(10,10), 0, 0); 299ef317ab5Sdanielk1977 DELETE FROM abc WHERE random()%10!=0; 300ef317ab5Sdanielk1977 INSERT INTO abc2 VALUES(randstr(10,10), 0, 0); 301ef317ab5Sdanielk1977 DELETE FROM abc2 WHERE random()%10!=0; 302ef317ab5Sdanielk1977 COMMIT; 303ef317ab5Sdanielk1977 " 304ef317ab5Sdanielk1977 } {1 {child process exited abnormally}} 305ef317ab5Sdanielk1977 do_test crash-4.3.$i.2 { 306ef317ab5Sdanielk1977 signature 307ef317ab5Sdanielk1977 } $sig 308ef317ab5Sdanielk1977 do_test crash-4.3.$i.3 { 309ef317ab5Sdanielk1977 signature2 310ef317ab5Sdanielk1977 } $sig2 311ef317ab5Sdanielk1977 } 3125a8f9374Sdanielk1977} 31394daf7fdSdanielk1977 31494daf7fdSdanielk1977#-------------------------------------------------------------------------- 31594daf7fdSdanielk1977# The following test cases - crash-5.* - exposes a bug that existed in the 31694daf7fdSdanielk1977# sqlite3pager_movepage() API used by auto-vacuum databases. 31794daf7fdSdanielk1977# database when a crash occurs during a multi-file transaction. See comments 31894daf7fdSdanielk1977# in test crash-5.3 for details. 31994daf7fdSdanielk1977# 32094daf7fdSdanielk1977db close 321fda06befSmistachkinforcedelete test.db 32294daf7fdSdanielk1977sqlite3 db test.db 32394daf7fdSdanielk1977do_test crash-5.1 { 32494daf7fdSdanielk1977 execsql { 32594daf7fdSdanielk1977 CREATE TABLE abc(a, b, c); -- Root page 3 32694daf7fdSdanielk1977 INSERT INTO abc VALUES(randstr(1500,1500), 0, 0); -- Overflow page 4 32794daf7fdSdanielk1977 INSERT INTO abc SELECT * FROM abc; 32894daf7fdSdanielk1977 INSERT INTO abc SELECT * FROM abc; 32994daf7fdSdanielk1977 INSERT INTO abc SELECT * FROM abc; 33094daf7fdSdanielk1977 } 33194daf7fdSdanielk1977} {} 33294daf7fdSdanielk1977do_test crash-5.2 { 33394daf7fdSdanielk1977 expr [file size test.db] / 1024 3344e17d14cSdanielk1977} [expr [string match [execsql {pragma auto_vacuum}] 1] ? 11 : 10] 33594daf7fdSdanielk1977set sig [signature] 33694daf7fdSdanielk1977do_test crash-5.3 { 33794daf7fdSdanielk1977# The SQL below is used to expose a bug that existed in 33894daf7fdSdanielk1977# sqlite3pager_movepage() during development of the auto-vacuum feature. It 33994daf7fdSdanielk1977# functions as follows: 34094daf7fdSdanielk1977# 34194daf7fdSdanielk1977# 1: Begin a transaction. 34294daf7fdSdanielk1977# 2: Put page 4 on the free-list (was the overflow page for the row deleted). 34394daf7fdSdanielk1977# 3: Write data to page 4 (it becomes the overflow page for the row inserted). 34494daf7fdSdanielk1977# The old page 4 data has been written to the journal file, but the 34594daf7fdSdanielk1977# journal file has not been sync()hronized. 34694daf7fdSdanielk1977# 4: Create a table, which calls sqlite3pager_movepage() to move page 4 34794daf7fdSdanielk1977# to the end of the database (page 12) to make room for the new root-page. 34894daf7fdSdanielk1977# 5: Put pressure on the pager-cache. This results in page 4 being written 34994daf7fdSdanielk1977# to the database file to make space in the cache to load a new page. The 35094daf7fdSdanielk1977# bug was that page 4 was written to the database file before the journal 35194daf7fdSdanielk1977# is sync()hronized. 35294daf7fdSdanielk1977# 6: Commit. A crash occurs during the sync of the journal file. 35394daf7fdSdanielk1977# 35494daf7fdSdanielk1977# End result: Before the bug was fixed, data has been written to page 4 of the 35594daf7fdSdanielk1977# database file and the journal file does not contain trustworthy rollback 35694daf7fdSdanielk1977# data for this page. 35794daf7fdSdanielk1977# 35859a33f98Sdanielk1977 crashsql -delay 1 -file test.db-journal { 35994daf7fdSdanielk1977 BEGIN; -- 1 36094daf7fdSdanielk1977 DELETE FROM abc WHERE oid = 1; -- 2 36194daf7fdSdanielk1977 INSERT INTO abc VALUES(randstr(1500,1500), 0, 0); -- 3 36294daf7fdSdanielk1977 CREATE TABLE abc2(a, b, c); -- 4 36394daf7fdSdanielk1977 SELECT * FROM abc; -- 5 36494daf7fdSdanielk1977 COMMIT; -- 6 36594daf7fdSdanielk1977 } 36694daf7fdSdanielk1977} {1 {child process exited abnormally}} 36794daf7fdSdanielk1977integrity_check crash-5.4 36894daf7fdSdanielk1977do_test crash-5.5 { 36994daf7fdSdanielk1977 signature 37094daf7fdSdanielk1977} $sig 37194daf7fdSdanielk1977 372e0830e8eSdanielk1977#-------------------------------------------------------------------------- 373e0830e8eSdanielk1977# The following test cases - crash-6.* - test that a DROP TABLE operation 374e0830e8eSdanielk1977# is correctly rolled back in the event of a crash while the database file 375e0830e8eSdanielk1977# is being written. This is mainly to test that all pages are written to the 376e0830e8eSdanielk1977# journal file before truncation in an auto-vacuum database. 377e0830e8eSdanielk1977# 378e0830e8eSdanielk1977do_test crash-6.1 { 37959a33f98Sdanielk1977 crashsql -delay 1 -file test.db { 380e0830e8eSdanielk1977 DROP TABLE abc; 381e0830e8eSdanielk1977 } 382e0830e8eSdanielk1977} {1 {child process exited abnormally}} 383e0830e8eSdanielk1977do_test crash-6.2 { 384e0830e8eSdanielk1977 signature 385e0830e8eSdanielk1977} $sig 38694daf7fdSdanielk1977 387aca790acSdanielk1977#-------------------------------------------------------------------------- 388aca790acSdanielk1977# These test cases test the case where the master journal file name is 389aca790acSdanielk1977# corrupted slightly so that the corruption has to be detected by the 390aca790acSdanielk1977# checksum. 391aca790acSdanielk1977do_test crash-7.1 { 39259a33f98Sdanielk1977 crashsql -delay 1 -file test.db { 393aca790acSdanielk1977 ATTACH 'test2.db' AS aux; 394aca790acSdanielk1977 BEGIN; 395aca790acSdanielk1977 INSERT INTO abc VALUES(randstr(1500,1500), 0, 0); 396aca790acSdanielk1977 INSERT INTO abc2 VALUES(randstr(1500,1500), 0, 0); 397aca790acSdanielk1977 COMMIT; 398aca790acSdanielk1977 } 399aca790acSdanielk1977 400aca790acSdanielk1977 # Change the checksum value for the master journal name. 401aca790acSdanielk1977 set f [open test.db-journal a] 402aca790acSdanielk1977 fconfigure $f -encoding binary 403aca790acSdanielk1977 seek $f [expr [file size test.db-journal] - 12] 404aca790acSdanielk1977 puts -nonewline $f "\00\00\00\00" 405aca790acSdanielk1977 close $f 406aca790acSdanielk1977} {} 407aca790acSdanielk1977do_test crash-7.2 { 408aca790acSdanielk1977 signature 409aca790acSdanielk1977} $sig 410aca790acSdanielk1977 411251b067cSdrhfinish_test 412