Commit 1b45e05c authored by Aleksey Midenkov's avatar Aleksey Midenkov

MDEV-21555 Assertion secondary index is out of sync on delete from versioned 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.
parent dc3a350d
...@@ -443,3 +443,16 @@ pk f1 f2 left(f3, 4) check_row_ts(row_start, row_end) ...@@ -443,3 +443,16 @@ pk f1 f2 left(f3, 4) check_row_ts(row_start, row_end)
1 8 8 SHOR HISTORICAL ROW 1 8 8 SHOR HISTORICAL ROW
2 8 8 LONG HISTORICAL ROW 2 8 8 LONG HISTORICAL ROW
drop table t1; 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;
...@@ -476,4 +476,22 @@ select pk, f1, f2, left(f3, 4), check_row_ts(row_start, row_end) from t1 for sys ...@@ -476,4 +476,22 @@ select pk, f1, f2, left(f3, 4), check_row_ts(row_start, row_end) from t1 for sys
# cleanup # cleanup
drop table t1; 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 --source suite/versioning/common_finish.inc
...@@ -1666,23 +1666,6 @@ row_ins_check_foreign_constraint( ...@@ -1666,23 +1666,6 @@ row_ins_check_foreign_constraint(
cmp = cmp_dtuple_rec(entry, rec, offsets); cmp = cmp_dtuple_rec(entry, rec, offsets);
if (cmp == 0) { 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, if (rec_get_deleted_flag(rec,
rec_offs_comp(offsets))) { rec_offs_comp(offsets))) {
/* In delete-marked records, DB_TRX_ID must /* In delete-marked records, DB_TRX_ID must
...@@ -1704,6 +1687,23 @@ row_ins_check_foreign_constraint( ...@@ -1704,6 +1687,23 @@ row_ins_check_foreign_constraint(
goto end_scan; goto end_scan;
} }
} else { } 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 /* Found a matching record. Lock only
a record because we can allow inserts a record because we can allow inserts
into gaps */ into gaps */
......
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