Loading mysql-test/r/ctype_ucs.result +8 −0 Original line number Diff line number Diff line Loading @@ -811,6 +811,14 @@ quote(name) ???????? ???????????????? drop table bug20536; set names ucs2; ERROR 42000: Variable 'character_set_client' can't be set to the value of 'ucs2' set names ucs2 collate ucs2_bin; ERROR 42000: Variable 'character_set_client' can't be set to the value of 'ucs2' set character_set_client= ucs2; ERROR 42000: Variable 'character_set_client' can't be set to the value of 'ucs2' set character_set_client= concat('ucs', substr('2', 1)); ERROR 42000: Variable 'character_set_client' can't be set to the value of 'ucs2' End of 4.1 tests CREATE TABLE t1 (a varchar(64) character set ucs2, b decimal(10,3)); INSERT INTO t1 VALUES ("1.1", 0), ("2.1", 0); Loading mysql-test/t/ctype_ucs.test +12 −0 Original line number Diff line number Diff line Loading @@ -547,6 +547,18 @@ select quote(name) from bug20536; drop table bug20536; # # Bug #31615: crash after set names ucs2 collate xxx # --error 1231 set names ucs2; --error 1231 set names ucs2 collate ucs2_bin; --error 1231 set character_set_client= ucs2; --error 1231 set character_set_client= concat('ucs', substr('2', 1)); --echo End of 4.1 tests # Loading sql/set_var.cc +22 −0 Original line number Diff line number Diff line Loading @@ -2222,6 +2222,21 @@ sys_var_character_set_filesystem::set_default(THD *thd, enum_var_type type) } bool sys_var_character_set_client::check(THD *thd, set_var *var) { if (sys_var_character_set::check(thd, var)) return 1; /* Currently, UCS-2 cannot be used as a client character set */ if (var->save_result.charset->mbminlen > 1) { my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), name, var->save_result.charset->csname); return 1; } return 0; } CHARSET_INFO ** sys_var_character_set_results::ci_ptr(THD *thd, enum_var_type type) { Loading Loading @@ -2561,6 +2576,13 @@ bool sys_var_key_cache_long::update(THD *thd, set_var *var) int set_var_collation_client::check(THD *thd) { /* Currently, UCS-2 cannot be used as a client character set */ if (character_set_client->mbminlen > 1) { my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), "character_set_client", character_set_client->csname); return 1; } return 0; } Loading sql/set_var.h +1 −0 Original line number Diff line number Diff line Loading @@ -613,6 +613,7 @@ class sys_var_character_set_client :public sys_var_character_set sys_var_character_set(name_arg) {} void set_default(THD *thd, enum_var_type type); CHARSET_INFO **ci_ptr(THD *thd, enum_var_type type); bool check(THD *thd, set_var *var); }; class sys_var_character_set_results :public sys_var_character_set Loading Loading
mysql-test/r/ctype_ucs.result +8 −0 Original line number Diff line number Diff line Loading @@ -811,6 +811,14 @@ quote(name) ???????? ???????????????? drop table bug20536; set names ucs2; ERROR 42000: Variable 'character_set_client' can't be set to the value of 'ucs2' set names ucs2 collate ucs2_bin; ERROR 42000: Variable 'character_set_client' can't be set to the value of 'ucs2' set character_set_client= ucs2; ERROR 42000: Variable 'character_set_client' can't be set to the value of 'ucs2' set character_set_client= concat('ucs', substr('2', 1)); ERROR 42000: Variable 'character_set_client' can't be set to the value of 'ucs2' End of 4.1 tests CREATE TABLE t1 (a varchar(64) character set ucs2, b decimal(10,3)); INSERT INTO t1 VALUES ("1.1", 0), ("2.1", 0); Loading
mysql-test/t/ctype_ucs.test +12 −0 Original line number Diff line number Diff line Loading @@ -547,6 +547,18 @@ select quote(name) from bug20536; drop table bug20536; # # Bug #31615: crash after set names ucs2 collate xxx # --error 1231 set names ucs2; --error 1231 set names ucs2 collate ucs2_bin; --error 1231 set character_set_client= ucs2; --error 1231 set character_set_client= concat('ucs', substr('2', 1)); --echo End of 4.1 tests # Loading
sql/set_var.cc +22 −0 Original line number Diff line number Diff line Loading @@ -2222,6 +2222,21 @@ sys_var_character_set_filesystem::set_default(THD *thd, enum_var_type type) } bool sys_var_character_set_client::check(THD *thd, set_var *var) { if (sys_var_character_set::check(thd, var)) return 1; /* Currently, UCS-2 cannot be used as a client character set */ if (var->save_result.charset->mbminlen > 1) { my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), name, var->save_result.charset->csname); return 1; } return 0; } CHARSET_INFO ** sys_var_character_set_results::ci_ptr(THD *thd, enum_var_type type) { Loading Loading @@ -2561,6 +2576,13 @@ bool sys_var_key_cache_long::update(THD *thd, set_var *var) int set_var_collation_client::check(THD *thd) { /* Currently, UCS-2 cannot be used as a client character set */ if (character_set_client->mbminlen > 1) { my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), "character_set_client", character_set_client->csname); return 1; } return 0; } Loading
sql/set_var.h +1 −0 Original line number Diff line number Diff line Loading @@ -613,6 +613,7 @@ class sys_var_character_set_client :public sys_var_character_set sys_var_character_set(name_arg) {} void set_default(THD *thd, enum_var_type type); CHARSET_INFO **ci_ptr(THD *thd, enum_var_type type); bool check(THD *thd, set_var *var); }; class sys_var_character_set_results :public sys_var_character_set Loading