mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
A lot of fixes to make character set work ok, first step to fixing BUG#48163
This commit is contained in:
@ -1583,7 +1583,9 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags)
|
||||
{
|
||||
if (!(part_syntax_buf= generate_partition_syntax(part_info,
|
||||
&syntax_len,
|
||||
TRUE, TRUE)))
|
||||
TRUE, TRUE,
|
||||
lpt->create_info,
|
||||
lpt->alter_info)))
|
||||
{
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
@ -1675,7 +1677,9 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags)
|
||||
char *tmp_part_syntax_str;
|
||||
if (!(part_syntax_buf= generate_partition_syntax(part_info,
|
||||
&syntax_len,
|
||||
TRUE, TRUE)))
|
||||
TRUE, TRUE,
|
||||
lpt->create_info,
|
||||
lpt->alter_info)))
|
||||
{
|
||||
error= 1;
|
||||
goto err;
|
||||
@ -2494,6 +2498,39 @@ int prepare_create_field(Create_field *sql_field,
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Get character set from field object generated by parser using
|
||||
default values when not set.
|
||||
|
||||
SYNOPSIS
|
||||
get_sql_field_charset()
|
||||
sql_field The sql_field object
|
||||
create_info Info generated by parser
|
||||
|
||||
RETURN VALUES
|
||||
cs Character set
|
||||
*/
|
||||
|
||||
CHARSET_INFO* get_sql_field_charset(Create_field *sql_field,
|
||||
HA_CREATE_INFO *create_info)
|
||||
{
|
||||
CHARSET_INFO *cs= sql_field->charset;
|
||||
|
||||
if (!cs)
|
||||
cs= create_info->default_table_charset;
|
||||
/*
|
||||
table_charset is set only in ALTER TABLE t1 CONVERT TO CHARACTER SET csname
|
||||
if we want change character set for all varchar/char columns.
|
||||
But the table charset must not affect the BLOB fields, so don't
|
||||
allow to change my_charset_bin to somethig else.
|
||||
*/
|
||||
if (create_info->table_charset && cs != &my_charset_bin)
|
||||
cs= create_info->table_charset;
|
||||
return cs;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Preparation for table creation
|
||||
|
||||
@ -2557,18 +2594,8 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
|
||||
executing a prepared statement for the second time.
|
||||
*/
|
||||
sql_field->length= sql_field->char_length;
|
||||
if (!sql_field->charset)
|
||||
sql_field->charset= create_info->default_table_charset;
|
||||
/*
|
||||
table_charset is set in ALTER TABLE if we want change character set
|
||||
for all varchar/char columns.
|
||||
But the table charset must not affect the BLOB fields, so don't
|
||||
allow to change my_charset_bin to somethig else.
|
||||
*/
|
||||
if (create_info->table_charset && sql_field->charset != &my_charset_bin)
|
||||
sql_field->charset= create_info->table_charset;
|
||||
|
||||
save_cs= sql_field->charset;
|
||||
save_cs= sql_field->charset= get_sql_field_charset(sql_field,
|
||||
create_info);
|
||||
if ((sql_field->flags & BINCMP_FLAG) &&
|
||||
!(sql_field->charset= get_charset_by_csname(sql_field->charset->csname,
|
||||
MY_CS_BINSORT,MYF(0))))
|
||||
@ -3617,6 +3644,9 @@ bool mysql_create_table_no_lock(THD *thd,
|
||||
}
|
||||
if (check_engine(thd, table_name, create_info))
|
||||
DBUG_RETURN(TRUE);
|
||||
|
||||
set_table_default_charset(thd, create_info, (char*) db);
|
||||
|
||||
db_options= create_info->table_options;
|
||||
if (create_info->row_type == ROW_TYPE_DYNAMIC)
|
||||
db_options|=HA_OPTION_PACK_RECORD;
|
||||
@ -3720,7 +3750,9 @@ bool mysql_create_table_no_lock(THD *thd,
|
||||
*/
|
||||
if (!(part_syntax_buf= generate_partition_syntax(part_info,
|
||||
&syntax_len,
|
||||
TRUE, TRUE)))
|
||||
TRUE, TRUE,
|
||||
create_info,
|
||||
alter_info)))
|
||||
goto err;
|
||||
part_info->part_info_string= part_syntax_buf;
|
||||
part_info->part_info_len= syntax_len;
|
||||
@ -3787,8 +3819,6 @@ bool mysql_create_table_no_lock(THD *thd,
|
||||
}
|
||||
#endif
|
||||
|
||||
set_table_default_charset(thd, create_info, (char*) db);
|
||||
|
||||
if (mysql_prepare_create_table(thd, create_info, alter_info,
|
||||
internal_tmp_table,
|
||||
&db_options, file,
|
||||
|
Reference in New Issue
Block a user