diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index f208a55d752a0..cda0ab655c70f 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,3 +1,9 @@ +* Fix query caching when type information is reset + + Backports ancillary fix in 5.0. + + *James Coleman* + * Allow `joins` to be unscoped. Fixes #13775. diff --git a/activerecord/lib/active_record/type/value.rb b/activerecord/lib/active_record/type/value.rb index ff99dbc2f19b8..926e95b0c2e32 100644 --- a/activerecord/lib/active_record/type/value.rb +++ b/activerecord/lib/active_record/type/value.rb @@ -86,6 +86,11 @@ def ==(other) scale == other.scale && limit == other.limit end + alias eql? == + + def hash + [self.class, precision, scale, limit].hash + end private diff --git a/activerecord/test/cases/query_cache_test.rb b/activerecord/test/cases/query_cache_test.rb index 9e586a2a9e821..b47d976bbb3d1 100644 --- a/activerecord/test/cases/query_cache_test.rb +++ b/activerecord/test/cases/query_cache_test.rb @@ -243,6 +243,26 @@ def test_query_cache_doesnt_leak_cached_results_of_rolled_back_queries assert_equal 0, Post.where(title: 'rollback').to_a.count end end + + def test_query_cached_even_when_types_are_reset + Task.cache do + # Warm the cache + task = Task.find(1) + + Task.connection.type_map.clear + + # Preload the type cache again (so we don't have those queries issued during our assertions) + Task.connection.send(:initialize_type_map, Task.connection.type_map) + + # Clear places where type information is cached + Task.reset_column_information + Task.find_by_statement_cache.clear + + assert_queries(0) do + Task.find(1) + end + end + end end class QueryCacheExpiryTest < ActiveRecord::TestCase