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:
parent
da71c1bad7
commit
908676dfd9
@ -2164,3 +2164,64 @@ t1 CREATE TABLE `t1` (
|
|||||||
`b` int(11) DEFAULT NULL
|
`b` int(11) DEFAULT NULL
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# MDEV-15308
|
||||||
|
# Assertion `ha_alter_info->alter_info->drop_list.elements > 0' failed
|
||||||
|
# in ha_innodb::prepare_inplace_alter_table
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a INT, b INT) ENGINE=InnoDB;
|
||||||
|
ALTER TABLE t1 DROP FOREIGN KEY IF EXISTS fk, DROP COLUMN b;
|
||||||
|
Warnings:
|
||||||
|
Note 1091 Can't DROP 'fk'; check that column/key exists
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` int(11) DEFAULT NULL
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a INT, b INT) ENGINE=InnoDB;
|
||||||
|
ALTER TABLE t1 DROP INDEX IF EXISTS fk, DROP COLUMN b;
|
||||||
|
Warnings:
|
||||||
|
Note 1091 Can't DROP 'fk'; check that column/key exists
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` int(11) DEFAULT NULL
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a INT, b INT, c INT, KEY(c)) ENGINE=InnoDB;
|
||||||
|
ALTER TABLE t1 DROP FOREIGN KEY IF EXISTS fk, DROP COLUMN c;
|
||||||
|
Warnings:
|
||||||
|
Note 1091 Can't DROP 'fk'; check that column/key exists
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` int(11) DEFAULT NULL,
|
||||||
|
`b` int(11) DEFAULT NULL
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a INT, b INT, c INT, KEY c1(c)) ENGINE=InnoDB;
|
||||||
|
ALTER TABLE t1 DROP FOREIGN KEY IF EXISTS fk, DROP INDEX c1;
|
||||||
|
Warnings:
|
||||||
|
Note 1091 Can't DROP 'fk'; check that column/key exists
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` int(11) DEFAULT NULL,
|
||||||
|
`b` int(11) DEFAULT NULL,
|
||||||
|
`c` int(11) DEFAULT NULL
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a INT, b INT) ENGINE=InnoDB;
|
||||||
|
ALTER TABLE t1 DROP INDEX IF EXISTS fk, DROP COLUMN IF EXISTS c;
|
||||||
|
Warnings:
|
||||||
|
Note 1091 Can't DROP 'fk'; check that column/key exists
|
||||||
|
Note 1091 Can't DROP 'c'; check that column/key exists
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` int(11) DEFAULT NULL,
|
||||||
|
`b` int(11) DEFAULT NULL
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t1;
|
||||||
|
@ -1809,3 +1809,35 @@ SHOW CREATE TABLE t1;
|
|||||||
ALTER TABLE t1 CONVERT TO CHARACTER SET utf8;
|
ALTER TABLE t1 CONVERT TO CHARACTER SET utf8;
|
||||||
SHOW CREATE TABLE t1;
|
SHOW CREATE TABLE t1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-15308
|
||||||
|
--echo # Assertion `ha_alter_info->alter_info->drop_list.elements > 0' failed
|
||||||
|
--echo # in ha_innodb::prepare_inplace_alter_table
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a INT, b INT) ENGINE=InnoDB;
|
||||||
|
ALTER TABLE t1 DROP FOREIGN KEY IF EXISTS fk, DROP COLUMN b;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a INT, b INT) ENGINE=InnoDB;
|
||||||
|
ALTER TABLE t1 DROP INDEX IF EXISTS fk, DROP COLUMN b;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a INT, b INT, c INT, KEY(c)) ENGINE=InnoDB;
|
||||||
|
ALTER TABLE t1 DROP FOREIGN KEY IF EXISTS fk, DROP COLUMN c;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a INT, b INT, c INT, KEY c1(c)) ENGINE=InnoDB;
|
||||||
|
ALTER TABLE t1 DROP FOREIGN KEY IF EXISTS fk, DROP INDEX c1;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a INT, b INT) ENGINE=InnoDB;
|
||||||
|
ALTER TABLE t1 DROP INDEX IF EXISTS fk, DROP COLUMN IF EXISTS c;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
@ -5808,10 +5808,28 @@ drop_create_field:
|
|||||||
List_iterator<Alter_drop> drop_it(alter_info->drop_list);
|
List_iterator<Alter_drop> drop_it(alter_info->drop_list);
|
||||||
Alter_drop *drop;
|
Alter_drop *drop;
|
||||||
bool remove_drop;
|
bool remove_drop;
|
||||||
|
ulonglong left_flags= 0;
|
||||||
while ((drop= drop_it++))
|
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)
|
if (!drop->drop_if_exists)
|
||||||
|
{
|
||||||
|
left_flags|= cur_flag;
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
remove_drop= TRUE;
|
remove_drop= TRUE;
|
||||||
if (drop->type == Alter_drop::COLUMN)
|
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),
|
ER_CANT_DROP_FIELD_OR_KEY, ER(ER_CANT_DROP_FIELD_OR_KEY),
|
||||||
drop->name);
|
drop->name);
|
||||||
drop_it.remove();
|
drop_it.remove();
|
||||||
if (alter_info->drop_list.is_empty())
|
}
|
||||||
|
else
|
||||||
|
left_flags|= cur_flag;
|
||||||
|
}
|
||||||
|
/* Reset state to what's left in drop list */
|
||||||
alter_info->flags&= ~(Alter_info::ALTER_DROP_COLUMN |
|
alter_info->flags&= ~(Alter_info::ALTER_DROP_COLUMN |
|
||||||
Alter_info::ALTER_DROP_INDEX |
|
Alter_info::ALTER_DROP_INDEX |
|
||||||
Alter_info::DROP_FOREIGN_KEY);
|
Alter_info::DROP_FOREIGN_KEY);
|
||||||
}
|
alter_info->flags|= left_flags;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ALTER TABLE ADD KEY IF NOT EXISTS */
|
/* ALTER TABLE ADD KEY IF NOT EXISTS */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user