diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2011-02-02 15:09:54 -0800 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2011-02-02 15:09:54 -0800 |
commit | 066d9a3f5d24feb628187117769aee81f8538159 (patch) | |
tree | 56c1472c3f5caf2d45575496331eefb1cb3ae0ac /lib/arel/visitors | |
parent | 345646619f034fbce952b0339ea86e1607548570 (diff) | |
download | rails-066d9a3f5d24feb628187117769aee81f8538159.tar.gz rails-066d9a3f5d24feb628187117769aee81f8538159.tar.bz2 rails-066d9a3f5d24feb628187117769aee81f8538159.zip |
adding TOP to sub selects for mssql
Diffstat (limited to 'lib/arel/visitors')
-rw-r--r-- | lib/arel/visitors/mssql.rb | 7 | ||||
-rw-r--r-- | lib/arel/visitors/to_sql.rb | 21 |
2 files changed, 19 insertions, 9 deletions
diff --git a/lib/arel/visitors/mssql.rb b/lib/arel/visitors/mssql.rb index 9b0e77c19b..ea7ab6394c 100644 --- a/lib/arel/visitors/mssql.rb +++ b/lib/arel/visitors/mssql.rb @@ -3,6 +3,13 @@ module Arel class MSSQL < Arel::Visitors::ToSql private + def build_subselect key, o + stmt = super + core = stmt.cores.first + core.top = Nodes::Top.new(o.limit.expr) if o.limit + stmt + end + def visit_Arel_Nodes_Limit o "" end diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb index a395b7f765..61f68a8c09 100644 --- a/lib/arel/visitors/to_sql.rb +++ b/lib/arel/visitors/to_sql.rb @@ -38,6 +38,17 @@ module Arel ].compact.join ' ' end + # FIXME: we should probably have a 2-pass visitor for this + def build_subselect key, o + stmt = Nodes::SelectStatement.new + core = stmt.cores.first + core.froms = o.relation + core.projections = [key] + stmt.limit = o.limit + stmt.orders = o.orders + stmt + end + def visit_Arel_Nodes_UpdateStatement o if o.orders.empty? && o.limit.nil? wheres = o.wheres @@ -52,15 +63,7 @@ key on UpdateManager using UpdateManager#key= key = o.relation.primary_key end - wheres = o.wheres - stmt = Nodes::SelectStatement.new - core = stmt.cores.first - core.froms = o.relation - core.projections = [key] - stmt.limit = o.limit - stmt.orders = o.orders - - wheres = [Nodes::In.new(key, [stmt])] + wheres = [Nodes::In.new(key, [build_subselect(key, o)])] end [ |