Index: sql/recovery_unittest.cc |
diff --git a/sql/recovery_unittest.cc b/sql/recovery_unittest.cc |
index 11f2a87380862cccfcd59478392d52bb387dbfca..73d146fac1f1c61b7336b4a44dff7f0950d4f506 100644 |
--- a/sql/recovery_unittest.cc |
+++ b/sql/recovery_unittest.cc |
@@ -429,7 +429,7 @@ TEST_F(SQLRecoveryTest, AutoRecoverTable) { |
ExecuteWithResults(recovery->db(), kTempSchemaSql, "|", "\n")); |
size_t rows = 0; |
- EXPECT_TRUE(recovery->AutoRecoverTable("x", 0, &rows)); |
+ EXPECT_TRUE(recovery->AutoRecoverTable("x", &rows)); |
EXPECT_EQ(2u, rows); |
// Test that any additional temp tables were cleaned up. |
@@ -452,7 +452,7 @@ TEST_F(SQLRecoveryTest, AutoRecoverTable) { |
// TODO(shess): Should this failure implicitly lead to Raze()? |
size_t rows = 0; |
- EXPECT_FALSE(recovery->AutoRecoverTable("y", 0, &rows)); |
+ EXPECT_FALSE(recovery->AutoRecoverTable("y", &rows)); |
sql::Recovery::Unrecoverable(std::move(recovery)); |
} |
@@ -509,7 +509,7 @@ TEST_F(SQLRecoveryTest, AutoRecoverTableWithDefault) { |
ASSERT_TRUE(recovery->db()->Execute(final_schema.c_str())); |
size_t rows = 0; |
- EXPECT_TRUE(recovery->AutoRecoverTable("x", 0, &rows)); |
+ EXPECT_TRUE(recovery->AutoRecoverTable("x", &rows)); |
EXPECT_EQ(4u, rows); |
ASSERT_TRUE(sql::Recovery::Recovered(std::move(recovery))); |
@@ -545,7 +545,7 @@ TEST_F(SQLRecoveryTest, AutoRecoverTableNullFilter) { |
ASSERT_TRUE(recovery->db()->Execute(kFinalSchema)); |
size_t rows = 0; |
- EXPECT_TRUE(recovery->AutoRecoverTable("x", 0, &rows)); |
+ EXPECT_TRUE(recovery->AutoRecoverTable("x", &rows)); |
EXPECT_EQ(1u, rows); |
ASSERT_TRUE(sql::Recovery::Recovered(std::move(recovery))); |
@@ -584,7 +584,7 @@ TEST_F(SQLRecoveryTest, AutoRecoverTableWithRowid) { |
ASSERT_TRUE(recovery->db()->Execute(kCreateSql)); |
size_t rows = 0; |
- EXPECT_TRUE(recovery->AutoRecoverTable("x", 0, &rows)); |
+ EXPECT_TRUE(recovery->AutoRecoverTable("x", &rows)); |
EXPECT_EQ(2u, rows); |
ASSERT_TRUE(sql::Recovery::Recovered(std::move(recovery))); |
@@ -629,7 +629,7 @@ TEST_F(SQLRecoveryTest, AutoRecoverTableWithCompoundKey) { |
ASSERT_TRUE(recovery->db()->Execute(kCreateSql)); |
size_t rows = 0; |
- EXPECT_TRUE(recovery->AutoRecoverTable("x", 0, &rows)); |
+ EXPECT_TRUE(recovery->AutoRecoverTable("x", &rows)); |
EXPECT_EQ(3u, rows); |
ASSERT_TRUE(sql::Recovery::Recovered(std::move(recovery))); |
@@ -642,29 +642,40 @@ TEST_F(SQLRecoveryTest, AutoRecoverTableWithCompoundKey) { |
ASSERT_EQ(orig_data, ExecuteWithResults(&db(), kXSql, "|", "\n")); |
} |
-// Test |extend_columns| support. |
-TEST_F(SQLRecoveryTest, AutoRecoverTableExtendColumns) { |
+// Test recovering from a table with fewer columns than the target. |
+TEST_F(SQLRecoveryTest, AutoRecoverTableMissingColumns) { |
const char kCreateSql[] = "CREATE TABLE x (id INTEGER PRIMARY KEY, t0 TEXT)"; |
+ const char kAlterSql[] = "ALTER TABLE x ADD COLUMN t1 TEXT DEFAULT 't'"; |
ASSERT_TRUE(db().Execute(kCreateSql)); |
ASSERT_TRUE(db().Execute("INSERT INTO x VALUES (1, 'This is')")); |
ASSERT_TRUE(db().Execute("INSERT INTO x VALUES (2, 'That was')")); |
- // Save aside a copy of the original schema and data. |
+ // Generate the expected info by faking a table to match what recovery will |
+ // create. |
const std::string orig_schema(GetSchema(&db())); |
const char kXSql[] = "SELECT * FROM x ORDER BY 1"; |
- const std::string orig_data(ExecuteWithResults(&db(), kXSql, "|", "\n")); |
+ std::string expected_schema; |
+ std::string expected_data; |
+ { |
+ ASSERT_TRUE(db().BeginTransaction()); |
+ ASSERT_TRUE(db().Execute(kAlterSql)); |
- // Modify the table to add a column, and add data to that column. |
- ASSERT_TRUE(db().Execute("ALTER TABLE x ADD COLUMN t1 TEXT")); |
- ASSERT_TRUE(db().Execute("UPDATE x SET t1 = 'a test'")); |
- ASSERT_NE(orig_schema, GetSchema(&db())); |
- ASSERT_NE(orig_data, ExecuteWithResults(&db(), kXSql, "|", "\n")); |
+ expected_schema = GetSchema(&db()); |
+ expected_data = ExecuteWithResults(&db(), kXSql, "|", "\n"); |
+ db().RollbackTransaction(); |
+ } |
+ |
+ // Following tests are pointless if the rollback didn't work. |
+ ASSERT_EQ(orig_schema, GetSchema(&db())); |
+ |
+ // Recover the previous version of the table into the altered version. |
{ |
scoped_ptr<sql::Recovery> recovery = sql::Recovery::Begin(&db(), db_path()); |
ASSERT_TRUE(recovery->db()->Execute(kCreateSql)); |
+ ASSERT_TRUE(recovery->db()->Execute(kAlterSql)); |
size_t rows = 0; |
- EXPECT_TRUE(recovery->AutoRecoverTable("x", 1, &rows)); |
+ EXPECT_TRUE(recovery->AutoRecoverTable("x", &rows)); |
EXPECT_EQ(2u, rows); |
ASSERT_TRUE(sql::Recovery::Recovered(std::move(recovery))); |
} |
@@ -672,8 +683,8 @@ TEST_F(SQLRecoveryTest, AutoRecoverTableExtendColumns) { |
// Since the database was not corrupt, the entire schema and all |
// data should be recovered. |
ASSERT_TRUE(Reopen()); |
- ASSERT_EQ(orig_schema, GetSchema(&db())); |
- ASSERT_EQ(orig_data, ExecuteWithResults(&db(), kXSql, "|", "\n")); |
+ ASSERT_EQ(expected_schema, GetSchema(&db())); |
+ ASSERT_EQ(expected_data, ExecuteWithResults(&db(), kXSql, "|", "\n")); |
} |
// Recover a golden file where an interior page has been manually modified so |
@@ -697,7 +708,7 @@ TEST_F(SQLRecoveryTest, Bug387868) { |
ASSERT_TRUE(recovery->db()->Execute(kCreateSql)); |
size_t rows = 0; |
- EXPECT_TRUE(recovery->AutoRecoverTable("x", 0, &rows)); |
+ EXPECT_TRUE(recovery->AutoRecoverTable("x", &rows)); |
EXPECT_EQ(43u, rows); |
// Successfully recovered. |