diff options
Diffstat (limited to 'sql/sql_alter.cc')
-rw-r--r-- | sql/sql_alter.cc | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/sql/sql_alter.cc b/sql/sql_alter.cc index 21c79a046a5..ede30263e48 100644 --- a/sql/sql_alter.cc +++ b/sql/sql_alter.cc @@ -25,6 +25,7 @@ Alter_info::Alter_info(const Alter_info &rhs, MEM_ROOT *mem_root) :drop_list(rhs.drop_list, mem_root), alter_list(rhs.alter_list, mem_root), key_list(rhs.key_list, mem_root), + alter_rename_key_list(rhs.alter_rename_key_list, mem_root), create_list(rhs.create_list, mem_root), check_constraint_list(rhs.check_constraint_list, mem_root), flags(rhs.flags), partition_flags(rhs.partition_flags), @@ -46,6 +47,7 @@ Alter_info::Alter_info(const Alter_info &rhs, MEM_ROOT *mem_root) list_copy_and_replace_each_value(drop_list, mem_root); list_copy_and_replace_each_value(alter_list, mem_root); list_copy_and_replace_each_value(key_list, mem_root); + list_copy_and_replace_each_value(alter_rename_key_list, mem_root); list_copy_and_replace_each_value(create_list, mem_root); /* partition_names are not deeply copied currently */ } @@ -251,7 +253,8 @@ Alter_info::algorithm(const THD *thd) const Alter_table_ctx::Alter_table_ctx() - : datetime_field(NULL), error_if_not_empty(false), + : implicit_default_value_error_field(NULL), + error_if_not_empty(false), tables_opened(0), db(null_clex_str), table_name(null_clex_str), alias(null_clex_str), new_db(null_clex_str), new_name(null_clex_str), new_alias(null_clex_str), @@ -272,7 +275,7 @@ Alter_table_ctx::Alter_table_ctx(THD *thd, TABLE_LIST *table_list, uint tables_opened_arg, const LEX_CSTRING *new_db_arg, const LEX_CSTRING *new_name_arg) - : datetime_field(NULL), error_if_not_empty(false), + : implicit_default_value_error_field(NULL), error_if_not_empty(false), tables_opened(tables_opened_arg), new_db(*new_db_arg), new_name(*new_name_arg), fk_error_if_delete_row(false), fk_error_id(NULL), @@ -331,7 +334,8 @@ Alter_table_ctx::Alter_table_ctx(THD *thd, TABLE_LIST *table_list, } tmp_name.str= tmp_name_buff; - tmp_name.length= my_snprintf(tmp_name_buff, sizeof(tmp_name_buff), "%s-%lx_%llx", + tmp_name.length= my_snprintf(tmp_name_buff, sizeof(tmp_name_buff), + "%s-alter-%lx-%llx", tmp_file_prefix, current_pid, thd->thread_id); /* Safety fix for InnoDB */ if (lower_case_table_names) @@ -364,6 +368,21 @@ Alter_table_ctx::Alter_table_ctx(THD *thd, TABLE_LIST *table_list, } +void Alter_table_ctx::report_implicit_default_value_error(THD *thd, + const TABLE_SHARE *s) + const +{ + Create_field *error_field= implicit_default_value_error_field; + const Type_handler *h= error_field->type_handler(); + thd->push_warning_truncated_value_for_field(Sql_condition::WARN_LEVEL_WARN, + h->name().ptr(), + h->default_value().ptr(), + s ? s->db.str : nullptr, + s ? s->table_name.str : nullptr, + error_field->field_name.str); +} + + bool Sql_cmd_alter_table::execute(THD *thd) { LEX *lex= thd->lex; @@ -392,8 +411,9 @@ bool Sql_cmd_alter_table::execute(THD *thd) */ HA_CREATE_INFO create_info(lex->create_info); Alter_info alter_info(lex->alter_info, thd->mem_root); - ulong priv=0; - ulong priv_needed= ALTER_ACL; + create_info.alter_info= &alter_info; + privilege_t priv(NO_ACL); + privilege_t priv_needed(ALTER_ACL); bool result; DBUG_ENTER("Sql_cmd_alter_table::execute"); @@ -502,9 +522,9 @@ bool Sql_cmd_alter_table::execute(THD *thd) (!thd->is_current_stmt_binlog_format_row() || !thd->find_temporary_table(first_table))) { - WSREP_TO_ISOLATION_BEGIN_ALTER((lex->name.str ? select_lex->db.str : NULL), - (lex->name.str ? lex->name.str : NULL), - first_table, &alter_info); + WSREP_TO_ISOLATION_BEGIN_ALTER((lex->name.str ? select_lex->db.str : first_table->db.str), + (lex->name.str ? lex->name.str : first_table->table_name.str), + first_table, &alter_info, used_engine ? &create_info : NULL); thd->variables.auto_increment_offset = 1; thd->variables.auto_increment_increment = 1; @@ -517,7 +537,7 @@ bool Sql_cmd_alter_table::execute(THD *thd) &alter_info, select_lex->order_list.elements, select_lex->order_list.first, - lex->ignore); + lex->ignore, lex->if_exists()); DBUG_RETURN(result); #ifdef WITH_WSREP |