blob: 391dfb4fcf440f7515f1dbb1f3f812737408f561 [file] [log] [blame]
drh047d4832004-10-01 14:38:02 +00001# 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#
drhe8f52c52008-07-12 14:52:20 +000015# $Id: diskfull.test,v 1.8 2008/07/12 14:52:20 drh Exp $
drh047d4832004-10-01 14:38:02 +000016
17set testdir [file dirname $argv0]
18source $testdir/tester.tcl
19
drha7aea3d2007-03-15 12:51:16 +000020set sqlite_io_error_persist 0
21set sqlite_io_error_hit 0
22set sqlite_io_error_pending 0
drh047d4832004-10-01 14:38:02 +000023do_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;
drhf307a4a2005-09-09 10:46:19 +000028 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);
drh047d4832004-10-01 14:38:02 +000034 }
35} {}
drhf307a4a2005-09-09 10:46:19 +000036set sqlite_diskfull_pending 0
37integrity_check diskfull-1.2
38do_test diskfull-1.3 {
drh047d4832004-10-01 14:38:02 +000039 set sqlite_diskfull_pending 1
40 catchsql {
41 INSERT INTO t1 SELECT * FROM t1;
42 }
drh2db0bbc2005-08-11 02:10:18 +000043} {1 {database or disk is full}}
drhf307a4a2005-09-09 10:46:19 +000044set sqlite_diskfull_pending 0
45integrity_check diskfull-1.4
46do_test diskfull-1.5 {
drh047d4832004-10-01 14:38:02 +000047 set sqlite_diskfull_pending 1
48 catchsql {
49 DELETE FROM t1;
50 }
drh2db0bbc2005-08-11 02:10:18 +000051} {1 {database or disk is full}}
drhf307a4a2005-09-09 10:46:19 +000052set sqlite_diskfull_pending 0
drha7aea3d2007-03-15 12:51:16 +000053set sqlite_io_error_hit 0
drhf307a4a2005-09-09 10:46:19 +000054integrity_check diskfull-1.6
55
danielk1977393f0682007-03-31 10:00:48 +000056proc do_diskfull_test {prefix sql} {
57 set ::go 1
58 set ::sql $sql
danielk1977e180dd92007-04-05 17:15:52 +000059 set ::i 1
danielk1977393f0682007-03-31 10:00:48 +000060 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 }
drhf307a4a2005-09-09 10:46:19 +000080}
drh047d4832004-10-01 14:38:02 +000081
danielk1977393f0682007-03-31 10:00:48 +000082do_diskfull_test diskfull-2 VACUUM
83
84# db close
mistachkinfda06be2011-08-02 00:57:34 +000085# forcedelete test.db
86# forcedelete test.db-journal
danielk1977393f0682007-03-31 10:00:48 +000087# 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}
drhe8f52c52008-07-12 14:52:20 +0000107#
danielk1977393f0682007-03-31 10:00:48 +0000108# 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
drh047d4832004-10-01 14:38:02 +0000115finish_test