From 5b166a95777720b2981ebe5fd1442061822e5296 Mon Sep 17 00:00:00 2001 From: mariadb-AndreyPiskunov Date: Thu, 22 Sep 2022 18:14:30 +0300 Subject: [PATCH] Fix truncate and round for char types --- utils/funcexp/func_round.cpp | 16 +++++++++++++++- utils/funcexp/func_truncate.cpp | 2 +- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/utils/funcexp/func_round.cpp b/utils/funcexp/func_round.cpp index d5a973792..69a47fff6 100644 --- a/utils/funcexp/func_round.cpp +++ b/utils/funcexp/func_round.cpp @@ -196,6 +196,13 @@ double Func_round::getDoubleVal(Row& row, FunctionParm& parm, bool& isNull, return x; } + if (execplan::CalpontSystemCatalog::VARCHAR == op_ct.colDataType || + execplan::CalpontSystemCatalog::CHAR == op_ct.colDataType || + execplan::CalpontSystemCatalog::TEXT == op_ct.colDataType) + { + return getIntVal(row, parm, isNull, op_ct); + } + if (isUnsigned(op_ct.colDataType)) { return getUintVal(row, parm, isNull, op_ct); @@ -263,6 +270,13 @@ long double Func_round::getLongDoubleVal(Row& row, FunctionParm& parm, bool& isN return x; } + if (execplan::CalpontSystemCatalog::VARCHAR == op_ct.colDataType || + execplan::CalpontSystemCatalog::CHAR == op_ct.colDataType || + execplan::CalpontSystemCatalog::TEXT == op_ct.colDataType) + { + return getIntVal(row, parm, isNull, op_ct); + } + if (isUnsigned(op_ct.colDataType)) { return getUintVal(row, parm, isNull, op_ct); @@ -484,7 +498,7 @@ IDB_Decimal Func_round::getDecimalVal(Row& row, FunctionParm& parm, bool& isNull else x = ceil(x - 0.5); - decimal.value = (int64_t)x; + decimal.value = x <= INT64_MIN ? INT64_MIN : x >= INT64_MAX ? INT64_MAX : int64_t(x); decimal.scale = s; } } diff --git a/utils/funcexp/func_truncate.cpp b/utils/funcexp/func_truncate.cpp index 7a529c00f..94dfbc7ea 100644 --- a/utils/funcexp/func_truncate.cpp +++ b/utils/funcexp/func_truncate.cpp @@ -440,7 +440,7 @@ IDB_Decimal Func_truncate::getDecimalVal(Row& row, FunctionParm& parm, bool& isN if (!isNull) { x *= p; - decimal.value = (int64_t)x; + decimal.value = x <= INT64_MIN ? INT64_MIN : x >= INT64_MAX ? INT64_MAX : int64_t(x); decimal.scale = s; } }