1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-07-29 08:21:15 +03:00

MCOL-5248 Change func_truncate() to use double for string, rather than attempt to translate to decimal. Currently, the treenode.h conversion functions don't support string to decimal conversion. (#2598)

This new functionality brings us into alignment with MDB 10.6
This commit is contained in:
David.Hall
2022-11-30 10:58:25 -06:00
committed by GitHub
parent b63efe0103
commit ef0a21267e

View File

@ -172,36 +172,43 @@ uint64_t Func_truncate::getUintVal(Row& row, FunctionParm& parm, bool& isNull,
double Func_truncate::getDoubleVal(Row& row, FunctionParm& parm, bool& isNull, double Func_truncate::getDoubleVal(Row& row, FunctionParm& parm, bool& isNull,
CalpontSystemCatalog::ColType& op_ct) CalpontSystemCatalog::ColType& op_ct)
{ {
if (execplan::CalpontSystemCatalog::DOUBLE == op_ct.colDataType || switch (op_ct.colDataType)
execplan::CalpontSystemCatalog::FLOAT == op_ct.colDataType)
{ {
int64_t d = 0; case execplan::CalpontSystemCatalog::DOUBLE:
double p = 1; case execplan::CalpontSystemCatalog::FLOAT:
decimalPlaceDouble(parm, d, p, row, isNull); case execplan::CalpontSystemCatalog::VARCHAR:
case execplan::CalpontSystemCatalog::CHAR:
if (isNull) case execplan::CalpontSystemCatalog::TEXT:
return 0.0;
double x = parm[0]->data()->getDoubleVal(row, isNull);
if (!isNull)
{ {
x *= p; int64_t d = 0;
double p = 1;
decimalPlaceDouble(parm, d, p, row, isNull);
if (x > 0) if (isNull)
x = floor(x); return 0.0;
else
x = ceil(x);
if (p != 0.0) double x = parm[0]->data()->getDoubleVal(row, isNull);
x /= p;
else if (!isNull)
x = 0.0; {
x *= p;
if (x > 0)
x = floor(x);
else
x = ceil(x);
if (p != 0.0)
x /= p;
else
x = 0.0;
}
return x;
} }
default:
return x; break;
} }
IDB_Decimal x = getDecimalVal(row, parm, isNull, op_ct); IDB_Decimal x = getDecimalVal(row, parm, isNull, op_ct);
if (isNull) if (isNull)
@ -436,13 +443,22 @@ IDB_Decimal Func_truncate::getDecimalVal(Row& row, FunctionParm& parm, bool& isN
break; break;
double x = parm[0]->data()->getDoubleVal(row, isNull); double x = parm[0]->data()->getDoubleVal(row, isNull);
if (!isNull) if (!isNull)
{ {
x *= p; x *= p;
decimal.value = x <= static_cast<double>(INT64_MIN) ? INT64_MIN if (x >= static_cast<double>(INT64_MIN) && x <= static_cast<double>(INT64_MAX))
: x >= static_cast<double>(INT64_MAX) ? INT64_MAX {
: int64_t(x); decimal.value = x;
}
else
{
isNull = true;
Message::Args args;
args.add("truncate");
args.add(x);
unsigned errcode = ERR_FUNC_OUT_OF_RANGE_RESULT;
throw IDBExcept(IDBErrorInfo::instance()->errorMsg(errcode, args), errcode);
}
decimal.scale = s; decimal.scale = s;
} }
} }