Skip to content

Commit 0f503e4

Browse files
authored
Merge pull request #2247 from akostadinov/master
support LIKE case-insensitive matching
2 parents afe43fa + 9dc7556 commit 0f503e4

File tree

4 files changed

+49
-0
lines changed

4 files changed

+49
-0
lines changed

lib/arel/visitors/oracle.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
# frozen_string_literal: true
22

3+
require_relative "oracle_common"
4+
35
module Arel # :nodoc: all
46
module Visitors
57
class Oracle < Arel::Visitors::ToSql
8+
include OracleCommon
9+
610
private
711
def visit_Arel_Nodes_SelectStatement(o, collector)
812
o = order_hacks(o)

lib/arel/visitors/oracle12.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
# frozen_string_literal: true
22

3+
require_relative "oracle_common"
4+
35
module Arel # :nodoc: all
46
module Visitors
57
class Oracle12 < Arel::Visitors::ToSql
8+
include OracleCommon
9+
610
private
711
def visit_Arel_Nodes_SelectStatement(o, collector)
812
# Oracle does not allow LIMIT clause with select for update

lib/arel/visitors/oracle_common.rb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# frozen_string_literal: true
2+
3+
module Arel # :nodoc: all
4+
module Visitors
5+
module OracleCommon
6+
private
7+
def visit_Arel_Nodes_Matches(o, collector)
8+
if !o.case_sensitive && o.left && o.right
9+
o.left = Arel::Nodes::NamedFunction.new("UPPER", [o.left])
10+
o.right = Arel::Nodes::NamedFunction.new("UPPER", [o.right])
11+
end
12+
13+
super o, collector
14+
end
15+
end
16+
end
17+
end

spec/active_record/oracle_enhanced/type/character_string_spec.rb

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class ::TestItem < ActiveRecord::Base
2424
end
2525

2626
after(:each) do
27+
TestItem.delete_all
2728
Object.send(:remove_const, "TestItem")
2829
ActiveRecord::Base.clear_cache!
2930
end
@@ -40,4 +41,27 @@ class ::TestItem < ActiveRecord::Base
4041
item_reloaded = TestItem.first
4142
expect(item_reloaded.padded).to eq(str)
4243
end
44+
45+
it "should support case sensitive matching" do
46+
TestItem.create!(
47+
padded: "First",
48+
)
49+
TestItem.create!(
50+
padded: "first",
51+
)
52+
53+
expect(TestItem.where(TestItem.arel_table[:padded].matches("first%", "\\", true))).to have_attributes(count: 1)
54+
end
55+
56+
it "should support case insensitive matching" do
57+
TestItem.create!(
58+
padded: "First",
59+
)
60+
TestItem.create!(
61+
padded: "first",
62+
)
63+
64+
expect(TestItem.where(TestItem.arel_table[:padded].matches("first%", "\\", false))).to have_attributes(count: 2)
65+
expect(TestItem.where(TestItem.arel_table[:padded].matches("first%"))).to have_attributes(count: 2)
66+
end
4367
end

0 commit comments

Comments
 (0)