diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/arel/nodes/select_core.rb | 17 | ||||
-rw-r--r-- | lib/arel/nodes/unary.rb | 6 | ||||
-rw-r--r-- | lib/arel/visitors/to_sql.rb | 5 |
3 files changed, 21 insertions, 7 deletions
diff --git a/lib/arel/nodes/select_core.rb b/lib/arel/nodes/select_core.rb index 7f577e0a05..bee0a5930c 100644 --- a/lib/arel/nodes/select_core.rb +++ b/lib/arel/nodes/select_core.rb @@ -2,15 +2,18 @@ module Arel module Nodes class SelectCore < Arel::Nodes::Node attr_accessor :top, :projections, :wheres, :groups - attr_accessor :having, :source + attr_accessor :having, :source, :set_quantifier def initialize - @source = JoinSource.new nil - @top = nil - @projections = [] - @wheres = [] - @groups = [] - @having = nil + @source = JoinSource.new nil + @top = nil + + # http://savage.net.au/SQL/sql-92.bnf.html#set%20quantifier + @set_quantifier = nil + @projections = [] + @wheres = [] + @groups = [] + @having = nil end def from diff --git a/lib/arel/nodes/unary.rb b/lib/arel/nodes/unary.rb index 1c834913fa..e6e40e6b13 100644 --- a/lib/arel/nodes/unary.rb +++ b/lib/arel/nodes/unary.rb @@ -23,5 +23,11 @@ module Arel }.each do |name| const_set(name, Class.new(Unary)) end + + class Distinct < Unary + def initialize expr = nil + super + end + end end end diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb index 061e46a436..6aba31d94d 100644 --- a/lib/arel/visitors/to_sql.rb +++ b/lib/arel/visitors/to_sql.rb @@ -125,6 +125,7 @@ key on UpdateManager using UpdateManager#key= [ "SELECT", (visit(o.top) if o.top), + (visit(o.set_quantifier) if o.set_quantifier), "#{o.projections.map { |x| visit x }.join ', '}", visit(o.source), ("WHERE #{o.wheres.map { |x| visit x }.join ' AND ' }" unless o.wheres.empty?), @@ -137,6 +138,10 @@ key on UpdateManager using UpdateManager#key= visit o.expr end + def visit_Arel_Nodes_Distinct o + 'DISTINCT' + end + def visit_Arel_Nodes_With o "WITH #{o.children.map { |x| visit x }.join(', ')}" end |