diff options
author | Ryuta Kamizono <kamipo@gmail.com> | 2019-07-30 00:08:27 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-30 00:08:27 +0900 |
commit | 2e6d9af6c8b9900481dabfca685b3e335c2f27aa (patch) | |
tree | e2af35d2fb64037fe3764bb9b9a026f1fa91f053 | |
parent | 79740de065e9b5ff03e9956f7e6151f6e1c03f58 (diff) | |
parent | 92c265b3ad89303e53e64f7ead4499066966c722 (diff) | |
download | rails-2e6d9af6c8b9900481dabfca685b3e335c2f27aa.tar.gz rails-2e6d9af6c8b9900481dabfca685b3e335c2f27aa.tar.bz2 rails-2e6d9af6c8b9900481dabfca685b3e335c2f27aa.zip |
Merge pull request #36800 from jamespearson/matches_regex_mysql
Enabled matches_regex for MySql
-rw-r--r-- | activerecord/CHANGELOG.md | 4 | ||||
-rw-r--r-- | activerecord/lib/arel/visitors/mysql.rb | 8 | ||||
-rw-r--r-- | activerecord/test/cases/arel/visitors/mysql_test.rb | 46 |
3 files changed, 58 insertions, 0 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index 7f2071189b..919905e884 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,3 +1,7 @@ +* Allow matches_regex on MySQL + + *James Pearson* + * Allow specifying fixtures to be ignored by setting `ignore` in YAML file's '_fixture' section. *Tongfei Gao* diff --git a/activerecord/lib/arel/visitors/mysql.rb b/activerecord/lib/arel/visitors/mysql.rb index dd77cfdf66..6cb866715f 100644 --- a/activerecord/lib/arel/visitors/mysql.rb +++ b/activerecord/lib/arel/visitors/mysql.rb @@ -48,6 +48,14 @@ module Arel # :nodoc: all visit_Arel_Nodes_IsNotDistinctFrom o, collector end + def visit_Arel_Nodes_Regexp(o, collector) + infix_value o, collector, " REGEXP " + end + + def visit_Arel_Nodes_NotRegexp(o, collector) + infix_value o, collector, " NOT REGEXP " + end + # In the simple case, MySQL allows us to place JOINs directly into the UPDATE # query. However, this does not allow for LIMIT, OFFSET and ORDER. To support # these, we must use a subquery. diff --git a/activerecord/test/cases/arel/visitors/mysql_test.rb b/activerecord/test/cases/arel/visitors/mysql_test.rb index 5f37587957..05dccd126e 100644 --- a/activerecord/test/cases/arel/visitors/mysql_test.rb +++ b/activerecord/test/cases/arel/visitors/mysql_test.rb @@ -104,6 +104,52 @@ module Arel sql.must_be_like %{ NOT "users"."name" <=> NULL } end end + + describe "Nodes::Regexp" do + before do + @table = Table.new(:users) + @attr = @table[:id] + end + + it "should know how to visit" do + node = @table[:name].matches_regexp("foo.*") + node.must_be_kind_of Nodes::Regexp + compile(node).must_be_like %{ + "users"."name" REGEXP 'foo.*' + } + end + + it "can handle subqueries" do + subquery = @table.project(:id).where(@table[:name].matches_regexp("foo.*")) + node = @attr.in subquery + compile(node).must_be_like %{ + "users"."id" IN (SELECT id FROM "users" WHERE "users"."name" REGEXP 'foo.*') + } + end + end + + describe "Nodes::NotRegexp" do + before do + @table = Table.new(:users) + @attr = @table[:id] + end + + it "should know how to visit" do + node = @table[:name].does_not_match_regexp("foo.*") + node.must_be_kind_of Nodes::NotRegexp + compile(node).must_be_like %{ + "users"."name" NOT REGEXP 'foo.*' + } + end + + it "can handle subqueries" do + subquery = @table.project(:id).where(@table[:name].does_not_match_regexp("foo.*")) + node = @attr.in subquery + compile(node).must_be_like %{ + "users"."id" IN (SELECT id FROM "users" WHERE "users"."name" NOT REGEXP 'foo.*') + } + end + end end end end |