Skip to content

Commit 024172e

Browse files
authored
Fix to avoid deleting non ScalarDB tables when dropping namespaces (#3092)
1 parent ddc8d74 commit 024172e

23 files changed

+326
-7
lines changed

core/src/integration-test/java/com/scalar/db/storage/cassandra/CassandraAdminTestUtils.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ public void corruptMetadata(String namespace, String table) {
5757
// Do nothing
5858
}
5959

60+
@Override
61+
public void deleteMetadata(String namespace, String table) throws Exception {
62+
// Do nothing
63+
}
64+
6065
@Override
6166
public void dropNamespace(String namespace) {
6267
String dropKeyspaceQuery =

core/src/integration-test/java/com/scalar/db/storage/cosmos/CosmosAdminTestUtils.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,15 @@ public void corruptMetadata(String namespace, String table) {
8686
container.upsertItem(corruptedMetadata);
8787
}
8888

89+
@Override
90+
public void deleteMetadata(String namespace, String table) {
91+
String fullTableName = getFullTableName(namespace, table);
92+
CosmosContainer container =
93+
client.getDatabase(metadataDatabase).getContainer(CosmosAdmin.TABLE_METADATA_CONTAINER);
94+
container.deleteItem(
95+
fullTableName, new PartitionKey(fullTableName), new CosmosItemRequestOptions());
96+
}
97+
8998
/**
9099
* Retrieve the stored procedure for the given table
91100
*

core/src/integration-test/java/com/scalar/db/storage/dynamo/DynamoAdminCaseSensitivityIntegrationTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ protected AdminTestUtils getAdminTestUtils(String testName) {
2929
return new DynamoAdminTestUtils(getProperties(testName));
3030
}
3131

32+
@Override
33+
@Disabled("DynamoDB does not have a concept of namespaces")
34+
public void
35+
dropNamespace_ForNamespaceWithNonScalarDBManagedTables_ShouldThrowIllegalArgumentException() {}
36+
3237
@Override
3338
@Disabled("DynamoDB does not support dropping columns")
3439
public void dropColumnFromTable_DropColumnForEachExistingDataType_ShouldDropColumnsCorrectly() {}

core/src/integration-test/java/com/scalar/db/storage/dynamo/DynamoAdminIntegrationTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ protected AdminTestUtils getAdminTestUtils(String testName) {
2828
return new DynamoAdminTestUtils(getProperties(testName));
2929
}
3030

31+
@Override
32+
@Disabled("DynamoDB does not have a concept of namespaces")
33+
public void
34+
dropNamespace_ForNamespaceWithNonScalarDBManagedTables_ShouldThrowIllegalArgumentException() {}
35+
3136
@Override
3237
@Disabled("DynamoDB does not support dropping columns")
3338
public void dropColumnFromTable_DropColumnForEachExistingDataType_ShouldDropColumnsCorrectly() {}

core/src/integration-test/java/com/scalar/db/storage/dynamo/DynamoAdminTestUtils.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,20 @@ public void corruptMetadata(String namespace, String table) {
171171
.build());
172172
}
173173

174+
@Override
175+
public void deleteMetadata(String namespace, String table) {
176+
String fullTableName =
177+
getFullTableName(Namespace.of(namespacePrefix, namespace).prefixed(), table);
178+
Map<String, AttributeValue> keyToDelete = new HashMap<>();
179+
keyToDelete.put("table", AttributeValue.builder().s(fullTableName).build());
180+
181+
client.deleteItem(
182+
DeleteItemRequest.builder()
183+
.tableName(getFullTableName(metadataNamespace, DynamoAdmin.METADATA_TABLE))
184+
.key(keyToDelete)
185+
.build());
186+
}
187+
174188
@Override
175189
public void dropTable(String nonPrefixedNamespace, String table) {
176190
String namespace = Namespace.of(namespacePrefix, nonPrefixedNamespace).prefixed();

core/src/integration-test/java/com/scalar/db/storage/jdbc/JdbcAdminCaseSensitivityIntegrationTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,12 @@ private boolean isWideningColumnTypeConversionNotFullySupported() {
8989
return JdbcTestUtils.isOracle(rdbEngine) || JdbcTestUtils.isSqlite(rdbEngine);
9090
}
9191

92+
@Test
93+
@Override
94+
@DisabledIf("isSqlite")
95+
public void
96+
dropNamespace_ForNamespaceWithNonScalarDBManagedTables_ShouldThrowIllegalArgumentException() {}
97+
9298
@Test
9399
@Override
94100
@DisabledIf("isDb2")

core/src/integration-test/java/com/scalar/db/storage/jdbc/JdbcAdminIntegrationTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,12 @@ private boolean isWideningColumnTypeConversionNotFullySupported() {
9090
return JdbcTestUtils.isOracle(rdbEngine) || JdbcTestUtils.isSqlite(rdbEngine);
9191
}
9292

93+
@Test
94+
@Override
95+
@DisabledIf("isSqlite")
96+
public void
97+
dropNamespace_ForNamespaceWithNonScalarDBManagedTables_ShouldThrowIllegalArgumentException() {}
98+
9399
@Test
94100
@Override
95101
@DisabledIf("isDb2")

core/src/integration-test/java/com/scalar/db/storage/jdbc/JdbcAdminTestUtils.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,22 @@ public void corruptMetadata(String namespace, String table) throws Exception {
6464
execute(insertCorruptedMetadataStatement);
6565
}
6666

67+
@Override
68+
public void deleteMetadata(String namespace, String table) throws Exception {
69+
String deleteMetadataStatement =
70+
"DELETE FROM "
71+
+ rdbEngine.encloseFullTableName(metadataSchema, JdbcAdmin.METADATA_TABLE)
72+
+ " WHERE "
73+
+ rdbEngine.enclose(JdbcAdmin.METADATA_COL_FULL_TABLE_NAME)
74+
+ " = ?";
75+
try (Connection connection = dataSource.getConnection();
76+
PreparedStatement preparedStatement =
77+
connection.prepareStatement(deleteMetadataStatement)) {
78+
preparedStatement.setString(1, getFullTableName(namespace, table));
79+
preparedStatement.executeUpdate();
80+
}
81+
}
82+
6783
private void execute(String sql) throws SQLException {
6884
try (Connection connection = dataSource.getConnection()) {
6985
JdbcAdmin.execute(connection, sql);

core/src/integration-test/java/com/scalar/db/storage/multistorage/MultiStorageAdminTestUtils.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,25 @@ public void corruptMetadata(String namespace, String table) throws Exception {
116116
execute(insertCorruptedMetadataStatement);
117117
}
118118

119+
@Override
120+
public void deleteMetadata(String namespace, String table) throws Exception {
121+
// Do nothing for Cassandra
122+
123+
// for JDBC
124+
String deleteMetadataStatement =
125+
"DELETE FROM "
126+
+ rdbEngine.encloseFullTableName(jdbcMetadataSchema, JdbcAdmin.METADATA_TABLE)
127+
+ " WHERE "
128+
+ rdbEngine.enclose(JdbcAdmin.METADATA_COL_FULL_TABLE_NAME)
129+
+ " = ?";
130+
try (Connection connection = dataSource.getConnection();
131+
PreparedStatement preparedStatement =
132+
connection.prepareStatement(deleteMetadataStatement)) {
133+
preparedStatement.setString(1, getFullTableName(namespace, table));
134+
preparedStatement.executeUpdate();
135+
}
136+
}
137+
119138
@Override
120139
public void dropNamespace(String namespace) throws SQLException {
121140
boolean existsOnCassandra = namespaceExistsOnCassandra(namespace);

core/src/main/java/com/scalar/db/common/CoreError.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -843,6 +843,12 @@ public enum CoreError implements ScalarDbError {
843843
"With Oracle, setting a condition on a BLOB column when using a selection operation is not supported. Condition: %s",
844844
"",
845845
""),
846+
NAMESPACE_WITH_NON_SCALARDB_TABLES_CANNOT_BE_DROPPED(
847+
Category.USER_ERROR,
848+
"0249",
849+
"The namespace has non-ScalarDB tables and cannot be dropped. Namespace: %s; Tables in the namespace: %s",
850+
"",
851+
""),
846852

847853
//
848854
// Errors for the concurrency error category

0 commit comments

Comments
 (0)