Skip to content

Commit 499a6c7

Browse files
committed
Remove invalid order from FROM subquery
1 parent 6a6650b commit 499a6c7

File tree

1 file changed

+11
-6
lines changed

1 file changed

+11
-6
lines changed

lib/arel/visitors/sqlserver.rb

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ def visit_Arel_Nodes_Limit o, collector
5858
end
5959
end
6060

61+
def visit_Arel_Nodes_Grouping(o, collector)
62+
remove_invalid_ordering_from_select_statement(o.expr)
63+
super
64+
end
65+
6166
def visit_Arel_Nodes_SelectStatement o, collector
6267
@select_statement = o
6368
distinct_One_As_One_Is_So_Not_Fetch o
@@ -127,14 +132,11 @@ def visit_Arel_Nodes_OuterJoin o, collector
127132
visit o.right, collector
128133
end
129134

130-
# Need to remove ordering from subqueries unless TOP/OFFSET also used. Otherwise, SQLServer
131-
# returns error "The ORDER BY clause is invalid in views, inline functions, derived tables,
132-
# subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified."
133135
def collect_in_clause(left, right, collector)
134136
if Array === right
135-
right.each { |node| remove_invalid_ordering_from_in_clause(node) }
137+
right.each { |node| remove_invalid_ordering_from_select_statement(node) }
136138
else
137-
remove_invalid_ordering_from_in_clause(right)
139+
remove_invalid_ordering_from_select_statement(right)
138140
end
139141

140142
super
@@ -231,7 +233,10 @@ def remote_server_table_name o
231233
).quoted
232234
end
233235

234-
def remove_invalid_ordering_from_in_clause(node)
236+
# Need to remove ordering from subqueries unless TOP/OFFSET also used. Otherwise, SQLServer
237+
# returns error "The ORDER BY clause is invalid in views, inline functions, derived tables,
238+
# subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified."
239+
def remove_invalid_ordering_from_select_statement(node)
235240
return unless Arel::Nodes::SelectStatement === node
236241

237242
node.orders = [] unless node.offset || node.limit

0 commit comments

Comments
 (0)