Commit ffde32d2 authored by ramil/ram@mysql.com/ramil.myoffice.izhnet.ru's avatar ramil/ram@mysql.com/ramil.myoffice.izhnet.ru
Browse files

Fix for bug#31615: crash after set names ucs2 collate xxx

Problem: currently, UCS-2 cannot be used as a client character set.

Fix: raise an error if one attempts to set it to USC-2.
parent 18250925
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -803,4 +803,12 @@ 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
+12 −0
Original line number Diff line number Diff line
@@ -535,4 +535,16 @@ 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
+22 −0
Original line number Diff line number Diff line
@@ -1992,6 +1992,21 @@ void sys_var_character_set_client::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)
{
@@ -2355,6 +2370,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;
}

+1 −0
Original line number Diff line number Diff line
@@ -578,6 +578,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