From 9dc75566690cedc6bf9cf34425cba98780b72c58 Mon Sep 17 00:00:00 2001 From: "Aleksandar N. Kostadinov" Date: Wed, 12 Jan 2022 15:50:09 +0200 Subject: [PATCH] support LIKE case-insensitive matching --- lib/arel/visitors/oracle.rb | 4 ++++ lib/arel/visitors/oracle12.rb | 4 ++++ lib/arel/visitors/oracle_common.rb | 17 +++++++++++++ .../type/character_string_spec.rb | 24 +++++++++++++++++++ 4 files changed, 49 insertions(+) create mode 100644 lib/arel/visitors/oracle_common.rb 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