xref: /sqlite-3.40.0/test/diskfull.test (revision fda06bef)
1047d4836Sdrh# 2001 October 12
2047d4836Sdrh#
3047d4836Sdrh# The author disclaims copyright to this source code.  In place of
4047d4836Sdrh# a legal notice, here is a blessing:
5047d4836Sdrh#
6047d4836Sdrh#    May you do good and not evil.
7047d4836Sdrh#    May you find forgiveness for yourself and forgive others.
8047d4836Sdrh#    May you share freely, never taking more than you give.
9047d4836Sdrh#
10047d4836Sdrh#***********************************************************************
11047d4836Sdrh# This file implements regression tests for SQLite library.  The
12047d4836Sdrh# focus of this file is testing for correct handling of disk full
13047d4836Sdrh# errors.
14047d4836Sdrh#
15e8f52c50Sdrh# $Id: diskfull.test,v 1.8 2008/07/12 14:52:20 drh Exp $
16047d4836Sdrh
17047d4836Sdrhset testdir [file dirname $argv0]
18047d4836Sdrhsource $testdir/tester.tcl
19047d4836Sdrh
20a7aea3ddSdrhset sqlite_io_error_persist 0
21a7aea3ddSdrhset sqlite_io_error_hit 0
22a7aea3ddSdrhset sqlite_io_error_pending 0
23047d4836Sdrhdo_test diskfull-1.1 {
24047d4836Sdrh  execsql {
25047d4836Sdrh    CREATE TABLE t1(x);
26047d4836Sdrh    INSERT INTO t1 VALUES(randstr(1000,1000));
27047d4836Sdrh    INSERT INTO t1 SELECT * FROM t1;
28f307a4aaSdrh    INSERT INTO t1 SELECT * FROM t1;
29f307a4aaSdrh    INSERT INTO t1 SELECT * FROM t1;
30f307a4aaSdrh    INSERT INTO t1 SELECT * FROM t1;
31f307a4aaSdrh    CREATE INDEX t1i1 ON t1(x);
32f307a4aaSdrh    CREATE TABLE t2 AS SELECT x AS a, x AS b FROM t1;
33f307a4aaSdrh    CREATE INDEX t2i1 ON t2(b);
34047d4836Sdrh  }
35047d4836Sdrh} {}
36f307a4aaSdrhset sqlite_diskfull_pending 0
37f307a4aaSdrhintegrity_check diskfull-1.2
38f307a4aaSdrhdo_test diskfull-1.3 {
39047d4836Sdrh  set sqlite_diskfull_pending 1
40047d4836Sdrh  catchsql {
41047d4836Sdrh    INSERT INTO t1 SELECT * FROM t1;
42047d4836Sdrh  }
432db0bbc2Sdrh} {1 {database or disk is full}}
44f307a4aaSdrhset sqlite_diskfull_pending 0
45f307a4aaSdrhintegrity_check diskfull-1.4
46f307a4aaSdrhdo_test diskfull-1.5 {
47047d4836Sdrh  set sqlite_diskfull_pending 1
48047d4836Sdrh  catchsql {
49047d4836Sdrh    DELETE FROM t1;
50047d4836Sdrh  }
512db0bbc2Sdrh} {1 {database or disk is full}}
52f307a4aaSdrhset sqlite_diskfull_pending 0
53a7aea3ddSdrhset sqlite_io_error_hit 0
54f307a4aaSdrhintegrity_check diskfull-1.6
55f307a4aaSdrh
56393f0689Sdanielk1977proc do_diskfull_test {prefix sql} {
57393f0689Sdanielk1977  set ::go 1
58393f0689Sdanielk1977  set ::sql $sql
59e180dd93Sdanielk1977  set ::i 1
60393f0689Sdanielk1977  while {$::go} {
61393f0689Sdanielk1977    incr ::i
62393f0689Sdanielk1977    do_test ${prefix}.$::i.1 {
63393f0689Sdanielk1977      set ::sqlite_diskfull_pending $::i
64393f0689Sdanielk1977      set ::sqlite_diskfull 0
65393f0689Sdanielk1977      set r [catchsql $::sql]
66393f0689Sdanielk1977      if {!$::sqlite_diskfull} {
67f307a4aaSdrh        set r {1 {database or disk is full}}
68393f0689Sdanielk1977        set ::go 0
69f307a4aaSdrh      }
70f307a4aaSdrh      if {$r=="1 {disk I/O error}"} {
71f307a4aaSdrh        set r {1 {database or disk is full}}
72f307a4aaSdrh      }
73f307a4aaSdrh      set r
74f307a4aaSdrh    } {1 {database or disk is full}}
75393f0689Sdanielk1977    set ::sqlite_diskfull_pending 0
76f307a4aaSdrh    db close
77f307a4aaSdrh    sqlite3 db test.db
78393f0689Sdanielk1977    integrity_check ${prefix}.$::i.2
79393f0689Sdanielk1977  }
80f307a4aaSdrh}
81047d4836Sdrh
82393f0689Sdanielk1977do_diskfull_test diskfull-2 VACUUM
83393f0689Sdanielk1977
84393f0689Sdanielk1977# db close
85*fda06befSmistachkin# forcedelete test.db
86*fda06befSmistachkin# forcedelete test.db-journal
87393f0689Sdanielk1977# sqlite3 db test.db
88393f0689Sdanielk1977#
89393f0689Sdanielk1977# do_test diskfull-3.1 {
90393f0689Sdanielk1977#   execsql {
91393f0689Sdanielk1977#     PRAGMA default_cache_size = 10;
92393f0689Sdanielk1977#     CREATE TABLE t3(a, b, UNIQUE(a, b));
93393f0689Sdanielk1977#     INSERT INTO t3 VALUES( randstr(100, 100), randstr(100, 100) );
94393f0689Sdanielk1977#     INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
95393f0689Sdanielk1977#     INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
96393f0689Sdanielk1977#     INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
97393f0689Sdanielk1977#     INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
98393f0689Sdanielk1977#     INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
99393f0689Sdanielk1977#     INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
100393f0689Sdanielk1977#     INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
101393f0689Sdanielk1977#     UPDATE t3
102393f0689Sdanielk1977#     SET b = (SELECT a FROM t3 WHERE rowid = (SELECT max(rowid)-1 FROM t3))
103393f0689Sdanielk1977#     WHERE rowid = (SELECT max(rowid) FROM t3);
104393f0689Sdanielk1977#     PRAGMA cache_size;
105393f0689Sdanielk1977#   }
106393f0689Sdanielk1977# } {10}
107e8f52c50Sdrh#
108393f0689Sdanielk1977# do_diskfull_test diskfull-3.2 {
109393f0689Sdanielk1977#   BEGIN;
110393f0689Sdanielk1977#     INSERT INTO t3 VALUES( randstr(100, 100), randstr(100, 100) );
111393f0689Sdanielk1977#     UPDATE t3 SET a = b;
112393f0689Sdanielk1977#   COMMIT;
113393f0689Sdanielk1977# }
114393f0689Sdanielk1977
115047d4836Sdrhfinish_test
116