diff --git a/sql/set_var.cc b/sql/set_var.cc index f1a36ae0292..eb44dd1dbcb 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -1280,9 +1280,15 @@ bool sys_var_character_set::check(THD *thd, set_var *var) String str(buff,sizeof(buff), system_charset_info), *res; if (!(res=var->value->val_str(&str))) - res= &empty_string; - - if (!(tmp=get_charset_by_csname(res->c_ptr(),MY_CS_PRIMARY,MYF(0))) && + { + if (!nullable) + { + my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), "NULL"); + return 1; + } + tmp= NULL; + } + else if (!(tmp=get_charset_by_csname(res->c_ptr(),MY_CS_PRIMARY,MYF(0))) && !(tmp=get_old_charset_by_name(res->c_ptr()))) { my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), res->c_ptr()); diff --git a/sql/set_var.h b/sql/set_var.h index 785f7f7e4f8..d016c3a7085 100644 --- a/sql/set_var.h +++ b/sql/set_var.h @@ -433,7 +433,9 @@ SHOW_TYPE type() { return SHOW_CHAR; } class sys_var_character_set :public sys_var_thd { public: - sys_var_character_set(const char *name_arg) :sys_var_thd(name_arg) {} + bool nullable; + sys_var_character_set(const char *name_arg) :sys_var_thd(name_arg) + { nullable= 0; } bool check(THD *thd, set_var *var); SHOW_TYPE type() { return SHOW_CHAR; } bool check_update_type(Item_result type) @@ -460,7 +462,8 @@ class sys_var_character_set_results :public sys_var_character_set { public: sys_var_character_set_results(const char *name_arg) : - sys_var_character_set(name_arg) {} + sys_var_character_set(name_arg) + { nullable= 1; } void set_default(THD *thd, enum_var_type type); CHARSET_INFO **ci_ptr(THD *thd, enum_var_type type); };