Skip to content

Commit 75138d7

Browse files
committed
Fixed ordering of optimizer hints.
1 parent 8bf060f commit 75138d7

File tree

2 files changed

+15
-5
lines changed

2 files changed

+15
-5
lines changed

lib/arel/visitors/sqlserver.rb

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -134,26 +134,27 @@ def visit_Arel_Nodes_HomogeneousIn(o, collector)
134134

135135
def visit_Arel_Nodes_SelectStatement(o, collector)
136136
@select_statement = o
137+
optimizer_hints = nil
137138
distinct_One_As_One_Is_So_Not_Fetch o
138139
if o.with
139140
collector = visit o.with, collector
140141
collector << " "
141142
end
142143
collector = o.cores.inject(collector) { |c, x|
144+
if x.is_a? Arel::Nodes::SelectCore
145+
# optimizer hints in SQL Server have to be at the very end of the query, so we need to hold onto these for now
146+
optimizer_hints = x.optimizer_hints
147+
end
143148
visit_Arel_Nodes_SelectCore(x, c)
144149
}
145150
collector = visit_Orders_And_Let_Fetch_Happen o, collector
146151
collector = visit_Make_Fetch_Happen o, collector
152+
collector = maybe_visit optimizer_hints, collector
147153
collector
148154
ensure
149155
@select_statement = nil
150156
end
151157

152-
def visit_Arel_Nodes_SelectCore(o, collector)
153-
collector = super
154-
maybe_visit o.optimizer_hints, collector
155-
end
156-
157158
def visit_Arel_Nodes_OptimizerHints(o, collector)
158159
hints = o.expr.map { |v| sanitize_as_option_clause(v) }.join(", ")
159160
collector << "OPTION (#{hints})"

test/cases/optimizer_hints_test_sqlserver.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,15 @@ class OptimizerHitsTestSQLServer < ActiveRecord::TestCase
3636
end
3737
end
3838

39+
40+
it "support order" do
41+
assert_queries_match(%r{\ASELECT .+ FROM .+ ORDER .+ OPTION .+\z}) do
42+
companies = Company.optimizer_hints("LABEL='FindCompanies'")
43+
companies = companies.order(:id)
44+
companies.to_a
45+
end
46+
end
47+
3948
it "sanitize values" do
4049
assert_queries_match(%r{\ASELECT .+ FROM .+ OPTION \(HASH GROUP\)\z}) do
4150
companies = Company.optimizer_hints("OPTION (HASH GROUP)")

0 commit comments

Comments
 (0)