Skip to content

Commit db26bf7

Browse files
committed
MDEV-15990 versioning: don't allow changes in the past
1 parent e56f6c5 commit db26bf7

File tree

3 files changed

+55
-4
lines changed

3 files changed

+55
-4
lines changed

mysql-test/suite/versioning/r/misc.result

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,30 @@ insert into t2 (a) values (now()),(now());
5757
select * from t2 where a in (select row_start from t1);
5858
a
5959
drop table t1, t2;
60+
# MDEV-30046 wrong row targeted with "insert ... on duplicate" and "replace"
61+
# Don't allow changes from the past
62+
create or replace table t1 (pk int primary key, i int) with system versioning;
63+
show create table t1;
64+
Table Create Table
65+
t1 CREATE TABLE `t1` (
66+
`pk` int(11) NOT NULL,
67+
`i` int(11) DEFAULT NULL,
68+
PRIMARY KEY (`pk`)
69+
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
70+
set timestamp=12345;
71+
insert t1(pk, i) values(1,3);
72+
set timestamp=12344;
73+
delete from t1;
74+
select pk,i from t1 for system_time all;
75+
pk i
76+
set timestamp=12345;
77+
insert t1(pk, i) values(1,3);
78+
set timestamp=12344;
79+
replace t1(pk, i) values(1,4);
80+
select pk,i from t1 for system_time all;
81+
pk i
82+
1 4
83+
drop table t1;
6084
#
6185
# End of 10.11 tests
6286
#

mysql-test/suite/versioning/t/misc.test

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,25 @@ insert into t2 (a) values (now()),(now());
4646
select * from t2 where a in (select row_start from t1);
4747
drop table t1, t2;
4848

49+
--echo # MDEV-30046 wrong row targeted with "insert ... on duplicate" and "replace"
50+
--echo # Don't allow changes from the past
51+
create or replace table t1 (pk int primary key, i int) with system versioning;
52+
show create table t1;
53+
set timestamp=12345;
54+
insert t1(pk, i) values(1,3);
55+
set timestamp=12344;
56+
delete from t1;
57+
58+
select pk,i from t1 for system_time all;
59+
60+
set timestamp=12345;
61+
insert t1(pk, i) values(1,3);
62+
set timestamp=12344;
63+
replace t1(pk, i) values(1,4);
64+
65+
select pk,i from t1 for system_time all;
66+
drop table t1;
67+
4968
--echo #
5069
--echo # End of 10.11 tests
5170
--echo #

sql/sql_delete.cc

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,7 @@ int TABLE::delete_row(bool treat_versioned)
308308
{
309309
int err= 0;
310310
uchar *del_buf= record[replace ? 1 : 0];
311+
311312
bool delete_row= !treat_versioned
312313
|| in_use->lex->vers_conditions.delete_history
313314
|| versioned(VERS_TRX_ID)
@@ -325,7 +326,14 @@ int TABLE::delete_row(bool treat_versioned)
325326
store_record(this, record[1]);
326327
}
327328
vers_update_end();
328-
err= file->ha_update_row(record[1], record[0]);
329+
330+
Field *row_start= vers_start_field();
331+
Field *row_end= vers_end_field();
332+
// Don't make history row with negative lifetime
333+
delete_row= row_start->cmp(row_start->ptr, row_end->ptr) > 0;
334+
335+
if (likely(!delete_row))
336+
err= file->ha_update_row(record[1], record[0]);
329337
if (unlikely(err))
330338
{
331339
/*
@@ -342,11 +350,11 @@ int TABLE::delete_row(bool treat_versioned)
342350
|| err == HA_ERR_FOREIGN_DUPLICATE_KEY;
343351
if (!delete_row)
344352
return err;
345-
346-
if (!replace)
347-
del_buf= record[1];
348353
}
349354

355+
if (delete_row)
356+
del_buf= record[1];
357+
350358
if (replace)
351359
restore_record(this, record[2]);
352360
}

0 commit comments

Comments
 (0)