diff --git a/migration-engine/connectors/sql-migration-connector/src/sql_renderer/postgres_renderer.rs b/migration-engine/connectors/sql-migration-connector/src/sql_renderer/postgres_renderer.rs index 69a2095c86c2..ce745c925cd6 100644 --- a/migration-engine/connectors/sql-migration-connector/src/sql_renderer/postgres_renderer.rs +++ b/migration-engine/connectors/sql-migration-connector/src/sql_renderer/postgres_renderer.rs @@ -140,13 +140,16 @@ impl SqlRenderer for PostgresFlavour { let affected_columns = walk_columns(schemas.next()).filter(|column| matches!(&column.column_type().family, ColumnTypeFamily::Enum(name) if name.as_str() == enums.next().name())); for column in affected_columns { + let array = if column.arity().is_list() { "[]" } else { "" }; + let sql = format!( "ALTER TABLE {table_name} \ - ALTER COLUMN {column_name} TYPE {tmp_name} \ - USING ({column_name}::text::{tmp_name})", + ALTER COLUMN {column_name} TYPE {tmp_name}{array} \ + USING ({column_name}::text::{tmp_name}{array})", table_name = Quoted::postgres_ident(column.table().name()), column_name = Quoted::postgres_ident(column.name()), tmp_name = Quoted::postgres_ident(&tmp_name), + array = array, ); stmts.push(sql); diff --git a/migration-engine/migration-engine-tests/tests/migrations/enums.rs b/migration-engine/migration-engine-tests/tests/migrations/enums.rs index 199fdc1e2123..7a70cc2e817d 100644 --- a/migration-engine/migration-engine-tests/tests/migrations/enums.rs +++ b/migration-engine/migration-engine-tests/tests/migrations/enums.rs @@ -504,3 +504,62 @@ fn existing_enums_are_picked_up(api: TestApi) { .assert_green_bang() .assert_no_steps(); } + +// Bug: https://github.com/prisma/prisma/issues/8137 +#[test_connector(tags(Postgres))] +fn enum_array_modification_should_work(api: TestApi) { + let migrations_directory = api.create_migrations_directory(); + + let dm = r#" + datasource test { + provider = "postgres" + url = "postgres://meowmeowmeow" + } + + enum Position { + First + Second + Last + } + + model Test { + id String @id @default(uuid()) + positions Position[] + } + "#; + + api.create_migration("01init", &dm, &migrations_directory).send_sync(); + + api.apply_migrations(&migrations_directory) + .send_sync() + .assert_applied_migrations(&["01init"]); + + let dm = r#" + datasource test { + provider = "postgres" + url = "postgres://meowmeowmeow" + } + + enum Position { + First + Second + } + + model Test { + id String @id @default(uuid()) + positions Position[] + } + "#; + + api.create_migration("02remove", &dm, &migrations_directory).send_sync(); + + api.apply_migrations(&migrations_directory) + .send_sync() + .assert_applied_migrations(&["02remove"]); + + api.create_migration("03empty", &dm, &migrations_directory).send_sync(); + + api.apply_migrations(&migrations_directory) + .send_sync() + .assert_applied_migrations(&[]); +}