Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
parkernilson opened this issue Aug 31, 2024 · 1 comment

Comments

@parkernilson
Copy link

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
Copy link
Author

Hello! Any updates on this issue?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant