You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-07-30 19:23:07 +03:00
MCOL-4394 __float128 related code had been moved into a separate file
Trim to double and to long double conversions for Decimal
This commit is contained in:
@ -1881,9 +1881,11 @@ double Func_cast_decimal::getDoubleVal(Row& row,
|
||||
isNull,
|
||||
operationColType);
|
||||
|
||||
// WIP MCOL-641 This could deliver wrong result b/c wide DECIMAL might have
|
||||
// p <= INT64MAXPRECISION
|
||||
if (decimal.precision > datatypes::INT64MAXPRECISION)
|
||||
{
|
||||
return datatypes::Decimal::getDoubleFromWideDecimal(decimal.s128Value, decimal.scale);
|
||||
return static_cast<double>(decimal);
|
||||
}
|
||||
|
||||
return (double) decimal.value / helpers::powerOf10_c[decimal.scale];
|
||||
@ -1994,7 +1996,7 @@ double Func_cast_double::getDoubleVal(Row& row,
|
||||
|
||||
if (parm[0]->data()->resultType().colWidth == datatypes::MAXDECIMALWIDTH)
|
||||
{
|
||||
dblval = datatypes::Decimal::getDoubleFromWideDecimal(decimal.s128Value, decimal.scale);
|
||||
dblval = static_cast<double>(decimal);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -392,7 +392,7 @@ double Func_ceil::getDoubleVal(Row& row,
|
||||
|
||||
if (op_ct.colWidth == datatypes::MAXDECIMALWIDTH)
|
||||
{
|
||||
ret = datatypes::Decimal::getDoubleFromWideDecimal(tmp.s128Value);
|
||||
ret = static_cast<double>(tmp.toTSInt128());
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -448,7 +448,7 @@ long double Func_ceil::getLongDoubleVal(Row& row,
|
||||
|
||||
if (op_ct.colWidth == datatypes::MAXDECIMALWIDTH)
|
||||
{
|
||||
ret = datatypes::Decimal::getLongDoubleFromWideDecimal(tmp.s128Value);
|
||||
ret = static_cast<long double>(tmp.toTSInt128());
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -330,7 +330,7 @@ double Func_floor::getDoubleVal(Row& row,
|
||||
|
||||
if (op_ct.colWidth == datatypes::MAXDECIMALWIDTH)
|
||||
{
|
||||
ret = datatypes::Decimal::getDoubleFromWideDecimal(tmp.s128Value);
|
||||
ret = static_cast<double>(tmp.toTSInt128());
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -377,7 +377,7 @@ long double Func_floor::getLongDoubleVal(Row& row,
|
||||
|
||||
if (op_ct.colWidth == datatypes::MAXDECIMALWIDTH)
|
||||
{
|
||||
ret = datatypes::Decimal::getLongDoubleFromWideDecimal(tmp.s128Value);
|
||||
ret = static_cast<long double>(tmp.toTSInt128());
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -241,8 +241,8 @@ double Func_mod::getDoubleVal(Row& row,
|
||||
datatypes::getScaleDivisor(scaleDivisor, d.scale);
|
||||
int128_t value = d.s128Value / scaleDivisor;
|
||||
int128_t lefto = d.s128Value % scaleDivisor;
|
||||
__float128 tmp = (__float128) (value % div) + (__float128) lefto / scaleDivisor;
|
||||
mod = datatypes::getDoubleFromFloat128(tmp);
|
||||
datatypes::TFloat128 tmp((__float128) (value % div) + (__float128) lefto / scaleDivisor);
|
||||
mod = static_cast<double>(tmp);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -364,8 +364,8 @@ long double Func_mod::getLongDoubleVal(Row& row,
|
||||
datatypes::getScaleDivisor(scaleDivisor, d.scale);
|
||||
int128_t value = d.s128Value / scaleDivisor;
|
||||
int128_t lefto = d.s128Value % scaleDivisor;
|
||||
__float128 tmp = (__float128) (value % div) + (__float128) lefto / scaleDivisor;
|
||||
mod = datatypes::getLongDoubleFromFloat128(tmp);
|
||||
datatypes::TFloat128 tmp((__float128) (value % div) + (__float128) lefto / scaleDivisor);
|
||||
mod = static_cast<long double>(tmp);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -210,7 +210,7 @@ double Func_round::getDoubleVal(Row& row,
|
||||
if (!op_ct.isWideDecimalType())
|
||||
d = x.value;
|
||||
else
|
||||
d = datatypes::Decimal::getDoubleFromWideDecimal(x.s128Value);
|
||||
d = static_cast<double>(x.toTSInt128());
|
||||
|
||||
if (x.scale > 0)
|
||||
{
|
||||
@ -277,7 +277,7 @@ long double Func_round::getLongDoubleVal(Row& row,
|
||||
if (!op_ct.isWideDecimalType())
|
||||
d = x.value;
|
||||
else
|
||||
d = datatypes::Decimal::getDoubleFromWideDecimal(x.s128Value);
|
||||
d = static_cast<double>(x.toTSInt128());
|
||||
|
||||
if (x.scale > 0)
|
||||
{
|
||||
|
@ -233,7 +233,7 @@ double Func_truncate::getDoubleVal(Row& row,
|
||||
if (!op_ct.isWideDecimalType())
|
||||
d = x.value;
|
||||
else
|
||||
d = datatypes::Decimal::getDoubleFromWideDecimal(x.s128Value);
|
||||
d = static_cast<double>(x.toTSInt128());
|
||||
|
||||
if (x.scale > 0)
|
||||
{
|
||||
@ -293,7 +293,7 @@ long double Func_truncate::getLongDoubleVal(Row& row,
|
||||
if (!op_ct.isWideDecimalType())
|
||||
d = x.value;
|
||||
else
|
||||
d = datatypes::Decimal::getDoubleFromWideDecimal(x.s128Value);
|
||||
d = static_cast<double>(x.toTSInt128());
|
||||
|
||||
if (x.scale > 0)
|
||||
{
|
||||
|
@ -2045,8 +2045,9 @@ void RowAggregation::doStatistics(const Row& rowIn, int64_t colIn, int64_t colOu
|
||||
case execplan::CalpontSystemCatalog::UDECIMAL: // handle scale later
|
||||
if (LIKELY(fRowGroupIn.getColumnWidth(colIn) == datatypes::MAXDECIMALWIDTH))
|
||||
{
|
||||
int128_t* val128InPtr = rowIn.getBinaryField<int128_t>(colIn);
|
||||
valIn = Dec::getLongDoubleFromWideDecimal(*val128InPtr);
|
||||
// To save from unaligned memory
|
||||
datatypes::TSInt128 val128In(rowIn.getBinaryField<int128_t>(colIn));
|
||||
valIn = static_cast<long double>(val128In.toTFloat128());
|
||||
}
|
||||
else if (fRowGroupIn.getColumnWidth(colIn) <= datatypes::MAXLEGACYWIDTH)
|
||||
{
|
||||
|
Reference in New Issue
Block a user