From 3e67e0b3b2c192335daeede83430dc6e5042fec3 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sat, 3 Jun 2006 21:27:16 +0000 Subject: Fixed problems with eager loading and counting on SQL Server (closed #5212) [kajism@yahoo.com] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4418 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- activerecord/CHANGELOG | 3 ++- .../lib/active_record/connection_adapters/sqlserver_adapter.rb | 10 ++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) (limited to 'activerecord') diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG index 86c61e51a3..698bf850e9 100644 --- a/activerecord/CHANGELOG +++ b/activerecord/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Fixed problems with eager loading and counting on SQL Server #5212 [kajism@yahoo.com] + * Fixed that count distinct should use the selected column even when using :include #5251 [anna@wota.jp] * Fixed that :includes merged from with_scope won't cause the same association to be loaded more than once if repetition occurs in the clauses #5253 [alex@purefiction.net] @@ -8,7 +10,6 @@ * PostgreSQL: don't ignore port when host is nil since it's often used to label the domain socket. #5247 [shimbo@is.naist.jp] ->>>>>>> .r4414 * Records and arrays of records are bound as quoted ids. [Jeremy Kemper] Foo.find(:all, :conditions => ['bar_id IN (?)', bars]) Foo.find(:first, :conditions => ['bar_id = ?', bar]) diff --git a/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb b/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb index 658330cf53..2e1ac2350b 100644 --- a/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb @@ -370,11 +370,11 @@ module ActiveRecord def add_limit_offset!(sql, options) if options[:limit] and options[:offset] - total_rows = @connection.select_all("SELECT count(*) as TotalRows from (#{sql.gsub(/\bSELECT\b/i, "SELECT TOP 1000000000")}) tally")[0][:TotalRows].to_i + total_rows = @connection.select_all("SELECT count(*) as TotalRows from (#{sql.gsub(/\bSELECT(\s+DISTINCT)?\b/i, "SELECT#{$1} TOP 1000000000")}) tally")[0][:TotalRows].to_i if (options[:limit] + options[:offset]) >= total_rows options[:limit] = (total_rows - options[:offset] >= 0) ? (total_rows - options[:offset]) : 0 end - sql.sub!(/^\s*SELECT/i, "SELECT * FROM (SELECT TOP #{options[:limit]} * FROM (SELECT TOP #{options[:limit] + options[:offset]} ") + sql.sub!(/^\s*SELECT(\s+DISTINCT)?/i, "SELECT * FROM (SELECT TOP #{options[:limit]} * FROM (SELECT#{$1} TOP #{options[:limit] + options[:offset]} ") sql << ") AS tmp1" if options[:order] options[:order] = options[:order].split(',').map do |field| @@ -385,7 +385,9 @@ module ActiveRecord tc << '\\]' end if sql =~ /#{tc} AS (t\d_r\d\d?)/ - parts[0] = $1 + parts[0] = $1 + elsif parts[0] =~ /\w+\.(\w+)/ + parts[0] = $1 end parts.join(' ') end.join(', ') @@ -394,7 +396,7 @@ module ActiveRecord sql << " ) AS tmp2" end elsif sql !~ /^\s*SELECT (@@|COUNT\()/i - sql.sub!(/^\s*SELECT([\s]*distinct)?/i) do + sql.sub!(/^\s*SELECT(\s+DISTINCT)?/i) do "SELECT#{$1} TOP #{options[:limit]}" end unless options[:limit].nil? end -- cgit v1.2.3