migra
migra copied to clipboard
Adding value to enum type causes "cannot drop type" when a function is using that type for a parameter
Steps to reproduce:
- 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;
- Add a value to the enum:
alter type enum_type_1 add value 'val3';
- 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"