aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/relation/calculations.rb
diff options
context:
space:
mode:
authorRyuta Kamizono <kamipo@gmail.com>2019-04-08 17:43:56 +0900
committerRyuta Kamizono <kamipo@gmail.com>2019-04-08 17:46:46 +0900
commitbf1494a1018a0bdc50dac4e87fdbf4b6b03083fa (patch)
tree7a84a832f964f4ace8944d6f094b5e52864d4df0 /activerecord/lib/active_record/relation/calculations.rb
parent57c7cbb1623c0e8befc58988a34bbb9896fd226a (diff)
downloadrails-bf1494a1018a0bdc50dac4e87fdbf4b6b03083fa.tar.gz
rails-bf1494a1018a0bdc50dac4e87fdbf4b6b03083fa.tar.bz2
rails-bf1494a1018a0bdc50dac4e87fdbf4b6b03083fa.zip
Fix GROUP BY with calculate longer name field to respect `table_alias_length`
Follow up of c9e4c848eeeb8999b778fa1ae52185ca5537fffe.
Diffstat (limited to 'activerecord/lib/active_record/relation/calculations.rb')
-rw-r--r--activerecord/lib/active_record/relation/calculations.rb11
1 files changed, 6 insertions, 5 deletions
diff --git a/activerecord/lib/active_record/relation/calculations.rb b/activerecord/lib/active_record/relation/calculations.rb
index 910c6b3214..801e312658 100644
--- a/activerecord/lib/active_record/relation/calculations.rb
+++ b/activerecord/lib/active_record/relation/calculations.rb
@@ -319,12 +319,11 @@ module ActiveRecord
group_aliases = group_fields.map { |field|
field = connection.visitor.compile(field) if Arel.arel_node?(field)
- column_alias_for(field)
+ column_alias_for(field.to_s.downcase)
}
group_columns = group_aliases.zip(group_fields)
- aggregate_alias = "#{operation}_#{column_name.to_s.downcase}"
- aggregate_alias = column_alias_for(aggregate_alias) unless aggregate_alias.match?(/\A\w+\z/)
+ aggregate_alias = column_alias_for("#{operation}_#{column_name.to_s.downcase}")
select_values = [
operation_over_aggregate_column(
@@ -369,7 +368,7 @@ module ActiveRecord
end]
end
- # Converts the given keys to the value that the database adapter returns as
+ # Converts the given field to the value that the database adapter returns as
# a usable column name:
#
# column_alias_for("users.id") # => "users_id"
@@ -377,7 +376,9 @@ module ActiveRecord
# column_alias_for("count(distinct users.id)") # => "count_distinct_users_id"
# column_alias_for("count(*)") # => "count_all"
def column_alias_for(field)
- column_alias = field.to_s.downcase
+ return field if field.match?(/\A\w{,#{connection.table_alias_length}}\z/)
+
+ column_alias = +field
column_alias.gsub!(/\*/, "all")
column_alias.gsub!(/\W+/, " ")
column_alias.strip!