mirror of
https://github.com/MariaDB/server.git
synced 2026-01-06 05:22:24 +03:00
Backport of fix for Bug#52123
This commit is contained in:
@@ -1739,6 +1739,16 @@ SELECT RELEASE_LOCK('aaaaaaaaaaaaaaaaa');
|
||||
#
|
||||
End of 5.1 tests
|
||||
#
|
||||
# Bug#52123 Assertion failed: aggregator == aggr->Aggrtype(),
|
||||
# file .\item_sum.cc, line 587
|
||||
#
|
||||
CREATE TABLE t1(a int, KEY(a));
|
||||
INSERT INTO t1 VALUES (1), (2);
|
||||
SELECT 1 FROM t1 ORDER BY AVG(DISTINCT a);
|
||||
1
|
||||
1
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug#55648: Server crash on MIN/MAX on maximum time value
|
||||
#
|
||||
CREATE TABLE t1(c1 TIME NOT NULL);
|
||||
|
||||
@@ -1120,6 +1120,17 @@ SELECT RELEASE_LOCK('aaaaaaaaaaaaaaaaa');
|
||||
--echo #
|
||||
--echo End of 5.1 tests
|
||||
|
||||
###
|
||||
--echo #
|
||||
--echo # Bug#52123 Assertion failed: aggregator == aggr->Aggrtype(),
|
||||
--echo # file .\item_sum.cc, line 587
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1(a int, KEY(a));
|
||||
INSERT INTO t1 VALUES (1), (2);
|
||||
SELECT 1 FROM t1 ORDER BY AVG(DISTINCT a);
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#55648: Server crash on MIN/MAX on maximum time value
|
||||
--echo #
|
||||
|
||||
@@ -556,24 +556,27 @@ Item *Item_sum::set_arg(uint i, THD *thd, Item *new_val)
|
||||
|
||||
int Item_sum::set_aggregator(Aggregator::Aggregator_type aggregator)
|
||||
{
|
||||
if (aggr)
|
||||
/*
|
||||
Dependent subselects may be executed multiple times, making
|
||||
set_aggregator to be called multiple times. The aggregator type
|
||||
will be the same, but it needs to be reset so that it is
|
||||
reevaluated with the new dependent data.
|
||||
This function may also be called multiple times during query optimization.
|
||||
In this case, the type may change, so we delete the old aggregator,
|
||||
and create a new one.
|
||||
*/
|
||||
if (aggr && aggregator == aggr->Aggrtype())
|
||||
{
|
||||
/*
|
||||
Dependent subselects may be executed multiple times, making
|
||||
set_aggregator to be called multiple times. The aggregator type
|
||||
will be the same, but it needs to be reset so that it is
|
||||
reevaluated with the new dependent data.
|
||||
*/
|
||||
DBUG_ASSERT(aggregator == aggr->Aggrtype());
|
||||
aggr->clear();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
delete aggr;
|
||||
switch (aggregator)
|
||||
{
|
||||
case Aggregator::DISTINCT_AGGREGATOR:
|
||||
aggr= new Aggregator_distinct(this);
|
||||
break;
|
||||
|
||||
case Aggregator::SIMPLE_AGGREGATOR:
|
||||
aggr= new Aggregator_simple(this);
|
||||
break;
|
||||
|
||||
@@ -461,10 +461,9 @@ public:
|
||||
*/
|
||||
virtual void no_rows_in_result()
|
||||
{
|
||||
if (!aggr)
|
||||
set_aggregator(with_distinct ?
|
||||
Aggregator::DISTINCT_AGGREGATOR :
|
||||
Aggregator::SIMPLE_AGGREGATOR);
|
||||
set_aggregator(with_distinct ?
|
||||
Aggregator::DISTINCT_AGGREGATOR :
|
||||
Aggregator::SIMPLE_AGGREGATOR);
|
||||
aggregator_clear();
|
||||
}
|
||||
virtual void make_unique() { force_copy_fields= TRUE; }
|
||||
@@ -515,11 +514,10 @@ public:
|
||||
quick_group= with_distinct ? 0 : 1;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
Set the type of aggregation : DISTINCT or not.
|
||||
|
||||
Called when the final determination is done about the aggregation
|
||||
type and the object is about to be used.
|
||||
May be called multiple times.
|
||||
*/
|
||||
|
||||
int set_aggregator(Aggregator::Aggregator_type aggregator);
|
||||
|
||||
Reference in New Issue
Block a user