@@ -5,6 +5,7 @@ class SQLServer < Arel::Visitors::ToSql
55 OFFSET = " OFFSET "
66 ROWS = " ROWS"
77 FETCH = " FETCH NEXT "
8+ FETCH0 = " FETCH FIRST (SELECT 0) "
89 ROWS_ONLY = " ROWS ONLY"
910
1011
@@ -45,9 +46,14 @@ def visit_Arel_Nodes_Offset o, collector
4546 end
4647
4748 def visit_Arel_Nodes_Limit o , collector
48- collector << FETCH
49- visit o . expr , collector
50- collector << ROWS_ONLY
49+ if node_value ( o ) == 0
50+ collector << FETCH0
51+ collector << ROWS_ONLY
52+ else
53+ collector << FETCH
54+ visit o . expr , collector
55+ collector << ROWS_ONLY
56+ end
5157 end
5258
5359 def visit_Arel_Nodes_SelectStatement o , collector
@@ -115,13 +121,6 @@ def visit_Orders_And_Let_Fetch_Happen o, collector
115121 end
116122
117123 def visit_Make_Fetch_Happen o , collector
118- if o . limit
119- value = case o . limit . expr
120- when Numeric then o . limit . expr
121- when Arel ::Nodes ::Unary then o . limit . expr . expr
122- end
123- o . limit = nil if value == 0
124- end
125124 o . offset = Nodes ::Offset . new ( 0 ) if o . limit && !o . offset
126125 collector = visit o . offset , collector if o . offset
127126 collector = visit o . limit , collector if o . limit
@@ -130,6 +129,14 @@ def visit_Make_Fetch_Happen o, collector
130129
131130 # SQLServer Helpers
132131
132+ def node_value ( node )
133+ case node . expr
134+ when NilClass then nil
135+ when Numeric then node . expr
136+ when Arel ::Nodes ::Unary then node . expr . expr
137+ end
138+ end
139+
133140 def select_statement_lock?
134141 @select_statement && @select_statement . lock
135142 end
0 commit comments