mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 10:56:12 +01:00 
			
		
		
		
	 633417308f
			
		
	
	
	633417308f
	
	
	
		
			
			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.
		
			
				
	
	
		
			34 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			34 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| #
 | |
| # Assertion `inited == NONE || update_handler != this' failed in
 | |
| # handler::ha_write_row
 | |
| #
 | |
| 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;
 | |
| #
 | |
| # MDEV-21819 Assertion `inited == NONE || update_handler != this'
 | |
| # failed in handler::ha_write_row
 | |
| #
 | |
| 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');
 | |
| DELETE FROM t1 FOR PORTION OF app FROM '2023-01-01' TO '2024-01-01';
 | |
| ERROR 23000: Duplicate entry 'foo' for key 'b'
 | |
| DROP TABLE t1;
 | |
| # End of 10.5 tests
 | |
| #
 | |
| # MDEV-37312 ASAN errors or assertion failure upon attempt to UPDATE FOR PORTION violating long unique under READ COMMITTED
 | |
| #
 | |
| 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;
 | |
| update t1 for portion of p from '1980-01-01' to '1980-01-02' set a = 1;
 | |
| ERROR 23000: Duplicate entry 'foo' for key 'f'
 | |
| 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;
 | |
| update t1 for portion of p from '1980-01-01' to '1980-01-02' set a = 1;
 | |
| ERROR 23000: Duplicate entry 'foo' for key 'f'
 | |
| drop table t1;
 | |
| # End of 10.6 tests
 |