From 1a44c359b97b6b4f5b6c4b6e7cc9135021e98b20 Mon Sep 17 00:00:00 2001 From: Alan Guo Xiang Tan Date: Wed, 28 Feb 2024 14:56:15 +0800 Subject: [PATCH] DEV: Fix reloading type map not clearing cache (#25924) Why this change? This is a follow up to 408d2f8e692868779b1b05c19fcb32c35897184b. When `ActiveRecord::ConnectionAdapaters::PostgreSQLAdatper#reload_type_map` is called, we need to clear the type map cache otherwise migrations adding an array column will end up throwing errors. --- lib/freedom_patches/cache_postgresql_connection_type_map.rb | 6 ++++++ .../cache_postgresql_connection_type_map_spec.rb | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/freedom_patches/cache_postgresql_connection_type_map.rb b/lib/freedom_patches/cache_postgresql_connection_type_map.rb index ddc24c070d7..7fd32fb25cb 100644 --- a/lib/freedom_patches/cache_postgresql_connection_type_map.rb +++ b/lib/freedom_patches/cache_postgresql_connection_type_map.rb @@ -9,6 +9,12 @@ # The latest attempt to fix the problem in Rails is in https://github.com/rails/rails/pull/46409 but it has gone stale. module FreedomPatches module PostgreSQLAdapter + # Definition as of writing: https://github.com/rails/rails/blob/5bf5344521a6f305ca17e0004273322a0a26f50a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb#L316 + def reload_type_map + self.class.type_map = nil + super + end + # Definition as of writing: https://github.com/rails/rails/blob/5bf5344521a6f305ca17e0004273322a0a26f50a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb#L614 def initialize_type_map(m = type_map) if !self.class.type_map.nil? diff --git a/spec/lib/freedom_patches/cache_postgresql_connection_type_map_spec.rb b/spec/lib/freedom_patches/cache_postgresql_connection_type_map_spec.rb index 5073578dcaf..a41c1becd37 100644 --- a/spec/lib/freedom_patches/cache_postgresql_connection_type_map_spec.rb +++ b/spec/lib/freedom_patches/cache_postgresql_connection_type_map_spec.rb @@ -14,7 +14,10 @@ RSpec.describe "Caching PostgreSQL connection type map" do end end - expect do ActiveRecord::Base.connection.reconnect! end.not_to change { pg_type_queries.length } + expect do + ActiveRecord::Base.clear_active_connections! + ActiveRecord::Base.establish_connection + end.to change { pg_type_queries.length }.by(1) # There is some default pg_type query but if stuff was not cached, we would see 4 queries here ensure ActiveSupport::Notifications.unsubscribe(subscriber) end