From ea04a8cfda4963143e3fde38d5dec913c02d35ee Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Tue, 18 Nov 2014 22:25:47 +0100 Subject: [PATCH] MDEV-6805 one can set character_set_client to utf32 use the same restriction for character_set_client on the command line and from SQL. Also: remove strange hack from thd_init_client_charset() that contradicted the manual (collation_connection and character_set_result were not always set) --- mysql-test/r/ctype_ucs2_def.result | 1 + mysql-test/r/ctype_ucs2_query_cache.result | 1 + mysql-test/r/ctype_utf16_def.result | 1 + .../sys_vars/r/character_set_connection_func.result | 2 +- .../suite/sys_vars/r/character_set_results_func.result | 2 +- .../suite/sys_vars/r/collation_connection_func.result | 2 +- mysql-test/t/ctype_ucs2_def.test | 2 ++ mysql-test/t/ctype_ucs2_query_cache.test | 2 ++ mysql-test/t/ctype_utf16_def.test | 1 + sql/mysqld.cc | 10 +++++++++- sql/sql_connect.cc | 6 +----- 11 files changed, 21 insertions(+), 9 deletions(-) diff --git a/mysql-test/r/ctype_ucs2_def.result b/mysql-test/r/ctype_ucs2_def.result index af69a9e77d6..5ca7d1689d2 100644 --- a/mysql-test/r/ctype_ucs2_def.result +++ b/mysql-test/r/ctype_ucs2_def.result @@ -1,3 +1,4 @@ +call mtr.add_suppression("Cannot use ucs2 as character_set_client"); show variables like 'collation_server'; Variable_name Value collation_server ucs2_unicode_ci diff --git a/mysql-test/r/ctype_ucs2_query_cache.result b/mysql-test/r/ctype_ucs2_query_cache.result index 6f26bed02da..9a7580324c1 100644 --- a/mysql-test/r/ctype_ucs2_query_cache.result +++ b/mysql-test/r/ctype_ucs2_query_cache.result @@ -1,3 +1,4 @@ +call mtr.add_suppression("Cannot use ucs2 as character_set_client"); # # Start of 5.5 tests # diff --git a/mysql-test/r/ctype_utf16_def.result b/mysql-test/r/ctype_utf16_def.result index 6514734cb38..9d3d110fc99 100644 --- a/mysql-test/r/ctype_utf16_def.result +++ b/mysql-test/r/ctype_utf16_def.result @@ -1,3 +1,4 @@ +call mtr.add_suppression("Cannot use utf16 as character_set_client"); SHOW VARIABLES LIKE 'collation_server'; Variable_name Value collation_server utf16_general_ci diff --git a/mysql-test/suite/sys_vars/r/character_set_connection_func.result b/mysql-test/suite/sys_vars/r/character_set_connection_func.result index 6fc33a4f369..7f3c4e42ce6 100644 --- a/mysql-test/suite/sys_vars/r/character_set_connection_func.result +++ b/mysql-test/suite/sys_vars/r/character_set_connection_func.result @@ -11,7 +11,7 @@ SELECT @@global.character_set_connection; utf8 SELECT @@session.character_set_connection; @@session.character_set_connection -utf8 +latin1 '#--------------------FN_DYNVARS_011_02-------------------------#' 'connection default' DROP TABLE IF EXISTS t1; diff --git a/mysql-test/suite/sys_vars/r/character_set_results_func.result b/mysql-test/suite/sys_vars/r/character_set_results_func.result index d92821fdfa6..14bad0f4eb4 100644 --- a/mysql-test/suite/sys_vars/r/character_set_results_func.result +++ b/mysql-test/suite/sys_vars/r/character_set_results_func.result @@ -9,7 +9,7 @@ SELECT @@global.character_set_results; utf8 SELECT @@session.character_set_results; @@session.character_set_results -utf8 +latin1 '#--------------------FN_DYNVARS_012_02-------------------------#' 'connection default' DROP TABLE IF EXISTS t1; diff --git a/mysql-test/suite/sys_vars/r/collation_connection_func.result b/mysql-test/suite/sys_vars/r/collation_connection_func.result index 18f82dc60e1..b40efda517f 100644 --- a/mysql-test/suite/sys_vars/r/collation_connection_func.result +++ b/mysql-test/suite/sys_vars/r/collation_connection_func.result @@ -9,7 +9,7 @@ SELECT @@global.collation_connection; latin1_danish_ci SELECT @@session.collation_connection; @@session.collation_connection -latin1_danish_ci +latin1_swedish_ci '#--------------------FN_DYNVARS_015_02-------------------------#' 'connection default' DROP TABLE IF EXISTS t1; diff --git a/mysql-test/t/ctype_ucs2_def.test b/mysql-test/t/ctype_ucs2_def.test index b146dc63626..be8e044f2e4 100644 --- a/mysql-test/t/ctype_ucs2_def.test +++ b/mysql-test/t/ctype_ucs2_def.test @@ -1,5 +1,7 @@ -- source include/have_ucs2.inc +call mtr.add_suppression("Cannot use ucs2 as character_set_client"); + # # MySQL Bug#15276: MySQL ignores collation-server # diff --git a/mysql-test/t/ctype_ucs2_query_cache.test b/mysql-test/t/ctype_ucs2_query_cache.test index 0ac09b2ba4b..acb39419751 100644 --- a/mysql-test/t/ctype_ucs2_query_cache.test +++ b/mysql-test/t/ctype_ucs2_query_cache.test @@ -1,6 +1,8 @@ -- source include/have_query_cache.inc -- source include/have_ucs2.inc +call mtr.add_suppression("Cannot use ucs2 as character_set_client"); + --echo # --echo # Start of 5.5 tests --echo # diff --git a/mysql-test/t/ctype_utf16_def.test b/mysql-test/t/ctype_utf16_def.test index d8ef4a4278b..fad61b057c3 100644 --- a/mysql-test/t/ctype_utf16_def.test +++ b/mysql-test/t/ctype_utf16_def.test @@ -1,4 +1,5 @@ --source include/have_utf16.inc +call mtr.add_suppression("Cannot use utf16 as character_set_client"); # # Bug #32391 Character sets: crash with --character-set-server diff --git a/sql/mysqld.cc b/sql/mysqld.cc index b1b8e6b11c0..760ae6fa0d7 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -4268,7 +4268,15 @@ static int init_common_variables() global_system_variables.collation_database= default_charset_info; global_system_variables.collation_connection= default_charset_info; global_system_variables.character_set_results= default_charset_info; - global_system_variables.character_set_client= default_charset_info; + if (default_charset_info->mbminlen > 1) + { + global_system_variables.character_set_client= &my_charset_latin1; + sql_print_warning("Cannot use %s as character_set_client, %s will be used instead", + default_charset_info->csname, + global_system_variables.character_set_client->csname); + } + else + global_system_variables.character_set_client= default_charset_info; if (!(character_set_filesystem= get_charset_by_csname(character_set_filesystem_name, diff --git a/sql/sql_connect.cc b/sql/sql_connect.cc index ac50c7bd8f5..807b028a4b1 100644 --- a/sql/sql_connect.cc +++ b/sql/sql_connect.cc @@ -837,14 +837,10 @@ bool thd_init_client_charset(THD *thd, uint cs_number) Use server character set and collation if - opt_character_set_client_handshake is not set - client has not specified a character set - - client character set is the same as the servers - client character set doesn't exists in server */ if (!opt_character_set_client_handshake || - !(cs= get_charset(cs_number, MYF(0))) || - !my_strcasecmp(&my_charset_latin1, - global_system_variables.character_set_client->name, - cs->name)) + !(cs= get_charset(cs_number, MYF(0)))) { thd->variables.character_set_client= global_system_variables.character_set_client;