You've already forked mariadb-columnstore-engine
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:
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user