1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-07-30 19:23:07 +03:00

MCOL-1793 Refactor to handle another edge case. Also fix CORR and reset

This commit is contained in:
David Hall
2018-11-28 15:49:34 -06:00
parent bbe642b1bc
commit ed43876695
3 changed files with 14 additions and 25 deletions

View File

@ -144,7 +144,7 @@ mcsv1_UDAF::ReturnCode corr::evaluate(mcsv1Context* context, static_any::any& va
{ {
struct corr_data* data = (struct corr_data*)context->getUserData()->data; struct corr_data* data = (struct corr_data*)context->getUserData()->data;
double N = data->cnt; double N = data->cnt;
if (N > 0) if (N > 1)
{ {
double sumx = data->sumx; double sumx = data->sumx;
double sumy = data->sumy; double sumy = data->sumy;
@ -161,8 +161,7 @@ mcsv1_UDAF::ReturnCode corr::evaluate(mcsv1Context* context, static_any::any& va
double var_popy = (sumy2 - (sumy * sumy / N)) / N; double var_popy = (sumy2 - (sumy * sumy / N)) / N;
if (var_popy == 0) if (var_popy == 0)
{ {
// When var_popy is 0, 1 is the result // When var_popy is 0, NULL is the result
valOut = 1.0;
return mcsv1_UDAF::SUCCESS; return mcsv1_UDAF::SUCCESS;
} }
double std_popx = sqrt(var_popx); double std_popx = sqrt(var_popx);

View File

@ -84,6 +84,7 @@ void WF_udaf::resetData()
getContext().getFunction()->reset(&getContext()); getContext().getFunction()->reset(&getContext());
fDistinctMap.clear(); fDistinctMap.clear();
WindowFunctionType::resetData(); WindowFunctionType::resetData();
fValOut.reset();
} }
void WF_udaf::parseParms(const std::vector<execplan::SRCP>& parms) void WF_udaf::parseParms(const std::vector<execplan::SRCP>& parms)
@ -708,7 +709,6 @@ void WF_udaf::operator()(int64_t b, int64_t e, int64_t c)
mcsv1sdk::mcsv1_UDAF::ReturnCode rc; mcsv1sdk::mcsv1_UDAF::ReturnCode rc;
uint64_t colOut = fFieldIndex[0]; uint64_t colOut = fFieldIndex[0];
bool isNull = false; bool isNull = false;
fValOut.reset();
if ((fFrameUnit == WF__FRAME_ROWS) || if ((fFrameUnit == WF__FRAME_ROWS) ||
(fPrev == -1) || (fPrev == -1) ||

View File

@ -194,31 +194,21 @@ void WindowFunction::operator()()
// Built-in functions may have this functionality added in the future. // Built-in functions may have this functionality added in the future.
// If b > e then the frame is entirely outside of the partition // If b > e then the frame is entirely outside of the partition
// and there's no values to drop // and there's no values to drop
if (b <= e) if (!firstTime && (b <= e) && fFunctionType->dropValues(prevFrame.first, w.first))
{ {
if (!firstTime) // Adjust the beginning of the frame for nextValue
{ // to start where the previous frame left off.
if (fFunctionType->dropValues(prevFrame.first, w.first)) b = prevFrame.second + 1;
{ }
// Adjust the beginning of the frame for nextValue else
// to start where the previous frame left off. {
b = prevFrame.second + 1; // If dropValues failed or doesn't exist,
} // calculate the entire frame.
else fFunctionType->resetData();
{
// dropValues failed or doesn't exist
// so calculate the entire frame.
fFunctionType->resetData();
}
}
else
{
fFunctionType->resetData();
firstTime = false;
}
} }
fFunctionType->operator()(b, e, i); // UDAnF: Calls nextValue and evaluate fFunctionType->operator()(b, e, i); // UDAnF: Calls nextValue and evaluate
prevFrame = w; prevFrame = w;
firstTime = false;
} }
} }
} }