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..0c987919a 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,30 @@ 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) + { + // If an argument is an AggregateColumn, don't group by it. + if (dynamic_cast(j->get()) == NULL) + { + bool bFound = false; + for (std::vector::iterator igpc = csep->groupByCols().begin(); + igpc < csep->groupByCols().end(); + ++igpc) + { + if (*igpc->get() == *j->get()) + { + bFound = true; + break; + } + } + if (!bFound) + { + csep->groupByCols().push_back(*j); + } + } + } } colSet.insert(key);