diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2014-04-08 19:16:33 -0700 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2014-04-08 19:16:33 -0700 |
commit | 3ec26142a9f9f036bc3f763adac8fa38048d0a76 (patch) | |
tree | d46a2eb27747abe60274184c7e3fa7d39cc69f69 | |
parent | b2fb1d3381027176505e8709acd22295fb57597a (diff) | |
download | rails-3ec26142a9f9f036bc3f763adac8fa38048d0a76.tar.gz rails-3ec26142a9f9f036bc3f763adac8fa38048d0a76.tar.bz2 rails-3ec26142a9f9f036bc3f763adac8fa38048d0a76.zip |
oracle tests passing
-rw-r--r-- | lib/arel/visitors/oracle.rb | 47 | ||||
-rw-r--r-- | test/visitors/test_oracle.rb | 42 |
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 |