From 1d09067b479354956806a8b28c8ce5422cccd60a Mon Sep 17 00:00:00 2001 From: Robin Roestenburg Date: Mon, 25 Jan 2021 12:32:51 +0100 Subject: [PATCH] Remove SET NAMES, set collation using variable Fixes malformed packet error that occurred with MariaDB client connecting to RDS Aurora (MySQL 5.7) database. --- .../abstract_mysql_adapter.rb | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 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 e065721eefde7..976b9bde27ce7 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb @@ -751,6 +751,11 @@ def configure_connection wait_timeout = 2147483 unless wait_timeout.is_a?(Integer) variables["wait_timeout"] = wait_timeout + # Set the collation of the connection character set. + if @config[:collation] + variables["collation_connection"] = @config[:collation] + end + defaults = [":default", :default].to_set # Make MySQL reject illegal values rather than truncating or blanking them, see @@ -770,15 +775,6 @@ def configure_connection end sql_mode_assignment = "@@SESSION.sql_mode = #{sql_mode}, " if sql_mode - # NAMES does not have an equals sign, see - # https://dev.mysql.com/doc/refman/en/set-names.html - # (trailing comma because variable_assignments will always have content) - if @config[:encoding] - encoding = +"NAMES #{@config[:encoding]}" - encoding << " COLLATE #{@config[:collation]}" if @config[:collation] - encoding << ", " - end - # Gather up all of the SET variables... variable_assignments = variables.map do |k, v| if defaults.include?(v) @@ -790,7 +786,7 @@ def configure_connection end.compact.join(", ") # ...and send them all in one query - execute("SET #{encoding} #{sql_mode_assignment} #{variable_assignments}", "SCHEMA") + execute("SET #{sql_mode_assignment} #{variable_assignments}", "SCHEMA") end def column_definitions(table_name) # :nodoc: