persistentstorage/sqlite3api/TEST/TclScript/diskfull.test
changeset 0 08ec8eefde2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/sqlite3api/TEST/TclScript/diskfull.test	Fri Jan 22 11:06:30 2010 +0200
@@ -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
+# file delete -force test.db
+# file delete -force 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