diff --git a/dbcon/joblist/groupconcat.cpp b/dbcon/joblist/groupconcat.cpp index abada0b40..242b630b3 100644 --- a/dbcon/joblist/groupconcat.cpp +++ b/dbcon/joblist/groupconcat.cpp @@ -457,17 +457,32 @@ void GroupConcator::outputRow(std::ostringstream& oss, const rowgroup::Row& row) case CalpontSystemCatalog::UDECIMAL: { int scale = (int) row.getScale(*i); - //{ - // long double dblVal = intVal / pow(10.0, (double)scale); - // oss << fixed << setprecision(scale) << dblVal; - //} - char buf[utils::MAXLENGTH16BYTES]; - - int128_t* dec = row.getBinaryField(*i); - dataconvert::DataConvert::decimalToString(dec, - static_cast(scale), buf, - sizeof(buf), types[*i]); - oss << fixed << buf; + + if (LIKELY(row.getColumnWidth(*i) == datatypes::MAXDECIMALWIDTH)) + { + char buf[utils::MAXLENGTH16BYTES]; + + int128_t* dec = row.getBinaryField(*i); + dataconvert::DataConvert::decimalToString(dec, + static_cast(scale), buf, + sizeof(buf), types[*i]); + oss << fixed << buf; + } + else + { + int64_t intVal = row.getIntField(*i); + if (scale == 0) + { + oss << intVal; + } + else + { + char buf[utils::MAXLENGTH8BYTES]; + dataconvert::DataConvert::decimalToString(intVal, + scale, buf, sizeof(buf), types[*i]); + oss << fixed << buf; + } + } break; } diff --git a/utils/common/widedecimalutils.h b/utils/common/widedecimalutils.h index a27859828..3ebdb408b 100644 --- a/utils/common/widedecimalutils.h +++ b/utils/common/widedecimalutils.h @@ -30,6 +30,7 @@ namespace utils const uint64_t BINARYEMPTYVALUELOW = 1ULL; const uint64_t BINARYEMPTYVALUEHIGH = 0x8000000000000000ULL; const uint8_t MAXLENGTH16BYTES = 42; + const uint8_t MAXLENGTH8BYTES = 23; inline bool isWideDecimalNullValue(const int128_t& val) { diff --git a/utils/funcexp/func_math.cpp b/utils/funcexp/func_math.cpp index 13c738217..0c86cbb67 100644 --- a/utils/funcexp/func_math.cpp +++ b/utils/funcexp/func_math.cpp @@ -1911,7 +1911,8 @@ string Func_format::getStrVal(Row& row, char buf[80]; - dataconvert::DataConvert::decimalToString( decimal.value, decimal.scale, buf, 80, parm[0]->data()->resultType().colDataType); + dataconvert::DataConvert::decimalToString( decimal.value, + decimal.scale, buf, 80, parm[0]->data()->resultType().colDataType); value = buf; }