1
0

walfault.test 18 KB

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