Annotation of embedaddon/sqlite3/test/walfault.test, revision 1.1
1.1 ! misho 1: # 2010 May 03
! 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 the operation of the library in
! 13: # "PRAGMA journal_mode=WAL" mode.
! 14: #
! 15:
! 16: set testdir [file dirname $argv0]
! 17: source $testdir/tester.tcl
! 18: source $testdir/malloc_common.tcl
! 19: source $testdir/lock_common.tcl
! 20:
! 21: ifcapable !wal {finish_test ; return }
! 22:
! 23: #-------------------------------------------------------------------------
! 24: # This test case, walfault-1-*, simulates faults while executing a
! 25: #
! 26: # PRAGMA journal_mode = WAL;
! 27: #
! 28: # statement immediately after creating a new database.
! 29: #
! 30: do_test walfault-1-pre-1 {
! 31: faultsim_delete_and_reopen
! 32: faultsim_save_and_close
! 33: } {}
! 34: do_faultsim_test walfault-1 -prep {
! 35: faultsim_restore_and_reopen
! 36: } -body {
! 37: db eval { PRAGMA main.journal_mode = WAL }
! 38: } -test {
! 39:
! 40: faultsim_test_result {0 wal}
! 41:
! 42: # Test that the connection that encountered an error as part of
! 43: # "PRAGMA journal_mode = WAL" and a new connection use the same
! 44: # journal mode when accessing the database.
! 45: #
! 46: # If "PRAGMA journal_mode" is executed immediately, connection [db] (the
! 47: # one that hit the error in journal_mode="WAL") might return "wal" even
! 48: # if it failed to switch the database to WAL mode. This is not considered
! 49: # a problem. When it tries to read the database, connection [db] correctly
! 50: # recognizes that it is a rollback database and switches back to a
! 51: # rollback compatible journal mode.
! 52: #
! 53: if {[permutation] != "inmemory_journal"} {
! 54: set jm [db one {SELECT * FROM sqlite_master ; PRAGMA main.journal_mode}]
! 55: sqlite3 db2 test.db
! 56: set jm2 [db2 one {SELECT * FROM sqlite_master ; PRAGMA main.journal_mode}]
! 57: db2 close
! 58:
! 59: if { $jm!=$jm2 } { error "Journal modes do not match: $jm $jm2" }
! 60: if { $testrc==0 && $jm!="wal" } { error "Journal mode is not WAL" }
! 61: }
! 62: }
! 63:
! 64: #--------------------------------------------------------------------------
! 65: # Test case walfault-2-* tests fault injection during recovery of a
! 66: # short WAL file (a dozen frames or thereabouts).
! 67: #
! 68: do_test walfault-2-pre-1 {
! 69: sqlite3 db test.db
! 70: execsql {
! 71: PRAGMA journal_mode = WAL;
! 72: BEGIN;
! 73: CREATE TABLE x(y, z, UNIQUE(y, z));
! 74: INSERT INTO x VALUES(randomblob(100), randomblob(100));
! 75: COMMIT;
! 76: PRAGMA wal_checkpoint;
! 77:
! 78: INSERT INTO x SELECT randomblob(100), randomblob(100) FROM x;
! 79: INSERT INTO x SELECT randomblob(100), randomblob(100) FROM x;
! 80: INSERT INTO x SELECT randomblob(100), randomblob(100) FROM x;
! 81: }
! 82: execsql {
! 83: SELECT count(*) FROM x
! 84: }
! 85: } {8}
! 86: do_test walfault-2-pre-2 {
! 87: faultsim_save_and_close
! 88: faultsim_restore_and_reopen
! 89: execsql { SELECT count(*) FROM x }
! 90: } {8}
! 91: do_faultsim_test walfault-2 -prep {
! 92: faultsim_restore_and_reopen
! 93: } -body {
! 94: execsql { SELECT count(*) FROM x }
! 95: } -test {
! 96: faultsim_test_result {0 8}
! 97: faultsim_integrity_check
! 98: }
! 99:
! 100: #--------------------------------------------------------------------------
! 101: # Test fault injection while writing and checkpointing a small WAL file.
! 102: #
! 103: do_test walfault-3-pre-1 {
! 104: sqlite3 db test.db
! 105: execsql {
! 106: PRAGMA auto_vacuum = 1;
! 107: PRAGMA journal_mode = WAL;
! 108: CREATE TABLE abc(a PRIMARY KEY);
! 109: INSERT INTO abc VALUES(randomblob(1500));
! 110: }
! 111: db close
! 112: faultsim_save_and_close
! 113: } {}
! 114: do_faultsim_test walfault-3 -prep {
! 115: faultsim_restore_and_reopen
! 116: } -body {
! 117: db eval {
! 118: DELETE FROM abc;
! 119: PRAGMA wal_checkpoint;
! 120: }
! 121: set {} {}
! 122: } -test {
! 123: faultsim_test_result {0 {}}
! 124: }
! 125:
! 126: #--------------------------------------------------------------------------
! 127: #
! 128: if {[permutation] != "inmemory_journal"} {
! 129: faultsim_delete_and_reopen
! 130: faultsim_save_and_close
! 131: do_faultsim_test walfault-4 -prep {
! 132: faultsim_restore_and_reopen
! 133: } -body {
! 134: execsql {
! 135: PRAGMA auto_vacuum = 0;
! 136: PRAGMA journal_mode = WAL;
! 137: CREATE TABLE t1(a PRIMARY KEY, b);
! 138: INSERT INTO t1 VALUES('a', 'b');
! 139: PRAGMA wal_checkpoint;
! 140: SELECT * FROM t1;
! 141: }
! 142: } -test {
! 143: # Update: The following changed from {0 {wal 0 7 7 a b}} as a result
! 144: # of PSOW being set by default.
! 145: faultsim_test_result {0 {wal 0 5 5 a b}}
! 146: faultsim_integrity_check
! 147: }
! 148: }
! 149:
! 150: #--------------------------------------------------------------------------
! 151: #
! 152: do_test walfault-5-pre-1 {
! 153: faultsim_delete_and_reopen
! 154: execsql {
! 155: PRAGMA page_size = 512;
! 156: PRAGMA journal_mode = WAL;
! 157: }
! 158: faultsim_save_and_close
! 159: } {}
! 160: do_faultsim_test walfault-5 -faults shmerr* -prep {
! 161: faultsim_restore_and_reopen
! 162: execsql { PRAGMA wal_autocheckpoint = 0 }
! 163: shmfault filter xShmMap
! 164: } -body {
! 165: execsql {
! 166: CREATE TABLE t1(x);
! 167: BEGIN;
! 168: INSERT INTO t1 VALUES(randomblob(400)); /* 1 */
! 169: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 2 */
! 170: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 4 */
! 171: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 8 */
! 172: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 16 */
! 173: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 32 */
! 174: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 64 */
! 175: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 128 */
! 176: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 256 */
! 177: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 512 */
! 178: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 1024 */
! 179: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 2048 */
! 180: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 4096 */
! 181: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 8192 */
! 182: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 16384 */
! 183: COMMIT;
! 184: SELECT count(*) FROM t1;
! 185: }
! 186: } -test {
! 187: faultsim_test_result {0 16384}
! 188: faultsim_integrity_check
! 189: }
! 190:
! 191: #--------------------------------------------------------------------------
! 192: #
! 193: do_test walfault-6-pre-1 {
! 194: faultsim_delete_and_reopen
! 195: execsql {
! 196: PRAGMA page_size = 512;
! 197: PRAGMA journal_mode = WAL;
! 198: PRAGMA wal_autocheckpoint = 0;
! 199: CREATE TABLE t1(x);
! 200: BEGIN;
! 201: INSERT INTO t1 VALUES(randomblob(400)); /* 1 */
! 202: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 2 */
! 203: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 4 */
! 204: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 8 */
! 205: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 16 */
! 206: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 32 */
! 207: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 64 */
! 208: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 128 */
! 209: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 256 */
! 210: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 512 */
! 211: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 1024 */
! 212: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 2048 */
! 213: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 4096 */
! 214: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 8192 */
! 215: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 16384 */
! 216: COMMIT;
! 217: }
! 218: faultsim_save_and_close
! 219: } {}
! 220: do_faultsim_test walfault-6 -faults shmerr* -prep {
! 221: faultsim_restore_and_reopen
! 222: shmfault filter xShmMap
! 223: } -body {
! 224: execsql { SELECT count(*) FROM t1 }
! 225: } -test {
! 226: faultsim_test_result {0 16384}
! 227: faultsim_integrity_check
! 228: set n [db one {SELECT count(*) FROM t1}]
! 229: if {$n != 16384 && $n != 0} { error "Incorrect number of rows: $n" }
! 230: }
! 231:
! 232: #--------------------------------------------------------------------------
! 233: #
! 234: do_test walfault-7-pre-1 {
! 235: faultsim_delete_and_reopen
! 236: execsql {
! 237: PRAGMA page_size = 512;
! 238: PRAGMA journal_mode = WAL;
! 239: PRAGMA wal_autocheckpoint = 0;
! 240: CREATE TABLE t1(x);
! 241: BEGIN;
! 242: INSERT INTO t1 VALUES(randomblob(400)); /* 1 */
! 243: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 2 */
! 244: INSERT INTO t1 SELECT randomblob(400) FROM t1; /* 4 */
! 245: COMMIT;
! 246: }
! 247: faultsim_save_and_close
! 248: } {}
! 249: do_faultsim_test walfault-7 -prep {
! 250: faultsim_restore_and_reopen
! 251: } -body {
! 252: execsql { SELECT count(*) FROM t1 }
! 253: } -test {
! 254: faultsim_test_result {0 4}
! 255: set n [db one {SELECT count(*) FROM t1}]
! 256: if {$n != 4 && $n != 0} { error "Incorrect number of rows: $n" }
! 257: }
! 258:
! 259: #--------------------------------------------------------------------------
! 260: #
! 261: do_test walfault-8-pre-1 {
! 262: faultsim_delete_and_reopen
! 263: execsql {
! 264: PRAGMA journal_mode = WAL;
! 265: CREATE TABLE abc(a PRIMARY KEY);
! 266: INSERT INTO abc VALUES(randomblob(900));
! 267: }
! 268: faultsim_save_and_close
! 269: } {}
! 270: do_faultsim_test walfault-8 -prep {
! 271: faultsim_restore_and_reopen
! 272: execsql { PRAGMA cache_size = 10 }
! 273: } -body {
! 274: execsql {
! 275: BEGIN;
! 276: INSERT INTO abc SELECT randomblob(900) FROM abc; /* 1 */
! 277: --INSERT INTO abc SELECT randomblob(900) FROM abc; /* 2 */
! 278: --INSERT INTO abc SELECT randomblob(900) FROM abc; /* 4 */
! 279: --INSERT INTO abc SELECT randomblob(900) FROM abc; /* 8 */
! 280: ROLLBACK;
! 281: SELECT count(*) FROM abc;
! 282: }
! 283: } -test {
! 284: faultsim_test_result {0 1}
! 285:
! 286: faultsim_integrity_check
! 287: catch { db eval ROLLBACK }
! 288: faultsim_integrity_check
! 289:
! 290: set n [db one {SELECT count(*) FROM abc}]
! 291: if {$n != 1} { error "Incorrect number of rows: $n" }
! 292: }
! 293:
! 294: #--------------------------------------------------------------------------
! 295: #
! 296: do_test walfault-9-pre-1 {
! 297: faultsim_delete_and_reopen
! 298: execsql {
! 299: PRAGMA journal_mode = WAL;
! 300: CREATE TABLE abc(a PRIMARY KEY);
! 301: INSERT INTO abc VALUES(randomblob(900));
! 302: }
! 303: faultsim_save_and_close
! 304: } {}
! 305: do_faultsim_test walfault-9 -prep {
! 306: #if {$iFail<73} { set iFail 73 }
! 307: #if {$iFail>73} { exit }
! 308:
! 309: faultsim_restore_and_reopen
! 310: execsql { PRAGMA cache_size = 10 }
! 311: } -body {
! 312: execsql {
! 313: BEGIN;
! 314: INSERT INTO abc SELECT randomblob(900) FROM abc; /* 1 */
! 315: SAVEPOINT spoint;
! 316: INSERT INTO abc SELECT randomblob(900) FROM abc; /* 2 */
! 317: INSERT INTO abc SELECT randomblob(900) FROM abc; /* 4 */
! 318: INSERT INTO abc SELECT randomblob(900) FROM abc; /* 8 */
! 319: ROLLBACK TO spoint;
! 320: COMMIT;
! 321: SELECT count(*) FROM abc;
! 322: }
! 323: } -test {
! 324: faultsim_test_result {0 2}
! 325: faultsim_integrity_check
! 326:
! 327: catch { db eval { ROLLBACK TO spoint } }
! 328: catch { db eval { COMMIT } }
! 329: set n [db one {SELECT count(*) FROM abc}]
! 330: if {$n != 1 && $n != 2} { error "Incorrect number of rows: $n" }
! 331: }
! 332:
! 333: do_test walfault-10-pre1 {
! 334: faultsim_delete_and_reopen
! 335: execsql {
! 336: PRAGMA journal_mode = WAL;
! 337: PRAGMA wal_autocheckpoint = 0;
! 338: CREATE TABLE z(zz INTEGER PRIMARY KEY, zzz BLOB);
! 339: CREATE INDEX zzzz ON z(zzz);
! 340: INSERT INTO z VALUES(NULL, randomblob(800));
! 341: INSERT INTO z VALUES(NULL, randomblob(800));
! 342: INSERT INTO z SELECT NULL, randomblob(800) FROM z;
! 343: INSERT INTO z SELECT NULL, randomblob(800) FROM z;
! 344: INSERT INTO z SELECT NULL, randomblob(800) FROM z;
! 345: INSERT INTO z SELECT NULL, randomblob(800) FROM z;
! 346: INSERT INTO z SELECT NULL, randomblob(800) FROM z;
! 347: }
! 348: faultsim_save_and_close
! 349: } {}
! 350: do_faultsim_test walfault-10 -prep {
! 351: faultsim_restore_and_reopen
! 352: execsql {
! 353: PRAGMA cache_size = 10;
! 354: BEGIN;
! 355: UPDATE z SET zzz = randomblob(799);
! 356: }
! 357:
! 358: set ::stmt [sqlite3_prepare db "SELECT zzz FROM z WHERE zz IN (1, 2, 3)" -1]
! 359: sqlite3_step $::stmt
! 360: } -body {
! 361: execsql { INSERT INTO z VALUES(NULL, NULL) }
! 362: } -test {
! 363: sqlite3_finalize $::stmt
! 364: faultsim_integrity_check
! 365:
! 366: faultsim_test_result {0 {}}
! 367: catch { db eval { ROLLBACK } }
! 368: faultsim_integrity_check
! 369:
! 370: set n [db eval {SELECT count(*), sum(length(zzz)) FROM z}]
! 371: if {$n != "64 51200"} { error "Incorrect data: $n" }
! 372: }
! 373:
! 374: #--------------------------------------------------------------------------
! 375: # Test fault injection while checkpointing a large WAL file, if the
! 376: # checkpoint is the first operation run after opening the database.
! 377: # This means that some of the required wal-index pages are mapped as part of
! 378: # the checkpoint process, which means there are a few more opportunities
! 379: # for IO errors.
! 380: #
! 381: # To speed this up, IO errors are only simulated within xShmMap() calls.
! 382: #
! 383: do_test walfault-11-pre-1 {
! 384: sqlite3 db test.db
! 385: execsql {
! 386: PRAGMA journal_mode = WAL;
! 387: PRAGMA wal_autocheckpoint = 0;
! 388: BEGIN;
! 389: CREATE TABLE abc(a PRIMARY KEY);
! 390: INSERT INTO abc VALUES(randomblob(1500));
! 391: INSERT INTO abc VALUES(randomblob(1500));
! 392: INSERT INTO abc SELECT randomblob(1500) FROM abc; -- 4
! 393: INSERT INTO abc SELECT randomblob(1500) FROM abc; -- 8
! 394: INSERT INTO abc SELECT randomblob(1500) FROM abc; -- 16
! 395: INSERT INTO abc SELECT randomblob(1500) FROM abc; -- 32
! 396: INSERT INTO abc SELECT randomblob(1500) FROM abc; -- 64
! 397: INSERT INTO abc SELECT randomblob(1500) FROM abc; -- 128
! 398: INSERT INTO abc SELECT randomblob(1500) FROM abc; -- 256
! 399: INSERT INTO abc SELECT randomblob(1500) FROM abc; -- 512
! 400: INSERT INTO abc SELECT randomblob(1500) FROM abc; -- 1024
! 401: INSERT INTO abc SELECT randomblob(1500) FROM abc; -- 2048
! 402: INSERT INTO abc SELECT randomblob(1500) FROM abc; -- 4096
! 403: COMMIT;
! 404: }
! 405: faultsim_save_and_close
! 406: } {}
! 407: do_faultsim_test walfault-11 -faults shmerr* -prep {
! 408: catch { db2 close }
! 409: faultsim_restore_and_reopen
! 410: shmfault filter xShmMap
! 411: } -body {
! 412: db eval { SELECT count(*) FROM abc }
! 413: sqlite3 db2 test.db -vfs shmfault
! 414: db2 eval { PRAGMA wal_checkpoint }
! 415: set {} {}
! 416: } -test {
! 417: faultsim_test_result {0 {}}
! 418: }
! 419:
! 420: #-------------------------------------------------------------------------
! 421: # Test the handling of the various IO/OOM/SHM errors that may occur during
! 422: # a log recovery operation undertaken as part of a call to
! 423: # sqlite3_wal_checkpoint().
! 424: #
! 425: do_test walfault-12-pre-1 {
! 426: faultsim_delete_and_reopen
! 427: execsql {
! 428: PRAGMA journal_mode = WAL;
! 429: PRAGMA wal_autocheckpoint = 0;
! 430: BEGIN;
! 431: CREATE TABLE abc(a PRIMARY KEY);
! 432: INSERT INTO abc VALUES(randomblob(1500));
! 433: INSERT INTO abc VALUES(randomblob(1500));
! 434: COMMIT;
! 435: }
! 436: faultsim_save_and_close
! 437: } {}
! 438: do_faultsim_test walfault-12 -prep {
! 439: if {[info commands shmfault] == ""} {
! 440: testvfs shmfault -default true
! 441: }
! 442: faultsim_restore_and_reopen
! 443: db eval { SELECT * FROM sqlite_master }
! 444: shmfault shm test.db [string repeat "\000" 40]
! 445: } -body {
! 446: set rc [sqlite3_wal_checkpoint db]
! 447: if {$rc != "SQLITE_OK"} { error [sqlite3_errmsg db] }
! 448: } -test {
! 449: db close
! 450: faultsim_test_result {0 {}}
! 451: }
! 452:
! 453: #-------------------------------------------------------------------------
! 454: # Test simple recovery, reading and writing a database file using a
! 455: # heap-memory wal-index.
! 456: #
! 457: do_test walfault-13-pre-1 {
! 458: faultsim_delete_and_reopen
! 459: execsql {
! 460: PRAGMA journal_mode = WAL;
! 461: PRAGMA wal_autocheckpoint = 0;
! 462: BEGIN;
! 463: CREATE TABLE abc(a PRIMARY KEY);
! 464: INSERT INTO abc VALUES(randomblob(1500));
! 465: INSERT INTO abc VALUES(randomblob(1500));
! 466: COMMIT;
! 467: }
! 468: faultsim_save_and_close
! 469: delete_file sv_test.db-shm
! 470: } {}
! 471:
! 472: do_faultsim_test walfault-13.1 -prep {
! 473: faultsim_restore_and_reopen
! 474: } -body {
! 475: db eval { PRAGMA locking_mode = exclusive }
! 476: db eval { SELECT count(*) FROM abc }
! 477: } -test {
! 478: faultsim_test_result {0 2}
! 479: if {[file exists test.db-shm]} { error "Not using heap-memory mode" }
! 480: faultsim_integrity_check
! 481: }
! 482:
! 483: do_faultsim_test walfault-13.2 -prep {
! 484: faultsim_restore_and_reopen
! 485: db eval { PRAGMA locking_mode = exclusive }
! 486: } -body {
! 487: db eval { PRAGMA journal_mode = delete }
! 488: } -test {
! 489: faultsim_test_result {0 delete}
! 490: if {[file exists test.db-shm]} { error "Not using heap-memory mode" }
! 491: faultsim_integrity_check
! 492: }
! 493:
! 494: do_test walfault-13-pre-2 {
! 495: faultsim_delete_and_reopen
! 496: execsql {
! 497: BEGIN;
! 498: CREATE TABLE abc(a PRIMARY KEY);
! 499: INSERT INTO abc VALUES(randomblob(1500));
! 500: INSERT INTO abc VALUES(randomblob(1500));
! 501: COMMIT;
! 502: }
! 503: faultsim_save_and_close
! 504: } {}
! 505:
! 506: do_faultsim_test walfault-13.3 -prep {
! 507: faultsim_restore_and_reopen
! 508: } -body {
! 509: db eval {
! 510: PRAGMA locking_mode = exclusive;
! 511: PRAGMA journal_mode = WAL;
! 512: INSERT INTO abc VALUES(randomblob(1500));
! 513: }
! 514: } -test {
! 515: faultsim_test_result {0 {exclusive wal}}
! 516: if {[file exists test.db-shm]} { error "Not using heap-memory mode" }
! 517: faultsim_integrity_check
! 518: set nRow [db eval {SELECT count(*) FROM abc}]
! 519: if {!(($nRow==2 && $testrc) || $nRow==3)} { error "Bad db content" }
! 520: }
! 521:
! 522: #-------------------------------------------------------------------------
! 523: # Test fault-handling when wrapping around to the start of a WAL file.
! 524: #
! 525: do_test walfault-14-pre {
! 526: faultsim_delete_and_reopen
! 527: execsql {
! 528: PRAGMA auto_vacuum = 0;
! 529: PRAGMA journal_mode = WAL;
! 530: BEGIN;
! 531: CREATE TABLE abc(a PRIMARY KEY);
! 532: INSERT INTO abc VALUES(randomblob(1500));
! 533: INSERT INTO abc VALUES(randomblob(1500));
! 534: COMMIT;
! 535: }
! 536: faultsim_save_and_close
! 537: } {}
! 538: do_faultsim_test walfault-14 -prep {
! 539: faultsim_restore_and_reopen
! 540: } -body {
! 541: db eval {
! 542: PRAGMA wal_checkpoint = full;
! 543: INSERT INTO abc VALUES(randomblob(1500));
! 544: }
! 545: } -test {
! 546: faultsim_test_result {0 {0 9 9}}
! 547: faultsim_integrity_check
! 548: set nRow [db eval {SELECT count(*) FROM abc}]
! 549: if {!(($nRow==2 && $testrc) || $nRow==3)} { error "Bad db content" }
! 550: }
! 551: finish_test
! 552:
! 553: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>