116 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| # 2001 October 12
 | |
| #
 | |
| # The author disclaims copyright to this source code.  In place of
 | |
| # a legal notice, here is a blessing:
 | |
| #
 | |
| #    May you do good and not evil.
 | |
| #    May you find forgiveness for yourself and forgive others.
 | |
| #    May you share freely, never taking more than you give.
 | |
| #
 | |
| #***********************************************************************
 | |
| # This file implements regression tests for SQLite library.  The
 | |
| # focus of this file is testing for correct handling of disk full
 | |
| # errors.
 | |
| # 
 | |
| # $Id: diskfull.test,v 1.8 2008/07/12 14:52:20 drh Exp $
 | |
| 
 | |
| set testdir [file dirname $argv0]
 | |
| source $testdir/tester.tcl
 | |
| 
 | |
| set sqlite_io_error_persist 0
 | |
| set sqlite_io_error_hit 0
 | |
| set sqlite_io_error_pending 0
 | |
| do_test diskfull-1.1 {
 | |
|   execsql {
 | |
|     CREATE TABLE t1(x);
 | |
|     INSERT INTO t1 VALUES(randstr(1000,1000));
 | |
|     INSERT INTO t1 SELECT * FROM t1;
 | |
|     INSERT INTO t1 SELECT * FROM t1;
 | |
|     INSERT INTO t1 SELECT * FROM t1;
 | |
|     INSERT INTO t1 SELECT * FROM t1;
 | |
|     CREATE INDEX t1i1 ON t1(x);
 | |
|     CREATE TABLE t2 AS SELECT x AS a, x AS b FROM t1;
 | |
|     CREATE INDEX t2i1 ON t2(b);
 | |
|   }
 | |
| } {}
 | |
| set sqlite_diskfull_pending 0
 | |
| integrity_check diskfull-1.2
 | |
| do_test diskfull-1.3 {
 | |
|   set sqlite_diskfull_pending 1
 | |
|   catchsql {
 | |
|     INSERT INTO t1 SELECT * FROM t1;
 | |
|   }
 | |
| } {1 {database or disk is full}}
 | |
| set sqlite_diskfull_pending 0
 | |
| integrity_check diskfull-1.4
 | |
| do_test diskfull-1.5 {
 | |
|   set sqlite_diskfull_pending 1
 | |
|   catchsql {
 | |
|     DELETE FROM t1;
 | |
|   }
 | |
| } {1 {database or disk is full}}
 | |
| set sqlite_diskfull_pending 0
 | |
| set sqlite_io_error_hit 0
 | |
| integrity_check diskfull-1.6
 | |
| 
 | |
| proc do_diskfull_test {prefix sql} {
 | |
|   set ::go 1
 | |
|   set ::sql $sql
 | |
|   set ::i 1
 | |
|   while {$::go} {
 | |
|     incr ::i
 | |
|     do_test ${prefix}.$::i.1 {
 | |
|       set ::sqlite_diskfull_pending $::i
 | |
|       set ::sqlite_diskfull 0
 | |
|       set r [catchsql $::sql]
 | |
|       if {!$::sqlite_diskfull} {
 | |
|         set r {1 {database or disk is full}}
 | |
|         set ::go 0
 | |
|       }
 | |
|       if {$r=="1 {disk I/O error}"} {
 | |
|         set r {1 {database or disk is full}}
 | |
|       }
 | |
|       set r
 | |
|     } {1 {database or disk is full}}
 | |
|     set ::sqlite_diskfull_pending 0
 | |
|     db close
 | |
|     sqlite3 db test.db
 | |
|     integrity_check ${prefix}.$::i.2
 | |
|   }
 | |
| }
 | |
| 
 | |
| do_diskfull_test diskfull-2 VACUUM
 | |
| 
 | |
| # db close
 | |
| # forcedelete test.db
 | |
| # forcedelete test.db-journal
 | |
| # sqlite3 db test.db
 | |
| # 
 | |
| # do_test diskfull-3.1 {
 | |
| #   execsql {
 | |
| #     PRAGMA default_cache_size = 10;
 | |
| #     CREATE TABLE t3(a, b, UNIQUE(a, b));
 | |
| #     INSERT INTO t3 VALUES( randstr(100, 100), randstr(100, 100) );
 | |
| #     INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
 | |
| #     INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
 | |
| #     INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
 | |
| #     INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
 | |
| #     INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
 | |
| #     INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
 | |
| #     INSERT INTO t3 SELECT randstr(100, 100), randstr(100, 100) FROM t3;
 | |
| #     UPDATE t3 
 | |
| #     SET b = (SELECT a FROM t3 WHERE rowid = (SELECT max(rowid)-1 FROM t3))
 | |
| #     WHERE rowid = (SELECT max(rowid) FROM t3);
 | |
| #     PRAGMA cache_size;
 | |
| #   }
 | |
| # } {10}
 | |
| # 
 | |
| # do_diskfull_test diskfull-3.2 {
 | |
| #   BEGIN;
 | |
| #     INSERT INTO t3 VALUES( randstr(100, 100), randstr(100, 100) );
 | |
| #     UPDATE t3 SET a = b;
 | |
| #   COMMIT;
 | |
| # }
 | |
| 
 | |
| finish_test
 | 
