Skip to content

Commit 47a6654

Browse files
authored
Fixed the ordering of optimizer hints in the generated SQL (#1255)
1 parent 111d33b commit 47a6654

File tree

3 files changed

+16
-8
lines changed

3 files changed

+16
-8
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
- [#1244](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1244) Allow INSERT statements with SELECT notation
66
- [#1247](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1247) Fix queries with date and date-time placeholder conditions
77
- [#1249](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1249) Binary basic columns should be limitable
8+
- [#1255](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1255)Fixed the ordering of optimizer hints in the generated SQL
89

910
## v7.2.1
1011

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)