From c5df132536f8a265fb93cb2ae984ce082b349d16 Mon Sep 17 00:00:00 2001 From: Kodai Doki <52027276+KodaiD@users.noreply.github.com> Date: Tue, 21 Oct 2025 05:38:49 +0000 Subject: [PATCH 1/2] Empty commit [skip ci] From 420208df474eb5e7481dc05536b265cde913d2b6 Mon Sep 17 00:00:00 2001 From: Kodai Doki <52027276+KodaiD@users.noreply.github.com> Date: Tue, 21 Oct 2025 14:38:29 +0900 Subject: [PATCH 2/2] Resolve conflicts --- ...raAdminCaseSensitivityIntegrationTest.java | 4 +++ .../CassandraAdminIntegrationTest.java | 4 +++ ...mmitAdminIntegrationTestWithCassandra.java | 4 +++ ...tionAdminIntegrationTestWithCassandra.java | 4 +++ ...sCommitAdminIntegrationTestWithCosmos.java | 4 +++ ...osAdminCaseSensitivityIntegrationTest.java | 4 +++ .../cosmos/CosmosAdminIntegrationTest.java | 4 +++ ...sactionAdminIntegrationTestWithCosmos.java | 4 +++ ...sCommitAdminIntegrationTestWithDynamo.java | 4 +++ ...moAdminCaseSensitivityIntegrationTest.java | 4 +++ .../dynamo/DynamoAdminIntegrationTest.java | 4 +++ ...sactionAdminIntegrationTestWithDynamo.java | 4 +++ .../com/scalar/db/storage/jdbc/JdbcAdmin.java | 11 ++++--- .../db/storage/jdbc/JdbcAdminTestBase.java | 6 ---- ...ibutedStorageAdminIntegrationTestBase.java | 30 +++++++++++++++++++ ...edTransactionAdminIntegrationTestBase.java | 30 +++++++++++++++++++ 16 files changed, 115 insertions(+), 10 deletions(-) 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 6b385d95d..a82a8cf34 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 @@ -101,4 +101,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 9d79c4405..9fa04fb4c 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 @@ -100,4 +100,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 ce41e66a1..2fd0c4a9c 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 @@ -118,4 +118,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 717e7fd90..8633cd660 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 @@ -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/cosmos/ConsensusCommitAdminIntegrationTestWithCosmos.java b/core/src/integration-test/java/com/scalar/db/storage/cosmos/ConsensusCommitAdminIntegrationTestWithCosmos.java index 9bf1677eb..b38db3033 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 @@ -113,4 +113,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 463266d39..15d38b51e 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 @@ -98,4 +98,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 d5e87826e..168078c3e 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 @@ -97,4 +97,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 10e16505f..009b1dbdd 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 @@ -98,4 +98,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 508424b15..d03939cd7 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 @@ -167,4 +167,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 2b744722e..de95fb445 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 @@ -152,4 +152,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 ecc009872..2eaa3016f 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 @@ -151,4 +151,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 30a567f18..1733e9a0d 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 @@ -152,4 +152,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 821590c04..ce05bb7ef 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 @@ -309,7 +309,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); } catch (SQLException e) { throw new ExecutionException( "Dropping the table failed: " + getFullTableName(namespace, table), e); @@ -322,11 +322,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)); - deleteMetadataSchemaAndTableIfEmpty(connection); + if (deleteMetadataTableIfEmpty) { + deleteMetadataSchemaAndTableIfEmpty(connection); + } } catch (SQLException e) { if (e.getMessage().contains("Unknown table") || e.getMessage().contains("does not exist")) { return; @@ -906,7 +909,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/JdbcAdminTestBase.java b/core/src/test/java/com/scalar/db/storage/jdbc/JdbcAdminTestBase.java index e1d8297a9..6f7b6f5bb 100644 --- a/core/src/test/java/com/scalar/db/storage/jdbc/JdbcAdminTestBase.java +++ b/core/src/test/java/com/scalar/db/storage/jdbc/JdbcAdminTestBase.java @@ -3294,7 +3294,6 @@ public void renameTable_ForMysql_ShouldWorkProperly() throws SQLException, Execu "DELETE FROM `" + tableMetadataSchemaName + "`.`metadata` WHERE `full_table_name` = 'ns.table'", - "SELECT DISTINCT `full_table_name` FROM `" + tableMetadataSchemaName + "`.`metadata`", "INSERT INTO `" + tableMetadataSchemaName + "`.`metadata` VALUES ('ns.table_new','c1','TEXT','PARTITION',NULL,false,1)", @@ -3314,7 +3313,6 @@ public void renameTable_ForOracle_ShouldWorkProperly() throws SQLException, Exec "DELETE FROM \"" + tableMetadataSchemaName + "\".\"metadata\" WHERE \"full_table_name\" = 'ns.table'", - "SELECT DISTINCT \"full_table_name\" FROM \"" + tableMetadataSchemaName + "\".\"metadata\"", "INSERT INTO \"" + tableMetadataSchemaName + "\".\"metadata\" VALUES ('ns.table_new','c1','TEXT','PARTITION',NULL,0,1)", @@ -3335,7 +3333,6 @@ public void renameTable_ForPostgresql_ShouldWorkProperly() "DELETE FROM \"" + tableMetadataSchemaName + "\".\"metadata\" WHERE \"full_table_name\" = 'ns.table'", - "SELECT DISTINCT \"full_table_name\" FROM \"" + tableMetadataSchemaName + "\".\"metadata\"", "INSERT INTO \"" + tableMetadataSchemaName + "\".\"metadata\" VALUES ('ns.table_new','c1','TEXT','PARTITION',NULL,false,1)", @@ -3356,7 +3353,6 @@ public void renameTable_ForSqlServer_ShouldWorkProperly() "DELETE FROM [" + tableMetadataSchemaName + "].[metadata] WHERE [full_table_name] = 'ns.table'", - "SELECT DISTINCT [full_table_name] FROM [" + tableMetadataSchemaName + "].[metadata]", "INSERT INTO [" + tableMetadataSchemaName + "].[metadata] VALUES ('ns.table_new','c1','TEXT','PARTITION',NULL,0,1)", @@ -3376,7 +3372,6 @@ public void renameTable_ForSqlite_ShouldWorkProperly() throws SQLException, Exec "DELETE FROM \"" + tableMetadataSchemaName + "$metadata\" WHERE \"full_table_name\" = 'ns.table'", - "SELECT DISTINCT \"full_table_name\" FROM \"" + tableMetadataSchemaName + "$metadata\"", "INSERT INTO \"" + tableMetadataSchemaName + "$metadata\" VALUES ('ns.table_new','c1','TEXT','PARTITION',NULL,FALSE,1)", @@ -3396,7 +3391,6 @@ public void renameTable_ForDb2_ShouldWorkProperly() throws SQLException, Executi "DELETE FROM \"" + tableMetadataSchemaName + "\".\"metadata\" WHERE \"full_table_name\" = 'ns.table'", - "SELECT DISTINCT \"full_table_name\" FROM \"" + tableMetadataSchemaName + "\".\"metadata\"", "INSERT INTO \"" + tableMetadataSchemaName + "\".\"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 c72c31a14..8a89950ce 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 @@ -1545,6 +1545,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 137bbdee9..e19600aa3 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 @@ -1485,6 +1485,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 {