Skip to content

Commit 34df309

Browse files
committed
Fixed the ordering of optimizer hints in the generated SQL (#1255)
1 parent 8bf060f commit 34df309

File tree

2 files changed

+15
-8
lines changed

2 files changed

+15
-8
lines changed

lib/arel/visitors/sqlserver.rb

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -134,26 +134,24 @@ 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
142-
collector = o.cores.inject(collector) { |c, x|
143-
visit_Arel_Nodes_SelectCore(x, c)
144-
}
143+
collector = o.cores.inject(collector) do |collect, core|
144+
optimizer_hints = core.optimizer_hints if core.optimizer_hints
145+
visit_Arel_Nodes_SelectCore(core, collect)
146+
end
145147
collector = visit_Orders_And_Let_Fetch_Happen o, collector
146148
collector = visit_Make_Fetch_Happen o, collector
149+
collector = maybe_visit optimizer_hints, collector
147150
collector
148151
ensure
149152
@select_statement = nil
150153
end
151154

152-
def visit_Arel_Nodes_SelectCore(o, collector)
153-
collector = super
154-
maybe_visit o.optimizer_hints, collector
155-
end
156-
157155
def visit_Arel_Nodes_OptimizerHints(o, collector)
158156
hints = o.expr.map { |v| sanitize_as_option_clause(v) }.join(", ")
159157
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)