1047d4836Sdrh# 2001 October 12 2047d4836Sdrh# 3047d4836Sdrh# The author disclaims copyright to this source code. In place of 4047d4836Sdrh# a legal notice, here is a blessing: 5047d4836Sdrh# 6047d4836Sdrh# May you do good and not evil. 7047d4836Sdrh# May you find forgiveness for yourself and forgive others. 8047d4836Sdrh# May you share freely, never taking more than you give. 9047d4836Sdrh# 10047d4836Sdrh#*********************************************************************** 11047d4836Sdrh# This file implements regression tests for SQLite library. The 12047d4836Sdrh# focus of this file is testing for correct handling of disk full 13047d4836Sdrh# errors. 14047d4836Sdrh# 15e8f52c50Sdrh# $Id: diskfull.test,v 1.8 2008/07/12 14:52:20 drh Exp $ 16047d4836Sdrh 17047d4836Sdrhset testdir [file dirname $argv0] 18047d4836Sdrhsource $testdir/tester.tcl 19047d4836Sdrh 20a7aea3ddSdrhset sqlite_io_error_persist 0 21a7aea3ddSdrhset sqlite_io_error_hit 0 22a7aea3ddSdrhset sqlite_io_error_pending 0 23047d4836Sdrhdo_test diskfull-1.1 { 24047d4836Sdrh execsql { 25047d4836Sdrh CREATE TABLE t1(x); 26047d4836Sdrh INSERT INTO t1 VALUES(randstr(1000,1000)); 27047d4836Sdrh INSERT INTO t1 SELECT * FROM t1; 28f307a4aaSdrh INSERT INTO t1 SELECT * FROM t1; 29f307a4aaSdrh INSERT INTO t1 SELECT * FROM t1; 30f307a4aaSdrh INSERT INTO t1 SELECT * FROM t1; 31f307a4aaSdrh CREATE INDEX t1i1 ON t1(x); 32f307a4aaSdrh CREATE TABLE t2 AS SELECT x AS a, x AS b FROM t1; 33f307a4aaSdrh CREATE INDEX t2i1 ON t2(b); 34047d4836Sdrh } 35047d4836Sdrh} {} 36f307a4aaSdrhset sqlite_diskfull_pending 0 37f307a4aaSdrhintegrity_check diskfull-1.2 38f307a4aaSdrhdo_test diskfull-1.3 { 39047d4836Sdrh set sqlite_diskfull_pending 1 40047d4836Sdrh catchsql { 41047d4836Sdrh INSERT INTO t1 SELECT * FROM t1; 42047d4836Sdrh } 432db0bbc2Sdrh} {1 {database or disk is full}} 44f307a4aaSdrhset sqlite_diskfull_pending 0 45f307a4aaSdrhintegrity_check diskfull-1.4 46f307a4aaSdrhdo_test diskfull-1.5 { 47047d4836Sdrh set sqlite_diskfull_pending 1 48047d4836Sdrh catchsql { 49047d4836Sdrh DELETE FROM t1; 50047d4836Sdrh } 512db0bbc2Sdrh} {1 {database or disk is full}} 52f307a4aaSdrhset sqlite_diskfull_pending 0 53a7aea3ddSdrhset sqlite_io_error_hit 0 54f307a4aaSdrhintegrity_check diskfull-1.6 55f307a4aaSdrh 56393f0689Sdanielk1977proc do_diskfull_test {prefix sql} { 57393f0689Sdanielk1977 set ::go 1 58393f0689Sdanielk1977 set ::sql $sql 59e180dd93Sdanielk1977 set ::i 1 60393f0689Sdanielk1977 while {$::go} { 61393f0689Sdanielk1977 incr ::i 62393f0689Sdanielk1977 do_test ${prefix}.$::i.1 { 63393f0689Sdanielk1977 set ::sqlite_diskfull_pending $::i 64393f0689Sdanielk1977 set ::sqlite_diskfull 0 65393f0689Sdanielk1977 set r [catchsql $::sql] 66393f0689Sdanielk1977 if {!$::sqlite_diskfull} { 67f307a4aaSdrh set r {1 {database or disk is full}} 68393f0689Sdanielk1977 set ::go 0 69f307a4aaSdrh } 70f307a4aaSdrh if {$r=="1 {disk I/O error}"} { 71f307a4aaSdrh set r {1 {database or disk is full}} 72f307a4aaSdrh } 73f307a4aaSdrh set r 74f307a4aaSdrh } {1 {database or disk is full}} 75393f0689Sdanielk1977 set ::sqlite_diskfull_pending 0 76f307a4aaSdrh db close 77f307a4aaSdrh sqlite3 db test.db 78393f0689Sdanielk1977 integrity_check ${prefix}.$::i.2 79393f0689Sdanielk1977 } 80f307a4aaSdrh} 81047d4836Sdrh 82393f0689Sdanielk1977do_diskfull_test diskfull-2 VACUUM 83393f0689Sdanielk1977 84393f0689Sdanielk1977# db close 85*fda06befSmistachkin# forcedelete test.db 86*fda06befSmistachkin# forcedelete test.db-journal 87393f0689Sdanielk1977# sqlite3 db test.db 88393f0689Sdanielk1977# 89393f0689Sdanielk1977# do_test diskfull-3.1 { 90393f0689Sdanielk1977# execsql { 91393f0689Sdanielk1977# PRAGMA default_cache_size = 10; 92393f0689Sdanielk1977# CREATE TABLE t3(a, b, UNIQUE(a, b)); 93393f0689Sdanielk1977# INSERT INTO t3 VALUES( randstr(100, 100), randstr(100, 100) ); 94393f0689Sdanielk1977# INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3; 95393f0689Sdanielk1977# INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3; 96393f0689Sdanielk1977# INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3; 97393f0689Sdanielk1977# INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3; 98393f0689Sdanielk1977# INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3; 99393f0689Sdanielk1977# INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3; 100393f0689Sdanielk1977# INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3; 101393f0689Sdanielk1977# UPDATE t3 102393f0689Sdanielk1977# SET b = (SELECT a FROM t3 WHERE rowid = (SELECT max(rowid)-1 FROM t3)) 103393f0689Sdanielk1977# WHERE rowid = (SELECT max(rowid) FROM t3); 104393f0689Sdanielk1977# PRAGMA cache_size; 105393f0689Sdanielk1977# } 106393f0689Sdanielk1977# } {10} 107e8f52c50Sdrh# 108393f0689Sdanielk1977# do_diskfull_test diskfull-3.2 { 109393f0689Sdanielk1977# BEGIN; 110393f0689Sdanielk1977# INSERT INTO t3 VALUES( randstr(100, 100), randstr(100, 100) ); 111393f0689Sdanielk1977# UPDATE t3 SET a = b; 112393f0689Sdanielk1977# COMMIT; 113393f0689Sdanielk1977# } 114393f0689Sdanielk1977 115047d4836Sdrhfinish_test 116