Skip to content

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

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"

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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