aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2014-04-08 19:16:33 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2014-04-08 19:16:33 -0700
commit3ec26142a9f9f036bc3f763adac8fa38048d0a76 (patch)
treed46a2eb27747abe60274184c7e3fa7d39cc69f69
parentb2fb1d3381027176505e8709acd22295fb57597a (diff)
downloadrails-3ec26142a9f9f036bc3f763adac8fa38048d0a76.tar.gz
rails-3ec26142a9f9f036bc3f763adac8fa38048d0a76.tar.bz2
rails-3ec26142a9f9f036bc3f763adac8fa38048d0a76.zip
oracle tests passing
-rw-r--r--lib/arel/visitors/oracle.rb47
-rw-r--r--test/visitors/test_oracle.rb42
2 files changed, 51 insertions, 38 deletions
diff --git a/lib/arel/visitors/oracle.rb b/lib/arel/visitors/oracle.rb
index 0cd0179931..2cdbafadad 100644
--- a/lib/arel/visitors/oracle.rb
+++ b/lib/arel/visitors/oracle.rb
@@ -3,7 +3,7 @@ module Arel
class Oracle < Arel::Visitors::ToSql
private
- def visit_Arel_Nodes_SelectStatement o
+ def visit_Arel_Nodes_SelectStatement o, collector
o = order_hacks(o)
# if need to select first records without ORDER BY and GROUP BY and without DISTINCT
@@ -20,49 +20,58 @@ module Arel
limit = o.limit.expr.to_i
offset = o.offset
o.offset = nil
- sql = super(o)
- return <<-eosql
+ collector << "
SELECT * FROM (
SELECT raw_sql_.*, rownum raw_rnum_
- FROM (#{sql}) raw_sql_
+ FROM ("
+
+ collector = super(o, collector)
+ collector << ") raw_sql_
WHERE rownum <= #{offset.expr.to_i + limit}
)
- WHERE #{visit offset}
- eosql
+ WHERE "
+ return visit(offset, collector)
end
if o.limit
o = o.dup
limit = o.limit.expr
- return "SELECT * FROM (#{super(o)}) WHERE ROWNUM <= #{visit limit}"
+ collector << "SELECT * FROM ("
+ collector = super(o, collector)
+ collector << ") WHERE ROWNUM <= "
+ return visit limit, collector
end
if o.offset
o = o.dup
offset = o.offset
o.offset = nil
- sql = super(o)
- return <<-eosql
- SELECT * FROM (
+ collector << "SELECT * FROM (
SELECT raw_sql_.*, rownum raw_rnum_
- FROM (#{sql}) raw_sql_
+ FROM ("
+ collector = super(o, collector)
+ collector << ") raw_sql_
)
- WHERE #{visit offset}
- eosql
+ WHERE "
+ return visit offset, collector
end
super
end
- def visit_Arel_Nodes_Limit o
+ def visit_Arel_Nodes_Limit o, collector
+ collector
end
- def visit_Arel_Nodes_Offset o
- "raw_rnum_ > #{visit o.expr}"
+ def visit_Arel_Nodes_Offset o, collector
+ collector << "raw_rnum_ > "
+ visit o.expr, collector
end
- def visit_Arel_Nodes_Except o
- "( #{visit o.left } MINUS #{visit o.right} )"
+ def visit_Arel_Nodes_Except o, collector
+ collector << "( "
+ collector = infix_value o, collector, " MINUS "
+ collector << " )"
end
def visit_Arel_Nodes_UpdateStatement o
@@ -91,7 +100,7 @@ module Arel
#
# orders = o.orders.map { |x| visit x }.join(', ').split(',')
orders = o.orders.map do |x|
- string = visit x
+ string = visit(x, Arel::Collectors::SQLString.new).value
if string.include?(',')
split_order_string(string)
else
diff --git a/test/visitors/test_oracle.rb b/test/visitors/test_oracle.rb
index bd22822bca..bb0fe404e8 100644
--- a/test/visitors/test_oracle.rb
+++ b/test/visitors/test_oracle.rb
@@ -7,13 +7,17 @@ module Arel
@visitor = Oracle.new Table.engine.connection_pool
end
+ def compile node
+ @visitor.accept(node, Collectors::SQLString.new).value
+ end
+
it 'modifies order when there is distinct and first value' do
# *sigh*
select = "DISTINCT foo.id, FIRST_VALUE(projects.name) OVER (foo) AS alias_0__"
stmt = Nodes::SelectStatement.new
stmt.cores.first.projections << Nodes::SqlLiteral.new(select)
stmt.orders << Nodes::SqlLiteral.new('foo')
- sql = @visitor.accept(stmt)
+ sql = compile(stmt)
sql.must_be_like %{
SELECT #{select} ORDER BY alias_0__
}
@@ -26,8 +30,8 @@ module Arel
stmt.cores.first.projections << Nodes::SqlLiteral.new(select)
stmt.orders << Nodes::SqlLiteral.new('foo')
- sql = @visitor.accept(stmt)
- sql2 = @visitor.accept(stmt)
+ sql = compile(stmt)
+ sql2 = compile(stmt)
sql.must_equal sql2
end
@@ -37,7 +41,7 @@ module Arel
stmt = Nodes::SelectStatement.new
stmt.cores.first.projections << Nodes::SqlLiteral.new(select)
stmt.orders << Nodes::SqlLiteral.new('foo, bar')
- sql = @visitor.accept(stmt)
+ sql = compile(stmt)
sql.must_be_like %{
SELECT #{select} ORDER BY alias_0__, alias_1__
}
@@ -49,7 +53,7 @@ module Arel
stmt = Nodes::SelectStatement.new
stmt.cores.first.projections << Nodes::SqlLiteral.new(select)
stmt.orders << Nodes::SqlLiteral.new('NVL(LOWER(bar, foo), foo) DESC, UPPER(baz)')
- sql = @visitor.accept(stmt)
+ sql = compile(stmt)
sql.must_be_like %{
SELECT #{select} ORDER BY alias_0__ DESC, alias_1__
}
@@ -60,7 +64,7 @@ module Arel
it 'adds a rownum clause' do
stmt = Nodes::SelectStatement.new
stmt.limit = Nodes::Limit.new(10)
- sql = @visitor.accept stmt
+ sql = compile stmt
sql.must_be_like %{ SELECT WHERE ROWNUM <= 10 }
end
@@ -68,8 +72,8 @@ module Arel
stmt = Nodes::SelectStatement.new
stmt.orders << Nodes::SqlLiteral.new('foo')
stmt.limit = Nodes::Limit.new(10)
- sql = @visitor.accept stmt
- sql2 = @visitor.accept stmt
+ sql = compile stmt
+ sql2 = compile stmt
sql.must_equal sql2
end
@@ -77,9 +81,9 @@ module Arel
stmt = Nodes::SelectStatement.new
stmt.orders << Nodes::SqlLiteral.new('foo')
stmt.limit = Nodes::Limit.new(10)
- sql = @visitor.accept stmt
+ sql = compile stmt
sql.must_be_like %{
- SELECT * FROM (SELECT ORDER BY foo) WHERE ROWNUM <= 10
+ SELECT * FROM (SELECT ORDER BY foo ) WHERE ROWNUM <= 10
}
end
@@ -88,9 +92,9 @@ module Arel
stmt.cores.first.set_quantifier = Arel::Nodes::Distinct.new
stmt.cores.first.projections << Nodes::SqlLiteral.new('id')
stmt.limit = Arel::Nodes::Limit.new(10)
- sql = @visitor.accept stmt
+ sql = compile stmt
sql.must_be_like %{
- SELECT * FROM (SELECT DISTINCT id) WHERE ROWNUM <= 10
+ SELECT * FROM (SELECT DISTINCT id ) WHERE ROWNUM <= 10
}
end
@@ -98,11 +102,11 @@ module Arel
stmt = Nodes::SelectStatement.new
stmt.limit = Nodes::Limit.new(10)
stmt.offset = Nodes::Offset.new(10)
- sql = @visitor.accept stmt
+ sql = compile stmt
sql.must_be_like %{
SELECT * FROM (
SELECT raw_sql_.*, rownum raw_rnum_
- FROM (SELECT) raw_sql_
+ FROM (SELECT ) raw_sql_
WHERE rownum <= 20
)
WHERE raw_rnum_ > 10
@@ -113,8 +117,8 @@ module Arel
stmt = Nodes::SelectStatement.new
stmt.limit = Nodes::Limit.new(10)
stmt.offset = Nodes::Offset.new(10)
- sql = @visitor.accept stmt
- sql2 = @visitor.accept stmt
+ sql = compile stmt
+ sql2 = compile stmt
sql.must_equal sql2
end
end
@@ -123,7 +127,7 @@ module Arel
it 'creates a select from subquery with rownum condition' do
stmt = Nodes::SelectStatement.new
stmt.offset = Nodes::Offset.new(10)
- sql = @visitor.accept stmt
+ sql = compile stmt
sql.must_be_like %{
SELECT * FROM (
SELECT raw_sql_.*, rownum raw_rnum_
@@ -139,7 +143,7 @@ module Arel
it 'modified except to be minus' do
left = Nodes::SqlLiteral.new("SELECT * FROM users WHERE age > 10")
right = Nodes::SqlLiteral.new("SELECT * FROM users WHERE age > 20")
- sql = @visitor.accept Nodes::Except.new(left, right)
+ sql = compile Nodes::Except.new(left, right)
sql.must_be_like %{
( SELECT * FROM users WHERE age > 10 MINUS SELECT * FROM users WHERE age > 20 )
}
@@ -148,7 +152,7 @@ module Arel
describe 'locking' do
it 'defaults to FOR UPDATE when locking' do
node = Nodes::Lock.new(Arel.sql('FOR UPDATE'))
- @visitor.accept(node).must_be_like "FOR UPDATE"
+ compile(node).must_be_like "FOR UPDATE"
end
end
end