Index: sql/recovery_unittest.cc |
diff --git a/sql/recovery_unittest.cc b/sql/recovery_unittest.cc |
index 80e03544d1f850b5302a47874da4509cb4c65354..111a610450a169923f2fab7165225f39b9a015f6 100644 |
--- a/sql/recovery_unittest.cc |
+++ b/sql/recovery_unittest.cc |
@@ -805,6 +805,35 @@ TEST_F(SQLRecoveryTest, RecoverDatabase) { |
EXPECT_EQ("trailer", ExecuteWithResults(&db(), kVSql, "|", "\n")); |
} |
+// When RecoverDatabase() encounters SQLITE_NOTADB, the database is deleted. |
+TEST_F(SQLRecoveryTest, RecoverDatabaseDelete) { |
+ // Create a valid database, then write junk over the header. This should lead |
+ // to SQLITE_NOTADB, which will cause ATTACH to fail. |
+ ASSERT_TRUE(db().Execute("CREATE TABLE x (t TEXT)")); |
+ ASSERT_TRUE(db().Execute("INSERT INTO x VALUES ('This is a test')")); |
+ db().Close(); |
+ WriteJunkToDatabase(SQLTestBase::TYPE_OVERWRITE); |
+ |
+ { |
+ sql::test::ScopedErrorExpecter expecter; |
+ expecter.ExpectError(SQLITE_NOTADB); |
+ |
+ // Reopen() here because it will see SQLITE_NOTADB. |
+ ASSERT_TRUE(Reopen()); |
+ |
+ // This should "recover" the database by making it valid, but empty. |
+ sql::Recovery::RecoverDatabase(&db(), db_path()); |
+ |
+ ASSERT_TRUE(expecter.SawExpectedErrors()); |
+ } |
+ |
+ // Recovery poisoned the handle, must re-open. |
+ db().Close(); |
+ ASSERT_TRUE(Reopen()); |
+ |
+ EXPECT_EQ("", GetSchema(&db())); |
+} |
+ |
// Test histograms recorded when the invalid database cannot be attached. |
TEST_F(SQLRecoveryTest, AttachFailure) { |
// Create a valid database, then write junk over the header. This should lead |