Skip to content

Commit

Permalink
Enum array changes should work (#2121)
Browse files Browse the repository at this point in the history
We never realized the temporary enum as an array, if the original column
was one, causing drift and weird migration errors.
  • Loading branch information
Julius de Bruijn committed Aug 3, 2021
1 parent 29ab90f commit 89a0ba9
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 2 deletions.
Expand Up @@ -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);
Expand Down
59 changes: 59 additions & 0 deletions migration-engine/migration-engine-tests/tests/migrations/enums.rs
Expand Up @@ -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(&[]);
}

0 comments on commit 89a0ba9

Please sign in to comment.