Index: third_party/sqlite/src/test/snapshot_fault.test |
diff --git a/third_party/sqlite/src/test/snapshot_fault.test b/third_party/sqlite/src/test/snapshot_fault.test |
index 3ac13daefd42400fb7060b7ad49562dfac45c27f..5c6cf40a6f1d19ab4f7e66875dcc1543a6cb03c5 100644 |
--- a/third_party/sqlite/src/test/snapshot_fault.test |
+++ b/third_party/sqlite/src/test/snapshot_fault.test |
@@ -146,7 +146,7 @@ do_faultsim_test 3.0 -prep { |
error $msg |
} |
} -test { |
- faultsim_test_result {0 {}} {1 SQLITE_IOERR} \ |
+ faultsim_test_result {0 {}} {1 SQLITE_IOERR} {1 SQLITE_NOMEM} \ |
{1 SQLITE_IOERR_NOMEM} {1 SQLITE_IOERR_READ} |
if {$testrc==0} { |
set res [db eval { |
@@ -159,6 +159,68 @@ do_faultsim_test 3.0 -prep { |
sqlite3_snapshot_free $::snapshot |
} |
+#------------------------------------------------------------------------- |
+# Test the handling of faults that occur within sqlite3_snapshot_recover(). |
+# |
+reset_db |
+do_execsql_test 4.0 { |
+ PRAGMA journal_mode = wal; |
+ CREATE TABLE t1(zzz); |
+ INSERT INTO t1 VALUES('abc'); |
+ INSERT INTO t1 VALUES('def'); |
+} {wal} |
+faultsim_save_and_close |
+ |
+do_test 4.0.1 { |
+ faultsim_restore_and_reopen |
+ db eval { SELECT * FROM sqlite_master } |
+ sqlite3_snapshot_recover db main |
+} {} |
+db close |
+ |
+do_faultsim_test 4.0 -faults oom* -prep { |
+ faultsim_restore_and_reopen |
+ db eval { SELECT * FROM sqlite_master } |
+} -body { |
+ sqlite3_snapshot_recover db main |
+} -test { |
+ faultsim_test_result {0 {}} {1 SQLITE_NOMEM} {1 SQLITE_IOERR_NOMEM} |
+} |
+ |
+# The following test cases contrive to call sqlite3_snapshot_recover() |
+# before all pages of the *-shm file have been mapped. This tests an |
+# extra branch of error handling logic in snapshot_recover(). |
+# |
+reset_db |
+do_execsql_test 4.1.0 { |
+ PRAGMA page_size = 512; |
+ PRAGMA journal_mode = wal; |
+ PRAGMA wal_autocheckpoint = 0; |
+ CREATE TABLE t1(zzz); |
+ INSERT INTO t1 VALUES(randomblob( 500 * 9500 )); |
+ PRAGMA user_version = 211; |
+} {wal 0} |
+ |
+do_test 4.1.1 { |
+ list [file size test.db-shm] [file size test.db] |
+} {98304 512} |
+ |
+faultsim_save_and_close |
+do_faultsim_test 4.1 -faults shm* -prep { |
+ catch { db2 close } |
+ catch { db close } |
+ faultsim_restore_and_reopen |
+ sqlite3 db2 test.db |
+ db2 eval { SELECT * FROM sqlite_master } |
+ db eval BEGIN |
+ sqlite3_snapshot_get_blob db main |
+ db eval COMMIT |
+} -body { |
+ sqlite3_snapshot_recover db main |
+} -test { |
+ faultsim_test_result {0 {}} {1 SQLITE_IOERR} |
+} |
+ |
finish_test |