mariadb/mysql-test/suite/versioning/t/replace.test
Aleksey Midenkov 78c192644c MDEV-35343 unexpected replace behaviour when long unique index on
system versioned table

For versioned table REPLACE first tries to insert a row, if it gets
duplicate key error and optimization is possible it does UPDATE +
INSERT history. If optimization is not possible it goes normal branch
for UPDATE to history and repeats the cycle of INSERT.

The failure was in normal branch when we tried UPDATE to history but
such history already exists from previous cycles. There is no such
failures in optimized branch because vers_insert_history_row() already
ignores duplicates.

The fix ignores duplicate errors for UPDATE to history and does DELETE
instead.
2025-01-14 18:56:13 +03:00

123 lines
3.6 KiB
Text

--source suite/versioning/key_type.inc
if ($MTR_COMBINATION_SEC)
{
--skip pk or unique only
}
--source suite/versioning/common.inc
--source suite/versioning/engines.inc
--replace_result $sys_datatype_expl SYS_DATATYPE "$KEY_TYPE" KEY_TYPE
eval create or replace table t(
id int,
$KEY_TYPE(id),
x int,
row_start $sys_datatype_expl as row start invisible,
row_end $sys_datatype_expl as row end invisible,
period for system_time(row_start, row_end)
) with system versioning;
insert t values (1, 2);
replace t values (1, 3);
select *, current_row(row_end) as current from t for system_time all order by x;
drop table t;
--replace_result $sys_datatype_expl SYS_DATATYPE
eval create table t (
id int unique,
x int,
row_start $sys_datatype_expl as row start invisible,
row_end $sys_datatype_expl as row end invisible,
period for system_time (row_start, row_end)
) with system versioning;
insert t values (1, 2);
replace t values (1, 3);
select *, current_row(row_end) as current from t for system_time all order by x;
drop table t;
--echo #
--echo # MDEV-15645 Assertion `table->insert_values' failed in write_record upon REPLACE into a view with underlying versioned table
--echo #
create or replace table t1 (a int, b int, primary key (a), unique(b)) with system versioning;
insert into t1 values (1,1);
create or replace table t2 (c int);
create or replace view v as select t1.* from t1 join t2;
replace into v (a, b) select a, b from t1;
drop view v;
drop tables t1, t2;
--replace_result $sys_datatype_expl SYS_DATATYPE
eval CREATE TABLE t1 (
pk INT AUTO_INCREMENT,
f INT,
row_start $sys_datatype_expl AS ROW START INVISIBLE,
row_end $sys_datatype_expl AS ROW END INVISIBLE,
PRIMARY KEY(pk),
UNIQUE(f),
PERIOD FOR SYSTEM_TIME(row_start, row_end)
) WITH SYSTEM VERSIONING;
INSERT INTO t1 () VALUES (),(),(),(),(),();
UPDATE IGNORE t1 SET f = 1;
REPLACE t1 SELECT * FROM t1;
DROP TABLE t1;
--echo #
--echo # MDEV-22540 ER_DUP_ENTRY upon REPLACE or Assertion failed
--echo #
set timestamp=1589245268.41934;
create table t1 (a int primary key) with system versioning;
insert into t1 values (1),(2);
--connect (con1,localhost,root,,test)
set timestamp=1589245268.52093;
replace into t1 values (1),(2);
--connection default
replace into t1 values (1),(2);
--connection con1
--error ER_DUP_ENTRY
replace into t1 values (1),(2);
drop table t1;
--echo #
--echo # MDEV-15330 Server crash or assertion `table->insert_values' failure in write_record upon LOAD DATA
--echo #
if ($default_engine == MEMORY)
{
--disable_query_log
set default_storage_engine= myisam;
--enable_query_log
}
create table t1 (a int, b int, c int, vc int as (c), unique(a), unique(b)) with system versioning;
insert ignore into t1 (a,b,c) values (1,2,3);
--disable_cursor_protocol
--disable_ps2_protocol
select a, b, c into outfile '15330.data' from t1;
--enable_ps2_protocol
--enable_cursor_protocol
load data infile '15330.data' ignore into table t1 (a,b,c);
load data infile '15330.data' replace into table t1 (a,b,c);
--let $datadir=`select @@datadir`
--remove_file $datadir/test/15330.data
# cleanup
drop table t1;
--disable_query_log
eval set default_storage_engine= $default_engine;
--enable_query_log
--echo #
--echo # MDEV-35343 unexpected replace behaviour when long unique index on system versioned table
--echo #
create table t1 (data char(10));
insert into t1 values ('o');
alter ignore table t1 add unique index (data);
alter ignore table t1 add unique index (data);
alter table t1 add system versioning;
replace into t1 values ('o'), ('o');
drop table t1;
--source suite/versioning/common_finish.inc