From 19f0f140746bfae588f145fcd89df1c8f6df3910 Mon Sep 17 00:00:00 2001 From: Ryuta Kamizono Date: Sat, 3 Nov 2018 14:45:25 +0900 Subject: Checking boundable not only `IN` clause but also `NOT IN` clause --- .../connection_adapters/determine_if_preparable_visitor.rb | 12 ++++-------- activerecord/lib/arel/nodes/bind_param.rb | 4 ++++ activerecord/lib/arel/visitors/to_sql.rb | 12 ++++++++++++ 3 files changed, 20 insertions(+), 8 deletions(-) (limited to 'activerecord/lib') diff --git a/activerecord/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb b/activerecord/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb index f158946c6d..883747b84b 100644 --- a/activerecord/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +++ b/activerecord/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb @@ -12,15 +12,11 @@ module ActiveRecord def visit_Arel_Nodes_In(o, collector) @preparable = false + super + end - if Array === o.right && !o.right.empty? - o.right.delete_if do |bind| - if Arel::Nodes::BindParam === bind && Relation::QueryAttribute === bind.value - !bind.value.boundable? - end - end - end - + def visit_Arel_Nodes_NotIn(o, collector) + @preparable = false super end diff --git a/activerecord/lib/arel/nodes/bind_param.rb b/activerecord/lib/arel/nodes/bind_param.rb index 91e9b2b70f..ba8340558a 100644 --- a/activerecord/lib/arel/nodes/bind_param.rb +++ b/activerecord/lib/arel/nodes/bind_param.rb @@ -23,6 +23,10 @@ module Arel # :nodoc: all def nil? value.nil? end + + def boundable? + !value.respond_to?(:boundable?) || value.boundable? + end end end end diff --git a/activerecord/lib/arel/visitors/to_sql.rb b/activerecord/lib/arel/visitors/to_sql.rb index 7ce26884a5..8e56fb55a2 100644 --- a/activerecord/lib/arel/visitors/to_sql.rb +++ b/activerecord/lib/arel/visitors/to_sql.rb @@ -579,6 +579,10 @@ module Arel # :nodoc: all end def visit_Arel_Nodes_In(o, collector) + if Array === o.right && !o.right.empty? + o.right.keep_if { |value| boundable?(value) } + end + if Array === o.right && o.right.empty? collector << "1=0" else @@ -589,6 +593,10 @@ module Arel # :nodoc: all end def visit_Arel_Nodes_NotIn(o, collector) + if Array === o.right && !o.right.empty? + o.right.keep_if { |value| boundable?(value) } + end + if Array === o.right && o.right.empty? collector << "1=1" else @@ -788,6 +796,10 @@ module Arel # :nodoc: all } end + def boundable?(value) + !value.respond_to?(:boundable?) || value.boundable? + end + def has_join_sources?(o) o.relation.is_a?(Nodes::JoinSource) && !o.relation.right.empty? end -- cgit v1.2.3