diff --git a/lib/arel/visitors/oracle.rb b/lib/arel/visitors/oracle.rb index ac7199f4f..5bcab245b 100644 --- a/lib/arel/visitors/oracle.rb +++ b/lib/arel/visitors/oracle.rb @@ -1,8 +1,12 @@ # frozen_string_literal: true +require_relative "oracle_common" + module Arel # :nodoc: all module Visitors class Oracle < Arel::Visitors::ToSql + include OracleCommon + private def visit_Arel_Nodes_SelectStatement(o, collector) o = order_hacks(o) diff --git a/lib/arel/visitors/oracle12.rb b/lib/arel/visitors/oracle12.rb index 8a8758d76..02572ed48 100644 --- a/lib/arel/visitors/oracle12.rb +++ b/lib/arel/visitors/oracle12.rb @@ -1,8 +1,12 @@ # frozen_string_literal: true +require_relative "oracle_common" + module Arel # :nodoc: all module Visitors class Oracle12 < Arel::Visitors::ToSql + include OracleCommon + private def visit_Arel_Nodes_SelectStatement(o, collector) # Oracle does not allow LIMIT clause with select for update diff --git a/lib/arel/visitors/oracle_common.rb b/lib/arel/visitors/oracle_common.rb new file mode 100644 index 000000000..d47700d27 --- /dev/null +++ b/lib/arel/visitors/oracle_common.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module Arel # :nodoc: all + module Visitors + module OracleCommon + private + def visit_Arel_Nodes_Matches(o, collector) + if !o.case_sensitive && o.left && o.right + o.left = Arel::Nodes::NamedFunction.new("UPPER", [o.left]) + o.right = Arel::Nodes::NamedFunction.new("UPPER", [o.right]) + end + + super o, collector + end + end + end +end diff --git a/spec/active_record/oracle_enhanced/type/character_string_spec.rb b/spec/active_record/oracle_enhanced/type/character_string_spec.rb index a7ea98d4e..81a61f541 100644 --- a/spec/active_record/oracle_enhanced/type/character_string_spec.rb +++ b/spec/active_record/oracle_enhanced/type/character_string_spec.rb @@ -24,6 +24,7 @@ class ::TestItem < ActiveRecord::Base end after(:each) do + TestItem.delete_all Object.send(:remove_const, "TestItem") ActiveRecord::Base.clear_cache! end @@ -40,4 +41,27 @@ class ::TestItem < ActiveRecord::Base item_reloaded = TestItem.first expect(item_reloaded.padded).to eq(str) end + + it "should support case sensitive matching" do + TestItem.create!( + padded: "First", + ) + TestItem.create!( + padded: "first", + ) + + expect(TestItem.where(TestItem.arel_table[:padded].matches("first%", "\\", true))).to have_attributes(count: 1) + end + + it "should support case insensitive matching" do + TestItem.create!( + padded: "First", + ) + TestItem.create!( + padded: "first", + ) + + expect(TestItem.where(TestItem.arel_table[:padded].matches("first%", "\\", false))).to have_attributes(count: 2) + expect(TestItem.where(TestItem.arel_table[:padded].matches("first%"))).to have_attributes(count: 2) + end end