diff --git a/mysql-test/suite/innodb/r/instant_alter_index_rename.result b/mysql-test/suite/innodb/r/instant_alter_index_rename.result index 52051eff0bd..69f7cc8df4c 100644 --- a/mysql-test/suite/innodb/r/instant_alter_index_rename.result +++ b/mysql-test/suite/innodb/r/instant_alter_index_rename.result @@ -74,7 +74,6 @@ select @a_key_returns_id = get_index_id(@table_id, 'a_key_returns'), @a_key_returns_id = get_index_id(@table_id, 'a_key_returns') @b_key_id = get_index_id(@table_id, 'b_key') @c_key_id = get_index_id(@table_id, 'c_key2') @primary_id = get_index_id(@table_id, 'primary') 1 1 1 1 drop table t; -drop function get_index_id; create table errors ( a int, unique key a_key (a), @@ -183,3 +182,19 @@ CREATE TABLE t1 (f1 INT, f2 INT, f3 INT); ALTER TABLE t1 ADD FOREIGN KEY f (f2) REFERENCES xx(f2); ALTER TABLE t1 ADD FOREIGN KEY (f2) REFERENCES t1(f2), ADD KEY (f3), ADD KEY (f1); DROP TABLE t1; +# +# MDEV-21669 InnoDB: Table ... contains indexes inside InnoDB, which is different from the number of indexes defined in the MariaDB +# +CREATE TABLE t1 (col_int INTEGER, col_char CHAR(20), col_varchar VARCHAR(500)) ENGINE=InnoDB; +SET @table_id = (SELECT table_id FROM information_schema.innodb_sys_tables WHERE name='test/t1'); +ALTER TABLE t1 ADD KEY idx3 (col_varchar(9)), ADD KEY idX2 (col_char(9)); +SET @idx3_key_id = get_index_id(@table_id, 'iDx3'); +ALTER TABLE t1 DROP KEY iDx3, ADD KEY Idx3 (col_varchar(9)); +SELECT @idx3_key_id = get_index_id(@table_id, 'Idx3'); +@idx3_key_id = get_index_id(@table_id, 'Idx3') +1 +CHECK TABLE t1 EXTENDED ; +Table Op Msg_type Msg_text +test.t1 check status OK +DROP TABLE t1; +DROP FUNCTION get_index_id; diff --git a/mysql-test/suite/innodb/t/instant_alter_index_rename.test b/mysql-test/suite/innodb/t/instant_alter_index_rename.test index 3a608a00837..dd6cee7c860 100644 --- a/mysql-test/suite/innodb/t/instant_alter_index_rename.test +++ b/mysql-test/suite/innodb/t/instant_alter_index_rename.test @@ -73,7 +73,6 @@ select @a_key_returns_id = get_index_id(@table_id, 'a_key_returns'), @primary_id = get_index_id(@table_id, 'primary'); drop table t; -drop function get_index_id; create table errors ( a int, @@ -194,3 +193,17 @@ CREATE TABLE t1 (f1 INT, f2 INT, f3 INT); ALTER TABLE t1 ADD FOREIGN KEY f (f2) REFERENCES xx(f2); ALTER TABLE t1 ADD FOREIGN KEY (f2) REFERENCES t1(f2), ADD KEY (f3), ADD KEY (f1); DROP TABLE t1; + +--echo # +--echo # MDEV-21669 InnoDB: Table ... contains indexes inside InnoDB, which is different from the number of indexes defined in the MariaDB +--echo # +CREATE TABLE t1 (col_int INTEGER, col_char CHAR(20), col_varchar VARCHAR(500)) ENGINE=InnoDB; +SET @table_id = (SELECT table_id FROM information_schema.innodb_sys_tables WHERE name='test/t1'); +ALTER TABLE t1 ADD KEY idx3 (col_varchar(9)), ADD KEY idX2 (col_char(9)); +SET @idx3_key_id = get_index_id(@table_id, 'iDx3'); +ALTER TABLE t1 DROP KEY iDx3, ADD KEY Idx3 (col_varchar(9)); +SELECT @idx3_key_id = get_index_id(@table_id, 'Idx3'); +CHECK TABLE t1 EXTENDED ; +DROP TABLE t1; + +DROP FUNCTION get_index_id; diff --git a/sql/field.h b/sql/field.h index f07eab3a197..5fe3a9ed106 100644 --- a/sql/field.h +++ b/sql/field.h @@ -694,7 +694,7 @@ public: enum imagetype { itRAW, itMBR}; utype unireg_check; - uint32 field_length; // Length of field + const uint32 field_length; // Length of field uint32 flags; uint16 field_index; // field number in fields array uchar null_bit; // Bit used to test null bit diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 8c695988853..851a63bf05a 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -6634,7 +6634,7 @@ Compare_keys compare_keys_but_name(const KEY *table_key, const KEY *new_key, */ const Field *old_field= table->field[key_part->fieldnr - 1]; - bool is_equal= key_part->field->is_equal(*new_field); + bool is_equal= old_field->is_equal(*new_field); /* TODO: below is an InnoDB specific code which should be moved to InnoDB */ if (!is_equal) { diff --git a/sql/table.cc b/sql/table.cc index 6426cb57524..4962a002cb9 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -3759,7 +3759,7 @@ enum open_frm_error open_table_from_share(THD *thd, TABLE_SHARE *share, */ field= key_part->field=field->make_new_field(&outparam->mem_root, outparam, 0); - field->field_length= key_part->length; + const_cast(field->field_length)= key_part->length; } } if (!share->use_ext_keys)