mirror of
https://github.com/MariaDB/server.git
synced 2025-12-24 11:21:21 +03:00
Merged WL#3352 into mysql-next-mr
This commit is contained in:
@@ -1585,7 +1585,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);
|
||||
}
|
||||
@@ -1677,7 +1679,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;
|
||||
@@ -2498,6 +2502,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
|
||||
|
||||
@@ -2561,18 +2598,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))))
|
||||
@@ -3622,6 +3649,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;
|
||||
@@ -3715,7 +3745,7 @@ bool mysql_create_table_no_lock(THD *thd,
|
||||
ha_resolve_storage_engine_name(part_info->default_engine_type),
|
||||
ha_resolve_storage_engine_name(create_info->db_type)));
|
||||
if (part_info->check_partition_info(thd, &engine_type, file,
|
||||
create_info, TRUE))
|
||||
create_info, FALSE))
|
||||
goto err;
|
||||
part_info->default_engine_type= engine_type;
|
||||
|
||||
@@ -3725,7 +3755,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;
|
||||
@@ -3751,9 +3783,9 @@ bool mysql_create_table_no_lock(THD *thd,
|
||||
creates a proper .par file. The current part_info object is
|
||||
only used to create the frm-file and .par-file.
|
||||
*/
|
||||
if (part_info->use_default_no_partitions &&
|
||||
part_info->no_parts &&
|
||||
(int)part_info->no_parts !=
|
||||
if (part_info->use_default_num_partitions &&
|
||||
part_info->num_parts &&
|
||||
(int)part_info->num_parts !=
|
||||
file->get_default_no_partitions(create_info))
|
||||
{
|
||||
uint i;
|
||||
@@ -3764,13 +3796,13 @@ bool mysql_create_table_no_lock(THD *thd,
|
||||
(part_it++)->part_state= PART_TO_BE_DROPPED;
|
||||
}
|
||||
else if (part_info->is_sub_partitioned() &&
|
||||
part_info->use_default_no_subpartitions &&
|
||||
part_info->no_subparts &&
|
||||
(int)part_info->no_subparts !=
|
||||
part_info->use_default_num_subpartitions &&
|
||||
part_info->num_subparts &&
|
||||
(int)part_info->num_subparts !=
|
||||
file->get_default_no_partitions(create_info))
|
||||
{
|
||||
DBUG_ASSERT(thd->lex->sql_command != SQLCOM_CREATE_TABLE);
|
||||
part_info->no_subparts= file->get_default_no_partitions(create_info);
|
||||
part_info->num_subparts= file->get_default_no_partitions(create_info);
|
||||
}
|
||||
}
|
||||
else if (create_info->db_type != engine_type)
|
||||
@@ -3792,8 +3824,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,
|
||||
@@ -4583,11 +4613,11 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
||||
my_error(ER_PARTITION_MGMT_ON_NONPARTITIONED, MYF(0));
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
uint no_parts_found;
|
||||
uint no_parts_opt= alter_info->partition_names.elements;
|
||||
no_parts_found= set_part_state(alter_info, table->table->part_info,
|
||||
PART_ADMIN);
|
||||
if (no_parts_found != no_parts_opt &&
|
||||
uint num_parts_found;
|
||||
uint num_parts_opt= alter_info->partition_names.elements;
|
||||
num_parts_found= set_part_state(alter_info, table->table->part_info,
|
||||
PART_ADMIN);
|
||||
if (num_parts_found != num_parts_opt &&
|
||||
(!(alter_info->flags & ALTER_ALL_PARTITION)))
|
||||
{
|
||||
char buff[FN_REFLEN + MYSQL_ERRMSG_SIZE];
|
||||
|
||||
Reference in New Issue
Block a user