mirror of
https://github.com/github/rails.git
synced 2026-01-29 16:28:09 -05:00
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
This commit is contained in:
@@ -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])
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user