diff --git a/dbcon/joblist/joblistfactory.cpp b/dbcon/joblist/joblistfactory.cpp index 66245a8e2..b34215433 100644 --- a/dbcon/joblist/joblistfactory.cpp +++ b/dbcon/joblist/joblistfactory.cpp @@ -1525,7 +1525,7 @@ void parseExecutionPlan(CalpontSelectExecutionPlan* csep, JobInfo& jobInfo, // bug4531, window function support WindowFunctionStep::checkWindowFunction(csep, jobInfo); - // bug3391, move forward the aggregation check for no aggregte having clause. + // bug3391, move forward the aggregation check for no aggregate having clause. checkAggregation(csep, jobInfo); // include filters in having clause, if any. diff --git a/dbcon/joblist/windowfunctionstep.cpp b/dbcon/joblist/windowfunctionstep.cpp index 1a603a98e..a04a4fcb2 100644 --- a/dbcon/joblist/windowfunctionstep.cpp +++ b/dbcon/joblist/windowfunctionstep.cpp @@ -477,6 +477,17 @@ void WindowFunctionStep::checkWindowFunction(CalpontSelectExecutionPlan* csep, J colSet.insert(key); } + // MCOL-3435 We haven't yet checked for aggregate, but we need to know + bool hasAggregation = false; + for (uint64_t i = 0; i < jobInfo.deliveredCols.size(); i++) + { + if (dynamic_cast(jobInfo.deliveredCols[i].get()) != NULL) + { + hasAggregation = true; + break; + } + } + // add non-duplicate auxiliary columns RetColsVector colsInAf; @@ -499,10 +510,17 @@ void WindowFunctionStep::checkWindowFunction(CalpontSelectExecutionPlan* csep, J if (colSet.find(key) == colSet.end()) { jobInfo.deliveredCols.push_back(*j); -// MCOL-3343 Enable this if we decide to allow Window Functions to run with -// aggregates with no group by. MariaDB allows this. Nobody else in the world does. -// There will be more work to get it to function if we try this. -// jobInfo.windowSet.insert(getTupleKey(jobInfo, *j, true)); + // MCOL-3435 Allow Window Functions to run with aggregates with + // no group by by inserting a group by for window parameters. + if (hasAggregation) + { + uint32_t tupleKey = getTupleKey(jobInfo, *j, true); + if (find(jobInfo.groupByColVec.begin(), jobInfo.groupByColVec.end(), tupleKey) + == jobInfo.groupByColVec.end()) + { + jobInfo.groupByColVec.push_back(tupleKey); + } + } } colSet.insert(key);