summaryrefslogtreecommitdiff
path: root/test/diskfull.test
diff options
context:
space:
mode:
authorHans-Christoph Steiner <hans@eds.org>2012-03-30 20:42:12 -0400
committerHans-Christoph Steiner <hans@eds.org>2012-03-30 20:42:12 -0400
commit7bb481fda9ecb134804b49c2ce77ca28f7eea583 (patch)
tree31b520b9914d3e2453968abe375f2c102772c3dc /test/diskfull.test
Imported Upstream version 2.0.3
Diffstat (limited to 'test/diskfull.test')
-rw-r--r--test/diskfull.test115
1 files changed, 115 insertions, 0 deletions
diff --git a/test/diskfull.test b/test/diskfull.test
new file mode 100644
index 0000000..391dfb4
--- /dev/null
+++ b/test/diskfull.test
@@ -0,0 +1,115 @@
+# 2001 October 12
+#
+# The author disclaims copyright to this source code. In place of
+# a legal notice, here is a blessing:
+#
+# May you do good and not evil.
+# May you find forgiveness for yourself and forgive others.
+# May you share freely, never taking more than you give.
+#
+#***********************************************************************
+# This file implements regression tests for SQLite library. The
+# focus of this file is testing for correct handling of disk full
+# errors.
+#
+# $Id: diskfull.test,v 1.8 2008/07/12 14:52:20 drh Exp $
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+
+set sqlite_io_error_persist 0
+set sqlite_io_error_hit 0
+set sqlite_io_error_pending 0
+do_test diskfull-1.1 {
+ execsql {
+ CREATE TABLE t1(x);
+ INSERT INTO t1 VALUES(randstr(1000,1000));
+ INSERT INTO t1 SELECT * FROM t1;
+ INSERT INTO t1 SELECT * FROM t1;
+ INSERT INTO t1 SELECT * FROM t1;
+ INSERT INTO t1 SELECT * FROM t1;
+ CREATE INDEX t1i1 ON t1(x);
+ CREATE TABLE t2 AS SELECT x AS a, x AS b FROM t1;
+ CREATE INDEX t2i1 ON t2(b);
+ }
+} {}
+set sqlite_diskfull_pending 0
+integrity_check diskfull-1.2
+do_test diskfull-1.3 {
+ set sqlite_diskfull_pending 1
+ catchsql {
+ INSERT INTO t1 SELECT * FROM t1;
+ }
+} {1 {database or disk is full}}
+set sqlite_diskfull_pending 0
+integrity_check diskfull-1.4
+do_test diskfull-1.5 {
+ set sqlite_diskfull_pending 1
+ catchsql {
+ DELETE FROM t1;
+ }
+} {1 {database or disk is full}}
+set sqlite_diskfull_pending 0
+set sqlite_io_error_hit 0
+integrity_check diskfull-1.6
+
+proc do_diskfull_test {prefix sql} {
+ set ::go 1
+ set ::sql $sql
+ set ::i 1
+ while {$::go} {
+ incr ::i
+ do_test ${prefix}.$::i.1 {
+ set ::sqlite_diskfull_pending $::i
+ set ::sqlite_diskfull 0
+ set r [catchsql $::sql]
+ if {!$::sqlite_diskfull} {
+ set r {1 {database or disk is full}}
+ set ::go 0
+ }
+ if {$r=="1 {disk I/O error}"} {
+ set r {1 {database or disk is full}}
+ }
+ set r
+ } {1 {database or disk is full}}
+ set ::sqlite_diskfull_pending 0
+ db close
+ sqlite3 db test.db
+ integrity_check ${prefix}.$::i.2
+ }
+}
+
+do_diskfull_test diskfull-2 VACUUM
+
+# db close
+# forcedelete test.db
+# forcedelete test.db-journal
+# sqlite3 db test.db
+#
+# do_test diskfull-3.1 {
+# execsql {
+# PRAGMA default_cache_size = 10;
+# CREATE TABLE t3(a, b, UNIQUE(a, b));
+# INSERT INTO t3 VALUES( randstr(100, 100), randstr(100, 100) );
+# INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
+# INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
+# INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
+# INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
+# INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
+# INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
+# INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
+# UPDATE t3
+# SET b = (SELECT a FROM t3 WHERE rowid = (SELECT max(rowid)-1 FROM t3))
+# WHERE rowid = (SELECT max(rowid) FROM t3);
+# PRAGMA cache_size;
+# }
+# } {10}
+#
+# do_diskfull_test diskfull-3.2 {
+# BEGIN;
+# INSERT INTO t3 VALUES( randstr(100, 100), randstr(100, 100) );
+# UPDATE t3 SET a = b;
+# COMMIT;
+# }
+
+finish_test