提交 58d82b23 编写于 作者: A Aaron Patterson

dealing with limits and offsets

上级 f63badf4
module Arel
module Visitors
class Oracle < Arel::Visitors::ToSql
private
def visit_Arel_Nodes_SelectStatement o
if o.limit && o.orders.empty?
if o.limit && o.orders.empty? && !o.offset
o.cores.last.wheres.push Nodes::LessThanOrEqual.new(
Nodes::SqlLiteral.new('ROWNUM'), o.limit
)
......@@ -10,6 +12,22 @@ def visit_Arel_Nodes_SelectStatement o
return super
end
if o.limit && o.offset
limit = o.limit.to_i
offset = o.offset
o.limit = nil
o.offset = nil
sql = super
return <<-eosql
SELECT * FROM (
SELECT raw_sql_.*, rownum raw_rnum_
FROM (#{sql}) raw_sql_
WHERE rownum <= #{offset.value.to_i + limit}
)
WHERE #{visit offset}
eosql
end
if o.limit && !o.orders.empty?
limit = o.limit
o.limit = nil
......@@ -18,6 +36,10 @@ def visit_Arel_Nodes_SelectStatement o
super
end
def visit_Arel_Nodes_Offset o
"raw_rnum_ > #{visit o.value}"
end
end
end
end
......@@ -25,6 +25,21 @@ module Visitors
SELECT * FROM (SELECT ORDER BY foo) WHERE ROWNUM <= 10
}
end
it 'creates a different subquery when there is an offset' do
stmt = Nodes::SelectStatement.new
stmt.limit = 10
stmt.offset = Nodes::Offset.new(10)
sql = @visitor.accept stmt
sql.should be_like %{
SELECT * FROM (
SELECT raw_sql_.*, rownum raw_rnum_
FROM (SELECT ) raw_sql_
WHERE rownum <= 20
)
WHERE raw_rnum_ > 10
}
end
end
end
end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册