File tree Expand file tree Collapse file tree 3 files changed +55
-4
lines changed
mysql-test/suite/versioning Expand file tree Collapse file tree 3 files changed +55
-4
lines changed Original file line number Diff line number Diff line change @@ -57,6 +57,30 @@ insert into t2 (a) values (now()),(now());
5757select * from t2 where a in (select row_start from t1);
5858a
5959drop 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#
Original file line number Diff line number Diff line change @@ -46,6 +46,25 @@ insert into t2 (a) values (now()),(now());
4646select * from t2 where a in (select row_start from t1);
4747drop 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 #
Original file line number Diff line number Diff 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 }
You can’t perform that action at this time.
0 commit comments