From 70ba65844246be482534f698339260dc49532168 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Mon, 29 Jun 2020 12:12:10 +1200 Subject: [PATCH] #2026 - Postgres DDL - modify type generates wrong alter sql. Needs explicit cast / using clause. --- .../ddlgeneration/platform/PostgresDdl.java | 5 +++++ .../platform/PlatformDdl_AlterColumnTest.java | 16 +++++++++------- .../dbmigration/migrationtest/postgres/1.1.sql | 8 ++++---- .../dbmigration/migrationtest/postgres/1.3.sql | 6 +++--- 4 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PostgresDdl.java b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PostgresDdl.java index 50138ce21..daeaf57fb 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PostgresDdl.java +++ b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PostgresDdl.java @@ -54,4 +54,9 @@ public class PostgresDdl extends PlatformDdl { public String asIdentityColumn(String columnDefn, DdlIdentity identity) { return asIdentityStandardOptions(columnDefn, identity); } + + @Override + public String alterColumnType(String tableName, String columnName, String type) { + return super.alterColumnType(tableName, columnName, type) + " using " + columnName + "::" + convert(type); + } } diff --git a/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformDdl_AlterColumnTest.java b/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformDdl_AlterColumnTest.java index 2607bd13b..9b761bb36 100644 --- a/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformDdl_AlterColumnTest.java +++ b/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformDdl_AlterColumnTest.java @@ -20,12 +20,12 @@ import static org.junit.Assert.assertTrue; public class PlatformDdl_AlterColumnTest { - private PlatformDdl h2Ddl = PlatformDdlBuilder.create(new H2Platform()); - private PlatformDdl pgDdl = PlatformDdlBuilder.create(new PostgresPlatform()); - private PlatformDdl mysqlDdl = PlatformDdlBuilder.create(new MySqlPlatform()); - private PlatformDdl oraDdl = PlatformDdlBuilder.create(new OraclePlatform()); - private PlatformDdl sqlServerDdl = PlatformDdlBuilder.create(new SqlServer17Platform()); - private PlatformDdl hanaDdl = PlatformDdlBuilder.create(new HanaPlatform()); + private final PlatformDdl h2Ddl = PlatformDdlBuilder.create(new H2Platform()); + private final PlatformDdl pgDdl = PlatformDdlBuilder.create(new PostgresPlatform()); + private final PlatformDdl mysqlDdl = PlatformDdlBuilder.create(new MySqlPlatform()); + private final PlatformDdl oraDdl = PlatformDdlBuilder.create(new OraclePlatform()); + private final PlatformDdl sqlServerDdl = PlatformDdlBuilder.create(new SqlServer17Platform()); + private final PlatformDdl hanaDdl = PlatformDdlBuilder.create(new HanaPlatform()); { ServerConfig serverConfig = Ebean.getDefaultServer().getPluginApi().getServerConfig(); @@ -122,7 +122,9 @@ public class PlatformDdl_AlterColumnTest { assertEquals("alter table mytab alter column acol varchar(20)", sql); sql = pgDdl.alterColumnType("mytab", "acol", "varchar(20)"); - assertEquals("alter table mytab alter column acol type varchar(20)", sql); + assertEquals("alter table mytab alter column acol type varchar(20) using acol::varchar(20)", sql); + sql = pgDdl.alterColumnType("mytab", "acol", "bigint"); + assertEquals("alter table mytab alter column acol type bigint using acol::bigint", sql); sql = oraDdl.alterColumnType("mytab", "acol", "varchar(20)"); assertEquals("alter table mytab modify acol varchar2(20)", sql); diff --git a/src/test/resources/dbmigration/migrationtest/postgres/1.1.sql b/src/test/resources/dbmigration/migrationtest/postgres/1.1.sql index 5cc3be7a8..6c97d734e 100644 --- a/src/test/resources/dbmigration/migrationtest/postgres/1.1.sql +++ b/src/test/resources/dbmigration/migrationtest/postgres/1.1.sql @@ -42,7 +42,7 @@ alter table migtest_e_basic alter column status set default 'A'; alter table migtest_e_basic alter column status set not null; alter table migtest_e_basic add constraint ck_migtest_e_basic_status check ( status in ('N','A','I','?')); alter table migtest_e_basic drop constraint if exists ck_migtest_e_basic_status2; -alter table migtest_e_basic alter column status2 type varchar(127); +alter table migtest_e_basic alter column status2 type varchar(127) using status2::varchar(127); alter table migtest_e_basic alter column status2 drop default; alter table migtest_e_basic alter column status2 drop not null; @@ -71,7 +71,7 @@ alter table migtest_e_enum drop constraint if exists ck_migtest_e_enum_test_stat alter table migtest_e_history alter column test_string TYPE bigint USING (test_string::integer); comment on column migtest_e_history.test_string is 'Column altered to long now'; -alter table migtest_e_history alter column test_string type bigint; +alter table migtest_e_history alter column test_string type bigint using test_string::bigint; comment on table migtest_e_history is 'We have history now'; -- NOTE: table has @History - special migration may be necessary @@ -85,8 +85,8 @@ alter table migtest_e_history2_history add column test_string2 varchar(255); alter table migtest_e_history2_history add column test_string3 varchar(255) default 'unknown'; alter table migtest_e_history2_history add column new_column varchar(20); -alter table migtest_e_history4 alter column test_number type bigint; -alter table migtest_e_history4_history alter column test_number type bigint; +alter table migtest_e_history4 alter column test_number type bigint using test_number::bigint; +alter table migtest_e_history4_history alter column test_number type bigint using test_number::bigint; alter table migtest_e_history5 add column test_boolean boolean default false not null; alter table migtest_e_history5_history add column test_boolean boolean default false; diff --git a/src/test/resources/dbmigration/migrationtest/postgres/1.3.sql b/src/test/resources/dbmigration/migrationtest/postgres/1.3.sql index 172853cbd..1be77e36d 100644 --- a/src/test/resources/dbmigration/migrationtest/postgres/1.3.sql +++ b/src/test/resources/dbmigration/migrationtest/postgres/1.3.sql @@ -26,7 +26,7 @@ alter table migtest_e_basic add constraint ck_migtest_e_basic_status check ( sta update migtest_e_basic set status2 = 'N' where status2 is null; alter table migtest_e_basic drop constraint if exists ck_migtest_e_basic_status2; -alter table migtest_e_basic alter column status2 type varchar(1); +alter table migtest_e_basic alter column status2 type varchar(1) using status2::varchar(1); alter table migtest_e_basic alter column status2 set default 'N'; alter table migtest_e_basic alter column status2 set not null; alter table migtest_e_basic add constraint ck_migtest_e_basic_status2 check ( status2 in ('N','A','I')); @@ -57,8 +57,8 @@ alter table migtest_e_history2 add column obsolete_string2 varchar(255); alter table migtest_e_history2_history add column obsolete_string1 varchar(255); alter table migtest_e_history2_history add column obsolete_string2 varchar(255); -alter table migtest_e_history4 alter column test_number type integer; -alter table migtest_e_history4_history alter column test_number type integer; +alter table migtest_e_history4 alter column test_number type integer using test_number::integer; +alter table migtest_e_history4_history alter column test_number type integer using test_number::integer; alter table migtest_e_history6 alter column test_number1 drop default; alter table migtest_e_history6 alter column test_number1 drop not null;