1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

MDEV-15308 Assertion `ha_alter_info->alter_info->drop_list.elements

Problem was that handle_if_exists_options() didn't correct
alter_info->flags when things was removed from the list.
This commit is contained in:
Monty
2018-05-22 23:05:01 +03:00
parent da71c1bad7
commit 908676dfd9
3 changed files with 118 additions and 4 deletions

View File

@ -5808,10 +5808,28 @@ drop_create_field:
List_iterator<Alter_drop> drop_it(alter_info->drop_list);
Alter_drop *drop;
bool remove_drop;
ulonglong left_flags= 0;
while ((drop= drop_it++))
{
ulonglong cur_flag= 0;
switch (drop->type) {
case Alter_drop::COLUMN:
cur_flag= Alter_info::ALTER_DROP_COLUMN;
break;
case Alter_drop::FOREIGN_KEY:
cur_flag= Alter_info::DROP_FOREIGN_KEY;
break;
case Alter_drop::KEY:
cur_flag= Alter_info::ALTER_DROP_INDEX;
break;
default:
break;
}
if (!drop->drop_if_exists)
{
left_flags|= cur_flag;
continue;
}
remove_drop= TRUE;
if (drop->type == Alter_drop::COLUMN)
{
@ -5887,12 +5905,15 @@ drop_create_field:
ER_CANT_DROP_FIELD_OR_KEY, ER(ER_CANT_DROP_FIELD_OR_KEY),
drop->name);
drop_it.remove();
if (alter_info->drop_list.is_empty())
alter_info->flags&= ~(Alter_info::ALTER_DROP_COLUMN |
Alter_info::ALTER_DROP_INDEX |
Alter_info::DROP_FOREIGN_KEY);
}
else
left_flags|= cur_flag;
}
/* Reset state to what's left in drop list */
alter_info->flags&= ~(Alter_info::ALTER_DROP_COLUMN |
Alter_info::ALTER_DROP_INDEX |
Alter_info::DROP_FOREIGN_KEY);
alter_info->flags|= left_flags;
}
/* ALTER TABLE ADD KEY IF NOT EXISTS */