aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/connection_adapters
diff options
context:
space:
mode:
authorRyuta Kamizono <kamipo@gmail.com>2018-09-15 12:39:28 +0900
committerGitHub <noreply@github.com>2018-09-15 12:39:28 +0900
commitb53b91527548d7ea16aac7d88c50dba9b7e9ce34 (patch)
tree7eee51cb3b9a17d7c775fedf185ae1d8dc7168f8 /activerecord/lib/active_record/connection_adapters
parent70b5a7594e91d7e3f3ee60642102b7a2323c2e0c (diff)
parentb571c4f3f2811b5d3dc8b005707cf8c353abdf03 (diff)
downloadrails-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/active_record/connection_adapters')
-rw-r--r--activerecord/lib/active_record/connection_adapters/abstract/database_limits.rb5
-rw-r--r--activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb5
2 files changed, 10 insertions, 0 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