diff --git a/datatypes/mcs_decimal.h b/datatypes/mcs_decimal.h index 1237c20e7..294d0e422 100644 --- a/datatypes/mcs_decimal.h +++ b/datatypes/mcs_decimal.h @@ -347,12 +347,31 @@ class Decimal: public TSInt128 return toDouble(); } - inline long double toLongDouble() const + inline float toFloat() const { - datatypes::TFloat128 y(s128Value); - return static_cast(y); + int128_t scaleDivisor; + getScaleDivisor(scaleDivisor, scale); + datatypes::TFloat128 tmpval((__float128) s128Value / scaleDivisor); + return static_cast(tmpval); } + inline operator float() const + { + return toFloat(); + } + + inline long double toLongDouble() const + { + int128_t scaleDivisor; + getScaleDivisor(scaleDivisor, scale); + datatypes::TFloat128 tmpval((__float128) s128Value / scaleDivisor); + return static_cast(tmpval); + } + + inline operator long double() const + { + return toLongDouble(); + } // This method returns integral part as a TSInt128 and // fractional part as a TFloat128 diff --git a/datatypes/mcs_float128.h b/datatypes/mcs_float128.h index 9af7e8556..48f12a826 100644 --- a/datatypes/mcs_float128.h +++ b/datatypes/mcs_float128.h @@ -102,6 +102,21 @@ class TFloat128 return toLongDouble(); } + inline operator float() const + { + return toFloat(); + } + + inline float toFloat() const + { + if (value > static_cast<__float128>(FLT_MAX)) + return FLT_MAX; + else if (value < -static_cast<__float128>(FLT_MAX)) + return -FLT_MAX; + + return static_cast(value); + } + inline int64_t toTSInt64() const { if (value > static_cast<__float128>(INT64_MAX)) diff --git a/dbcon/execplan/arithmeticoperator.cpp b/dbcon/execplan/arithmeticoperator.cpp index 3f4fa695c..1c22b6e33 100644 --- a/dbcon/execplan/arithmeticoperator.cpp +++ b/dbcon/execplan/arithmeticoperator.cpp @@ -127,7 +127,8 @@ bool ArithmeticOperator::operator!=(const TreeNode* t) const void ArithmeticOperator::adjustResultType(const CalpontSystemCatalog::ColType& m) { - if (m.colDataType != CalpontSystemCatalog::DECIMAL) + if (m.colDataType != CalpontSystemCatalog::DECIMAL && + m.colDataType != CalpontSystemCatalog::UDECIMAL) { fResultType = m; } diff --git a/dbcon/execplan/arithmeticoperator.h b/dbcon/execplan/arithmeticoperator.h index 042d47cd1..163151f7a 100644 --- a/dbcon/execplan/arithmeticoperator.h +++ b/dbcon/execplan/arithmeticoperator.h @@ -246,11 +246,12 @@ inline void ArithmeticOperator::evaluate(rowgroup::Row& row, bool& isNull, Parse case execplan::CalpontSystemCatalog::LONGDOUBLE: fResult.longDoubleVal = execute(lop->getLongDoubleVal(row, isNull), rop->getLongDoubleVal(row, isNull), isNull); break; - // WIP MCOL-641 + case execplan::CalpontSystemCatalog::DECIMAL: case execplan::CalpontSystemCatalog::UDECIMAL: execute(fResult.decimalVal, lop->getDecimalVal(row, isNull), rop->getDecimalVal(row, isNull), isNull); break; + default: { std::ostringstream oss; diff --git a/dbcon/execplan/treenode.h b/dbcon/execplan/treenode.h index f3f067681..7f5d0fb2c 100644 --- a/dbcon/execplan/treenode.h +++ b/dbcon/execplan/treenode.h @@ -763,7 +763,14 @@ inline uint64_t TreeNode::getUintVal() case CalpontSystemCatalog::DECIMAL: case CalpontSystemCatalog::UDECIMAL: { - return (uint64_t)(fResult.decimalVal.value / pow((double)10, fResult.decimalVal.scale)); + if (fResultType.colWidth == datatypes::MAXDECIMALWIDTH) + { + return static_cast(fResult.decimalVal.getIntegralPart()); + } + else + { + return (uint64_t)(fResult.decimalVal.value / pow((double)10, fResult.decimalVal.scale)); + } } case CalpontSystemCatalog::DATE: @@ -829,8 +836,16 @@ inline float TreeNode::getFloatVal() return (float)fResult.doubleVal; case CalpontSystemCatalog::DECIMAL: + case CalpontSystemCatalog::UDECIMAL: { - return (fResult.decimalVal.value / pow((double)10, fResult.decimalVal.scale)); + if (fResultType.colWidth == datatypes::MAXDECIMALWIDTH) + { + return static_cast(fResult.decimalVal); + } + else + { + return (fResult.decimalVal.value / pow((double)10, fResult.decimalVal.scale)); + } } case CalpontSystemCatalog::DATE: @@ -974,8 +989,15 @@ inline long double TreeNode::getLongDoubleVal() case CalpontSystemCatalog::DECIMAL: case CalpontSystemCatalog::UDECIMAL: { - // this may not be accurate. if this is problematic, change to pre-calculated power array. - return (long double)(fResult.decimalVal.value / pow((long double)10, fResult.decimalVal.scale)); + if (fResultType.colWidth == datatypes::MAXDECIMALWIDTH) + { + return static_cast(fResult.decimalVal); + } + else + { + // this may not be accurate. if this is problematic, change to pre-calculated power array. + return (long double)(fResult.decimalVal.value / pow((long double)10, fResult.decimalVal.scale)); + } } case CalpontSystemCatalog::DATE: