aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib
diff options
context:
space:
mode:
authorRyuta Kamizono <kamipo@gmail.com>2018-01-24 08:28:02 +0900
committerRyuta Kamizono <kamipo@gmail.com>2018-01-25 14:12:58 +0900
commitebc09ed9ad9a04338138739226a1a92c7a2707ee (patch)
tree526b373ddbe05b6ded70a1c3e9662167a33a757b /activerecord/lib
parent8223408c8dffb14bec33fcc52cfc67e983f5f99e (diff)
downloadrails-ebc09ed9ad9a04338138739226a1a92c7a2707ee.tar.gz
rails-ebc09ed9ad9a04338138739226a1a92c7a2707ee.tar.bz2
rails-ebc09ed9ad9a04338138739226a1a92c7a2707ee.zip
Fix `count(:all)` with eager loading and having an order other than the driving table
This is a regression caused by 6beb4de. In PostgreSQL, ORDER BY expressions must appear in SELECT list when using DISTINCT. When using `count(:all)` with eager loading, Active Record enforces DISTINCT to count the driving table records only. 6beb4de was caused the regression because `count(:all)` with DISTINCT path no longer removes ORDER BY. We need to ignore ORDER BY when DISTINCT is enforced, otherwise not always generated valid SQL for PostgreSQL. Fixes #31783.
Diffstat (limited to 'activerecord/lib')
-rw-r--r--activerecord/lib/active_record/relation/calculations.rb9
1 files changed, 8 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/relation/calculations.rb b/activerecord/lib/active_record/relation/calculations.rb
index cb0b06cfdc..decd60c87f 100644
--- a/activerecord/lib/active_record/relation/calculations.rb
+++ b/activerecord/lib/active_record/relation/calculations.rb
@@ -131,7 +131,14 @@ module ActiveRecord
def calculate(operation, column_name)
if has_include?(column_name)
relation = apply_join_dependency
- relation.distinct! if operation.to_s.downcase == "count"
+
+ if operation.to_s.downcase == "count" && !distinct_value
+ relation.distinct!
+ # PostgreSQL: ORDER BY expressions must appear in SELECT list when using DISTINCT
+ if (column_name == :all || column_name.nil?) && select_values.empty?
+ relation.order_values = []
+ end
+ end
relation.calculate(operation, column_name)
else