Skip to content

Commit 67a8ed6

Browse files
committed
Fix to handle an issue where MySQL 5.7 does not support RENAME COLUMN statement
1 parent c03c49e commit 67a8ed6

File tree

5 files changed

+34
-4
lines changed

5 files changed

+34
-4
lines changed

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -908,7 +908,12 @@ public void renameColumn(
908908
}
909909
TableMetadata updatedTableMetadata = tableMetadataBuilder.build();
910910
String renameColumnStatement =
911-
rdbEngine.renameColumnSql(namespace, table, oldColumnName, newColumnName);
911+
rdbEngine.renameColumnSql(
912+
namespace,
913+
table,
914+
oldColumnName,
915+
newColumnName,
916+
getVendorDbColumnType(updatedTableMetadata, newColumnName));
912917
try (Connection connection = dataSource.getConnection()) {
913918
execute(connection, renameColumnStatement);
914919
if (currentTableMetadata.getSecondaryIndexNames().contains(oldColumnName)) {

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,23 @@ public void dropNamespaceTranslateSQLException(SQLException e, String namespace)
114114
throw new ExecutionException("Dropping the schema failed: " + namespace, e);
115115
}
116116

117+
@Override
118+
public String renameColumnSql(
119+
String namespace,
120+
String table,
121+
String oldColumnName,
122+
String newColumnName,
123+
String columnType) {
124+
return "ALTER TABLE "
125+
+ encloseFullTableName(namespace, table)
126+
+ " CHANGE COLUMN "
127+
+ enclose(oldColumnName)
128+
+ " "
129+
+ enclose(newColumnName)
130+
+ " "
131+
+ columnType;
132+
}
133+
117134
@Override
118135
public String alterColumnTypeSql(
119136
String namespace, String table, String columnName, String columnType) {

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,11 @@ public void dropNamespaceTranslateSQLException(SQLException e, String namespace)
103103

104104
@Override
105105
public String renameColumnSql(
106-
String namespace, String table, String oldColumnName, String newColumnName) {
106+
String namespace,
107+
String table,
108+
String oldColumnName,
109+
String newColumnName,
110+
String columnType) {
107111
return "EXEC sp_rename '"
108112
+ encloseFullTableName(namespace, table)
109113
+ "."

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,11 @@ default String[] dropColumnSql(String namespace, String table, String columnName
108108
}
109109

110110
default String renameColumnSql(
111-
String namespace, String table, String oldColumnName, String newColumnName) {
111+
String namespace,
112+
String table,
113+
String oldColumnName,
114+
String newColumnName,
115+
String columnType) {
112116
return "ALTER TABLE "
113117
+ encloseFullTableName(namespace, table)
114118
+ " RENAME COLUMN "

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3086,7 +3086,7 @@ public void renameColumn_ForMysql_ShouldWorkProperly() throws SQLException, Exec
30863086
"SELECT `column_name`,`data_type`,`key_type`,`clustering_order`,`indexed` FROM `"
30873087
+ METADATA_SCHEMA
30883088
+ "`.`metadata` WHERE `full_table_name`=? ORDER BY `ordinal_position` ASC",
3089-
"ALTER TABLE `ns`.`table` RENAME COLUMN `c2` TO `c3`",
3089+
"ALTER TABLE `ns`.`table` CHANGE COLUMN `c2` `c3` INT",
30903090
"DELETE FROM `" + METADATA_SCHEMA + "`.`metadata` WHERE `full_table_name` = 'ns.table'",
30913091
"INSERT INTO `"
30923092
+ METADATA_SCHEMA

0 commit comments

Comments
 (0)