1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

informix is working

This commit is contained in:
Aaron Patterson 2014-04-08 21:14:00 -07:00
parent d3d7c218cb
commit 1360259961
3 changed files with 50 additions and 29 deletions

View file

@ -2,30 +2,48 @@ module Arel
module Visitors module Visitors
class Informix < Arel::Visitors::ToSql class Informix < Arel::Visitors::ToSql
private private
def visit_Arel_Nodes_SelectStatement o def visit_Arel_Nodes_SelectStatement o, collector
[ collector << "SELECT "
"SELECT", collector = maybe_visit o.offset, collector
(visit(o.offset) if o.offset), collector = maybe_visit o.limit, collector
(visit(o.limit) if o.limit), collector = o.cores.inject(collector) { |c,x|
o.cores.map { |x| visit_Arel_Nodes_SelectCore x }.join, visit_Arel_Nodes_SelectCore x, c
("ORDER BY #{o.orders.map { |x| visit x }.join(', ')}" unless o.orders.empty?), }
(visit(o.lock) if o.lock), if o.orders.any?
].compact.join ' ' collector << "ORDER BY "
collector = inject_join o.orders, collector, ", "
end end
def visit_Arel_Nodes_SelectCore o collector = maybe_visit o.lock, collector
[
"#{o.projections.map { |x| visit x }.join ', '}",
("FROM #{visit(o.source)}" if o.source && !o.source.empty?),
("WHERE #{o.wheres.map { |x| visit x }.join ' AND ' }" unless o.wheres.empty?),
("GROUP BY #{o.groups.map { |x| visit x }.join ', ' }" unless o.groups.empty?),
(visit(o.having) if o.having),
].compact.join ' '
end end
def visit_Arel_Nodes_Offset o def visit_Arel_Nodes_SelectCore o, collector
"SKIP #{visit o.expr}" collector = inject_join o.projections, collector, ", "
froms = false
if o.source && !o.source.empty?
froms = true
collector << " FROM "
collector = visit o.source, collector
end end
def visit_Arel_Nodes_Limit o
"LIMIT #{visit o.expr}" if o.wheres.any?
collector << " WHERE "
collector = inject_join o.wheres, collector, " AND "
end
if o.groups.any?
collector << "GROUP BY "
collector = inject_join o.groups, collector, ", "
end
maybe_visit o.having, collector
end
def visit_Arel_Nodes_Offset o, collector
collector << "SKIP "
visit o.expr, collector
end
def visit_Arel_Nodes_Limit o, collector
collector << "LIMIT "
visit o.expr, collector
collector << " "
end end
end end
end end

View file

@ -107,7 +107,6 @@ module Arel
end end
unless wheres.empty? unless wheres.empty?
collector << " " if values
collector << " WHERE " collector << " WHERE "
collector = inject_join wheres, collector, " AND " collector = inject_join wheres, collector, " AND "
end end

View file

@ -7,10 +7,14 @@ module Arel
@visitor = Informix.new Table.engine.connection @visitor = Informix.new Table.engine.connection
end end
def compile node
@visitor.accept(node, Collectors::SQLString.new).value
end
it 'uses LIMIT n to limit results' do it 'uses LIMIT n to limit results' do
stmt = Nodes::SelectStatement.new stmt = Nodes::SelectStatement.new
stmt.limit = Nodes::Limit.new(1) stmt.limit = Nodes::Limit.new(1)
sql = @visitor.accept(stmt) sql = compile(stmt)
sql.must_be_like "SELECT LIMIT 1" sql.must_be_like "SELECT LIMIT 1"
end end
@ -20,14 +24,14 @@ module Arel
stmt.relation = table stmt.relation = table
stmt.limit = Nodes::Limit.new(Nodes.build_quoted(1)) stmt.limit = Nodes::Limit.new(Nodes.build_quoted(1))
stmt.key = table[:id] stmt.key = table[:id]
sql = @visitor.accept(stmt) sql = compile(stmt)
sql.must_be_like "UPDATE \"users\" WHERE \"users\".\"id\" IN (SELECT LIMIT 1 \"users\".\"id\" FROM \"users\")" sql.must_be_like "UPDATE \"users\" WHERE \"users\".\"id\" IN (SELECT LIMIT 1 \"users\".\"id\" FROM \"users\")"
end end
it 'uses SKIP n to jump results' do it 'uses SKIP n to jump results' do
stmt = Nodes::SelectStatement.new stmt = Nodes::SelectStatement.new
stmt.offset = Nodes::Offset.new(10) stmt.offset = Nodes::Offset.new(10)
sql = @visitor.accept(stmt) sql = compile(stmt)
sql.must_be_like "SELECT SKIP 10" sql.must_be_like "SELECT SKIP 10"
end end
@ -35,7 +39,7 @@ module Arel
stmt = Nodes::SelectStatement.new stmt = Nodes::SelectStatement.new
stmt.limit = Nodes::Limit.new(1) stmt.limit = Nodes::Limit.new(1)
stmt.offset = Nodes::Offset.new(1) stmt.offset = Nodes::Offset.new(1)
sql = @visitor.accept(stmt) sql = compile(stmt)
sql.must_be_like "SELECT SKIP 1 LIMIT 1" sql.must_be_like "SELECT SKIP 1 LIMIT 1"
end end
@ -45,7 +49,7 @@ module Arel
core.source = Nodes::JoinSource.new(table, [table.create_join(Table.new(:comments))]) core.source = Nodes::JoinSource.new(table, [table.create_join(Table.new(:comments))])
stmt = Nodes::SelectStatement.new([core]) stmt = Nodes::SelectStatement.new([core])
sql = @visitor.accept(stmt) sql = compile(stmt)
sql.must_be_like 'SELECT FROM "posts" INNER JOIN "comments"' sql.must_be_like 'SELECT FROM "posts" INNER JOIN "comments"'
end end