diff --git a/sql/handler.cc b/sql/handler.cc index b66e616dfda..1d21d499dde 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -6926,28 +6926,45 @@ bool Vers_parse_info::check_and_fix_alter(THD *thd, Alter_info *alter_info, } bool Vers_parse_info::fix_create_like(THD *thd, Alter_info *alter_info, - HA_CREATE_INFO *create_info) + HA_CREATE_INFO *create_info, TABLE_LIST *table) { List_iterator it(alter_info->create_list); - Create_field *f= NULL; + Create_field *f, *f_start=NULL, *f_end= NULL; DBUG_ASSERT(alter_info->create_list.elements > 2); - for (uint i= 0; i < alter_info->create_list.elements - 1; ++i) - f= it++; - DBUG_ASSERT(f->flags & VERS_SYS_START_FLAG); - if (create_string(thd->mem_root, &generated_as_row.start, f->field_name) || - create_string(thd->mem_root, &period_for_system_time.start, - f->field_name)) - return true; + while ((f= it++)) + { + if (f->flags & VERS_SYS_START_FLAG) + { + f_start= f; + if (f_end) + break; + } + else if (f->flags & VERS_SYS_END_FLAG) + { + f_end= f; + if (f_start) + break; + } + } - f= it++; - DBUG_ASSERT(f->flags & VERS_SYS_END_FLAG); - if (create_string(thd->mem_root, &generated_as_row.end, f->field_name) || - create_string(thd->mem_root, &period_for_system_time.end, f->field_name)) + if (!f_start || !f_end) + { + my_error(ER_VERS_WRONG_PARAMS, MYF(0), table->table_name, + "Missed one of system versioning fields from source"); return true; + } + + if (create_string(thd->mem_root, &generated_as_row.start, f_start->field_name) || + create_string(thd->mem_root, &period_for_system_time.start, f_start->field_name) || + create_string(thd->mem_root, &generated_as_row.end, f_end->field_name) || + create_string(thd->mem_root, &period_for_system_time.end, f_end->field_name)) + { + sql_print_error("Failed to allocate memory for Vers_parse_info::fix_create_like()"); + return true; + } create_info->options|= HA_VERSIONED_TABLE; - return false; } diff --git a/sql/handler.h b/sql/handler.h index 76d6bae734f..c46ee422565 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -1728,7 +1728,7 @@ public: bool check_and_fix_alter(THD *thd, Alter_info *alter_info, HA_CREATE_INFO *create_info, TABLE_SHARE *share); bool fix_create_like(THD *thd, Alter_info *alter_info, - HA_CREATE_INFO *create_info); + HA_CREATE_INFO *create_info, TABLE_LIST *table); /** User has added 'WITH SYSTEM VERSIONING' to table definition */ bool declared_with_system_versioning : 1; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 268c8bd7ac2..bbfe78ac4b2 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -5459,7 +5459,7 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table, if (src_table->table->versioned() && local_create_info.vers_info.fix_create_like(thd, &local_alter_info, - &local_create_info)) + &local_create_info, src_table)) { goto err; }