Home | History | Annotate | Download | only in test
      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