]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Improve the code coverage of "permutations.test coverage-pager".
authordan <dan@noemail.net>
Fri, 5 Apr 2013 20:40:43 +0000 (20:40 +0000)
committerdan <dan@noemail.net>
Fri, 5 Apr 2013 20:40:43 +0000 (20:40 +0000)
FossilOrigin-Name: b095e2cdb61ca8487255687f58fb1024d40f3986

manifest
manifest.uuid
src/test_vfs.c
test/pager1.test
test/pagerfault.test
test/wal.test
test/walfault.test

index 16f405792080e0bbaf04f3ec04567d9ff1240c71..2b89f591ab7f5ea9bf277763a29ec36393bb41bb 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\sfurther\smulti-client\stests\sto\smmap1.test.
-D 2013-04-04T19:32:53.279
+C Improve\sthe\scode\scoverage\sof\s"permutations.test\scoverage-pager".
+D 2013-04-05T20:40:43.227
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in aafa71d66bab7e87fb2f348152340645f79f0244
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -229,7 +229,7 @@ F src/test_superlock.c 2b97936ca127d13962c3605dbc9a4ef269c424cd
 F src/test_syscall.c 7e8293e4e6971b0f44c7f7f37b1315a8cc9f6018
 F src/test_tclvar.c f4dc67d5f780707210d6bb0eb6016a431c04c7fa
 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_wholenumber.c 3d2b9ed1505c40ad5c5ca2ad16ae7a289d6cc251
 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
@@ -651,10 +651,10 @@ F test/orderby2.test bc11009f7cd99d96b1b11e57b199b00633eb5b04
 F test/orderby3.test 8619d06a3debdcd80a27c0fdea5c40b468854b99
 F test/orderby4.test 4d39bfbaaa3ae64d026ca2ff166353d2edca4ba4
 F test/oserror.test 50417780d0e0d7cd23cf12a8277bb44024765df3
-F test/pager1.test 31c04bec797dda1bde337810b52efa08d1f1f08e
+F test/pager1.test 622bfaea80604a96010f35256a4fc22fce584e95
 F test/pager2.test 745b911dde3d1f24ae0870bd433dfa83d7c658c1
 F test/pager3.test 3856d9c80839be0668efee1b74811b1b7f7fc95f
-F test/pagerfault.test fc2e37b2da626826dd54bb13720b4d721719b660
+F test/pagerfault.test 636c01bdbdb2bb2baf68532d6c4ef4c633022743
 F test/pagerfault2.test 1f79ea40d1133b2683a2f811b00f2399f7ec2401
 F test/pagerfault3.test f16e2efcb5fc9996d1356f7cbc44c998318ae1d7
 F test/pageropt.test 32cb5a6ed7ccddf8e8c842cb44240bd9340223ce
@@ -955,7 +955,7 @@ F test/vtabF.test fd5ad376f5a34fe0891df1f3cddb4fe7c3eb077e
 F test/vtab_alter.test 9e374885248f69e251bdaacf480b04a197f125e5
 F test/vtab_err.test 0d4d8eb4def1d053ac7c5050df3024fd47a3fbd8
 F test/vtab_shared.test 82f463886e18d7f8395a4b6167c91815efe54839
-F test/wal.test 62454b2cf00b311e9e65f898aad0fef536ed561a
+F test/wal.test bbd98ac09d8fbcaa80ec233757056eb1bbb7cd95
 F test/wal2.test d4b470f13c87f6d8268b004380afa04c3c67cb90
 F test/wal3.test b22eb662bcbc148c5f6d956eaf94b047f7afe9c0
 F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c
@@ -971,7 +971,7 @@ F test/walcksum.test f5447800a157c9e2234fbb8e80243f0813941bde
 F test/walcrash.test 4457436593be8c136f9148487c7dccd5e9013af2
 F test/walcrash2.test 019d60b89d96c1937adb2b30b850ac7e86e5a142
 F test/walcrash3.test 595e44c6197f0d0aa509fc135be2fd0209d11a2c
-F test/walfault.test 97394d8de82a99f7abf1c12ed229640607fd0ad2
+F test/walfault.test 54ad6e849c727f4da463964b9eb8c8e8e155cf82
 F test/walhook.test ed00a40ba7255da22d6b66433ab61fab16a63483
 F test/walmode.test 4022fe03ae6e830583672caa101f046438a0473c
 F test/walnoshm.test 84ca10c544632a756467336b7c3b864d493ee496
@@ -1044,7 +1044,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
 F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac
-P 2b3d9805a28e51f646113e22c2dff2272342306e
-R 4c631120a8e96e37be49975ee7d63ac7
+P a107f75d93b8acd3403d8473a75137378041a833
+R 6d11c98ab18b87c4b8798ffe987d9d38
 U dan
-Z d6d074a538192756f7d91b52bba8b7ce
+Z 50aa2590d101ae076870fa94f81e976a
index d68eca1adfeca953ec0aaad2fa1395537b20b418..8dbe787aae358fa1ce42764d8fa4c55496478dfb 100644 (file)
@@ -1 +1 @@
-a107f75d93b8acd3403d8473a75137378041a833
\ No newline at end of file
+b095e2cdb61ca8487255687f58fb1024d40f3986
\ No newline at end of file
index 933de995150b15db19161e0aa10d58305c911864..fcd577439cfd6c72dde48358921420cf6ef1f86d 100644 (file)
@@ -125,8 +125,9 @@ struct Testvfs {
 #define TESTVFS_ACCESS_MASK       0x00004000
 #define TESTVFS_FULLPATHNAME_MASK 0x00008000
 #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
@@ -467,8 +468,12 @@ static int tvfsLock(sqlite3_file *pFile, int eLock){
 ** Unlock an tvfs-file.
 */
 static int tvfsUnlock(sqlite3_file *pFile, int eLock){
-  TestvfsFd *p = tvfsGetFd(pFile);
-  return sqlite3OsUnlock(p->pReal, eLock);
+  TestvfsFd *pFd = tvfsGetFd(pFile);
+  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 },
         { "xAccess",       TESTVFS_ACCESS_MASK },
         { "xFullPathname", TESTVFS_FULLPATHNAME_MASK },
+        { "xUnlock",       TESTVFS_UNLOCK_MASK },
       };
       Tcl_Obj **apElem = 0;
       int nElem = 0;
index ae47b3d93228078317dd92b927d828ba6423384d..22c84d55d06c360700c65b7a7d69c4e8d2dd051d 100644 (file)
@@ -15,6 +15,7 @@ source $testdir/tester.tcl
 source $testdir/lock_common.tcl
 source $testdir/malloc_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
 # manipulated directly using tcl scripts (using the [hexio_write] command).
@@ -1382,6 +1383,7 @@ db2 close
 #
 testvfs tv -default 1
 foreach sectorsize {
+    16
     32   64   128   256   512   1024   2048 
     4096 8192 16384 32768 65536 131072 262144
 } {
@@ -1404,7 +1406,7 @@ foreach sectorsize {
       COMMIT;
     }
     file size test.db-journal
-  } [expr $sectorsize > 65536 ? 65536 : $sectorsize]
+  } [expr $sectorsize > 65536 ? 65536 : ($sectorsize<32 ? 512 : $sectorsize)]
 
   do_test pager1-10.$sectorsize.2 {
     execsql { 
@@ -2523,4 +2525,211 @@ if {$::tcl_platform(platform)=="unix"} {
   } {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
index 9ea1aa63288679ca61c06e430d14bf763112bfe0..440909d1a12317cb34b5ccc0ba28436b671a7c69 100644 (file)
@@ -1246,6 +1246,7 @@ do_faultsim_test pagerfault-27 -faults ioerr-persistent -prep {
   faultsim_integrity_check
 }
 
+
 #-------------------------------------------------------------------------
 #
 do_test pagerfault-28-pre {
@@ -1279,7 +1280,7 @@ do_test pagerfault-28-pre {
 } {1}
 faultsim_save_and_close
 
-do_faultsim_test pagerfault-28 -faults oom* -prep {
+do_faultsim_test pagerfault-28a -faults oom* -prep {
   faultsim_restore_and_reopen
   execsql { PRAGMA mmap_limit=0 }
 
@@ -1303,5 +1304,185 @@ do_faultsim_test pagerfault-28 -faults oom* -prep {
   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
 
index f833b6ab1a4516a27f8074b3fdac07b55331cc18..0539192d25a34aed3b19d041b939ed5bf1ac93b8 100644 (file)
@@ -1569,26 +1569,6 @@ ifcapable autovacuum {
   } [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
 sqlite3_shutdown
 test_sqlite3_log
index 6f9aeddea2325e8c8e26f810f6fa0090b6490240..4a9d98afda8c9f85c7c4ba9fcb0ac77fb88d5584 100644 (file)
@@ -548,6 +548,44 @@ do_faultsim_test walfault-14 -prep {
   set nRow [db eval {SELECT count(*) FROM abc}]
   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