Fix a case where a corrupt stat4 record could go unrecognized due to integer overflow.
[sqlite.git] / test / diskfull.test
blob391dfb4fcf440f7515f1dbb1f3f812737408f561
1 # 2001 October 12
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
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.
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 $
17 set testdir [file dirname $argv0]
18 source $testdir/tester.tcl
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
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   }
82 do_diskfull_test diskfull-2 VACUUM
84 # db close
85 # forcedelete test.db
86 # forcedelete 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}
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 # }
115 finish_test