diff options
author | Ryuta Kamizono <kamipo@gmail.com> | 2015-11-11 23:05:44 +0900 |
---|---|---|
committer | Ryuta Kamizono <kamipo@gmail.com> | 2015-12-23 22:47:44 +0900 |
commit | d0be40cad168aae558eeb6a9b12acd8d113e3fc9 (patch) | |
tree | 305e28e84cb46b6b8993b317ad3b2dc77d13bca4 /activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb | |
parent | 9c5732d23447a2880dafc7f80254b1c9e42863f8 (diff) | |
download | rails-d0be40cad168aae558eeb6a9b12acd8d113e3fc9.tar.gz rails-d0be40cad168aae558eeb6a9b12acd8d113e3fc9.tar.bz2 rails-d0be40cad168aae558eeb6a9b12acd8d113e3fc9.zip |
Add `columns_for_distinct` for MySQL 5.7 with ONLY_FULL_GROUP_BY
In MySQL 5.7.5 and up, ONLY_FULL_GROUP_BY affects handling of queries
that use DISTINCT and ORDER BY. It requires the ORDER BY columns in the
select list for distinct queries, and requires that the ORDER BY include
the distinct column.
See https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb')
-rw-r--r-- | activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb index b9a9c22198..068bf356e8 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb @@ -786,6 +786,21 @@ module ActiveRecord end end + # In MySQL 5.7.5 and up, ONLY_FULL_GROUP_BY affects handling of queries that use + # DISTINCT and ORDER BY. It requires the ORDER BY columns in the select list for + # distinct queries, and requires that the ORDER BY include the distinct column. + # See https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html + def columns_for_distinct(columns, orders) # :nodoc: + order_columns = orders.reject(&:blank?).map { |s| + # Convert Arel node to string + s = s.to_sql unless s.is_a?(String) + # Remove any ASC/DESC modifiers + s.gsub(/\s+(?:ASC|DESC)\b/i, '') + }.reject(&:blank?).map.with_index { |column, i| "#{column} AS alias_#{i}" } + + [super, *order_columns].join(', ') + end + def strict_mode? self.class.type_cast_config_to_boolean(@config.fetch(:strict, true)) end |