Skip to content

Commit

Permalink
me: fix regression w/ mapped enum names on postgres
Browse files Browse the repository at this point in the history
When calculating a SQL schema from a Prisma schema, the Postgres
connector of the migration engine would use the name of the enum instead
of its database name (see parser-database docs for the reference on what
these mean). To picture this with an example, the following schema.

```
enum PersonType {
  Dog
  Cat
  @@Map("pet_preference")
}
```

would correspond, before the regression, and after this commit, to:

```
CREATE TYPE "pet_preference" AS ENUM ('Dog', 'Cat');
```

but the regression caused it to correspond to:

```
CREATE TYPE "PersonType" AS ENUM ('Dog', 'Cat');
```

This does not only affect newly created enums: we diff the wrong enums,
causing bad migrations for existing users of Migrate that have the enums
with the correct (mapped) names in their database.

Users reported the regression in prisma/prisma#16180
This commit should completely fix the problem.

The regression was introduced in an unrelated refactoring in
b6400f1. Enum names in column types
were replace with enum ids — a win for correctness. As part of this
refactoring, the `sql_schema_describer::Enum` type was made private, and
adding enums to a schema became possible only through
`SqlSchema::push_enum`. In the SQL migration connector

What could have caught this:

- Testing that the name of the database enum in the migration is the
  mapped name. We can test this:
    - Through `.assert_schema()`, which has existed for a long time.
      It is a gap in our test coverage that we weren't testing this.
    - The new single migration tests, like the test in this commit.
      They are new, and they are less work than the previous option.
- migrations-ci could have caught this, but it is currently neglected.
  • Loading branch information
tomhoule committed Nov 9, 2022
1 parent da86746 commit 3389f1a
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 1 deletion.
Expand Up @@ -19,7 +19,7 @@ impl SqlSchemaCalculatorFlavour for PostgresFlavour {
let sql_enum_id = ctx
.schema
.describer_schema
.push_enum(sql_namespace_id, prisma_enum.name().to_owned());
.push_enum(sql_namespace_id, prisma_enum.database_name().to_owned());
ctx.enum_ids.insert(prisma_enum.id, sql_enum_id);

for value in prisma_enum.values() {
Expand Down
@@ -0,0 +1,30 @@
// tags=postgres
// exclude=cockroachdb

datasource pg {
provider = "postgresql"
url = env("TEST_DATABASE_URL")
}

model Avocado {
id String @id
status Ripeness
}

enum Ripeness {
NOT_RIPE_ENOUGH
TOO_RIPE
@@map("avocado_ripeness_status")
}
// Expected Migration:
// -- CreateEnum
// CREATE TYPE "avocado_ripeness_status" AS ENUM ('NOT_RIPE_ENOUGH', 'TOO_RIPE');
//
// -- CreateTable
// CREATE TABLE "Avocado" (
// "id" TEXT NOT NULL,
// "status" "avocado_ripeness_status" NOT NULL,
//
// CONSTRAINT "Avocado_pkey" PRIMARY KEY ("id")
// );

0 comments on commit 3389f1a

Please sign in to comment.