migra icon indicating copy to clipboard operation
migra copied to clipboard

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

Open parkernilson opened this issue 5 months ago • 1 comments

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"

parkernilson avatar Aug 31 '24 20:08 parkernilson