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 17 set testdir [file dirname $argv0] 18 source $testdir/tester.tcl 19 20 set sqlite_io_error_persist 0 21 set sqlite_io_error_hit 0 22 set sqlite_io_error_pending 0 23 do_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 } {} 36 set sqlite_diskfull_pending 0 37 integrity_check diskfull-1.2 38 do_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}} 44 set sqlite_diskfull_pending 0 45 integrity_check diskfull-1.4 46 do_test diskfull-1.5 { 47 set sqlite_diskfull_pending 1 48 catchsql { 49 DELETE FROM t1; 50 } 51 } {1 {database or disk is full}} 52 set sqlite_diskfull_pending 0 53 set sqlite_io_error_hit 0 54 integrity_check diskfull-1.6 55 56 proc 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 82 do_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 115 finish_test 116