mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-30 18:36:12 +01:00 
			
		
		
		
	 ae05097714
			
		
	
	
	ae05097714
	
	
	
		
			
			This error was discovered while working on
MDEV-30540 Wrong result with IN list length reaching
           IN_PREDICATE_CONVERSION_THRESHOLD
If there is read error from handler::ha_rnd_next() during a recursive
query, st_select_lex_unit::exec_recursive() will crash as it will try to
get the error code from a structure that was deleted by the callee.
The code was using the construct:
   sl->join->exec();
   saved_error=sl->join->error;
This does not work as sl->join was freed by the exec() and sl->join would
be set to 0.
Fixed by having JOIN::exec() return the error code.
The included test case simulates the error in ha_rnd_next(), which causes
a crash without the patch.
scovered whle working on
MDEV-30540 Wrong result with IN list length reaching
           IN_PREDICATE_CONVERSION_THRESHOLD
If there is read error from handler::ha_rnd_next() during a recursive
query, st_select_lex_unit::exec_recursive() will crash as it will try to
get the error code from a structure that was deleted by the callee.
The code was using the construct:
   sl->join->exec();
   saved_error=sl->join->error;
This does not work as sl->join was freed by the exec() and sl->join was
set to 0.
Fixed by having JOIN::exec() return the error code.
The included test case simulates the error in ha_rnd_next(), which causes
a crash without the patch.
		
	
			
		
			
				
	
	
		
			53 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| set @save_big_tables=@@big_tables;
 | |
| set big_tables=1;
 | |
| Warnings:
 | |
| Warning	1287	'@@big_tables' is deprecated and will be removed in a future release
 | |
| create table  folks(id int, name char(32), dob date, father int, mother int);
 | |
| insert into folks values
 | |
| (100, 'Me', '2000-01-01', 20, 30),
 | |
| (20, 'Dad', '1970-02-02', 10, 9),
 | |
| (30, 'Mom', '1975-03-03', 8, 7),
 | |
| (10, 'Grandpa Bill', '1940-04-05', null, null),
 | |
| (9, 'Grandma Ann', '1941-10-15', null, null),
 | |
| (25, 'Uncle Jim', '1968-11-18', 8, 7),
 | |
| (98, 'Sister Amy', '2001-06-20', 20, 30),
 | |
| (7, 'Grandma Sally', '1943-08-23', null, 6),
 | |
| (8, 'Grandpa Ben', '1940-10-21', null, null),
 | |
| (6, 'Grandgrandma Martha', '1923-05-17', null, null),
 | |
| (67, 'Cousin Eddie', '1992-02-28', 25, 27),
 | |
| (27, 'Auntie Melinda', '1971-03-29', null, null);
 | |
| call mtr.add_suppression(".*marked as crashed.*");
 | |
| SET @saved_dbug= @@SESSION.debug_dbug;
 | |
| SET SESSION debug_dbug="+d,ha_rnd_next_error";
 | |
| SET @ha_rnd_next_error_counter=110;
 | |
| with recursive
 | |
| ancestor_couples(h_id, h_name, h_dob, h_father, h_mother,
 | |
| w_id, w_name, w_dob, w_father, w_mother)
 | |
| as
 | |
| (
 | |
| select h.*, w.*
 | |
| from folks h, folks w,  coupled_ancestors a
 | |
| where a.father = h.id AND a.mother = w.id
 | |
| union
 | |
| select h.*, w.*
 | |
| from folks v, folks h, folks w
 | |
| where v.name = 'Me' and
 | |
| (v.father = h.id AND v.mother= w.id)
 | |
| ),
 | |
| coupled_ancestors (id, name, dob, father, mother)
 | |
| as
 | |
| (
 | |
| select h_id, h_name, h_dob, h_father, h_mother
 | |
| from ancestor_couples
 | |
| union
 | |
| select w_id, w_name, w_dob, w_father, w_mother
 | |
| from ancestor_couples
 | |
| )
 | |
| select h_name, h_dob, w_name, w_dob
 | |
| from ancestor_couples;
 | |
| ERROR HY000: Table '(temporary)' is marked as crashed and should be repaired
 | |
| drop table folks;
 | |
| set big_tables=@save_big_tables;
 | |
| Warnings:
 | |
| Warning	1287	'@@big_tables' is deprecated and will be removed in a future release
 | |
| SET @@SESSION.debug_dbug=@saved_dbug;
 |