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

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.
This commit is contained in:
Marko Mäkelä
2018-04-20 10:35:22 +03:00
parent f2433b8dd3
commit 01b2e773ef
4 changed files with 17 additions and 16 deletions

View File

@ -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;

View File

@ -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

View File

@ -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++;

View File

@ -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++;