Merge mysql.com:/home/ram/work/mysql-5.1-maint

into  mysql.com:/home/ram/work/b31615/b31615.5.1
parents d3293988 c380020a
...@@ -811,6 +811,14 @@ quote(name) ...@@ -811,6 +811,14 @@ quote(name)
???????? ????????
???????????????? ????????????????
drop table bug20536; 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 End of 4.1 tests
CREATE TABLE t1 (a varchar(64) character set ucs2, b decimal(10,3)); CREATE TABLE t1 (a varchar(64) character set ucs2, b decimal(10,3));
INSERT INTO t1 VALUES ("1.1", 0), ("2.1", 0); INSERT INTO t1 VALUES ("1.1", 0), ("2.1", 0);
......
...@@ -547,6 +547,18 @@ select quote(name) from bug20536; ...@@ -547,6 +547,18 @@ select quote(name) from bug20536;
drop table 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 --echo End of 4.1 tests
# #
......
...@@ -164,7 +164,8 @@ static sys_var_character_set_sv sys_character_set_server(&vars, "character_set_s ...@@ -164,7 +164,8 @@ static sys_var_character_set_sv sys_character_set_server(&vars, "character_set_s
sys_var_const_str sys_charset_system(&vars, "character_set_system", sys_var_const_str sys_charset_system(&vars, "character_set_system",
(char *)my_charset_utf8_general_ci.name); (char *)my_charset_utf8_general_ci.name);
static sys_var_character_set_database sys_character_set_database(&vars, "character_set_database"); static sys_var_character_set_database sys_character_set_database(&vars, "character_set_database");
static sys_var_character_set_sv sys_character_set_client(&vars, "character_set_client", static sys_var_character_set_client sys_character_set_client(&vars,
"character_set_client",
&SV::character_set_client, &SV::character_set_client,
&default_charset_info); &default_charset_info);
static sys_var_character_set_sv sys_character_set_connection(&vars, "character_set_connection", static sys_var_character_set_sv sys_character_set_connection(&vars, "character_set_connection",
...@@ -1861,6 +1862,21 @@ CHARSET_INFO **sys_var_character_set_sv::ci_ptr(THD *thd, enum_var_type type) ...@@ -1861,6 +1862,21 @@ CHARSET_INFO **sys_var_character_set_sv::ci_ptr(THD *thd, enum_var_type type)
} }
bool sys_var_character_set_client::check(THD *thd, set_var *var)
{
if (sys_var_character_set_sv::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_database::ci_ptr(THD *thd, CHARSET_INFO ** sys_var_character_set_database::ci_ptr(THD *thd,
enum_var_type type) enum_var_type type)
{ {
...@@ -2290,6 +2306,13 @@ uchar *sys_var_log_output::value_ptr(THD *thd, enum_var_type type, ...@@ -2290,6 +2306,13 @@ uchar *sys_var_log_output::value_ptr(THD *thd, enum_var_type type,
int set_var_collation_client::check(THD *thd) 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; return 0;
} }
......
...@@ -667,6 +667,20 @@ public: ...@@ -667,6 +667,20 @@ public:
}; };
class sys_var_character_set_client: public sys_var_character_set_sv
{
public:
sys_var_character_set_client(sys_var_chain *chain, const char *name_arg,
CHARSET_INFO *SV::*offset_arg,
CHARSET_INFO **global_default_arg,
bool is_nullable= 0)
: sys_var_character_set_sv(chain, name_arg, offset_arg, global_default_arg,
is_nullable)
{ }
bool check(THD *thd, set_var *var);
};
class sys_var_character_set_database :public sys_var_character_set class sys_var_character_set_database :public sys_var_character_set
{ {
public: public:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment