Commit 7913527e authored by unknown's avatar unknown

Bug#18004 Connecting crashes server when default charset is UCS2

table.cc:
  Fixing to use system_charset_info instead of default_charset_info.
  Crash happened because the "ctype" array is empty in UCS2,
  and thus cannot be used with my_isspace().
  The reason why UCS2 appeared in this context was because of
  of default_charset_info variable incorrectly substituted to my_isspace().
  As functions check_db_name(), check_table_name() and check_column_name()
  always get values in utf8, system_charset_info must be used instead.
ctype_ucs2_def.test, ctype_ucs2_def-master.opt, ctype_ucs2_def.result:
  new file


sql/table.cc:
  Bug#18004 Connecting crashes server when default charset is UCS2
  Use of default_charset_info was wrong.
  Functions check_db_name, check_table_name and check_column_name
  get values of system_charset_info character set (utf8).
parent 367442f7
show variables like "%character_set_ser%";
Variable_name Value
character_set_server ucs2
DROP TABLE IF EXISTS t1;
create table t1 (a int);
drop table t1;
--default-character-set=ucs2 --default-collation=ucs2_unicode_ci
#
# Bug#18004 Connecting crashes server when default charset is UCS2
#
show variables like "%character_set_ser%";
--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings
create table t1 (a int);
drop table t1;
...@@ -1423,7 +1423,7 @@ bool check_db_name(char *name) ...@@ -1423,7 +1423,7 @@ bool check_db_name(char *name)
while (*name) while (*name)
{ {
#if defined(USE_MB) && defined(USE_MB_IDENT) #if defined(USE_MB) && defined(USE_MB_IDENT)
last_char_is_space= my_isspace(default_charset_info, *name); last_char_is_space= my_isspace(system_charset_info, *name);
if (use_mb(system_charset_info)) if (use_mb(system_charset_info))
{ {
int len=my_ismbchar(system_charset_info, name, int len=my_ismbchar(system_charset_info, name,
...@@ -1469,7 +1469,7 @@ bool check_table_name(const char *name, uint length) ...@@ -1469,7 +1469,7 @@ bool check_table_name(const char *name, uint length)
while (name != end) while (name != end)
{ {
#if defined(USE_MB) && defined(USE_MB_IDENT) #if defined(USE_MB) && defined(USE_MB_IDENT)
last_char_is_space= my_isspace(default_charset_info, *name); last_char_is_space= my_isspace(system_charset_info, *name);
if (use_mb(system_charset_info)) if (use_mb(system_charset_info))
{ {
int len=my_ismbchar(system_charset_info, name, end); int len=my_ismbchar(system_charset_info, name, end);
...@@ -1500,7 +1500,7 @@ bool check_column_name(const char *name) ...@@ -1500,7 +1500,7 @@ bool check_column_name(const char *name)
while (*name) while (*name)
{ {
#if defined(USE_MB) && defined(USE_MB_IDENT) #if defined(USE_MB) && defined(USE_MB_IDENT)
last_char_is_space= my_isspace(default_charset_info, *name); last_char_is_space= my_isspace(system_charset_info, *name);
if (use_mb(system_charset_info)) if (use_mb(system_charset_info))
{ {
int len=my_ismbchar(system_charset_info, name, int len=my_ismbchar(system_charset_info, name,
......
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