summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Provaznik <jprovaznik@gitlab.com>2018-08-13 12:15:41 +0200
committerJan Provaznik <jprovaznik@gitlab.com>2018-08-13 13:01:52 +0200
commitad712ddb1dba4189c7553f45f22f891f164a2762 (patch)
treebeb06fe86834b7288c4f6640e600e96435e3c402
parent00c474ae4efd296138598d9fb6609322beb43da9 (diff)
downloadgitlab-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.rb3
-rw-r--r--config/application.rb5
-rw-r--r--lib/mysql_session_options.rb29
-rw-r--r--lib/mysql_zero_date.rb18
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?