diff --git a/core/src/integration-test/java/com/scalar/db/storage/cassandra/CassandraAdminCaseSensitivityIntegrationTest.java b/core/src/integration-test/java/com/scalar/db/storage/cassandra/CassandraAdminCaseSensitivityIntegrationTest.java index 75e3fe3d1..bf759cfcb 100644 --- a/core/src/integration-test/java/com/scalar/db/storage/cassandra/CassandraAdminCaseSensitivityIntegrationTest.java +++ b/core/src/integration-test/java/com/scalar/db/storage/cassandra/CassandraAdminCaseSensitivityIntegrationTest.java @@ -105,4 +105,8 @@ public void renameTable_IfNewTableNameAlreadyExists_ShouldThrowIllegalArgumentEx @Override @Disabled("Cassandra does not support renaming tables") public void renameTable_ForExistingTableWithIndexes_ShouldRenameTableAndIndexesCorrectly() {} + + @Override + @Disabled("Cassandra does not support renaming tables") + public void renameTable_IfOnlyOneTableExists_ShouldRenameTableCorrectly() {} } diff --git a/core/src/integration-test/java/com/scalar/db/storage/cassandra/CassandraAdminIntegrationTest.java b/core/src/integration-test/java/com/scalar/db/storage/cassandra/CassandraAdminIntegrationTest.java index 7dc8c3748..59a3ab077 100644 --- a/core/src/integration-test/java/com/scalar/db/storage/cassandra/CassandraAdminIntegrationTest.java +++ b/core/src/integration-test/java/com/scalar/db/storage/cassandra/CassandraAdminIntegrationTest.java @@ -104,4 +104,8 @@ public void renameTable_IfNewTableNameAlreadyExists_ShouldThrowIllegalArgumentEx @Override @Disabled("Cassandra does not support renaming tables") public void renameTable_ForExistingTableWithIndexes_ShouldRenameTableAndIndexesCorrectly() {} + + @Override + @Disabled("Cassandra does not support renaming tables") + public void renameTable_IfOnlyOneTableExists_ShouldRenameTableCorrectly() {} } diff --git a/core/src/integration-test/java/com/scalar/db/storage/cassandra/ConsensusCommitAdminIntegrationTestWithCassandra.java b/core/src/integration-test/java/com/scalar/db/storage/cassandra/ConsensusCommitAdminIntegrationTestWithCassandra.java index ec839164c..835d0e6bd 100644 --- a/core/src/integration-test/java/com/scalar/db/storage/cassandra/ConsensusCommitAdminIntegrationTestWithCassandra.java +++ b/core/src/integration-test/java/com/scalar/db/storage/cassandra/ConsensusCommitAdminIntegrationTestWithCassandra.java @@ -104,4 +104,8 @@ public void renameTable_IfNewTableNameAlreadyExists_ShouldThrowIllegalArgumentEx @Override @Disabled("Cassandra does not support renaming tables") public void renameTable_ForExistingTableWithIndexes_ShouldRenameTableAndIndexesCorrectly() {} + + @Override + @Disabled("Cassandra does not support renaming tables") + public void renameTable_IfOnlyOneTableExists_ShouldRenameTableCorrectly() {} } diff --git a/core/src/integration-test/java/com/scalar/db/storage/cassandra/SingleCrudOperationTransactionAdminIntegrationTestWithCassandra.java b/core/src/integration-test/java/com/scalar/db/storage/cassandra/SingleCrudOperationTransactionAdminIntegrationTestWithCassandra.java index 95b484b38..65535024c 100644 --- a/core/src/integration-test/java/com/scalar/db/storage/cassandra/SingleCrudOperationTransactionAdminIntegrationTestWithCassandra.java +++ b/core/src/integration-test/java/com/scalar/db/storage/cassandra/SingleCrudOperationTransactionAdminIntegrationTestWithCassandra.java @@ -99,4 +99,8 @@ public void renameTable_IfNewTableNameAlreadyExists_ShouldThrowIllegalArgumentEx @Override @Disabled("Cassandra does not support renaming tables") public void renameTable_ForExistingTableWithIndexes_ShouldRenameTableAndIndexesCorrectly() {} + + @Override + @Disabled("Cassandra does not support renaming tables") + public void renameTable_IfOnlyOneTableExists_ShouldRenameTableCorrectly() {} } diff --git a/core/src/integration-test/java/com/scalar/db/storage/cosmos/ConsensusCommitAdminIntegrationTestWithCosmos.java b/core/src/integration-test/java/com/scalar/db/storage/cosmos/ConsensusCommitAdminIntegrationTestWithCosmos.java index 864253b4f..312b9202c 100644 --- a/core/src/integration-test/java/com/scalar/db/storage/cosmos/ConsensusCommitAdminIntegrationTestWithCosmos.java +++ b/core/src/integration-test/java/com/scalar/db/storage/cosmos/ConsensusCommitAdminIntegrationTestWithCosmos.java @@ -96,4 +96,8 @@ public void renameTable_IfNewTableNameAlreadyExists_ShouldThrowIllegalArgumentEx @Override @Disabled("Cosmos DB does not support renaming tables") public void renameTable_ForExistingTableWithIndexes_ShouldRenameTableAndIndexesCorrectly() {} + + @Override + @Disabled("Cosmos DB does not support renaming tables") + public void renameTable_IfOnlyOneTableExists_ShouldRenameTableCorrectly() {} } diff --git a/core/src/integration-test/java/com/scalar/db/storage/cosmos/CosmosAdminCaseSensitivityIntegrationTest.java b/core/src/integration-test/java/com/scalar/db/storage/cosmos/CosmosAdminCaseSensitivityIntegrationTest.java index 2bedab906..2ac183767 100644 --- a/core/src/integration-test/java/com/scalar/db/storage/cosmos/CosmosAdminCaseSensitivityIntegrationTest.java +++ b/core/src/integration-test/java/com/scalar/db/storage/cosmos/CosmosAdminCaseSensitivityIntegrationTest.java @@ -96,4 +96,8 @@ public void renameTable_IfNewTableNameAlreadyExists_ShouldThrowIllegalArgumentEx @Override @Disabled("Cosmos DB does not support renaming tables") public void renameTable_ForExistingTableWithIndexes_ShouldRenameTableAndIndexesCorrectly() {} + + @Override + @Disabled("Cosmos DB does not support renaming tables") + public void renameTable_IfOnlyOneTableExists_ShouldRenameTableCorrectly() {} } diff --git a/core/src/integration-test/java/com/scalar/db/storage/cosmos/CosmosAdminIntegrationTest.java b/core/src/integration-test/java/com/scalar/db/storage/cosmos/CosmosAdminIntegrationTest.java index e7f33d6cc..afb85f6b3 100644 --- a/core/src/integration-test/java/com/scalar/db/storage/cosmos/CosmosAdminIntegrationTest.java +++ b/core/src/integration-test/java/com/scalar/db/storage/cosmos/CosmosAdminIntegrationTest.java @@ -95,4 +95,8 @@ public void renameTable_IfNewTableNameAlreadyExists_ShouldThrowIllegalArgumentEx @Override @Disabled("Cosmos DB does not support renaming tables") public void renameTable_ForExistingTableWithIndexes_ShouldRenameTableAndIndexesCorrectly() {} + + @Override + @Disabled("Cosmos DB does not support renaming tables") + public void renameTable_IfOnlyOneTableExists_ShouldRenameTableCorrectly() {} } diff --git a/core/src/integration-test/java/com/scalar/db/storage/cosmos/SingleCrudOperationTransactionAdminIntegrationTestWithCosmos.java b/core/src/integration-test/java/com/scalar/db/storage/cosmos/SingleCrudOperationTransactionAdminIntegrationTestWithCosmos.java index 936909841..f76f4a671 100644 --- a/core/src/integration-test/java/com/scalar/db/storage/cosmos/SingleCrudOperationTransactionAdminIntegrationTestWithCosmos.java +++ b/core/src/integration-test/java/com/scalar/db/storage/cosmos/SingleCrudOperationTransactionAdminIntegrationTestWithCosmos.java @@ -90,4 +90,8 @@ public void renameTable_IfNewTableNameAlreadyExists_ShouldThrowIllegalArgumentEx @Override @Disabled("Cosmos DB does not support renaming tables") public void renameTable_ForExistingTableWithIndexes_ShouldRenameTableAndIndexesCorrectly() {} + + @Override + @Disabled("Cosmos DB does not support renaming tables") + public void renameTable_IfOnlyOneTableExists_ShouldRenameTableCorrectly() {} } diff --git a/core/src/integration-test/java/com/scalar/db/storage/dynamo/ConsensusCommitAdminIntegrationTestWithDynamo.java b/core/src/integration-test/java/com/scalar/db/storage/dynamo/ConsensusCommitAdminIntegrationTestWithDynamo.java index a885ee257..f3b7d9a87 100644 --- a/core/src/integration-test/java/com/scalar/db/storage/dynamo/ConsensusCommitAdminIntegrationTestWithDynamo.java +++ b/core/src/integration-test/java/com/scalar/db/storage/dynamo/ConsensusCommitAdminIntegrationTestWithDynamo.java @@ -101,4 +101,8 @@ public void renameTable_IfNewTableNameAlreadyExists_ShouldThrowIllegalArgumentEx @Override @Disabled("DynamoDB does not support renaming tables") public void renameTable_ForExistingTableWithIndexes_ShouldRenameTableAndIndexesCorrectly() {} + + @Override + @Disabled("DynamoDB does not support renaming tables") + public void renameTable_IfOnlyOneTableExists_ShouldRenameTableCorrectly() {} } diff --git a/core/src/integration-test/java/com/scalar/db/storage/dynamo/DynamoAdminCaseSensitivityIntegrationTest.java b/core/src/integration-test/java/com/scalar/db/storage/dynamo/DynamoAdminCaseSensitivityIntegrationTest.java index b1fb8fcde..c5c362c51 100644 --- a/core/src/integration-test/java/com/scalar/db/storage/dynamo/DynamoAdminCaseSensitivityIntegrationTest.java +++ b/core/src/integration-test/java/com/scalar/db/storage/dynamo/DynamoAdminCaseSensitivityIntegrationTest.java @@ -101,4 +101,8 @@ public void renameTable_IfNewTableNameAlreadyExists_ShouldThrowIllegalArgumentEx @Override @Disabled("DynamoDB does not support renaming tables") public void renameTable_ForExistingTableWithIndexes_ShouldRenameTableAndIndexesCorrectly() {} + + @Override + @Disabled("DynamoDB does not support renaming tables") + public void renameTable_IfOnlyOneTableExists_ShouldRenameTableCorrectly() {} } diff --git a/core/src/integration-test/java/com/scalar/db/storage/dynamo/DynamoAdminIntegrationTest.java b/core/src/integration-test/java/com/scalar/db/storage/dynamo/DynamoAdminIntegrationTest.java index 33f8dfeb4..3193d1e34 100644 --- a/core/src/integration-test/java/com/scalar/db/storage/dynamo/DynamoAdminIntegrationTest.java +++ b/core/src/integration-test/java/com/scalar/db/storage/dynamo/DynamoAdminIntegrationTest.java @@ -100,4 +100,8 @@ public void renameTable_IfNewTableNameAlreadyExists_ShouldThrowIllegalArgumentEx @Override @Disabled("DynamoDB does not support renaming tables") public void renameTable_ForExistingTableWithIndexes_ShouldRenameTableAndIndexesCorrectly() {} + + @Override + @Disabled("DynamoDB does not support renaming tables") + public void renameTable_IfOnlyOneTableExists_ShouldRenameTableCorrectly() {} } diff --git a/core/src/integration-test/java/com/scalar/db/storage/dynamo/SingleCrudOperationTransactionAdminIntegrationTestWithDynamo.java b/core/src/integration-test/java/com/scalar/db/storage/dynamo/SingleCrudOperationTransactionAdminIntegrationTestWithDynamo.java index c971f6e29..12c023f61 100644 --- a/core/src/integration-test/java/com/scalar/db/storage/dynamo/SingleCrudOperationTransactionAdminIntegrationTestWithDynamo.java +++ b/core/src/integration-test/java/com/scalar/db/storage/dynamo/SingleCrudOperationTransactionAdminIntegrationTestWithDynamo.java @@ -95,4 +95,8 @@ public void renameTable_IfNewTableNameAlreadyExists_ShouldThrowIllegalArgumentEx @Override @Disabled("DynamoDB does not support renaming tables") public void renameTable_ForExistingTableWithIndexes_ShouldRenameTableAndIndexesCorrectly() {} + + @Override + @Disabled("DynamoDB does not support renaming tables") + public void renameTable_IfOnlyOneTableExists_ShouldRenameTableCorrectly() {} } diff --git a/core/src/main/java/com/scalar/db/storage/jdbc/JdbcAdmin.java b/core/src/main/java/com/scalar/db/storage/jdbc/JdbcAdmin.java index 23cfd6a20..abdfa1535 100644 --- a/core/src/main/java/com/scalar/db/storage/jdbc/JdbcAdmin.java +++ b/core/src/main/java/com/scalar/db/storage/jdbc/JdbcAdmin.java @@ -409,7 +409,7 @@ private String computeBooleanValue(boolean value) { public void dropTable(String namespace, String table) throws ExecutionException { try (Connection connection = dataSource.getConnection()) { dropTableInternal(connection, namespace, table); - deleteTableMetadata(connection, namespace, table); + deleteTableMetadata(connection, namespace, table, true); deleteNamespacesTableAndMetadataSchemaIfEmpty(connection); } catch (SQLException e) { throw new ExecutionException( @@ -423,11 +423,14 @@ private void dropTableInternal(Connection connection, String schema, String tabl execute(connection, dropTableStatement); } - private void deleteTableMetadata(Connection connection, String namespace, String table) + private void deleteTableMetadata( + Connection connection, String namespace, String table, boolean deleteMetadataTableIfEmpty) throws SQLException { try { execute(connection, getDeleteTableMetadataStatement(namespace, table)); - deleteMetadataTableIfEmpty(connection); + if (deleteMetadataTableIfEmpty) { + deleteMetadataTableIfEmpty(connection); + } } catch (SQLException e) { if (e.getMessage().contains("Unknown table") || e.getMessage().contains("does not exist")) { return; @@ -1015,7 +1018,7 @@ public void renameTable(String namespace, String oldTableName, String newTableNa String renameTableStatement = rdbEngine.renameTableSql(namespace, oldTableName, newTableName); try (Connection connection = dataSource.getConnection()) { execute(connection, renameTableStatement); - deleteTableMetadata(connection, namespace, oldTableName); + deleteTableMetadata(connection, namespace, oldTableName, false); for (String indexedColumnName : tableMetadata.getSecondaryIndexNames()) { String oldIndexName = getIndexName(namespace, oldTableName, indexedColumnName); String newIndexName = getIndexName(namespace, newTableName, indexedColumnName); diff --git a/core/src/test/java/com/scalar/db/storage/jdbc/JdbcAdminTest.java b/core/src/test/java/com/scalar/db/storage/jdbc/JdbcAdminTest.java index c8636162e..7b2528e2e 100644 --- a/core/src/test/java/com/scalar/db/storage/jdbc/JdbcAdminTest.java +++ b/core/src/test/java/com/scalar/db/storage/jdbc/JdbcAdminTest.java @@ -3425,7 +3425,6 @@ public void renameTable_ForMysql_ShouldWorkProperly() throws SQLException, Execu + "`.`metadata` WHERE `full_table_name`=? ORDER BY `ordinal_position` ASC", "ALTER TABLE `ns`.`table` RENAME TO `ns`.`table_new`", "DELETE FROM `" + METADATA_SCHEMA + "`.`metadata` WHERE `full_table_name` = 'ns.table'", - "SELECT DISTINCT `full_table_name` FROM `" + METADATA_SCHEMA + "`.`metadata`", "INSERT INTO `" + METADATA_SCHEMA + "`.`metadata` VALUES ('ns.table_new','c1','TEXT','PARTITION',NULL,false,1)", @@ -3445,7 +3444,6 @@ public void renameTable_ForOracle_ShouldWorkProperly() throws SQLException, Exec "DELETE FROM \"" + METADATA_SCHEMA + "\".\"metadata\" WHERE \"full_table_name\" = 'ns.table'", - "SELECT DISTINCT \"full_table_name\" FROM \"" + METADATA_SCHEMA + "\".\"metadata\"", "INSERT INTO \"" + METADATA_SCHEMA + "\".\"metadata\" VALUES ('ns.table_new','c1','TEXT','PARTITION',NULL,0,1)", @@ -3466,7 +3464,6 @@ public void renameTable_ForPostgresql_ShouldWorkProperly() "DELETE FROM \"" + METADATA_SCHEMA + "\".\"metadata\" WHERE \"full_table_name\" = 'ns.table'", - "SELECT DISTINCT \"full_table_name\" FROM \"" + METADATA_SCHEMA + "\".\"metadata\"", "INSERT INTO \"" + METADATA_SCHEMA + "\".\"metadata\" VALUES ('ns.table_new','c1','TEXT','PARTITION',NULL,false,1)", @@ -3485,7 +3482,6 @@ public void renameTable_ForSqlServer_ShouldWorkProperly() + "].[metadata] WHERE [full_table_name]=? ORDER BY [ordinal_position] ASC", "EXEC sp_rename '[ns].[table]', 'table_new'", "DELETE FROM [" + METADATA_SCHEMA + "].[metadata] WHERE [full_table_name] = 'ns.table'", - "SELECT DISTINCT [full_table_name] FROM [" + METADATA_SCHEMA + "].[metadata]", "INSERT INTO [" + METADATA_SCHEMA + "].[metadata] VALUES ('ns.table_new','c1','TEXT','PARTITION',NULL,0,1)", @@ -3503,7 +3499,6 @@ public void renameTable_ForSqlite_ShouldWorkProperly() throws SQLException, Exec + "$metadata\" WHERE \"full_table_name\"=? ORDER BY \"ordinal_position\" ASC", "ALTER TABLE \"ns$table\" RENAME TO \"ns$table_new\"", "DELETE FROM \"" + METADATA_SCHEMA + "$metadata\" WHERE \"full_table_name\" = 'ns.table'", - "SELECT DISTINCT \"full_table_name\" FROM \"" + METADATA_SCHEMA + "$metadata\"", "INSERT INTO \"" + METADATA_SCHEMA + "$metadata\" VALUES ('ns.table_new','c1','TEXT','PARTITION',NULL,FALSE,1)", @@ -3523,7 +3518,6 @@ public void renameTable_ForDb2_ShouldWorkProperly() throws SQLException, Executi "DELETE FROM \"" + METADATA_SCHEMA + "\".\"metadata\" WHERE \"full_table_name\" = 'ns.table'", - "SELECT DISTINCT \"full_table_name\" FROM \"" + METADATA_SCHEMA + "\".\"metadata\"", "INSERT INTO \"" + METADATA_SCHEMA + "\".\"metadata\" VALUES ('ns.table_new','c1','TEXT','PARTITION',NULL,false,1)", diff --git a/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java b/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java index 15c74f548..882004960 100644 --- a/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java +++ b/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java @@ -1568,6 +1568,36 @@ public void renameTable_ForExistingTableWithIndexes_ShouldRenameTableAndIndexesC } } + @Test + public void renameTable_IfOnlyOneTableExists_ShouldRenameTableCorrectly() + throws ExecutionException { + String newTableName = "new" + getTable4(); + try { + // Arrange + admin.createNamespace(namespace3); + Map options = getCreationOptions(); + TableMetadata tableMetadata = + TableMetadata.newBuilder() + .addColumn(getColumnName1(), DataType.INT) + .addColumn(getColumnName2(), DataType.INT) + .addPartitionKey(getColumnName1()) + .build(); + admin.createTable(namespace3, getTable4(), tableMetadata, options); + + // Act + admin.renameTable(namespace3, getTable4(), newTableName); + + // Assert + assertThat(admin.tableExists(namespace3, getTable4())).isFalse(); + assertThat(admin.tableExists(namespace3, newTableName)).isTrue(); + assertThat(admin.getTableMetadata(namespace3, newTableName)).isEqualTo(tableMetadata); + } finally { + admin.dropTable(namespace3, getTable4(), true); + admin.dropTable(namespace3, newTableName, true); + admin.dropNamespace(namespace3, true); + } + } + @Test public void alterColumnType_ForNonExistingTable_ShouldThrowIllegalArgumentException() { // Arrange diff --git a/integration-test/src/main/java/com/scalar/db/api/DistributedTransactionAdminIntegrationTestBase.java b/integration-test/src/main/java/com/scalar/db/api/DistributedTransactionAdminIntegrationTestBase.java index a255c2aa5..6a1cb8feb 100644 --- a/integration-test/src/main/java/com/scalar/db/api/DistributedTransactionAdminIntegrationTestBase.java +++ b/integration-test/src/main/java/com/scalar/db/api/DistributedTransactionAdminIntegrationTestBase.java @@ -1464,6 +1464,36 @@ public void renameTable_ForExistingTableWithIndexes_ShouldRenameTableAndIndexesC } } + @Test + public void renameTable_IfOnlyOneTableExists_ShouldRenameTableCorrectly() + throws ExecutionException { + String newTableName = "new" + TABLE4; + try { + // Arrange + admin.createNamespace(namespace3); + Map options = getCreationOptions(); + TableMetadata tableMetadata = + TableMetadata.newBuilder() + .addColumn("c1", DataType.INT) + .addColumn("c2", DataType.INT) + .addPartitionKey("c1") + .build(); + admin.createTable(namespace3, TABLE4, tableMetadata, options); + + // Act + admin.renameTable(namespace3, TABLE4, newTableName); + + // Assert + assertThat(admin.tableExists(namespace3, TABLE4)).isFalse(); + assertThat(admin.tableExists(namespace3, newTableName)).isTrue(); + assertThat(admin.getTableMetadata(namespace3, newTableName)).isEqualTo(tableMetadata); + } finally { + admin.dropTable(namespace3, TABLE4, true); + admin.dropTable(namespace3, newTableName, true); + admin.dropNamespace(namespace3, true); + } + } + @Test public void createCoordinatorTables_ShouldCreateCoordinatorTablesCorrectly() throws ExecutionException {