aboutsummaryrefslogtreecommitdiffstats
path: root/lib/arel/visitors/mysql.rb
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2014-04-08 19:43:42 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2014-04-08 19:43:42 -0700
commit5dceb0e9dc1e1e0abe595194ba1ef9f6112afd05 (patch)
tree503354fdc1efabec91419406382482df97c9a435 /lib/arel/visitors/mysql.rb
parent3ec26142a9f9f036bc3f763adac8fa38048d0a76 (diff)
downloadrails-5dceb0e9dc1e1e0abe595194ba1ef9f6112afd05.tar.gz
rails-5dceb0e9dc1e1e0abe595194ba1ef9f6112afd05.tar.bz2
rails-5dceb0e9dc1e1e0abe595194ba1ef9f6112afd05.zip
fixing mysql visitor
Diffstat (limited to 'lib/arel/visitors/mysql.rb')
-rw-r--r--lib/arel/visitors/mysql.rb61
1 files changed, 42 insertions, 19 deletions
diff --git a/lib/arel/visitors/mysql.rb b/lib/arel/visitors/mysql.rb
index 3b911e826f..cf590598e1 100644
--- a/lib/arel/visitors/mysql.rb
+++ b/lib/arel/visitors/mysql.rb
@@ -2,25 +2,31 @@ module Arel
module Visitors
class MySQL < Arel::Visitors::ToSql
private
- def visit_Arel_Nodes_Union o, suppress_parens = false
- left_result = case o.left
+ def visit_Arel_Nodes_Union o, collector, suppress_parens = false
+ unless suppress_parens
+ collector << "( "
+ end
+
+ collector = case o.left
when Arel::Nodes::Union
- visit_Arel_Nodes_Union o.left, true
+ visit_Arel_Nodes_Union o.left, collector, true
else
- visit o.left
+ visit o.left, collector
end
- right_result = case o.right
+ collector << " UNION "
+
+ collector = case o.right
when Arel::Nodes::Union
- visit_Arel_Nodes_Union o.right, true
+ visit_Arel_Nodes_Union o.right, collector, true
else
- visit o.right
+ visit o.right, collector
end
if suppress_parens
- "#{left_result} UNION #{right_result}"
+ collector
else
- "( #{left_result} UNION #{right_result} )"
+ collector << " )"
end
end
@@ -31,26 +37,43 @@ module Arel
###
# :'(
# http://dev.mysql.com/doc/refman/5.0/en/select.html#id3482214
- def visit_Arel_Nodes_SelectStatement o
+ def visit_Arel_Nodes_SelectStatement o, collector
if o.offset && !o.limit
o.limit = Arel::Nodes::Limit.new(Nodes.build_quoted(18446744073709551615))
end
super
end
- def visit_Arel_Nodes_SelectCore o
+ def visit_Arel_Nodes_SelectCore o, collector
o.froms ||= Arel.sql('DUAL')
super
end
- def visit_Arel_Nodes_UpdateStatement o
- [
- "UPDATE #{visit o.relation}",
- ("SET #{o.values.map { |value| visit value }.join ', '}" unless o.values.empty?),
- ("WHERE #{o.wheres.map { |x| visit x }.join ' AND '}" unless o.wheres.empty?),
- ("ORDER BY #{o.orders.map { |x| visit x }.join(', ')}" unless o.orders.empty?),
- (visit(o.limit) if o.limit),
- ].compact.join ' '
+ def visit_Arel_Nodes_UpdateStatement o, collector
+ collector << "UPDATE "
+ collector = visit o.relation, collector
+
+ unless o.values.empty?
+ collector << "SET "
+ collector = inject_join o.values, collector, ', '
+ end
+
+ unless o.wheres.empty?
+ collector << "SET "
+ collector = inject_join o.wheres, collector, ' AND '
+ end
+
+ unless o.orders.empty?
+ collector << "ORDER BY "
+ collector = inject_join o.wheres, collector, ', '
+ end
+
+ if o.limit
+ collector << " "
+ visit(o.limit, collector)
+ else
+ collector
+ end
end
end