mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Fixed bug #21493: crash for the second execution of a function
containing a select statement that uses an aggregating IN subquery. Added a parameter to the function fix_prepare_information to restore correctly the having clause for the second execution. Saved andor structure of the having conditions at the proper moment before any calls of split_sum_func2 that could modify the having structure adding new Item_ref objects. (These additions, are produced not with the statement mem_root, but rather with the execution mem_root.)
This commit is contained in:
@ -382,12 +382,14 @@ JOIN::prepare(Item ***rref_pointer_array,
|
||||
if ((res= subselect->select_transformer(this)) !=
|
||||
Item_subselect::RES_OK)
|
||||
{
|
||||
select_lex->fix_prepare_information(thd, &conds);
|
||||
select_lex->fix_prepare_information(thd, &conds, &having);
|
||||
DBUG_RETURN((res == Item_subselect::RES_ERROR));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
select_lex->fix_prepare_information(thd, &conds, &having);
|
||||
|
||||
if (having && having->with_sum_func)
|
||||
having->split_sum_func2(thd, ref_pointer_array, all_fields,
|
||||
&having, TRUE);
|
||||
@ -499,7 +501,6 @@ JOIN::prepare(Item ***rref_pointer_array,
|
||||
if (alloc_func_list())
|
||||
goto err;
|
||||
|
||||
select_lex->fix_prepare_information(thd, &conds);
|
||||
DBUG_RETURN(0); // All OK
|
||||
|
||||
err:
|
||||
@ -618,7 +619,6 @@ JOIN::optimize()
|
||||
build_bitmap_for_nested_joins(join_list, 0);
|
||||
|
||||
sel->prep_where= conds ? conds->copy_andor_structure(thd) : 0;
|
||||
sel->prep_having= having ? having->copy_andor_structure(thd) : 0;
|
||||
|
||||
if (arena)
|
||||
thd->restore_active_arena(arena, &backup);
|
||||
|
Reference in New Issue
Block a user