1# 2011 May 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. Specifically, 12# it tests that ticket [2d1a5c67dfc2363e44f29d9bbd57f7331851390a] has 13# been resolved. 14# 15# 16# 17 18set testdir [file dirname $argv0] 19source $testdir/tester.tcl 20set testprefix tkt-2d1a5c67d 21 22ifcapable {!vtab || !incrblob} {finish_test; return} 23if {[wal_is_capable]==0} {finish_test; return} 24 25for {set ii 1} {$ii<=10} {incr ii} { 26 do_test tkt-2d1a5c67d.1.$ii { 27 db close 28 forcedelete test.db test.db-wal 29 sqlite3 db test.db 30 db eval "PRAGMA cache_size=$::ii" 31 db eval { 32 PRAGMA journal_mode=WAL; 33 CREATE TABLE t1(a,b); 34 CREATE INDEX t1b ON t1(b); 35 CREATE TABLE t2(x,y UNIQUE); 36 INSERT INTO t2 VALUES(3,4); 37 BEGIN; 38 INSERT INTO t1(a,b) VALUES(1,2); 39 SELECT 'A', * FROM t2 WHERE y=4; 40 SELECT 'B', * FROM t1; 41 COMMIT; 42 SELECT 'C', * FROM t1; 43 } 44 } {wal A 3 4 B 1 2 C 1 2} 45} 46 47db close 48forcedelete test.db test.db-wal 49sqlite3 db test.db 50load_static_extension db wholenumber 51db eval { 52 PRAGMA journal_mode=WAL; 53 CREATE TABLE t1(a,b); 54 CREATE INDEX t1b ON t1(b); 55 CREATE TABLE t2(x,y); 56 CREATE VIRTUAL TABLE nums USING wholenumber; 57 INSERT INTO t2 SELECT value, randomblob(1000) FROM nums 58 WHERE value BETWEEN 1 AND 1000; 59} 60 61for {set ii 1} {$ii<=10} {incr ii} { 62 do_test tkt-2d1a5c67d.2.$ii { 63 db eval "PRAGMA cache_size=$::ii" 64 db eval { 65 DELETE FROM t1; 66 BEGIN; 67 INSERT INTO t1(a,b) VALUES(1,2); 68 SELECT sum(length(y)) FROM t2; 69 COMMIT; 70 SELECT * FROM t1; 71 } 72 } {1000000 1 2} 73} 74 75db close 76sqlite3 db test.db 77 78 79do_execsql_test 3.1 { 80 PRAGMA cache_size = 10; 81 CREATE TABLE t3(a INTEGER PRIMARY KEY, b); 82 CREATE TABLE t4(a); 83} 84 85do_execsql_test 3.2 { 86 INSERT INTO t3 VALUES(NULL, randomblob(500)); 87 INSERT INTO t3 SELECT NULL, b||b FROM t3; -- 2 88 INSERT INTO t3 SELECT NULL, b||b FROM t3; -- 4 89 INSERT INTO t3 SELECT NULL, b||b FROM t3; -- 8 90 INSERT INTO t3 SELECT NULL, b||b FROM t3; -- 16 91 INSERT INTO t3 SELECT NULL, b||b FROM t3; -- 32 92 INSERT INTO t3 SELECT NULL, b||b FROM t3; -- 64 93 INSERT INTO t3 SELECT NULL, b||b FROM t3; -- 128 94} 95 96do_execsql_test 3.3 { 97 BEGIN; 98 INSERT INTO t4 VALUES('xyz'); 99} 100 101do_test 3.4 { 102 set blobs [list] 103 for {set i 1} {$i<100} {incr i} { 104 set b [db incrblob -readonly t3 b $i] 105 read $b 106 lappend blobs $b 107 } 108 109 execsql COMMIT 110 execsql { SELECT * FROM t4 WHERE a = 'xyz' } 111} {xyz} 112 113do_test 3.5 { 114 foreach b $blobs { close $b } 115 execsql { SELECT * FROM t4 WHERE a = 'xyz' } 116} {xyz} 117 118# Check that recovery works on the WAL file. 119# 120forcedelete test.db2-wal test.db2 121do_test 3.6 { 122 copy_file test.db-wal test.db2-wal 123 copy_file test.db test.db2 124 sqlite3 db2 test.db2 125 execsql { SELECT * FROM t4 WHERE a = 'xyz' } db2 126} {xyz} 127 128finish_test 129