aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorMatthew Dunbar <matthew.dunbar@lifeway.com>2019-02-14 23:07:01 -0500
committerMatthew Dunbar <matthew.dunbar@lifeway.com>2019-02-14 23:25:44 -0500
commit795c0f8205a23af4dc928b46d15279b57d8ef3c3 (patch)
treec8a88ef6ac5fd353823fb6e1e2262959792e807e /activerecord
parentc43c83984792ac546e7610c898cf9099cc1a2ee6 (diff)
downloadrails-795c0f8205a23af4dc928b46d15279b57d8ef3c3.tar.gz
rails-795c0f8205a23af4dc928b46d15279b57d8ef3c3.tar.bz2
rails-795c0f8205a23af4dc928b46d15279b57d8ef3c3.zip
Properly handle cached queries with too many bind parameters
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb6
-rw-r--r--activerecord/test/cases/bind_parameter_test.rb10
2 files changed, 16 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb b/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb
index 4e55fcae2f..d950099bab 100644
--- a/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb
+++ b/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb
@@ -96,6 +96,12 @@ module ActiveRecord
if @query_cache_enabled && !locked?(arel)
arel = arel_from_relation(arel)
sql, binds = to_sql_and_binds(arel, binds)
+
+ if binds.length > bind_params_length
+ sql, binds = unprepared_statement { to_sql_and_binds(arel) }
+ preparable = false
+ end
+
cache_sql(sql, name, binds) { super(sql, name, binds, preparable: preparable) }
else
super
diff --git a/activerecord/test/cases/bind_parameter_test.rb b/activerecord/test/cases/bind_parameter_test.rb
index 22a98036f3..26be22832c 100644
--- a/activerecord/test/cases/bind_parameter_test.rb
+++ b/activerecord/test/cases/bind_parameter_test.rb
@@ -44,6 +44,16 @@ if ActiveRecord::Base.connection.prepared_statements
assert_equal 0, topics.count
end
+ def test_too_many_binds_with_query_cache
+ Topic.connection.enable_query_cache!
+ bind_params_length = @connection.send(:bind_params_length)
+ topics = Topic.where(id: (1 .. bind_params_length + 1).to_a)
+ assert_equal Topic.count, topics.count
+
+ topics = Topic.where.not(id: (1 .. bind_params_length + 1).to_a)
+ assert_equal 0, topics.count
+ end
+
def test_bind_from_join_in_subquery
subquery = Author.joins(:thinking_posts).where(name: "David")
scope = Author.from(subquery, "authors").where(id: 1)