mirror of
https://github.com/MariaDB/server.git
synced 2025-08-04 09:31:36 +02:00

in case of a long unique conflict ha_write_row() used delete_row() to remove the newly inserted row, and it used rnd_pos() to position the cursor before deletion. This rnd_pos() was freeing and reallocating blobs in record[0]. So when the code for FOR PORTION OF did store_record(record[2]); ha_write_row() restore_record(record[2]); it ended up with blob pointers to a freed memory. Let's use lookup_handler for deletion.
44 lines
1.8 KiB
Text
44 lines
1.8 KiB
Text
--source include/have_innodb.inc
|
|
--source include/have_partition.inc
|
|
|
|
--echo #
|
|
--echo # Assertion `inited == NONE || update_handler != this' failed in
|
|
--echo # handler::ha_write_row
|
|
--echo #
|
|
|
|
CREATE TABLE t1 (f VARCHAR(4096), s DATE, e DATE, PERIOD FOR app(s,e), UNIQUE(f)) ENGINE=MyISAM;
|
|
INSERT INTO t1 VALUES ('foo', '2023-08-30', '2025-07-09'),('bar', '2021-01-01', '2021-12-31');
|
|
DELETE FROM t1 FOR PORTION OF app FROM '2023-08-29' TO '2025-07-01';
|
|
DROP TABLE t1;
|
|
|
|
--echo #
|
|
--echo # MDEV-21819 Assertion `inited == NONE || update_handler != this'
|
|
--echo # failed in handler::ha_write_row
|
|
--echo #
|
|
|
|
CREATE OR REPLACE TABLE t1 (a INT, b BLOB, s DATE, e DATE, PERIOD FOR app(s,e), UNIQUE(b)) ENGINE=MyISAM PARTITION BY HASH(a) PARTITIONS 2;
|
|
INSERT INTO t1 VALUES (1,'foo','2022-01-01', '2025-01-01');
|
|
--error ER_DUP_ENTRY
|
|
DELETE FROM t1 FOR PORTION OF app FROM '2023-01-01' TO '2024-01-01';
|
|
DROP TABLE t1;
|
|
|
|
--echo # End of 10.5 tests
|
|
|
|
--echo #
|
|
--echo # MDEV-37312 ASAN errors or assertion failure upon attempt to UPDATE FOR PORTION violating long unique under READ COMMITTED
|
|
--echo #
|
|
create table t1 (a int, f text unique, s datetime, e datetime, period for p(s,e)) engine=innodb;
|
|
insert into t1 values (1,'foo','1900-01-01','2000-01-01'),(2,'bar','1900-01-01','2000-01-01');
|
|
set transaction isolation level read committed;
|
|
--error ER_DUP_ENTRY
|
|
update t1 for portion of p from '1980-01-01' to '1980-01-02' set a = 1;
|
|
drop table t1;
|
|
|
|
create table t1 (a int, f text unique, s datetime, e datetime, period for p(s,e)) engine=innodb partition by hash (a);
|
|
insert into t1 values (1,'foo','1900-01-01','2000-01-01'),(2,'bar','1900-01-01','2000-01-01');
|
|
set transaction isolation level read committed;
|
|
--error ER_DUP_ENTRY
|
|
update t1 for portion of p from '1980-01-01' to '1980-01-02' set a = 1;
|
|
drop table t1;
|
|
|
|
--echo # End of 10.6 tests
|