sl@0: # 2001 October 12 sl@0: # sl@0: # The author disclaims copyright to this source code. In place of sl@0: # a legal notice, here is a blessing: sl@0: # sl@0: # May you do good and not evil. sl@0: # May you find forgiveness for yourself and forgive others. sl@0: # May you share freely, never taking more than you give. sl@0: # sl@0: #*********************************************************************** sl@0: # This file implements regression tests for SQLite library. The sl@0: # focus of this file is testing for correct handling of disk full sl@0: # errors. sl@0: # sl@0: # $Id: diskfull.test,v 1.8 2008/07/12 14:52:20 drh Exp $ sl@0: sl@0: set testdir [file dirname $argv0] sl@0: source $testdir/tester.tcl sl@0: sl@0: set sqlite_io_error_persist 0 sl@0: set sqlite_io_error_hit 0 sl@0: set sqlite_io_error_pending 0 sl@0: do_test diskfull-1.1 { sl@0: execsql { sl@0: CREATE TABLE t1(x); sl@0: INSERT INTO t1 VALUES(randstr(1000,1000)); sl@0: INSERT INTO t1 SELECT * FROM t1; sl@0: INSERT INTO t1 SELECT * FROM t1; sl@0: INSERT INTO t1 SELECT * FROM t1; sl@0: INSERT INTO t1 SELECT * FROM t1; sl@0: CREATE INDEX t1i1 ON t1(x); sl@0: CREATE TABLE t2 AS SELECT x AS a, x AS b FROM t1; sl@0: CREATE INDEX t2i1 ON t2(b); sl@0: } sl@0: } {} sl@0: set sqlite_diskfull_pending 0 sl@0: integrity_check diskfull-1.2 sl@0: do_test diskfull-1.3 { sl@0: set sqlite_diskfull_pending 1 sl@0: catchsql { sl@0: INSERT INTO t1 SELECT * FROM t1; sl@0: } sl@0: } {1 {database or disk is full}} sl@0: set sqlite_diskfull_pending 0 sl@0: integrity_check diskfull-1.4 sl@0: do_test diskfull-1.5 { sl@0: set sqlite_diskfull_pending 1 sl@0: catchsql { sl@0: DELETE FROM t1; sl@0: } sl@0: } {1 {database or disk is full}} sl@0: set sqlite_diskfull_pending 0 sl@0: set sqlite_io_error_hit 0 sl@0: integrity_check diskfull-1.6 sl@0: sl@0: proc do_diskfull_test {prefix sql} { sl@0: set ::go 1 sl@0: set ::sql $sql sl@0: set ::i 1 sl@0: while {$::go} { sl@0: incr ::i sl@0: do_test ${prefix}.$::i.1 { sl@0: set ::sqlite_diskfull_pending $::i sl@0: set ::sqlite_diskfull 0 sl@0: set r [catchsql $::sql] sl@0: if {!$::sqlite_diskfull} { sl@0: set r {1 {database or disk is full}} sl@0: set ::go 0 sl@0: } sl@0: if {$r=="1 {disk I/O error}"} { sl@0: set r {1 {database or disk is full}} sl@0: } sl@0: set r sl@0: } {1 {database or disk is full}} sl@0: set ::sqlite_diskfull_pending 0 sl@0: db close sl@0: sqlite3 db test.db sl@0: integrity_check ${prefix}.$::i.2 sl@0: } sl@0: } sl@0: sl@0: do_diskfull_test diskfull-2 VACUUM sl@0: sl@0: # db close sl@0: # file delete -force test.db sl@0: # file delete -force test.db-journal sl@0: # sqlite3 db test.db sl@0: # sl@0: # do_test diskfull-3.1 { sl@0: # execsql { sl@0: # PRAGMA default_cache_size = 10; sl@0: # CREATE TABLE t3(a, b, UNIQUE(a, b)); sl@0: # INSERT INTO t3 VALUES( randstr(100, 100), randstr(100, 100) ); sl@0: # INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3; sl@0: # INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3; sl@0: # INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3; sl@0: # INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3; sl@0: # INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3; sl@0: # INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3; sl@0: # INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3; sl@0: # UPDATE t3 sl@0: # SET b = (SELECT a FROM t3 WHERE rowid = (SELECT max(rowid)-1 FROM t3)) sl@0: # WHERE rowid = (SELECT max(rowid) FROM t3); sl@0: # PRAGMA cache_size; sl@0: # } sl@0: # } {10} sl@0: # sl@0: # do_diskfull_test diskfull-3.2 { sl@0: # BEGIN; sl@0: # INSERT INTO t3 VALUES( randstr(100, 100), randstr(100, 100) ); sl@0: # UPDATE t3 SET a = b; sl@0: # COMMIT; sl@0: # } sl@0: sl@0: finish_test