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:
parent
d3d7c218cb
commit
1360259961
3 changed files with 50 additions and 29 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue