mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Fixed bug #24653.
The bug report has demonstrated the following two problems. 1. If an ORDER/GROUP BY list includes a constant expression being optimized away and, at the same time, containing single-row subselects that return more that one row, no error is reported. Strictly speaking the standard allows to ignore error in this case. Yet, now a corresponding fatal error is reported in this case. 2. If a query requires sorting by expressions containing single-row subselects that, however, return more than one row, then the execution of the query may cause a server crash. To fix this some code has been added that blocks execution of a subselect item in case of a fatal error in the method Item_subselect::exec.
This commit is contained in:
@ -644,6 +644,13 @@ JOIN::optimize()
|
||||
{
|
||||
ORDER *org_order= order;
|
||||
order=remove_const(this, order,conds,1, &simple_order);
|
||||
if (thd->net.report_error)
|
||||
{
|
||||
error= 1;
|
||||
DBUG_PRINT("error",("Error from remove_const"));
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
/*
|
||||
If we are using ORDER BY NULL or ORDER BY const_expression,
|
||||
return result in any order (even if we are using a GROUP BY)
|
||||
@ -747,6 +754,12 @@ JOIN::optimize()
|
||||
group_list= remove_const(this, (old_group_list= group_list), conds,
|
||||
rollup.state == ROLLUP::STATE_NONE,
|
||||
&simple_group);
|
||||
if (thd->net.report_error)
|
||||
{
|
||||
error= 1;
|
||||
DBUG_PRINT("error",("Error from remove_const"));
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
if (old_group_list && !group_list)
|
||||
select_distinct= 0;
|
||||
}
|
||||
@ -763,6 +776,12 @@ JOIN::optimize()
|
||||
{
|
||||
group_list= procedure->group= remove_const(this, procedure->group, conds,
|
||||
1, &simple_group);
|
||||
if (thd->net.report_error)
|
||||
{
|
||||
error= 1;
|
||||
DBUG_PRINT("error",("Error from remove_const"));
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
calc_group_buffer(this, group_list);
|
||||
}
|
||||
|
||||
@ -4428,6 +4447,8 @@ remove_const(JOIN *join,ORDER *first_order, COND *cond,
|
||||
*simple_order=0; // Must do a temp table to sort
|
||||
else if (!(order_tables & not_const_tables))
|
||||
{
|
||||
if (order->item[0]->with_subselect)
|
||||
order->item[0]->val_str(&order->item[0]->str_value);
|
||||
DBUG_PRINT("info",("removing: %s", order->item[0]->full_name()));
|
||||
continue; // skip const item
|
||||
}
|
||||
|
Reference in New Issue
Block a user