summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2019-01-08 00:57:19 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2019-01-08 00:57:19 +0200
commit30da40bb8c303159747b1cf1d74411b049b6d252 (patch)
tree40e2a80d978cbf20f2b05eb9afb8ffbcd34ed4fc
parent39a8caa51c115e7750c2355374413056932665eb (diff)
downloadmariadb-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.result32
-rw-r--r--mysql-test/suite/innodb/t/instant_alter.test13
-rw-r--r--storage/innobase/handler/handler0alter.cc9
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);
}
}