diff options
author | Ryuta Kamizono <kamipo@gmail.com> | 2018-09-15 12:39:28 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-09-15 12:39:28 +0900 |
commit | b53b91527548d7ea16aac7d88c50dba9b7e9ce34 (patch) | |
tree | 7eee51cb3b9a17d7c775fedf185ae1d8dc7168f8 /activerecord/lib | |
parent | 70b5a7594e91d7e3f3ee60642102b7a2323c2e0c (diff) | |
parent | b571c4f3f2811b5d3dc8b005707cf8c353abdf03 (diff) | |
download | rails-b53b91527548d7ea16aac7d88c50dba9b7e9ce34.tar.gz rails-b53b91527548d7ea16aac7d88c50dba9b7e9ce34.tar.bz2 rails-b53b91527548d7ea16aac7d88c50dba9b7e9ce34.zip |
Merge pull request #33878 from kamipo/fallback_to_unprepared_statement
Fallback to unprepared statement only when bind params limit is exceeded
Diffstat (limited to 'activerecord/lib')
4 files changed, 13 insertions, 7 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/abstract/database_limits.rb b/activerecord/lib/active_record/connection_adapters/abstract/database_limits.rb index ad148efcfe..1305216be2 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/database_limits.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/database_limits.rb @@ -71,6 +71,11 @@ module ActiveRecord 256 end deprecate :joins_per_query + + private + def bind_params_length + 65535 + end end end end diff --git a/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb b/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb index fdc9ffa688..5b24a467ec 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb @@ -46,11 +46,16 @@ module ActiveRecord def select_all(arel, name = nil, binds = [], preparable: nil) arel = arel_from_relation(arel) sql, binds = to_sql_and_binds(arel, binds) + if !prepared_statements || (arel.is_a?(String) && preparable.nil?) preparable = false + elsif binds.length > bind_params_length + sql, binds = unprepared_statement { to_sql_and_binds(arel) } + preparable = false else preparable = visitor.preparable end + if prepared_statements && preparable select_prepared(sql, name, binds) else diff --git a/activerecord/lib/active_record/relation/predicate_builder.rb b/activerecord/lib/active_record/relation/predicate_builder.rb index cb70b8bcde..f734cd0ad8 100644 --- a/activerecord/lib/active_record/relation/predicate_builder.rb +++ b/activerecord/lib/active_record/relation/predicate_builder.rb @@ -57,14 +57,10 @@ module ActiveRecord end def build_bind_attribute(column_name, value) - attr = build_query_attribute(column_name, value) + attr = Relation::QueryAttribute.new(column_name.to_s, value, table.type(column_name)) Arel::Nodes::BindParam.new(attr) end - def build_query_attribute(column_name, value) - Relation::QueryAttribute.new(column_name.to_s, value, table.type(column_name)) - end - protected def expand_from_hash(attributes) return ["1=0"] if attributes.empty? diff --git a/activerecord/lib/active_record/relation/predicate_builder/array_handler.rb b/activerecord/lib/active_record/relation/predicate_builder/array_handler.rb index 0895b9fba6..fadb3c420d 100644 --- a/activerecord/lib/active_record/relation/predicate_builder/array_handler.rb +++ b/activerecord/lib/active_record/relation/predicate_builder/array_handler.rb @@ -22,8 +22,8 @@ module ActiveRecord when 1 then predicate_builder.build(attribute, values.first) else values.map! do |v| - attr = predicate_builder.build_query_attribute(attribute.name, v) - attr.value_for_database if attr.boundable? + bind = predicate_builder.build_bind_attribute(attribute.name, v) + bind if bind.value.boundable? end.compact! values.empty? ? NullPredicate : attribute.in(values) end |