Skip to content

Adding value to enum type causes "cannot drop type" when a function is using that type for a parameter #243

@parkernilson

Description

@parkernilson

Steps to reproduce:

  1. Create an enum type, with a table and a function that both use it
    create type enum_type_1 as enum ('val1', 'val2'); create table table_with_enum ( enum_col enum_type_1 ); create function function_with_enum(param1 enum_type_1) returns void as $$ begin raise notice '%', param1; end; $$ language plpgsql;
  2. Add a value to the enum:
    alter type enum_type_1 add value 'val3';
  3. Generate a diff, which will result in:
    alter type "public"."enum_type_1" rename to "enum_type_1__old_version_to_be_dropped"; create type "public"."enum_type_1" as enum ('val1', 'val2', 'val3'); alter table "public"."table_with_enum" alter column enum_col type "public"."enum_type_1" using enum_col::text::"public"."enum_type_1"; drop type "public"."enum_type_1__old_version_to_be_dropped";

Expected

After the new enum is created with the extra val, the function that depends on it should be recreated with the new enum:

alter type "public"."enum_type_1" rename to "enum_type_1__old_version_to_be_dropped"; create type "public"."enum_type_1" as enum ('val1', 'val2', 'val3'); alter table "public"."table_with_enum" alter column enum_col type "public"."enum_type_1" using enum_col::text::"public"."enum_type_1"; drop function function_with_enum(param1 enum_type_1__old_version_to_be_dropped); create function function_with_enum(param1 enum_type_1) returns void as $$ begin raise notice '%', param1; end; $$ language plpgsql; drop type "public"."enum_type_1__old_version_to_be_dropped";

Actual

alter type "public"."enum_type_1" rename to "enum_type_1__old_version_to_be_dropped"; create type "public"."enum_type_1" as enum ('val1', 'val2', 'val3'); alter table "public"."table_with_enum" alter column enum_col type "public"."enum_type_1" using enum_col::text::"public"."enum_type_1"; drop type "public"."enum_type_1__old_version_to_be_dropped";

The function is not re-created with the new enum, so trying to run the diff results in this error:
ERROR: cannot drop type enum_type_1__old_version_to_be_dropped because other objects depend on it (SQLSTATE 2BP01) At statement 3: drop type "public"."enum_type_1__old_version_to_be_dropped"

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions