diff options
author | Jan Provaznik <jprovaznik@gitlab.com> | 2018-08-13 12:15:41 +0200 |
---|---|---|
committer | Jan Provaznik <jprovaznik@gitlab.com> | 2018-08-13 13:01:52 +0200 |
commit | ad712ddb1dba4189c7553f45f22f891f164a2762 (patch) | |
tree | beb06fe86834b7288c4f6640e600e96435e3c402 | |
parent | 00c474ae4efd296138598d9fb6609322beb43da9 (diff) | |
download | gitlab-ce-rails5-mysql-group-by.tar.gz |
Disable ONLY_FULL_GROUP_BY mode for mysqlrails5-mysql-group-by
* disables ONLY_FULL_GROUP_BY option which is enabled by default in
rails 5
* reverts 'uniq' workaround which was necessary only when this option
was enabled
-rw-r--r-- | app/models/milestone.rb | 3 | ||||
-rw-r--r-- | config/application.rb | 5 | ||||
-rw-r--r-- | lib/mysql_session_options.rb | 29 | ||||
-rw-r--r-- | lib/mysql_zero_date.rb | 18 |
4 files changed, 32 insertions, 23 deletions
diff --git a/app/models/milestone.rb b/app/models/milestone.rb index cb1def1b422..52b8c9ed247 100644 --- a/app/models/milestone.rb +++ b/app/models/milestone.rb @@ -133,10 +133,9 @@ class Milestone < ActiveRecord::Base rel.order(:project_id, :due_date).select('DISTINCT ON (project_id) id') else rel - .group(:project_id, :due_date, :id) + .group(:project_id) .having('due_date = MIN(due_date)') .pluck(:id, :project_id, :due_date) - .uniq(&:second) .map(&:first) end end diff --git a/config/application.rb b/config/application.rb index 76a2c47a750..79c493ce88c 100644 --- a/config/application.rb +++ b/config/application.rb @@ -21,9 +21,8 @@ module Gitlab require_dependency Rails.root.join('lib/gitlab/middleware/read_only') # This needs to be loaded before DB connection is made - # to make sure that all connections have NO_ZERO_DATE - # setting disabled - require_dependency Rails.root.join('lib/mysql_zero_date') + # to make sure that all connections have session options set + require_dependency Rails.root.join('lib/mysql_session_options') # Settings in config/environments/* take precedence over those specified here. # Application configuration should go into files in config/initializers diff --git a/lib/mysql_session_options.rb b/lib/mysql_session_options.rb new file mode 100644 index 00000000000..9ba1e508218 --- /dev/null +++ b/lib/mysql_session_options.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require 'active_record/connection_adapters/abstract_mysql_adapter' + +module MysqlSessionOptions + def configure_connection + super + + # Disable NO_ZERO_DATE mode for mysql. + # We use zero date as a default value + # (config/initializers/active_record_mysql_timestamp.rb), in + # Rails 5 using zero date fails by default (https://gitlab.com/gitlab-org/gitlab-ce/-/jobs/75450216) + # and NO_ZERO_DATE has to be explicitly disabled. Disabling strict mode + # is not sufficient. + sql_mode = "REPLACE(@@sql_mode, 'NO_ZERO_DATE', '')" + + # Disable ONLY_FULL_GROUP_BY for mysql. + # If ONLY_FULL_GROUP_BY is enabled then GROUP BY clause + # must include all columns used in SELECT, HAVING and ORDER BY. + # This causes that "duplicit" records are then returned in + # some of our queries and these have to be filtered-out + # on rails side. + sql_mode = "REPLACE(#{sql_mode}, 'ONLY_FULL_GROUP_BY', '')" + + @connection.query "SET @@SESSION.sql_mode = #{sql_mode};" # rubocop:disable Gitlab/ModuleWithInstanceVariables + end +end + +ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter.prepend(MysqlSessionOptions) if Gitlab.rails5? diff --git a/lib/mysql_zero_date.rb b/lib/mysql_zero_date.rb deleted file mode 100644 index 64634f789da..00000000000 --- a/lib/mysql_zero_date.rb +++ /dev/null @@ -1,18 +0,0 @@ -# Disable NO_ZERO_DATE mode for mysql in rails 5. -# We use zero date as a default value -# (config/initializers/active_record_mysql_timestamp.rb), in -# Rails 5 using zero date fails by default (https://gitlab.com/gitlab-org/gitlab-ce/-/jobs/75450216) -# and NO_ZERO_DATE has to be explicitly disabled. Disabling strict mode -# is not sufficient. - -require 'active_record/connection_adapters/abstract_mysql_adapter' - -module MysqlZeroDate - def configure_connection - super - - @connection.query "SET @@SESSION.sql_mode = REPLACE(@@SESSION.sql_mode, 'NO_ZERO_DATE', '');" # rubocop:disable Gitlab/ModuleWithInstanceVariables - end -end - -ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter.prepend(MysqlZeroDate) if Gitlab.rails5? |