Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions mysql-test/main/alter_table_failed_rename_index.result
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#
# Scenario A: WITH a prior failed ALTER ... RENAME INDEX
#
CREATE TABLE t1 (f1 INT, f2 INT, KEY(f1), KEY(f2)) ENGINE=InnoDB;
CREATE TABLE t2 (pk INT PRIMARY KEY, a INT, b INT, KEY ind1(a),
FOREIGN KEY fk1 (b) REFERENCES t1 (f1)) ENGINE=InnoDB;
ALTER TABLE t2 RENAME INDEX fk1 TO fk, ALGORITHM=INSTANT, ORDER BY a;
ERROR 0A000: ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=COPY
ALTER TABLE t2 ADD FOREIGN KEY ind1 (b) REFERENCES t1 (f2);
ERROR 42000: Duplicate key name 'ind1'
DROP TABLE t2, t1;
#
# Scenario B: WITHOUT a prior failed ALTER ... RENAME INDEX (baseline)
#
CREATE TABLE t1 (f1 INT, f2 INT, KEY(f1), KEY(f2)) ENGINE=InnoDB;
CREATE TABLE t2 (pk INT PRIMARY KEY, a INT, b INT, KEY ind1(a),
FOREIGN KEY fk1 (b) REFERENCES t1 (f1)) ENGINE=InnoDB;
ALTER TABLE t2 ADD FOREIGN KEY ind1 (b) REFERENCES t1 (f2);
ERROR 42000: Duplicate key name 'ind1'
DROP TABLE t2, t1;
30 changes: 30 additions & 0 deletions mysql-test/main/alter_table_failed_rename_index.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
--source include/have_innodb.inc

# MDEV-35732: Failed ALTER TABLE causes inconsistency, changes behavior of the next statement

--echo #
--echo # Scenario A: WITH a prior failed ALTER ... RENAME INDEX
--echo #
CREATE TABLE t1 (f1 INT, f2 INT, KEY(f1), KEY(f2)) ENGINE=InnoDB;
CREATE TABLE t2 (pk INT PRIMARY KEY, a INT, b INT, KEY ind1(a),
FOREIGN KEY fk1 (b) REFERENCES t1 (f1)) ENGINE=InnoDB;

--error ER_ALTER_OPERATION_NOT_SUPPORTED
ALTER TABLE t2 RENAME INDEX fk1 TO fk, ALGORITHM=INSTANT, ORDER BY a;

--error ER_DUP_KEYNAME
ALTER TABLE t2 ADD FOREIGN KEY ind1 (b) REFERENCES t1 (f2);

DROP TABLE t2, t1;

--echo #
--echo # Scenario B: WITHOUT a prior failed ALTER ... RENAME INDEX (baseline)
--echo #
CREATE TABLE t1 (f1 INT, f2 INT, KEY(f1), KEY(f2)) ENGINE=InnoDB;
CREATE TABLE t2 (pk INT PRIMARY KEY, a INT, b INT, KEY ind1(a),
FOREIGN KEY fk1 (b) REFERENCES t1 (f1)) ENGINE=InnoDB;

--error ER_DUP_KEYNAME
ALTER TABLE t2 ADD FOREIGN KEY ind1 (b) REFERENCES t1 (f2);

DROP TABLE t2, t1;
5 changes: 3 additions & 2 deletions sql/sql_table.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8941,6 +8941,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
bool long_hash_key= false;
if (key_info->flags & HA_INVISIBLE_KEY)
continue;
bool generated_key= key_info->flags & HA_GENERATED_KEY;
const char *key_name= key_info->name.str;
const bool primary_key= table->s->primary_key == i;
const bool explicit_pk= primary_key &&
Expand Down Expand Up @@ -9029,7 +9030,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
dropped by mysql_prepare_create_table() and this will confuse
code in fill_alter_inplace_info().
*/
key_info->flags&= ~HA_GENERATED_KEY;
generated_key= false;
break;
}
}
Expand Down Expand Up @@ -9229,7 +9230,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
tmp_name.length= strlen(key_name);
/* We dont need LONG_UNIQUE_HASH_FIELD flag because it will be autogenerated */
key= new (thd->mem_root) Key(key_type, &tmp_name, &key_create_info,
key_info->flags & HA_GENERATED_KEY,
generated_key,
&key_parts, key_info->option_list, DDL_options());
key->without_overlaps= key_info->without_overlaps;
key->period= table->s->period.name;
Expand Down