1# 2001 October 12 2# 3# The author disclaims copyright to this source code. In place of 4# a legal notice, here is a blessing: 5# 6# May you do good and not evil. 7# May you find forgiveness for yourself and forgive others. 8# May you share freely, never taking more than you give. 9# 10#*********************************************************************** 11# This file implements regression tests for SQLite library. The 12# focus of this file is testing for correct handling of disk full 13# errors. 14# 15# $Id: diskfull.test,v 1.8 2008/07/12 14:52:20 drh Exp $ 16 17set testdir [file dirname $argv0] 18source $testdir/tester.tcl 19 20set sqlite_io_error_persist 0 21set sqlite_io_error_hit 0 22set sqlite_io_error_pending 0 23do_test diskfull-1.1 { 24 execsql { 25 CREATE TABLE t1(x); 26 INSERT INTO t1 VALUES(randstr(1000,1000)); 27 INSERT INTO t1 SELECT * FROM t1; 28 INSERT INTO t1 SELECT * FROM t1; 29 INSERT INTO t1 SELECT * FROM t1; 30 INSERT INTO t1 SELECT * FROM t1; 31 CREATE INDEX t1i1 ON t1(x); 32 CREATE TABLE t2 AS SELECT x AS a, x AS b FROM t1; 33 CREATE INDEX t2i1 ON t2(b); 34 } 35} {} 36set sqlite_diskfull_pending 0 37integrity_check diskfull-1.2 38do_test diskfull-1.3 { 39 set sqlite_diskfull_pending 1 40 catchsql { 41 INSERT INTO t1 SELECT * FROM t1; 42 } 43} {1 {database or disk is full}} 44set sqlite_diskfull_pending 0 45integrity_check diskfull-1.4 46do_test diskfull-1.5 { 47 set sqlite_diskfull_pending 1 48 catchsql { 49 DELETE FROM t1; 50 } 51} {1 {database or disk is full}} 52set sqlite_diskfull_pending 0 53set sqlite_io_error_hit 0 54integrity_check diskfull-1.6 55 56proc do_diskfull_test {prefix sql} { 57 set ::go 1 58 set ::sql $sql 59 set ::i 1 60 while {$::go} { 61 incr ::i 62 do_test ${prefix}.$::i.1 { 63 set ::sqlite_diskfull_pending $::i 64 set ::sqlite_diskfull 0 65 set r [catchsql $::sql] 66 if {!$::sqlite_diskfull} { 67 set r {1 {database or disk is full}} 68 set ::go 0 69 } 70 if {$r=="1 {disk I/O error}"} { 71 set r {1 {database or disk is full}} 72 } 73 set r 74 } {1 {database or disk is full}} 75 set ::sqlite_diskfull_pending 0 76 db close 77 sqlite3 db test.db 78 integrity_check ${prefix}.$::i.2 79 } 80} 81 82do_diskfull_test diskfull-2 VACUUM 83 84# db close 85# file delete -force test.db 86# file delete -force test.db-journal 87# sqlite3 db test.db 88# 89# do_test diskfull-3.1 { 90# execsql { 91# PRAGMA default_cache_size = 10; 92# CREATE TABLE t3(a, b, UNIQUE(a, b)); 93# INSERT INTO t3 VALUES( randstr(100, 100), randstr(100, 100) ); 94# INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3; 95# INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3; 96# INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3; 97# INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3; 98# INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3; 99# INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3; 100# INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3; 101# UPDATE t3 102# SET b = (SELECT a FROM t3 WHERE rowid = (SELECT max(rowid)-1 FROM t3)) 103# WHERE rowid = (SELECT max(rowid) FROM t3); 104# PRAGMA cache_size; 105# } 106# } {10} 107# 108# do_diskfull_test diskfull-3.2 { 109# BEGIN; 110# INSERT INTO t3 VALUES( randstr(100, 100), randstr(100, 100) ); 111# UPDATE t3 SET a = b; 112# COMMIT; 113# } 114 115finish_test 116