Permalink
Browse files

Fix merging relation that order including `?`

The `Relation::Merger` has a problem that order values would be merged
as nested array.

That was caused an issue #33664 since if array value is passed to
`order` and first element in the array includes `?`, the array is
regarded as a prepared statement and bind variables.

https://api.rubyonrails.org/classes/ActiveRecord/Sanitization/ClassMethods.html#method-i-sanitize_sql_for_order

Just merging that as splat args like other values would fix the issue.

Fixes #33664.
  • Loading branch information...
kamipo committed Aug 20, 2018
1 parent ffca883 commit 96cd16bdeec661c9ecf1a83ca41a2cb22f435af9
@@ -152,10 +152,10 @@ def merge_outer_joins
def merge_multi_values
if other.reordering_value
# override any order specified in the original relation
relation.reorder! other.order_values
relation.reorder!(*other.order_values)
elsif other.order_values.any?
# merge in order_values from relation
relation.order! other.order_values
relation.order!(*other.order_values)
end

extensions = other.extensions - relation.extensions
@@ -121,6 +121,16 @@ def test_merging_with_from_clause
relation = relation.merge(Post.from("posts"))
assert_not_empty relation.from_clause
end

def test_merging_with_order_with_binds
relation = Post.all.merge(Post.order([Arel.sql("title LIKE ?"), "%suffix"]))
assert_equal ["title LIKE '%suffix'"], relation.order_values
end

def test_merging_with_order_without_binds
relation = Post.all.merge(Post.order(Arel.sql("title LIKE '%?'")))
assert_equal ["title LIKE '%?'"], relation.order_values
end
end

class MergingDifferentRelationsTest < ActiveRecord::TestCase

0 comments on commit 96cd16b

Please sign in to comment.