Skip to content

Commit

Permalink
MDEV-21555 Assertion secondary index is out of sync on delete from ve…
Browse files Browse the repository at this point in the history
…rsioned table

Delete-marked record is on the secondary index and the clustered index
already purged the corresponding record. We cannot detect if such
record is historical and we should not: the algorithm of
row_ins_check_foreign_constraint() skips such record anyway.
  • Loading branch information
midenok committed Aug 18, 2021
1 parent dc3a350 commit 1b45e05
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 17 deletions.
13 changes: 13 additions & 0 deletions mysql-test/suite/versioning/r/foreign.result
Original file line number Diff line number Diff line change
Expand Up @@ -443,3 +443,16 @@ pk f1 f2 left(f3, 4) check_row_ts(row_start, row_end)
1 8 8 SHOR HISTORICAL ROW
2 8 8 LONG HISTORICAL ROW
drop table t1;
#
# MDEV-21555 Assertion secondary index is out of sync on delete from versioned table
#
create table t1 (a int, b int as (a + 1) virtual, key(a)) engine=innodb with system versioning;
set foreign_key_checks= off;
insert into t1 (a) values (1), (2);
alter table t1 add foreign key (b) references t1 (a), algorithm=copy;
update t1 set a= null where a = 1;
delete from t1 where a is null;
set foreign_key_checks= on;
delete history from t1;
delete from t1;
drop table t1;
18 changes: 18 additions & 0 deletions mysql-test/suite/versioning/t/foreign.test
Original file line number Diff line number Diff line change
Expand Up @@ -476,4 +476,22 @@ select pk, f1, f2, left(f3, 4), check_row_ts(row_start, row_end) from t1 for sys
# cleanup
drop table t1;

--echo #
--echo # MDEV-21555 Assertion secondary index is out of sync on delete from versioned table
--echo #
create table t1 (a int, b int as (a + 1) virtual, key(a)) engine=innodb with system versioning;

set foreign_key_checks= off;
insert into t1 (a) values (1), (2);
alter table t1 add foreign key (b) references t1 (a), algorithm=copy;
update t1 set a= null where a = 1;
delete from t1 where a is null;
set foreign_key_checks= on;

delete history from t1;
delete from t1;

# cleanup
drop table t1;

--source suite/versioning/common_finish.inc
34 changes: 17 additions & 17 deletions storage/innobase/row/row0ins.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1666,23 +1666,6 @@ row_ins_check_foreign_constraint(
cmp = cmp_dtuple_rec(entry, rec, offsets);

if (cmp == 0) {
if (check_table->versioned()) {
bool history_row = false;

if (check_index->is_primary()) {
history_row = check_index->
vers_history_row(rec, offsets);
} else if (check_index->
vers_history_row(rec, history_row))
{
break;
}

if (history_row) {
continue;
}
}

if (rec_get_deleted_flag(rec,
rec_offs_comp(offsets))) {
/* In delete-marked records, DB_TRX_ID must
Expand All @@ -1704,6 +1687,23 @@ row_ins_check_foreign_constraint(
goto end_scan;
}
} else {
if (check_table->versioned()) {
bool history_row = false;

if (check_index->is_primary()) {
history_row = check_index->
vers_history_row(rec,
offsets);
} else if (check_index->
vers_history_row(rec,
history_row)) {
break;
}

if (history_row) {
continue;
}
}
/* Found a matching record. Lock only
a record because we can allow inserts
into gaps */
Expand Down

0 comments on commit 1b45e05

Please sign in to comment.