From ab503215081779f3e9ebb6cd21a65cb6efb86f26 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Tue, 18 Oct 2022 20:18:07 +0200 Subject: [PATCH] MDEV-29813 REPLACE/IGNORE does not work with historical records in InnoDB note that replace no longer supports system_versioning_insert_history, the test case is only for ignore --- mysql-test/suite/versioning/r/insert.result | 24 +++++++++++++++++++++ mysql-test/suite/versioning/t/insert.test | 23 ++++++++++++++++++++ sql/sql_delete.cc | 4 ++-- storage/innobase/row/row0ins.cc | 2 +- 4 files changed, 50 insertions(+), 3 deletions(-) diff --git a/mysql-test/suite/versioning/r/insert.result b/mysql-test/suite/versioning/r/insert.result index b429dc69ad2..442d71c6a91 100644 --- a/mysql-test/suite/versioning/r/insert.result +++ b/mysql-test/suite/versioning/r/insert.result @@ -295,3 +295,27 @@ ERROR 42000: Access denied; you need (at least one of) the SUPER, BINLOG REPLAY use test; # restart: --secure-timestamp=NO drop tables t1, t2, t3; +# +# MDEV-29813 REPLACE/IGNORE does not work with historical records in InnoDB +# +set sql_mode='STRICT_ALL_TABLES'; +create or replace table t1 (a int) with system versioning; +set system_versioning_insert_history= on; +insert into t1 (a,row_start,row_end) values (1,'2022-01-01','2023-01-01'),(1,'2022-01-01','2023-01-01'); +select a,row_start,row_end into outfile 'mdev29813.txt' from t1 for system_time all; +create or replace table t1 (a int primary key) with system versioning; +load data infile 'mdev29813.txt' ignore into table t1 (a,row_start,row_end); +Warnings: +Warning 1062 Duplicate entry '1' for key 'PRIMARY' +select a,row_start,row_end from t1 for system_time all; +a row_start row_end +1 2022-01-01 00:00:00.000000 2023-01-01 00:00:00.000000 +create or replace table t1 (a int primary key) with system versioning; +insert ignore into t1 (a,row_start,row_end) values (1,'2022-01-01','2023-01-01'),(1,'2022-01-01','2023-01-01'); +Warnings: +Warning 1062 Duplicate entry '1' for key 'PRIMARY' +select a,row_start,row_end from t1 for system_time all; +a row_start row_end +1 2022-01-01 00:00:00.000000 2023-01-01 00:00:00.000000 +drop table t1; +set sql_mode=default; diff --git a/mysql-test/suite/versioning/t/insert.test b/mysql-test/suite/versioning/t/insert.test index fcbf017cba1..e6dcd1aeac6 100644 --- a/mysql-test/suite/versioning/t/insert.test +++ b/mysql-test/suite/versioning/t/insert.test @@ -239,4 +239,27 @@ use test; drop tables t1, t2, t3; +--echo # +--echo # MDEV-29813 REPLACE/IGNORE does not work with historical records in InnoDB +--echo # +set sql_mode='STRICT_ALL_TABLES'; + +create or replace table t1 (a int) with system versioning; +set system_versioning_insert_history= on; +insert into t1 (a,row_start,row_end) values (1,'2022-01-01','2023-01-01'),(1,'2022-01-01','2023-01-01'); +select a,row_start,row_end into outfile 'mdev29813.txt' from t1 for system_time all; + +create or replace table t1 (a int primary key) with system versioning; +load data infile 'mdev29813.txt' ignore into table t1 (a,row_start,row_end); +select a,row_start,row_end from t1 for system_time all; + +create or replace table t1 (a int primary key) with system versioning; +insert ignore into t1 (a,row_start,row_end) values (1,'2022-01-01','2023-01-01'),(1,'2022-01-01','2023-01-01'); +select a,row_start,row_end from t1 for system_time all; + +--let $datadir= `select @@datadir` +--remove_file $datadir/test/mdev29813.txt +drop table t1; +set sql_mode=default; + -- source suite/versioning/common_finish.inc diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index 1f0945b1a2d..c74a5f0b92e 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -284,11 +284,11 @@ int TABLE::delete_row() vers_update_end(); int err= file->ha_update_row(record[1], record[0]); /* - MDEV-23644: we get HA_ERR_FOREIGN_DUPLICATE_KEY iff we already got history + MDEV-23644: we get HA_ERR_FOUND_DUPP_KEY iff we already got history row with same trx_id which is the result of foreign key action, so we don't need one more history row. */ - if (err == HA_ERR_FOREIGN_DUPLICATE_KEY) + if (err == HA_ERR_FOUND_DUPP_KEY) return file->ha_delete_row(record[0]); return err; } diff --git a/storage/innobase/row/row0ins.cc b/storage/innobase/row/row0ins.cc index 7f9fbe896ee..a3fe0bd6db7 100644 --- a/storage/innobase/row/row0ins.cc +++ b/storage/innobase/row/row0ins.cc @@ -2348,7 +2348,7 @@ duplicate: &trx_id_len); ut_ad(trx_id_len == DATA_TRX_ID_LEN); if (trx->id == trx_read_trx_id(trx_id)) { - err = DB_FOREIGN_DUPLICATE_KEY; + err = DB_DUPLICATE_KEY; } } goto func_exit;