1: # 2007 December 19
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: # during incremental vacuum with a shared cache.
14: #
15: # $Id: ioerr4.test,v 1.1.1.1 2012/02/21 17:04:16 misho Exp $
16:
17: set testdir [file dirname $argv0]
18: source $testdir/tester.tcl
19:
20: # This test requires both shared cache and incremental vacuum.
21: #
22: ifcapable {!shared_cache || !autovacuum} {
23: finish_test
24: return
25: }
26:
27: # Enable shared cache mode and incremental vacuum.
28: #
29: do_test ioerr4-1.1 {
30: db close
31: set ::enable_shared_cache [sqlite3_enable_shared_cache 1]
32: } {0}
33: do_test ioerr4-1.2 {
34: forcedelete test.db test.db-journal
35: sqlite3 db test.db
36: sqlite3 db2 test.db
37: db eval {
38: PRAGMA auto_vacuum=INCREMENTAL;
39: CREATE TABLE a(i INTEGER, b BLOB);
40: }
41: db2 eval {
42: SELECT name FROM sqlite_master
43: }
44: } {a}
45: do_test ioerr4-1.3 {
46: db eval {
47: PRAGMA auto_vacuum;
48: }
49: } {2}
50:
51: # Insert and delete many records in order to put lots of pages
52: # on the freelist.
53: #
54: do_test ioerr4-1.4 {
55: db eval {
56: INSERT INTO a VALUES(1, zeroblob(2000));
57: INSERT INTO a VALUES(2, zeroblob(2000));
58: INSERT INTO a SELECT i+2, zeroblob(2000) FROM a;
59: INSERT INTO a SELECT i+4, zeroblob(2000) FROM a;
60: INSERT INTO a SELECT i+8, zeroblob(2000) FROM a;
61: INSERT INTO a SELECT i+16, zeroblob(2000) FROM a;
62: SELECT count(*) FROM a;
63: }
64: } {32}
65: do_test ioerr4-1.5 {
66: db eval {
67: PRAGMA freelist_count
68: }
69: } {0}
70: do_test ioerr4-1.6 {
71: db eval {
72: DELETE FROM a;
73: PRAGMA freelist_count;
74: }
75: } {64}
76:
77: # Set up for an I/O error on incremental vacuum
78: # with two connections on shared cache.
79: #
80: db close
81: db2 close
82: forcecopy test.db test.db-bu
83: do_ioerr_test ioerr4-2 -tclprep {
84: catch {db2 close}
85: db close
86: forcedelete test.db test.db-journal
87: forcecopy test.db-bu test.db
88: sqlite3_enable_shared_cache 1
89: set ::DB [sqlite3 db test.db; sqlite3_connection_pointer db]
90: db eval {PRAGMA auto_vacuum=INCREMENTAL}
91: sqlite3 db2 test.db
92: } -tclbody {
93: db eval {PRAGMA incremental_vacuum(5)}
94: }
95:
96: db2 close
97: forcedelete test.db-bu
98: sqlite3_enable_shared_cache $::enable_shared_cache
99:
100: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>