aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/core.rb
diff options
context:
space:
mode:
authorSean Griffin <sean@seantheprogrammer.com>2016-03-31 13:33:42 -0600
committerSean Griffin <sean@seantheprogrammer.com>2016-03-31 13:41:36 -0600
commit3af40b71f34c70a274e261cd6e6468c613de648e (patch)
tree32fb92f750ed000c58d25c2691b6ea9614bff741 /activerecord/lib/active_record/core.rb
parent7b82e1c77b48cb351da4e0ed6ea0bac806d4925c (diff)
downloadrails-3af40b71f34c70a274e261cd6e6468c613de648e.tar.gz
rails-3af40b71f34c70a274e261cd6e6468c613de648e.tar.bz2
rails-3af40b71f34c70a274e261cd6e6468c613de648e.zip
Prepared statements shouldn't share a cache with unprepared statements
When prepared statements are enabled, the statement cache caches the SQL directly, including the bind parameters. If a similar query is run later with prepared statements disabled, we need to use a separate cache instead of trying to share the same one. Fixes #24351
Diffstat (limited to 'activerecord/lib/active_record/core.rb')
-rw-r--r--activerecord/lib/active_record/core.rb7
1 files changed, 4 insertions, 3 deletions
diff --git a/activerecord/lib/active_record/core.rb b/activerecord/lib/active_record/core.rb
index 86ec8000fb..c8343dd97f 100644
--- a/activerecord/lib/active_record/core.rb
+++ b/activerecord/lib/active_record/core.rb
@@ -136,7 +136,7 @@ module ActiveRecord
end
def initialize_find_by_cache # :nodoc:
- @find_by_statement_cache = {}.extend(Mutex_m)
+ @find_by_statement_cache = { true => {}.extend(Mutex_m), false => {}.extend(Mutex_m) }
end
def inherited(child_class) # :nodoc:
@@ -280,8 +280,9 @@ module ActiveRecord
private
def cached_find_by_statement(key, &block) # :nodoc:
- @find_by_statement_cache[key] || @find_by_statement_cache.synchronize {
- @find_by_statement_cache[key] ||= StatementCache.create(connection, &block)
+ cache = @find_by_statement_cache[connection.prepared_statements]
+ cache[key] || cache.synchronize {
+ cache[key] ||= StatementCache.create(connection, &block)
}
end