Commit 01b2e773 authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-15937 Assertion failure 'key->flags & 1' on ALTER TABLE

While the test case crashes a MariaDB 10.2 debug build only,
let us apply the fix to the earliest applicable MariaDB series (10.0)
to avoid any data corruption on a table-rebuilding ALTER TABLE
using ALGORITHM=INPLACE.

innobase_create_key_defs(): Use altered_table->s->primary_key
when a new primary key is being created.
parent f2433b8d
......@@ -51,3 +51,7 @@ WHERE NAME='test/t';
TABLE_ID NAME FLAG N_COLS SPACE FILE_FORMAT ROW_FORMAT ZIP_PAGE_SIZE
# test/t 1 6 # Antelope Compact 0
DROP TABLE t;
CREATE TABLE t1(c1 INT) ENGINE=InnoDB;
ALTER TABLE t1 ADD CONSTRAINT UNIQUE KEY i1(c1);
ALTER TABLE t1 CHANGE c1 c1 INT NOT NULL,ADD KEY(c1);
DROP TABLE t1;
......@@ -71,6 +71,11 @@ WHERE NAME='test/t';
DROP TABLE t;
CREATE TABLE t1(c1 INT) ENGINE=InnoDB;
ALTER TABLE t1 ADD CONSTRAINT UNIQUE KEY i1(c1);
ALTER TABLE t1 CHANGE c1 c1 INT NOT NULL,ADD KEY(c1);
DROP TABLE t1;
# Check that all connections opened by test cases in this file are really
# gone so execution of other tests won't be affected by their presence.
--source include/wait_until_count_sessions.inc
......@@ -1594,6 +1594,7 @@ innobase_create_index_def(
if (key_clustered) {
DBUG_ASSERT(!(key->flags & HA_FULLTEXT));
DBUG_ASSERT(key->flags & HA_NOSAME);
index->ind_type |= DICT_CLUSTERED;
} else if (key->flags & HA_FULLTEXT) {
DBUG_ASSERT(!(key->flags & HA_KEYFLAG_MASK
......@@ -1909,14 +1910,9 @@ innobase_create_key_defs(
ulint primary_key_number;
if (new_primary) {
if (n_add == 0) {
DBUG_ASSERT(got_default_clust);
DBUG_ASSERT(altered_table->s->primary_key
== 0);
primary_key_number = 0;
} else {
primary_key_number = *add;
}
DBUG_ASSERT(n_add || got_default_clust);
DBUG_ASSERT(n_add || !altered_table->s->primary_key);
primary_key_number = altered_table->s->primary_key;
} else if (got_default_clust) {
/* Create the GEN_CLUST_INDEX */
index_def_t* index = indexdef++;
......
......@@ -1595,6 +1595,7 @@ innobase_create_index_def(
if (key_clustered) {
DBUG_ASSERT(!(key->flags & HA_FULLTEXT));
DBUG_ASSERT(key->flags & HA_NOSAME);
index->ind_type |= DICT_CLUSTERED;
} else if (key->flags & HA_FULLTEXT) {
DBUG_ASSERT(!(key->flags & HA_KEYFLAG_MASK
......@@ -1910,14 +1911,9 @@ innobase_create_key_defs(
ulint primary_key_number;
if (new_primary) {
if (n_add == 0) {
DBUG_ASSERT(got_default_clust);
DBUG_ASSERT(altered_table->s->primary_key
== 0);
primary_key_number = 0;
} else {
primary_key_number = *add;
}
DBUG_ASSERT(n_add || got_default_clust);
DBUG_ASSERT(n_add || !altered_table->s->primary_key);
primary_key_number = altered_table->s->primary_key;
} else if (got_default_clust) {
/* Create the GEN_CLUST_INDEX */
index_def_t* index = indexdef++;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment