Skip to content

Commit c68cf2a

Browse files
committed
Fix
1 parent f03f72a commit c68cf2a

File tree

9 files changed

+59
-28
lines changed

9 files changed

+59
-28
lines changed

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
@@ -83,6 +83,12 @@ private boolean isWideningColumnTypeConversionNotFullySupported() {
8383
return JdbcTestUtils.isOracle(rdbEngine) || JdbcTestUtils.isSqlite(rdbEngine);
8484
}
8585

86+
@Test
87+
@Override
88+
@DisabledIf("isSqlite")
89+
public void
90+
dropNamespace_ForNamespaceWithNonScalarDBManagedTables_ShouldThrowIllegalArgumentException() {}
91+
8692
@Test
8793
@Override
8894
@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
@@ -84,6 +84,12 @@ private boolean isWideningColumnTypeConversionNotFullySupported() {
8484
return JdbcTestUtils.isOracle(rdbEngine) || JdbcTestUtils.isSqlite(rdbEngine);
8585
}
8686

87+
@Test
88+
@Override
89+
@DisabledIf("isSqlite")
90+
public void
91+
dropNamespace_ForNamespaceWithNonScalarDBManagedTables_ShouldThrowIllegalArgumentException() {}
92+
8793
@Test
8894
@Override
8995
@DisabledIf("isDb2")

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,13 @@ public void deleteMetadata(String namespace, String table) throws Exception {
7171
+ rdbEngine.encloseFullTableName(metadataSchema, JdbcAdmin.METADATA_TABLE)
7272
+ " WHERE "
7373
+ rdbEngine.enclose(JdbcAdmin.METADATA_COL_FULL_TABLE_NAME)
74-
+ " = '"
75-
+ getFullTableName(namespace, table)
76-
+ "'";
77-
execute(deleteMetadataStatement);
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+
}
7881
}
7982

8083
private void execute(String sql) throws SQLException {

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,10 +126,13 @@ public void deleteMetadata(String namespace, String table) throws Exception {
126126
+ rdbEngine.encloseFullTableName(jdbcMetadataSchema, JdbcAdmin.METADATA_TABLE)
127127
+ " WHERE "
128128
+ rdbEngine.enclose(JdbcAdmin.METADATA_COL_FULL_TABLE_NAME)
129-
+ " = '"
130-
+ getFullTableName(namespace, table)
131-
+ "'";
132-
execute(deleteMetadataStatement);
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+
}
133136
}
134137

135138
@Override

core/src/main/java/com/scalar/db/storage/cosmos/CosmosAdmin.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,8 @@ public void dropNamespace(String namespace) throws ExecutionException {
354354
getNamespacesContainer()
355355
.deleteItem(new CosmosNamespace(namespace), new CosmosItemRequestOptions());
356356
deleteMetadataDatabaseIfEmpty();
357+
} catch (IllegalArgumentException e) {
358+
throw e;
357359
} catch (RuntimeException e) {
358360
throw new ExecutionException(String.format("Deleting the %s database failed", namespace), e);
359361
}

core/src/main/java/com/scalar/db/storage/jdbc/JdbcAdmin.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,9 @@ public Set<String> getNamespaceTableNames(String namespace) throws ExecutionExce
712712
private Set<String> getNamespaceTableNamesInternal(Connection connection, String namespace)
713713
throws SQLException {
714714
String sql = rdbEngine.getTableNamesInNamespaceSql();
715+
if (Strings.isNullOrEmpty(sql)) {
716+
return Collections.emptySet();
717+
}
715718
Set<String> tableNames = new HashSet<>();
716719
try (PreparedStatement statement = connection.prepareStatement(sql)) {
717720
statement.setString(1, namespace);

core/src/main/java/com/scalar/db/storage/jdbc/RdbEngineSqlite.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,7 @@ public void setConnectionToReadOnly(Connection connection, boolean readOnly) {
370370

371371
@Override
372372
public String getTableNamesInNamespaceSql() {
373-
return "SELECT name FROM sqlite_master WHERE type='table' AND name LIKE ?";
373+
// Do nothing. Namespace is just a table prefix in the SQLite implementation.
374+
return null;
374375
}
375376
}

core/src/test/java/com/scalar/db/storage/cosmos/CosmosAdminTest.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -587,7 +587,8 @@ public void dropTable_WithMetadataLeft_ShouldDropContainerAndOnlyDeleteMetadata(
587587
// Arrange
588588
String namespace = "ns";
589589
CosmosDatabase metadataDatabase = mock(CosmosDatabase.class);
590-
when(client.getDatabase(any())).thenReturn(database, metadataDatabase);
590+
when(client.getDatabase(namespace)).thenReturn(database);
591+
when(client.getDatabase(METADATA_DATABASE)).thenReturn(metadataDatabase);
591592
CosmosContainer namespacesContainer = mock(CosmosContainer.class);
592593
when(metadataDatabase.getContainer(anyString())).thenReturn(namespacesContainer);
593594

@@ -597,6 +598,12 @@ public void dropTable_WithMetadataLeft_ShouldDropContainerAndOnlyDeleteMetadata(
597598
.thenReturn(pagedIterable);
598599
when(pagedIterable.stream()).thenReturn(Stream.of(new CosmosNamespace(METADATA_DATABASE)));
599600

601+
@SuppressWarnings("unchecked")
602+
CosmosPagedIterable<CosmosContainerProperties> emptyContainerPagedIterable =
603+
mock(CosmosPagedIterable.class);
604+
when(emptyContainerPagedIterable.stream()).thenReturn(Stream.empty());
605+
when(database.readAllContainers()).thenReturn(emptyContainerPagedIterable);
606+
600607
@SuppressWarnings("unchecked")
601608
CosmosPagedIterable<CosmosContainerProperties> containerPagedIterable =
602609
mock(CosmosPagedIterable.class);
@@ -613,7 +620,7 @@ public void dropTable_WithMetadataLeft_ShouldDropContainerAndOnlyDeleteMetadata(
613620
admin.dropNamespace(namespace);
614621

615622
// Assert
616-
verify(client).getDatabase(namespace);
623+
verify(client, times(2)).getDatabase(namespace);
617624
verify(database).delete();
618625
verify(client, times(3)).getDatabase(METADATA_DATABASE);
619626
verify(metadataDatabase, times(2)).getContainer(CosmosAdmin.NAMESPACES_CONTAINER);
@@ -628,10 +635,17 @@ public void dropNamespace_WithExistingDatabaseAndSomeNamespacesLeft_ShouldDropDa
628635
// Arrange
629636
String namespace = "ns";
630637
CosmosDatabase metadataDatabase = mock(CosmosDatabase.class);
631-
when(client.getDatabase(any())).thenReturn(database, metadataDatabase);
638+
when(client.getDatabase(namespace)).thenReturn(database);
639+
when(client.getDatabase(METADATA_DATABASE)).thenReturn(metadataDatabase);
632640
CosmosContainer namespacesContainer = mock(CosmosContainer.class);
633641
when(metadataDatabase.getContainer(anyString())).thenReturn(namespacesContainer);
634642

643+
@SuppressWarnings("unchecked")
644+
CosmosPagedIterable<CosmosContainerProperties> emptyContainerPagedIterable =
645+
mock(CosmosPagedIterable.class);
646+
when(emptyContainerPagedIterable.stream()).thenReturn(Stream.empty());
647+
when(database.readAllContainers()).thenReturn(emptyContainerPagedIterable);
648+
635649
@SuppressWarnings("unchecked")
636650
CosmosPagedIterable<Object> pagedIterable = mock(CosmosPagedIterable.class);
637651
when(namespacesContainer.queryItems(anyString(), any(), any())).thenReturn(pagedIterable);
@@ -642,7 +656,7 @@ public void dropNamespace_WithExistingDatabaseAndSomeNamespacesLeft_ShouldDropDa
642656
admin.dropNamespace(namespace);
643657

644658
// Assert
645-
verify(client).getDatabase(namespace);
659+
verify(client, times(2)).getDatabase(namespace);
646660
verify(database).delete();
647661
verify(client, times(2)).getDatabase(METADATA_DATABASE);
648662
verify(metadataDatabase, times(2)).getContainer(CosmosAdmin.NAMESPACES_CONTAINER);

core/src/test/java/com/scalar/db/storage/jdbc/JdbcAdminTest.java

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1957,7 +1957,6 @@ public void dropNamespace_forSqlite_shouldDropNamespace() throws Exception {
19571957
JdbcAdmin admin = createJdbcAdminFor(RdbEngine.SQLITE);
19581958

19591959
Connection connection = mock(Connection.class);
1960-
PreparedStatement getTableNamesPrepStmt = mock(PreparedStatement.class);
19611960
PreparedStatement deleteFromNamespaceTablePrepStmt = mock(PreparedStatement.class);
19621961
Statement selectAllFromNamespaceTablePrepStmt = mock(Statement.class);
19631962
Statement selectAllFromMetadataTablePrepStmt = mock(Statement.class);
@@ -1968,13 +1967,7 @@ public void dropNamespace_forSqlite_shouldDropNamespace() throws Exception {
19681967
selectAllFromNamespaceTablePrepStmt,
19691968
selectAllFromMetadataTablePrepStmt,
19701969
dropNamespaceTableStmt);
1971-
// Mock for getNamespaceTableNamesInternal() check - returns empty ResultSet (namespace is
1972-
// empty)
1973-
ResultSet emptyResultSet = mock(ResultSet.class);
1974-
when(emptyResultSet.next()).thenReturn(false);
1975-
when(getTableNamesPrepStmt.executeQuery()).thenReturn(emptyResultSet);
1976-
when(connection.prepareStatement(anyString()))
1977-
.thenReturn(getTableNamesPrepStmt, deleteFromNamespaceTablePrepStmt);
1970+
when(connection.prepareStatement(anyString())).thenReturn(deleteFromNamespaceTablePrepStmt);
19781971
when(dataSource.getConnection()).thenReturn(connection);
19791972
// Only the metadata schema is left
19801973
ResultSet resultSet1 =
@@ -2129,21 +2122,21 @@ private void dropNamespace_WithOtherNamespaceLeftForX_shouldOnlyDropNamespace(
21292122

21302123
Connection connection = mock(Connection.class);
21312124
Statement dropNamespaceStatementMock = mock(Statement.class);
2132-
PreparedStatement isNamespaceEmptyStatementMock = mock(PreparedStatement.class);
21332125
PreparedStatement deleteFromNamespaceTableMock = mock(PreparedStatement.class);
21342126
Statement selectNamespaceStatementMock = mock(Statement.class);
21352127
if (rdbEngine != RdbEngine.SQLITE) {
2128+
PreparedStatement getTableNamesPrepStmt = mock(PreparedStatement.class);
21362129
when(connection.createStatement())
21372130
.thenReturn(dropNamespaceStatementMock, selectNamespaceStatementMock);
2131+
ResultSet emptyResultSet = mock(ResultSet.class);
2132+
when(emptyResultSet.next()).thenReturn(false);
2133+
when(getTableNamesPrepStmt.executeQuery()).thenReturn(emptyResultSet);
2134+
when(connection.prepareStatement(anyString()))
2135+
.thenReturn(getTableNamesPrepStmt, deleteFromNamespaceTableMock);
21382136
} else {
21392137
when(connection.createStatement()).thenReturn(selectNamespaceStatementMock);
2138+
when(connection.prepareStatement(anyString())).thenReturn(deleteFromNamespaceTableMock);
21402139
}
2141-
// Mock for isNamespaceEmpty() check - returns empty ResultSet (namespace is empty)
2142-
ResultSet emptyResultSet = mock(ResultSet.class);
2143-
when(emptyResultSet.next()).thenReturn(false);
2144-
when(isNamespaceEmptyStatementMock.executeQuery()).thenReturn(emptyResultSet);
2145-
when(connection.prepareStatement(anyString()))
2146-
.thenReturn(isNamespaceEmptyStatementMock, deleteFromNamespaceTableMock);
21472140
when(dataSource.getConnection()).thenReturn(connection);
21482141
// Namespaces table contains other namespaces
21492142
ResultSet resultSet =

0 commit comments

Comments
 (0)