diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2019-01-08 00:57:19 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2019-01-08 00:57:19 +0200 |
commit | 30da40bb8c303159747b1cf1d74411b049b6d252 (patch) | |
tree | 40e2a80d978cbf20f2b05eb9afb8ffbcd34ed4fc | |
parent | 39a8caa51c115e7750c2355374413056932665eb (diff) | |
download | mariadb-git-30da40bb8c303159747b1cf1d74411b049b6d252.tar.gz |
MDEV-18160/MDEV-18162 Assertion failure or crash after DROP COLUMN
dict_table_t::instant_column(): Correctly compute the value of
metadata_changed. The original computation in
commit 003720755f44e4a17cc5ef952ae2af85b1eb778d would essentially
invoke memcmp(x,x,y), which can only return 0.
-rw-r--r-- | mysql-test/suite/innodb/r/instant_alter.result | 32 | ||||
-rw-r--r-- | mysql-test/suite/innodb/t/instant_alter.test | 13 | ||||
-rw-r--r-- | storage/innobase/handler/handler0alter.cc | 9 |
3 files changed, 50 insertions, 4 deletions
diff --git a/mysql-test/suite/innodb/r/instant_alter.result b/mysql-test/suite/innodb/r/instant_alter.result index f25e1de904d..5a3d41df4e0 100644 --- a/mysql-test/suite/innodb/r/instant_alter.result +++ b/mysql-test/suite/innodb/r/instant_alter.result @@ -638,6 +638,16 @@ INSERT INTO t1 VALUES (1); ALTER TABLE t1 ADD COLUMN b INT; ALTER TABLE t1 MODIFY COLUMN a INT NULL; DROP TABLE t1; +CREATE TABLE t1 (a INT PRIMARY KEY, b INT, c INT) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; +INSERT INTO t1 SET a=1; +ALTER TABLE t1 DROP c; +ALTER TABLE t1 DROP b, ADD v INT AS (a); +DROP TABLE t1; +CREATE TABLE t1 (a INT PRIMARY KEY, b INT, c INT, d INT) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; +INSERT INTO t1 SET a=1; +ALTER TABLE t1 DROP c; +ALTER TABLE t1 DROP b, ADD v INT AS (a); +DROP TABLE t1; CREATE TABLE t1 (id INT PRIMARY KEY, c2 INT UNIQUE, c3 POINT NOT NULL DEFAULT ST_GeomFromText('POINT(3 4)'), @@ -1222,6 +1232,16 @@ INSERT INTO t1 VALUES (1); ALTER TABLE t1 ADD COLUMN b INT; ALTER TABLE t1 MODIFY COLUMN a INT NULL; DROP TABLE t1; +CREATE TABLE t1 (a INT PRIMARY KEY, b INT, c INT) ENGINE=InnoDB ROW_FORMAT=COMPACT; +INSERT INTO t1 SET a=1; +ALTER TABLE t1 DROP c; +ALTER TABLE t1 DROP b, ADD v INT AS (a); +DROP TABLE t1; +CREATE TABLE t1 (a INT PRIMARY KEY, b INT, c INT, d INT) ENGINE=InnoDB ROW_FORMAT=COMPACT; +INSERT INTO t1 SET a=1; +ALTER TABLE t1 DROP c; +ALTER TABLE t1 DROP b, ADD v INT AS (a); +DROP TABLE t1; CREATE TABLE t1 (id INT PRIMARY KEY, c2 INT UNIQUE, c3 POINT NOT NULL DEFAULT ST_GeomFromText('POINT(3 4)'), @@ -1806,10 +1826,20 @@ INSERT INTO t1 VALUES (1); ALTER TABLE t1 ADD COLUMN b INT; ALTER TABLE t1 MODIFY COLUMN a INT NULL; DROP TABLE t1; +CREATE TABLE t1 (a INT PRIMARY KEY, b INT, c INT) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; +INSERT INTO t1 SET a=1; +ALTER TABLE t1 DROP c; +ALTER TABLE t1 DROP b, ADD v INT AS (a); +DROP TABLE t1; +CREATE TABLE t1 (a INT PRIMARY KEY, b INT, c INT, d INT) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; +INSERT INTO t1 SET a=1; +ALTER TABLE t1 DROP c; +ALTER TABLE t1 DROP b, ADD v INT AS (a); +DROP TABLE t1; disconnect analyze; SELECT variable_value-@old_instant instants FROM information_schema.global_status WHERE variable_name = 'innodb_instant_alter_column'; instants -131 +143 SET GLOBAL innodb_purge_rseg_truncate_frequency= @saved_frequency; diff --git a/mysql-test/suite/innodb/t/instant_alter.test b/mysql-test/suite/innodb/t/instant_alter.test index 273c9540606..b008008fff3 100644 --- a/mysql-test/suite/innodb/t/instant_alter.test +++ b/mysql-test/suite/innodb/t/instant_alter.test @@ -522,6 +522,19 @@ ALTER TABLE t1 ADD COLUMN b INT; ALTER TABLE t1 MODIFY COLUMN a INT NULL; DROP TABLE t1; +# MDEV-18160/MDEV-18162 Failing assertion on ALTER +eval CREATE TABLE t1 (a INT PRIMARY KEY, b INT, c INT) $engine; +INSERT INTO t1 SET a=1; +ALTER TABLE t1 DROP c; +ALTER TABLE t1 DROP b, ADD v INT AS (a); +DROP TABLE t1; + +eval CREATE TABLE t1 (a INT PRIMARY KEY, b INT, c INT, d INT) $engine; +INSERT INTO t1 SET a=1; +ALTER TABLE t1 DROP c; +ALTER TABLE t1 DROP b, ADD v INT AS (a); +DROP TABLE t1; + dec $format; } disconnect analyze; diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index 3ceb3017ab3..a7407032f68 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -645,15 +645,18 @@ dup_dropped: * sizeof *instant->dropped); } + const field_map_element_t* field_map = old_instant + ? old_instant->field_map : NULL; + init_instant<true>(table); if (!metadata_changed) { - metadata_changed = !old_instant - || memcmp(old_instant->field_map, + metadata_changed = !field_map + || memcmp(field_map, instant->field_map, (index->n_fields - index->first_user_field()) - * sizeof *old_instant->field_map); + * sizeof *field_map); } } |