Skip to content

Commit 0449636

Browse files
committed
Allow FETCH with 0 ROWS.
Thanks! http://sqlmag.com/t-sql/offsetfetch-part-1
1 parent 1a1771a commit 0449636

File tree

1 file changed

+17
-10
lines changed

1 file changed

+17
-10
lines changed

lib/arel/visitors/sqlserver.rb

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)