You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-08-01 06:46:55 +03:00
MCOL-4172 Add support for wide-DECIMAL into statistical aggregate and regr_* UDAF functions
The patch fixes wrong results returned when multiple UDAF exist in projection aggregate over wide decimal literals now works
This commit is contained in:
@ -106,17 +106,14 @@ struct cmpTuple
|
||||
return true;
|
||||
if (pUDAFa == pUDAFb)
|
||||
{
|
||||
if (pUDAFa == NULL)
|
||||
return false;
|
||||
std::vector<uint32_t>* paramKeysa = boost::get<3>(a);
|
||||
std::vector<uint32_t>* paramKeysb = boost::get<3>(b);
|
||||
|
||||
if (paramKeysa == NULL || paramKeysb == NULL)
|
||||
return false;
|
||||
if (paramKeysa->size() < paramKeysb->size())
|
||||
return true;
|
||||
if (paramKeysa->size() == paramKeysb->size())
|
||||
{
|
||||
if (paramKeysa == NULL)
|
||||
return false;
|
||||
for (uint64_t i = 0; i < paramKeysa->size(); ++i)
|
||||
{
|
||||
if ((*paramKeysa)[i] < (*paramKeysb)[i])
|
||||
@ -1471,7 +1468,7 @@ void TupleAggregateStep::prep1PhaseAggregate(
|
||||
// find if this func is a duplicate
|
||||
AGG_MAP::iterator iter = aggFuncMap.find(boost::make_tuple(key, aggOp, pUDAFFunc, udafc ? udafc->getContext().getParamKeys() : NULL));
|
||||
|
||||
if (iter != aggFuncMap.end())
|
||||
if (aggOp != ROWAGG_UDAF && aggOp != ROWAGG_MULTI_PARM && iter != aggFuncMap.end())
|
||||
{
|
||||
if (funct->fAggFunction == ROWAGG_AVG)
|
||||
funct->fAggFunction = ROWAGG_DUP_AVG;
|
||||
@ -1513,7 +1510,7 @@ void TupleAggregateStep::prep1PhaseAggregate(
|
||||
}
|
||||
|
||||
// there is avg(k), but no count(k) in the select list
|
||||
uint64_t lastCol = returnedColVec.size();
|
||||
uint64_t lastCol = outIdx;
|
||||
|
||||
for (map<uint32_t, SP_ROWAGG_FUNC_t>::iterator k = avgFuncMap.begin(); k != avgFuncMap.end(); k++)
|
||||
{
|
||||
@ -1855,8 +1852,12 @@ void TupleAggregateStep::prep1PhaseDistinctAggregate(
|
||||
}
|
||||
|
||||
// skip if this is a duplicate
|
||||
if (aggFuncMap.find(boost::make_tuple(aggKey, aggOp, pUDAFFunc, udafc ? udafc->getContext().getParamKeys() : NULL)) != aggFuncMap.end())
|
||||
if (aggOp != ROWAGG_UDAF && aggOp != ROWAGG_MULTI_PARM
|
||||
&& aggFuncMap.find(boost::make_tuple(aggKey, aggOp, pUDAFFunc, udafc ? udafc->getContext().getParamKeys() : NULL)) != aggFuncMap.end())
|
||||
{
|
||||
// skip if this is a duplicate
|
||||
continue;
|
||||
}
|
||||
|
||||
functionVec1.push_back(funct);
|
||||
aggFuncMap.insert(make_pair(boost::make_tuple(aggKey, aggOp, pUDAFFunc, udafc ? udafc->getContext().getParamKeys() : NULL), colAgg));
|
||||
@ -3134,9 +3135,13 @@ void TupleAggregateStep::prep2PhasesAggregate(
|
||||
}
|
||||
|
||||
// skip if this is a duplicate
|
||||
if (aggFuncMap.find(boost::make_tuple(aggKey, aggOp, pUDAFFunc, udafc ? udafc->getContext().getParamKeys() : NULL)) != aggFuncMap.end())
|
||||
if (aggOp != ROWAGG_UDAF && aggOp != ROWAGG_MULTI_PARM
|
||||
&& aggFuncMap.find(boost::make_tuple(aggKey, aggOp, pUDAFFunc, udafc ? udafc->getContext().getParamKeys() : NULL)) != aggFuncMap.end())
|
||||
{
|
||||
// skip if this is a duplicate
|
||||
continue;
|
||||
|
||||
}
|
||||
|
||||
functionVecPm.push_back(funct);
|
||||
aggFuncMap.insert(make_pair(boost::make_tuple(aggKey, aggOp, pUDAFFunc, udafc ? udafc->getContext().getParamKeys() : NULL), colAggPm));
|
||||
|
||||
@ -4010,8 +4015,12 @@ void TupleAggregateStep::prep2PhasesDistinctAggregate(
|
||||
}
|
||||
|
||||
// skip if this is a duplicate
|
||||
if (aggFuncMap.find(boost::make_tuple(aggKey, aggOp, pUDAFFunc, udafc ? udafc->getContext().getParamKeys() : NULL)) != aggFuncMap.end())
|
||||
if (aggOp != ROWAGG_UDAF && aggOp != ROWAGG_MULTI_PARM
|
||||
&& aggFuncMap.find(boost::make_tuple(aggKey, aggOp, pUDAFFunc, udafc ? udafc->getContext().getParamKeys() : NULL)) != aggFuncMap.end())
|
||||
{
|
||||
// skip if this is a duplicate
|
||||
continue;
|
||||
}
|
||||
|
||||
functionVecPm.push_back(funct);
|
||||
aggFuncMap.insert(make_pair(boost::make_tuple(aggKey, aggOp, pUDAFFunc, udafc ? udafc->getContext().getParamKeys() : NULL), colAggPm-multiParm));
|
||||
|
Reference in New Issue
Block a user