From c4a6d1380b702eb055e4a646d0a47b278da0a23c Mon Sep 17 00:00:00 2001 From: fatkodima Date: Tue, 24 Oct 2023 23:24:14 +0300 Subject: [PATCH] Reload type map when creating or dropping PostgreSQL enums --- .../connection_adapters/postgresql_adapter.rb | 4 ++-- .../postgresql/postgresql_adapter_test.rb | 15 +++++++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb index 74dd896eedd92..a637523c168d0 100644 --- a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb @@ -544,7 +544,7 @@ def create_enum(name, values, **options) END $$; SQL - internal_exec_query(query) + internal_exec_query(query).tap { reload_type_map } end # Drops an enum type. @@ -560,7 +560,7 @@ def drop_enum(name, values = nil, **options) query = <<~SQL DROP TYPE#{' IF EXISTS' if options[:if_exists]} #{quote_table_name(name)}; SQL - internal_exec_query(query) + internal_exec_query(query).tap { reload_type_map } end # Rename an existing enum type to something else. diff --git a/activerecord/test/cases/adapters/postgresql/postgresql_adapter_test.rb b/activerecord/test/cases/adapters/postgresql/postgresql_adapter_test.rb index 75faae9b7a0e4..dd47b13ec66cf 100644 --- a/activerecord/test/cases/adapters/postgresql/postgresql_adapter_test.rb +++ b/activerecord/test/cases/adapters/postgresql/postgresql_adapter_test.rb @@ -460,11 +460,18 @@ def test_raise_error_when_cannot_translate_exception def test_reload_type_map_for_newly_defined_types @connection.create_enum "feeling", ["good", "bad"] - result = @connection.select_all "SELECT 'good'::feeling" - assert_instance_of(PostgreSQLAdapter::OID::Enum, - result.column_types["feeling"]) + + # Runs only SELECT, no type map reloading. + assert_queries(1, ignore_none: true) do + result = @connection.select_all "SELECT 'good'::feeling" + assert_instance_of(PostgreSQLAdapter::OID::Enum, + result.column_types["feeling"]) + end ensure - @connection.drop_enum "feeling", if_exists: true + # Reloads type map. + assert_sql(/from pg_type/i) do + @connection.drop_enum "feeling", if_exists: true + end reset_connection end