Improve the code coverage of "permutations.test coverage-pager".

FossilOrigin-Name: b095e2cdb61ca8487255687f58fb1024d40f3986
This commit is contained in:
dan 2013-04-05 20:40:43 +00:00
parent ced9813b12
commit d7a558a9fb
7 changed files with 451 additions and 37 deletions

View File

@ -1,5 +1,5 @@
C Add\sfurther\smulti-client\stests\sto\smmap1.test. C Improve\sthe\scode\scoverage\sof\s"permutations.test\scoverage-pager".
D 2013-04-04T19:32:53.279 D 2013-04-05T20:40:43.227
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in aafa71d66bab7e87fb2f348152340645f79f0244 F Makefile.in aafa71d66bab7e87fb2f348152340645f79f0244
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@ -229,7 +229,7 @@ F src/test_superlock.c 2b97936ca127d13962c3605dbc9a4ef269c424cd
F src/test_syscall.c 7e8293e4e6971b0f44c7f7f37b1315a8cc9f6018 F src/test_syscall.c 7e8293e4e6971b0f44c7f7f37b1315a8cc9f6018
F src/test_tclvar.c f4dc67d5f780707210d6bb0eb6016a431c04c7fa F src/test_tclvar.c f4dc67d5f780707210d6bb0eb6016a431c04c7fa
F src/test_thread.c e286f2173563f2a1747c24bcda6b9d030bf4f4e4 F src/test_thread.c e286f2173563f2a1747c24bcda6b9d030bf4f4e4
F src/test_vfs.c fb16b2d9938cf0c1afc5a423b55b952fcc024275 F src/test_vfs.c 8e6087a8b3dcc260282074b0efba14b76311120c
F src/test_vfstrace.c 34b544e80ba7fb77be15395a609c669df2e660a2 F src/test_vfstrace.c 34b544e80ba7fb77be15395a609c669df2e660a2
F src/test_wholenumber.c 3d2b9ed1505c40ad5c5ca2ad16ae7a289d6cc251 F src/test_wholenumber.c 3d2b9ed1505c40ad5c5ca2ad16ae7a289d6cc251
F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
@ -651,10 +651,10 @@ F test/orderby2.test bc11009f7cd99d96b1b11e57b199b00633eb5b04
F test/orderby3.test 8619d06a3debdcd80a27c0fdea5c40b468854b99 F test/orderby3.test 8619d06a3debdcd80a27c0fdea5c40b468854b99
F test/orderby4.test 4d39bfbaaa3ae64d026ca2ff166353d2edca4ba4 F test/orderby4.test 4d39bfbaaa3ae64d026ca2ff166353d2edca4ba4
F test/oserror.test 50417780d0e0d7cd23cf12a8277bb44024765df3 F test/oserror.test 50417780d0e0d7cd23cf12a8277bb44024765df3
F test/pager1.test 31c04bec797dda1bde337810b52efa08d1f1f08e F test/pager1.test 622bfaea80604a96010f35256a4fc22fce584e95
F test/pager2.test 745b911dde3d1f24ae0870bd433dfa83d7c658c1 F test/pager2.test 745b911dde3d1f24ae0870bd433dfa83d7c658c1
F test/pager3.test 3856d9c80839be0668efee1b74811b1b7f7fc95f F test/pager3.test 3856d9c80839be0668efee1b74811b1b7f7fc95f
F test/pagerfault.test fc2e37b2da626826dd54bb13720b4d721719b660 F test/pagerfault.test 636c01bdbdb2bb2baf68532d6c4ef4c633022743
F test/pagerfault2.test 1f79ea40d1133b2683a2f811b00f2399f7ec2401 F test/pagerfault2.test 1f79ea40d1133b2683a2f811b00f2399f7ec2401
F test/pagerfault3.test f16e2efcb5fc9996d1356f7cbc44c998318ae1d7 F test/pagerfault3.test f16e2efcb5fc9996d1356f7cbc44c998318ae1d7
F test/pageropt.test 32cb5a6ed7ccddf8e8c842cb44240bd9340223ce F test/pageropt.test 32cb5a6ed7ccddf8e8c842cb44240bd9340223ce
@ -955,7 +955,7 @@ F test/vtabF.test fd5ad376f5a34fe0891df1f3cddb4fe7c3eb077e
F test/vtab_alter.test 9e374885248f69e251bdaacf480b04a197f125e5 F test/vtab_alter.test 9e374885248f69e251bdaacf480b04a197f125e5
F test/vtab_err.test 0d4d8eb4def1d053ac7c5050df3024fd47a3fbd8 F test/vtab_err.test 0d4d8eb4def1d053ac7c5050df3024fd47a3fbd8
F test/vtab_shared.test 82f463886e18d7f8395a4b6167c91815efe54839 F test/vtab_shared.test 82f463886e18d7f8395a4b6167c91815efe54839
F test/wal.test 62454b2cf00b311e9e65f898aad0fef536ed561a F test/wal.test bbd98ac09d8fbcaa80ec233757056eb1bbb7cd95
F test/wal2.test d4b470f13c87f6d8268b004380afa04c3c67cb90 F test/wal2.test d4b470f13c87f6d8268b004380afa04c3c67cb90
F test/wal3.test b22eb662bcbc148c5f6d956eaf94b047f7afe9c0 F test/wal3.test b22eb662bcbc148c5f6d956eaf94b047f7afe9c0
F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c
@ -971,7 +971,7 @@ F test/walcksum.test f5447800a157c9e2234fbb8e80243f0813941bde
F test/walcrash.test 4457436593be8c136f9148487c7dccd5e9013af2 F test/walcrash.test 4457436593be8c136f9148487c7dccd5e9013af2
F test/walcrash2.test 019d60b89d96c1937adb2b30b850ac7e86e5a142 F test/walcrash2.test 019d60b89d96c1937adb2b30b850ac7e86e5a142
F test/walcrash3.test 595e44c6197f0d0aa509fc135be2fd0209d11a2c F test/walcrash3.test 595e44c6197f0d0aa509fc135be2fd0209d11a2c
F test/walfault.test 97394d8de82a99f7abf1c12ed229640607fd0ad2 F test/walfault.test 54ad6e849c727f4da463964b9eb8c8e8e155cf82
F test/walhook.test ed00a40ba7255da22d6b66433ab61fab16a63483 F test/walhook.test ed00a40ba7255da22d6b66433ab61fab16a63483
F test/walmode.test 4022fe03ae6e830583672caa101f046438a0473c F test/walmode.test 4022fe03ae6e830583672caa101f046438a0473c
F test/walnoshm.test 84ca10c544632a756467336b7c3b864d493ee496 F test/walnoshm.test 84ca10c544632a756467336b7c3b864d493ee496
@ -1044,7 +1044,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac
P 2b3d9805a28e51f646113e22c2dff2272342306e P a107f75d93b8acd3403d8473a75137378041a833
R 4c631120a8e96e37be49975ee7d63ac7 R 6d11c98ab18b87c4b8798ffe987d9d38
U dan U dan
Z d6d074a538192756f7d91b52bba8b7ce Z 50aa2590d101ae076870fa94f81e976a

View File

@ -1 +1 @@
a107f75d93b8acd3403d8473a75137378041a833 b095e2cdb61ca8487255687f58fb1024d40f3986

View File

@ -125,8 +125,9 @@ struct Testvfs {
#define TESTVFS_ACCESS_MASK 0x00004000 #define TESTVFS_ACCESS_MASK 0x00004000
#define TESTVFS_FULLPATHNAME_MASK 0x00008000 #define TESTVFS_FULLPATHNAME_MASK 0x00008000
#define TESTVFS_READ_MASK 0x00010000 #define TESTVFS_READ_MASK 0x00010000
#define TESTVFS_UNLOCK_MASK 0x00020000
#define TESTVFS_ALL_MASK 0x0001FFFF #define TESTVFS_ALL_MASK 0x0003FFFF
#define TESTVFS_MAX_PAGES 1024 #define TESTVFS_MAX_PAGES 1024
@ -467,8 +468,12 @@ static int tvfsLock(sqlite3_file *pFile, int eLock){
** Unlock an tvfs-file. ** Unlock an tvfs-file.
*/ */
static int tvfsUnlock(sqlite3_file *pFile, int eLock){ static int tvfsUnlock(sqlite3_file *pFile, int eLock){
TestvfsFd *p = tvfsGetFd(pFile); TestvfsFd *pFd = tvfsGetFd(pFile);
return sqlite3OsUnlock(p->pReal, eLock); Testvfs *p = (Testvfs *)pFd->pVfs->pAppData;
if( p->mask&TESTVFS_WRITE_MASK && tvfsInjectIoerr(p) ){
return SQLITE_IOERR_UNLOCK;
}
return sqlite3OsUnlock(pFd->pReal, eLock);
} }
/* /*
@ -1101,6 +1106,7 @@ static int testvfs_obj_cmd(
{ "xClose", TESTVFS_CLOSE_MASK }, { "xClose", TESTVFS_CLOSE_MASK },
{ "xAccess", TESTVFS_ACCESS_MASK }, { "xAccess", TESTVFS_ACCESS_MASK },
{ "xFullPathname", TESTVFS_FULLPATHNAME_MASK }, { "xFullPathname", TESTVFS_FULLPATHNAME_MASK },
{ "xUnlock", TESTVFS_UNLOCK_MASK },
}; };
Tcl_Obj **apElem = 0; Tcl_Obj **apElem = 0;
int nElem = 0; int nElem = 0;

View File

@ -15,6 +15,7 @@ source $testdir/tester.tcl
source $testdir/lock_common.tcl source $testdir/lock_common.tcl
source $testdir/malloc_common.tcl source $testdir/malloc_common.tcl
source $testdir/wal_common.tcl source $testdir/wal_common.tcl
set testprefix pager1
# Do not use a codec for tests in this file, as the database file is # Do not use a codec for tests in this file, as the database file is
# manipulated directly using tcl scripts (using the [hexio_write] command). # manipulated directly using tcl scripts (using the [hexio_write] command).
@ -1382,6 +1383,7 @@ db2 close
# #
testvfs tv -default 1 testvfs tv -default 1
foreach sectorsize { foreach sectorsize {
16
32 64 128 256 512 1024 2048 32 64 128 256 512 1024 2048
4096 8192 16384 32768 65536 131072 262144 4096 8192 16384 32768 65536 131072 262144
} { } {
@ -1404,7 +1406,7 @@ foreach sectorsize {
COMMIT; COMMIT;
} }
file size test.db-journal file size test.db-journal
} [expr $sectorsize > 65536 ? 65536 : $sectorsize] } [expr $sectorsize > 65536 ? 65536 : ($sectorsize<32 ? 512 : $sectorsize)]
do_test pager1-10.$sectorsize.2 { do_test pager1-10.$sectorsize.2 {
execsql { execsql {
@ -2523,4 +2525,211 @@ if {$::tcl_platform(platform)=="unix"} {
} {one two} } {one two}
} }
#-------------------------------------------------------------------------
# Test that appending pages to the database file then moving those pages
# to the free-list before the transaction is committed does not cause
# an error.
#
foreach {tn pragma strsize} {
1 { PRAGMA mmap_limit = 0 } 2400
2 { } 2400
3 { PRAGMA mmap_limit = 0 } 4400
4 { } 4400
} {
reset_db
db func a_string a_string
db eval $pragma
do_execsql_test 34.$tn.1 {
CREATE TABLE t1(a, b);
INSERT INTO t1 VALUES(1, 2);
}
breakpoint
do_execsql_test 34.$tn.2 {
BEGIN;
INSERT INTO t1 VALUES(2, a_string($strsize));
DELETE FROM t1 WHERE oid=2;
COMMIT;
PRAGMA integrity_check;
} {ok}
}
#-------------------------------------------------------------------------
#
reset_db
do_test 35 {
sqlite3 db test.db
execsql {
CREATE TABLE t1(x, y);
PRAGMA journal_mode = WAL;
INSERT INTO t1 VALUES(1, 2);
}
execsql {
BEGIN;
CREATE TABLE t2(a, b);
}
hexio_write test.db-shm [expr 16*1024] [string repeat 0055 8192]
catchsql ROLLBACK
} {0 {}}
do_multiclient_test tn {
sql1 {
PRAGMA auto_vacuum = 0;
CREATE TABLE t1(x, y);
INSERT INTO t1 VALUES(1, 2);
}
do_test 36.$tn.1 {
sql2 { PRAGMA max_page_count = 2 }
list [catch { sql2 { CREATE TABLE t2(x) } } msg] $msg
} {1 {database or disk is full}}
sql1 { PRAGMA checkpoint_fullfsync = 1 }
sql1 { CREATE TABLE t2(x) }
do_test 36.$tn.2 {
sql2 { INSERT INTO t2 VALUES('xyz') }
list [catch { sql2 { CREATE TABLE t3(x) } } msg] $msg
} {1 {database or disk is full}}
}
forcedelete test1 test2
foreach {tn uri} {
1 {file:?mode=memory&cache=shared}
2 {file:one?mode=memory&cache=shared}
3 {file:test1?cache=shared}
4 {file:test2?another=parameter&yet=anotherone}
} {
do_test 37.$tn {
catch { db close }
sqlite3_shutdown
sqlite3_config_uri 1
sqlite3 db $uri
db eval {
CREATE TABLE t1(x);
INSERT INTO t1 VALUES(1);
SELECT * FROM t1;
}
} {1}
db close
sqlite3_shutdown
sqlite3_config_uri 0
}
do_test 38.1 {
catch { db close }
forcedelete test.db
set fd [open test.db w]
puts $fd "hello world"
close $fd
sqlite3 db test.db
catchsql { CREATE TABLE t1(x) }
} {1 {file is encrypted or is not a database}}
do_test 38.2 {
catch { db close }
forcedelete test.db
} {}
do_test 39.1 {
sqlite3 db test.db
execsql {
PRAGMA auto_vacuum = 1;
CREATE TABLE t1(x);
INSERT INTO t1 VALUES('xxx');
INSERT INTO t1 VALUES('two');
INSERT INTO t1 VALUES(randomblob(400));
INSERT INTO t1 VALUES(randomblob(400));
INSERT INTO t1 VALUES(randomblob(400));
INSERT INTO t1 VALUES(randomblob(400));
BEGIN;
UPDATE t1 SET x = 'one' WHERE rowid=1;
}
set ::stmt [sqlite3_prepare db "SELECT * FROM t1 ORDER BY rowid" -1 dummy]
sqlite3_step $::stmt
sqlite3_column_text $::stmt 0
} {one}
do_test 39.2 {
execsql { CREATE TABLE t2(x) }
sqlite3_step $::stmt
sqlite3_column_text $::stmt 0
} {two}
do_test 39.3 {
sqlite3_finalize $::stmt
execsql COMMIT
} {}
do_execsql_test 39.4 {
PRAGMA auto_vacuum = 2;
CREATE TABLE t3(x);
CREATE TABLE t4(x);
DROP TABLE t2;
DROP TABLE t3;
DROP TABLE t4;
}
do_test 39.5 {
db close
sqlite3 db test.db
execsql {
PRAGMA cache_size = 1;
PRAGMA incremental_vacuum;
PRAGMA integrity_check;
}
} {ok}
do_test 40.1 {
reset_db
execsql {
PRAGMA auto_vacuum = 1;
CREATE TABLE t1(x PRIMARY KEY);
INSERT INTO t1 VALUES(randomblob(1200));
PRAGMA page_count;
}
} {6}
do_test 40.2 {
execsql {
INSERT INTO t1 VALUES(randomblob(1200));
INSERT INTO t1 VALUES(randomblob(1200));
INSERT INTO t1 VALUES(randomblob(1200));
}
} {}
do_test 40.3 {
db close
sqlite3 db test.db
execsql {
PRAGMA cache_size = 1;
CREATE TABLE t2(x);
PRAGMA integrity_check;
}
} {ok}
do_test 41.1 {
reset_db
execsql {
CREATE TABLE t1(x PRIMARY KEY);
INSERT INTO t1 VALUES(randomblob(200));
INSERT INTO t1 SELECT randomblob(200) FROM t1;
INSERT INTO t1 SELECT randomblob(200) FROM t1;
INSERT INTO t1 SELECT randomblob(200) FROM t1;
INSERT INTO t1 SELECT randomblob(200) FROM t1;
INSERT INTO t1 SELECT randomblob(200) FROM t1;
INSERT INTO t1 SELECT randomblob(200) FROM t1;
}
} {}
do_test 41.2 {
testvfs tv -default 1
tv sectorsize 16384;
tv devchar [list]
db close
sqlite3 db test.db
execsql {
PRAGMA cache_size = 1;
DELETE FROM t1 WHERE rowid%4;
PRAGMA integrity_check;
}
} {ok}
finish_test finish_test

View File

@ -1246,6 +1246,7 @@ do_faultsim_test pagerfault-27 -faults ioerr-persistent -prep {
faultsim_integrity_check faultsim_integrity_check
} }
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
do_test pagerfault-28-pre { do_test pagerfault-28-pre {
@ -1279,7 +1280,7 @@ do_test pagerfault-28-pre {
} {1} } {1}
faultsim_save_and_close faultsim_save_and_close
do_faultsim_test pagerfault-28 -faults oom* -prep { do_faultsim_test pagerfault-28a -faults oom* -prep {
faultsim_restore_and_reopen faultsim_restore_and_reopen
execsql { PRAGMA mmap_limit=0 } execsql { PRAGMA mmap_limit=0 }
@ -1303,5 +1304,185 @@ do_faultsim_test pagerfault-28 -faults oom* -prep {
faultsim_integrity_check faultsim_integrity_check
} }
faultsim_restore_and_reopen
sqlite3 db2 test.db
db2 eval {SELECT count(*) FROM t2}
db close
do_faultsim_test pagerfault-28b -faults oom* -prep {
sqlite3 db test.db
} -body {
execsql { SELECT count(*) FROM t2 }
} -test {
faultsim_test_result {0 2048}
db close
}
db2 close
#-------------------------------------------------------------------------
# Try this:
#
# 1) Put the pager in ERROR state (error during rollback)
#
# 2) Next time the connection is used inject errors into all xWrite() and
# xUnlock() calls. This causes the hot-journal rollback to fail and
# the pager to declare its locking state UNKNOWN.
#
# 3) Same again.
#
# 4a) Stop injecting errors. Allow the rollback to succeed. Check that
# the database is Ok. Or,
#
# 4b) Close and reopen the db. Check that the db is Ok.
#
proc custom_injectinstall {} {
testvfs custom -default true
custom filter {xWrite xUnlock}
}
proc custom_injectuninstall {} {
catch {db close}
catch {db2 close}
custom delete
}
proc custom_injectstart {iFail} {
custom ioerr $iFail 1
}
proc custom_injectstop {} {
custom ioerr
}
set ::FAULTSIM(custom) [list \
-injectinstall custom_injectinstall \
-injectstart custom_injectstart \
-injectstop custom_injectstop \
-injecterrlist {{1 {disk I/O error}}} \
-injectuninstall custom_injectuninstall \
]
do_test pagerfault-29-pre {
faultsim_delete_and_reopen
db func a_string a_string
execsql {
PRAGMA page_size = 1024;
PRAGMA cache_size = 5;
BEGIN;
CREATE TABLE t2(a UNIQUE, b UNIQUE);
INSERT INTO t2 VALUES( a_string(800), a_string(800) );
INSERT INTO t2 SELECT a_string(800), a_string(800) FROM t2;
INSERT INTO t2 SELECT a_string(800), a_string(800) FROM t2;
INSERT INTO t2 SELECT a_string(800), a_string(800) FROM t2;
INSERT INTO t2 SELECT a_string(800), a_string(800) FROM t2;
COMMIT;
}
expr {[file size test.db] >= 50*1024}
} {1}
faultsim_save_and_close
foreach {tn tt} {
29 { catchsql ROLLBACK }
30 { db close ; sqlite3 db test.db }
} {
do_faultsim_test pagerfault-$tn -faults custom -prep {
faultsim_restore_and_reopen
db func a_string a_string
execsql {
PRAGMA cache_size = 5;
BEGIN;
UPDATE t2 SET a = a_string(799);
}
} -body {
catchsql ROLLBACK
catchsql ROLLBACK
catchsql ROLLBACK
} -test {
eval $::tt
if {"ok" != [db one {PRAGMA integrity_check}]} {
error "integrity check failed"
}
}
}
do_test pagerfault-31-pre {
sqlite3_shutdown
sqlite3_config_uri 1
} {SQLITE_OK}
do_faultsim_test pagerfault-31 -faults oom* -body {
sqlite3 db {file:one?mode=memory&cache=shared}
db eval {
CREATE TABLE t1(x);
INSERT INTO t1 VALUES(1);
SELECT * FROM t1;
}
} -test {
faultsim_test_result {0 1} {1 {}}
catch { db close }
}
sqlite3_shutdown
sqlite3_config_uri 0
do_test pagerfault-32-pre {
reset_db
execsql {
CREATE TABLE t1(x);
INSERT INTO t1 VALUES('one');
}
} {}
faultsim_save_and_close
do_faultsim_test pagerfault-32 -prep {
faultsim_restore_and_reopen
db eval { SELECT * FROM t1; }
} -body {
execsql { SELECT * FROM t1; }
} -test {
faultsim_test_result {0 one}
}
sqlite3_shutdown
sqlite3_config_uri 0
do_faultsim_test pagerfault-33a -prep {
sqlite3 db :memory:
execsql {
CREATE TABLE t1(a, b);
INSERT INTO t1 VALUES(1, 2);
}
} -body {
execsql { VACUUM }
} -test {
faultsim_test_result {0 {}}
}
do_faultsim_test pagerfault-33b -prep {
sqlite3 db ""
execsql {
CREATE TABLE t1(a, b);
INSERT INTO t1 VALUES(1, 2);
}
} -body {
execsql { VACUUM }
} -test {
faultsim_test_result {0 {}}
}
do_test pagerfault-34-pre {
reset_db
execsql {
CREATE TABLE t1(x PRIMARY KEY);
}
} {}
faultsim_save_and_close
do_faultsim_test pagerfault-34 -prep {
faultsim_restore_and_reopen
execsql {
BEGIN;
INSERT INTO t1 VALUES( randomblob(4000) );
DELETE FROM t1;
}
} -body {
execsql COMMIT
} -test {
faultsim_test_result {0 {}}
}
finish_test finish_test

View File

@ -1569,26 +1569,6 @@ ifcapable autovacuum {
} [wal_file_size 1 1024] } [wal_file_size 1 1024]
} }
reset_db
do_test 25 {
sqlite3 db test.db
execsql {
CREATE TABLE t1(x, y);
PRAGMA journal_mode = WAL;
INSERT INTO t1 VALUES(1, 2);
}
execsql {
BEGIN;
CREATE TABLE t2(a, b);
}
hexio_write test.db-shm [expr 16*1024] [string repeat 0055 8192]
catchsql ROLLBACK
} {0 {}}
db close db close
sqlite3_shutdown sqlite3_shutdown
test_sqlite3_log test_sqlite3_log

View File

@ -548,6 +548,44 @@ do_faultsim_test walfault-14 -prep {
set nRow [db eval {SELECT count(*) FROM abc}] set nRow [db eval {SELECT count(*) FROM abc}]
if {!(($nRow==2 && $testrc) || $nRow==3)} { error "Bad db content" } if {!(($nRow==2 && $testrc) || $nRow==3)} { error "Bad db content" }
} }
finish_test
#-------------------------------------------------------------------------
# Test fault-handling when switching out of exclusive-locking mode.
#
do_test walfault-14-pre {
faultsim_delete_and_reopen
execsql {
PRAGMA auto_vacuum = 0;
PRAGMA journal_mode = WAL;
BEGIN;
CREATE TABLE abc(a PRIMARY KEY);
INSERT INTO abc VALUES(randomblob(1500));
INSERT INTO abc VALUES(randomblob(1500));
COMMIT;
}
faultsim_save_and_close
} {}
do_faultsim_test walfault-14 -prep {
faultsim_restore_and_reopen
breakpoint
execsql {
SELECT count(*) FROM abc;
PRAGMA locking_mode = exclusive;
BEGIN;
INSERT INTO abc VALUES(randomblob(1500));
COMMIT;
}
} -body {
db eval {
PRAGMA locking_mode = normal;
BEGIN;
INSERT INTO abc VALUES(randomblob(1500));
COMMIT;
}
} -test {
faultsim_integrity_check
set nRow [db eval {SELECT count(*) FROM abc}]
if {$nRow!=3 && $nRow!=4} { error "Bad db content" }
}
finish_test finish_test