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 I/O errors
     13 # such as writes failing because the disk is full.
     14 # 
     15 # The tests in this file use special facilities that are only
     16 # available in the SQLite test fixture.
     17 #
     18 # $Id: autovacuum_ioerr2.test,v 1.7 2008/07/12 14:52:20 drh Exp $
     19 
     20 set testdir [file dirname $argv0]
     21 source $testdir/tester.tcl
     22 
     23 # If this build of the library does not support auto-vacuum, omit this
     24 # whole file.
     25 ifcapable {!autovacuum} {
     26   finish_test
     27   return
     28 }
     29 
     30 do_ioerr_test autovacuum-ioerr2-1 -sqlprep {
     31   PRAGMA auto_vacuum = 1;
     32   CREATE TABLE abc(a);
     33   INSERT INTO abc VALUES(randstr(1500,1500));
     34 } -sqlbody {
     35   CREATE TABLE abc2(a);
     36   BEGIN;
     37   DELETE FROM abc;
     38   INSERT INTO abc VALUES(randstr(1500,1500));
     39   CREATE TABLE abc3(a);
     40   COMMIT;
     41 }
     42 
     43 do_ioerr_test autovacuum-ioerr2-2 -tclprep {
     44   execsql {
     45     PRAGMA auto_vacuum = 1;
     46     PRAGMA cache_size = 10;
     47     BEGIN;
     48     CREATE TABLE abc(a);
     49     INSERT INTO abc VALUES(randstr(1100,1100)); -- Page 4 is overflow
     50     INSERT INTO abc VALUES(randstr(1100,1100)); -- Page 5 is overflow
     51   }
     52   for {set i 0} {$i<150} {incr i} {
     53     execsql {
     54       INSERT INTO abc VALUES(randstr(100,100)); 
     55     }
     56   }
     57   execsql COMMIT
     58 } -sqlbody {
     59   BEGIN;
     60   DELETE FROM abc WHERE length(a)>100;
     61   UPDATE abc SET a = randstr(90,90);
     62   CREATE TABLE abc3(a);
     63   COMMIT;
     64 }
     65 
     66 do_ioerr_test autovacuum-ioerr2-3 -sqlprep {
     67   PRAGMA auto_vacuum = 1;
     68   CREATE TABLE abc(a);
     69   CREATE TABLE abc2(b);
     70 } -sqlbody {
     71   BEGIN;
     72   INSERT INTO abc2 VALUES(10);
     73   DROP TABLE abc;
     74   COMMIT;
     75   DROP TABLE abc2;
     76 }
     77 
     78 file delete -force backup.db
     79 ifcapable subquery {
     80   do_ioerr_test autovacuum-ioerr2-4 -tclprep {
     81     if {![file exists backup.db]} {
     82       sqlite3 dbb backup.db 
     83       execsql {
     84         PRAGMA auto_vacuum = 1;
     85         BEGIN;
     86         CREATE TABLE abc(a);
     87         INSERT INTO abc VALUES(randstr(1100,1100)); -- Page 4 is overflow
     88         INSERT INTO abc VALUES(randstr(1100,1100)); -- Page 5 is overflow
     89       } dbb
     90       for {set i 0} {$i<2500} {incr i} {
     91         execsql {
     92           INSERT INTO abc VALUES(randstr(100,100)); 
     93         } dbb
     94       }
     95       execsql {
     96         COMMIT;
     97         PRAGMA cache_size = 10;
     98       } dbb
     99       dbb close
    100     }
    101     db close
    102     file delete -force test.db
    103     file delete -force test.db-journal
    104     copy_file backup.db test.db
    105     set ::DB [sqlite3 db test.db]
    106     execsql {
    107       PRAGMA cache_size = 10;
    108     }
    109   } -sqlbody {
    110     BEGIN;
    111     DELETE FROM abc WHERE oid < 3;
    112     UPDATE abc SET a = randstr(100,100) WHERE oid > 2300;
    113     UPDATE abc SET a = randstr(1100,1100) WHERE oid = 
    114         (select max(oid) from abc);
    115     COMMIT;
    116   }
    117 }
    118 
    119 do_ioerr_test autovacuum-ioerr2-1 -sqlprep {
    120   PRAGMA auto_vacuum = 1;
    121   CREATE TABLE abc(a);
    122   INSERT INTO abc VALUES(randstr(1500,1500));
    123 } -sqlbody {
    124   CREATE TABLE abc2(a);
    125   BEGIN;
    126   DELETE FROM abc;
    127   INSERT INTO abc VALUES(randstr(1500,1500));
    128   CREATE TABLE abc3(a);
    129   COMMIT;
    130 }
    131 
    132 finish_test
    133