From c354262661265f18d5797bf50d49f74beaf7cc69 Mon Sep 17 00:00:00 2001 From: Kodai Doki Date: Fri, 17 Oct 2025 20:32:24 +0900 Subject: [PATCH 1/3] Fix bug in renameTable --- .../com/scalar/db/storage/jdbc/JdbcAdmin.java | 2 +- .../scalar/db/storage/jdbc/JdbcAdminTest.java | 64 +++++++++++++++++++ ...ibutedStorageAdminIntegrationTestBase.java | 30 +++++++++ ...edTransactionAdminIntegrationTestBase.java | 30 +++++++++ 4 files changed, 125 insertions(+), 1 deletion(-) 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 23cfd6a209..00f621359f 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 @@ -1022,7 +1022,7 @@ public void renameTable(String namespace, String oldTableName, String newTableNa renameIndexInternal( connection, namespace, newTableName, indexedColumnName, oldIndexName, newIndexName); } - addTableMetadata(connection, namespace, newTableName, tableMetadata, false, false); + addTableMetadata(connection, namespace, newTableName, tableMetadata, true, false); } } catch (SQLException e) { throw new ExecutionException( 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 c8636162e2..1af054bb42 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 @@ -3426,6 +3426,18 @@ public void renameTable_ForMysql_ShouldWorkProperly() throws SQLException, Execu "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`", + "CREATE SCHEMA IF NOT EXISTS `" + METADATA_SCHEMA + "`", + "CREATE TABLE IF NOT EXISTS `" + + METADATA_SCHEMA + + "`.`metadata`(" + + "`full_table_name` VARCHAR(128)," + + "`column_name` VARCHAR(128)," + + "`data_type` VARCHAR(20) NOT NULL," + + "`key_type` VARCHAR(20)," + + "`clustering_order` VARCHAR(10)," + + "`indexed` BOOLEAN NOT NULL," + + "`ordinal_position` INTEGER NOT NULL," + + "PRIMARY KEY (`full_table_name`, `column_name`))", "INSERT INTO `" + METADATA_SCHEMA + "`.`metadata` VALUES ('ns.table_new','c1','TEXT','PARTITION',NULL,false,1)", @@ -3446,6 +3458,11 @@ public void renameTable_ForOracle_ShouldWorkProperly() throws SQLException, Exec + METADATA_SCHEMA + "\".\"metadata\" WHERE \"full_table_name\" = 'ns.table'", "SELECT DISTINCT \"full_table_name\" FROM \"" + METADATA_SCHEMA + "\".\"metadata\"", + "CREATE USER \"" + METADATA_SCHEMA + "\" IDENTIFIED BY \"Oracle1234!@#$\"", + "ALTER USER \"" + METADATA_SCHEMA + "\" quota unlimited on USERS", + "CREATE TABLE \"" + + METADATA_SCHEMA + + "\".\"metadata\"(\"full_table_name\" VARCHAR2(128),\"column_name\" VARCHAR2(128),\"data_type\" VARCHAR2(20) NOT NULL,\"key_type\" VARCHAR2(20),\"clustering_order\" VARCHAR2(10),\"indexed\" NUMBER(1) NOT NULL,\"ordinal_position\" INTEGER NOT NULL,PRIMARY KEY (\"full_table_name\", \"column_name\"))", "INSERT INTO \"" + METADATA_SCHEMA + "\".\"metadata\" VALUES ('ns.table_new','c1','TEXT','PARTITION',NULL,0,1)", @@ -3467,6 +3484,18 @@ public void renameTable_ForPostgresql_ShouldWorkProperly() + METADATA_SCHEMA + "\".\"metadata\" WHERE \"full_table_name\" = 'ns.table'", "SELECT DISTINCT \"full_table_name\" FROM \"" + METADATA_SCHEMA + "\".\"metadata\"", + "CREATE SCHEMA IF NOT EXISTS \"" + METADATA_SCHEMA + "\"", + "CREATE TABLE IF NOT EXISTS \"" + + METADATA_SCHEMA + + "\".\"metadata\"(" + + "\"full_table_name\" VARCHAR(128)," + + "\"column_name\" VARCHAR(128)," + + "\"data_type\" VARCHAR(20) NOT NULL," + + "\"key_type\" VARCHAR(20)," + + "\"clustering_order\" VARCHAR(10)," + + "\"indexed\" BOOLEAN NOT NULL," + + "\"ordinal_position\" INTEGER NOT NULL," + + "PRIMARY KEY (\"full_table_name\", \"column_name\"))", "INSERT INTO \"" + METADATA_SCHEMA + "\".\"metadata\" VALUES ('ns.table_new','c1','TEXT','PARTITION',NULL,false,1)", @@ -3486,6 +3515,18 @@ public void renameTable_ForSqlServer_ShouldWorkProperly() "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]", + "CREATE SCHEMA [" + METADATA_SCHEMA + "]", + "CREATE TABLE [" + + METADATA_SCHEMA + + "].[metadata](" + + "[full_table_name] VARCHAR(128)," + + "[column_name] VARCHAR(128)," + + "[data_type] VARCHAR(20) NOT NULL," + + "[key_type] VARCHAR(20)," + + "[clustering_order] VARCHAR(10)," + + "[indexed] BIT NOT NULL," + + "[ordinal_position] INTEGER NOT NULL," + + "PRIMARY KEY ([full_table_name], [column_name]))", "INSERT INTO [" + METADATA_SCHEMA + "].[metadata] VALUES ('ns.table_new','c1','TEXT','PARTITION',NULL,0,1)", @@ -3504,6 +3545,17 @@ public void renameTable_ForSqlite_ShouldWorkProperly() throws SQLException, Exec "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\"", + "CREATE TABLE IF NOT EXISTS \"" + + METADATA_SCHEMA + + "$metadata\"(" + + "\"full_table_name\" TEXT," + + "\"column_name\" TEXT," + + "\"data_type\" TEXT NOT NULL," + + "\"key_type\" TEXT," + + "\"clustering_order\" TEXT," + + "\"indexed\" BOOLEAN NOT NULL," + + "\"ordinal_position\" INTEGER NOT NULL," + + "PRIMARY KEY (\"full_table_name\", \"column_name\"))", "INSERT INTO \"" + METADATA_SCHEMA + "$metadata\" VALUES ('ns.table_new','c1','TEXT','PARTITION',NULL,FALSE,1)", @@ -3524,6 +3576,18 @@ public void renameTable_ForDb2_ShouldWorkProperly() throws SQLException, Executi + METADATA_SCHEMA + "\".\"metadata\" WHERE \"full_table_name\" = 'ns.table'", "SELECT DISTINCT \"full_table_name\" FROM \"" + METADATA_SCHEMA + "\".\"metadata\"", + "CREATE SCHEMA \"" + METADATA_SCHEMA + "\"", + "CREATE TABLE IF NOT EXISTS \"" + + METADATA_SCHEMA + + "\".\"metadata\"(" + + "\"full_table_name\" VARCHAR(128) NOT NULL," + + "\"column_name\" VARCHAR(128) NOT NULL," + + "\"data_type\" VARCHAR(20) NOT NULL," + + "\"key_type\" VARCHAR(20)," + + "\"clustering_order\" VARCHAR(10)," + + "\"indexed\" BOOLEAN NOT NULL," + + "\"ordinal_position\" INTEGER NOT NULL," + + "PRIMARY KEY (\"full_table_name\", \"column_name\"))", "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 15c74f548a..8820049603 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 a255c2aa52..6a1cb8febe 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 { From 149d5c2a44a6df9916c5126fb8221bbf75b7cc08 Mon Sep 17 00:00:00 2001 From: Kodai Doki Date: Fri, 17 Oct 2025 21:28:05 +0900 Subject: [PATCH 2/3] Update integration tests --- .../CassandraAdminCaseSensitivityIntegrationTest.java | 4 ++++ .../db/storage/cassandra/CassandraAdminIntegrationTest.java | 4 ++++ .../ConsensusCommitAdminIntegrationTestWithCassandra.java | 4 ++++ ...OperationTransactionAdminIntegrationTestWithCassandra.java | 4 ++++ .../cosmos/ConsensusCommitAdminIntegrationTestWithCosmos.java | 4 ++++ .../cosmos/CosmosAdminCaseSensitivityIntegrationTest.java | 4 ++++ .../scalar/db/storage/cosmos/CosmosAdminIntegrationTest.java | 4 ++++ ...rudOperationTransactionAdminIntegrationTestWithCosmos.java | 4 ++++ .../dynamo/ConsensusCommitAdminIntegrationTestWithDynamo.java | 4 ++++ .../dynamo/DynamoAdminCaseSensitivityIntegrationTest.java | 4 ++++ .../scalar/db/storage/dynamo/DynamoAdminIntegrationTest.java | 4 ++++ ...rudOperationTransactionAdminIntegrationTestWithDynamo.java | 4 ++++ 12 files changed, 48 insertions(+) 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 75e3fe3d1d..bf759cfcb7 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 7dc8c37482..59a3ab0771 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 ec839164ce..835d0e6bd4 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 95b484b38d..65535024c0 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 864253b4fc..312b9202ca 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 2bedab906f..2ac1837670 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 e7f33d6ccc..afb85f6b34 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 9369098416..f76f4a6714 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 a885ee2574..f3b7d9a874 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 b1fb8fcde9..c5c362c517 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 33f8dfeb41..3193d1e342 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 c971f6e29c..12c023f616 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() {} } From 6441ab0443e77289299e61f30a4b78e34c0260b1 Mon Sep 17 00:00:00 2001 From: Kodai Doki Date: Mon, 20 Oct 2025 14:24:50 +0900 Subject: [PATCH 3/3] Fix not to drop metadata table instead of recreating it --- .../com/scalar/db/storage/jdbc/JdbcAdmin.java | 13 ++-- .../scalar/db/storage/jdbc/JdbcAdminTest.java | 70 ------------------- 2 files changed, 8 insertions(+), 75 deletions(-) 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 00f621359f..abdfa15354 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,14 +1018,14 @@ 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); renameIndexInternal( connection, namespace, newTableName, indexedColumnName, oldIndexName, newIndexName); } - addTableMetadata(connection, namespace, newTableName, tableMetadata, true, false); + addTableMetadata(connection, namespace, newTableName, tableMetadata, false, false); } } catch (SQLException e) { throw new ExecutionException( 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 1af054bb42..7b2528e2e2 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,19 +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`", - "CREATE SCHEMA IF NOT EXISTS `" + METADATA_SCHEMA + "`", - "CREATE TABLE IF NOT EXISTS `" - + METADATA_SCHEMA - + "`.`metadata`(" - + "`full_table_name` VARCHAR(128)," - + "`column_name` VARCHAR(128)," - + "`data_type` VARCHAR(20) NOT NULL," - + "`key_type` VARCHAR(20)," - + "`clustering_order` VARCHAR(10)," - + "`indexed` BOOLEAN NOT NULL," - + "`ordinal_position` INTEGER NOT NULL," - + "PRIMARY KEY (`full_table_name`, `column_name`))", "INSERT INTO `" + METADATA_SCHEMA + "`.`metadata` VALUES ('ns.table_new','c1','TEXT','PARTITION',NULL,false,1)", @@ -3457,12 +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\"", - "CREATE USER \"" + METADATA_SCHEMA + "\" IDENTIFIED BY \"Oracle1234!@#$\"", - "ALTER USER \"" + METADATA_SCHEMA + "\" quota unlimited on USERS", - "CREATE TABLE \"" - + METADATA_SCHEMA - + "\".\"metadata\"(\"full_table_name\" VARCHAR2(128),\"column_name\" VARCHAR2(128),\"data_type\" VARCHAR2(20) NOT NULL,\"key_type\" VARCHAR2(20),\"clustering_order\" VARCHAR2(10),\"indexed\" NUMBER(1) NOT NULL,\"ordinal_position\" INTEGER NOT NULL,PRIMARY KEY (\"full_table_name\", \"column_name\"))", "INSERT INTO \"" + METADATA_SCHEMA + "\".\"metadata\" VALUES ('ns.table_new','c1','TEXT','PARTITION',NULL,0,1)", @@ -3483,19 +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\"", - "CREATE SCHEMA IF NOT EXISTS \"" + METADATA_SCHEMA + "\"", - "CREATE TABLE IF NOT EXISTS \"" - + METADATA_SCHEMA - + "\".\"metadata\"(" - + "\"full_table_name\" VARCHAR(128)," - + "\"column_name\" VARCHAR(128)," - + "\"data_type\" VARCHAR(20) NOT NULL," - + "\"key_type\" VARCHAR(20)," - + "\"clustering_order\" VARCHAR(10)," - + "\"indexed\" BOOLEAN NOT NULL," - + "\"ordinal_position\" INTEGER NOT NULL," - + "PRIMARY KEY (\"full_table_name\", \"column_name\"))", "INSERT INTO \"" + METADATA_SCHEMA + "\".\"metadata\" VALUES ('ns.table_new','c1','TEXT','PARTITION',NULL,false,1)", @@ -3514,19 +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]", - "CREATE SCHEMA [" + METADATA_SCHEMA + "]", - "CREATE TABLE [" - + METADATA_SCHEMA - + "].[metadata](" - + "[full_table_name] VARCHAR(128)," - + "[column_name] VARCHAR(128)," - + "[data_type] VARCHAR(20) NOT NULL," - + "[key_type] VARCHAR(20)," - + "[clustering_order] VARCHAR(10)," - + "[indexed] BIT NOT NULL," - + "[ordinal_position] INTEGER NOT NULL," - + "PRIMARY KEY ([full_table_name], [column_name]))", "INSERT INTO [" + METADATA_SCHEMA + "].[metadata] VALUES ('ns.table_new','c1','TEXT','PARTITION',NULL,0,1)", @@ -3544,18 +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\"", - "CREATE TABLE IF NOT EXISTS \"" - + METADATA_SCHEMA - + "$metadata\"(" - + "\"full_table_name\" TEXT," - + "\"column_name\" TEXT," - + "\"data_type\" TEXT NOT NULL," - + "\"key_type\" TEXT," - + "\"clustering_order\" TEXT," - + "\"indexed\" BOOLEAN NOT NULL," - + "\"ordinal_position\" INTEGER NOT NULL," - + "PRIMARY KEY (\"full_table_name\", \"column_name\"))", "INSERT INTO \"" + METADATA_SCHEMA + "$metadata\" VALUES ('ns.table_new','c1','TEXT','PARTITION',NULL,FALSE,1)", @@ -3575,19 +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\"", - "CREATE SCHEMA \"" + METADATA_SCHEMA + "\"", - "CREATE TABLE IF NOT EXISTS \"" - + METADATA_SCHEMA - + "\".\"metadata\"(" - + "\"full_table_name\" VARCHAR(128) NOT NULL," - + "\"column_name\" VARCHAR(128) NOT NULL," - + "\"data_type\" VARCHAR(20) NOT NULL," - + "\"key_type\" VARCHAR(20)," - + "\"clustering_order\" VARCHAR(10)," - + "\"indexed\" BOOLEAN NOT NULL," - + "\"ordinal_position\" INTEGER NOT NULL," - + "PRIMARY KEY (\"full_table_name\", \"column_name\"))", "INSERT INTO \"" + METADATA_SCHEMA + "\".\"metadata\" VALUES ('ns.table_new','c1','TEXT','PARTITION',NULL,false,1)",