diff --git a/mysql-test/columnstore/basic/r/mcs247_from_unixtime_funtion.result b/mysql-test/columnstore/basic/r/mcs247_from_unixtime_funtion.result index fd180728e..f2697a81b 100644 --- a/mysql-test/columnstore/basic/r/mcs247_from_unixtime_funtion.result +++ b/mysql-test/columnstore/basic/r/mcs247_from_unixtime_funtion.result @@ -18,6 +18,9 @@ FROM_UNIXTIME(0) SELECT FROM_UNIXTIME(-1) FROM t1 LIMIT 1; FROM_UNIXTIME(-1) NULL +SELECT FROM_UNIXTIME(-0.1) FROM t1 LIMIT 1; +FROM_UNIXTIME(-0.1) +NULL SELECT FROM_UNIXTIME(1) FROM t1 LIMIT 1; FROM_UNIXTIME(1) 1970-01-01 00:00:01 diff --git a/mysql-test/columnstore/basic/t/mcs247_from_unixtime_funtion.test b/mysql-test/columnstore/basic/t/mcs247_from_unixtime_funtion.test index 65475aa27..42efb2fdc 100644 --- a/mysql-test/columnstore/basic/t/mcs247_from_unixtime_funtion.test +++ b/mysql-test/columnstore/basic/t/mcs247_from_unixtime_funtion.test @@ -31,6 +31,7 @@ INSERT INTO t1 VALUES(9913, 98765.4321, repeat('q', 5), '09-12-11', '01:08:59'); SELECT FROM_UNIXTIME(0) FROM t1 LIMIT 1; SELECT FROM_UNIXTIME(-1) FROM t1 LIMIT 1; +SELECT FROM_UNIXTIME(-0.1) FROM t1 LIMIT 1; SELECT FROM_UNIXTIME(1) FROM t1 LIMIT 1; SELECT FROM_UNIXTIME(1547432997) FROM t1 LIMIT 1; SELECT FROM_UNIXTIME('1547432997') FROM t1 LIMIT 1; diff --git a/utils/funcexp/func_from_unixtime.cpp b/utils/funcexp/func_from_unixtime.cpp index 6f9279661..176cec406 100644 --- a/utils/funcexp/func_from_unixtime.cpp +++ b/utils/funcexp/func_from_unixtime.cpp @@ -51,6 +51,12 @@ DateTime getDateTime(rowgroup::Row& row, FunctionParm& parm, bool& isNull) case execplan::CalpontSystemCatalog::DOUBLE: { double value = parm[0]->data()->getDoubleVal(row, isNull); + if (value < 0) + { + isNull = true; + return 0; + } + double fracpart, intpart; fracpart = modf(value, &intpart); val = (int64_t)intpart; @@ -62,6 +68,12 @@ DateTime getDateTime(rowgroup::Row& row, FunctionParm& parm, bool& isNull) { IDB_Decimal dec = parm[0]->data()->getDecimalVal(row, isNull); + if (dec.value < 0) + { + isNull = true; + return 0; + } + if (parm[0]->data()->resultType().colWidth == datatypes::MAXDECIMALWIDTH) { auto integralAndFractional = dec.getIntegralAndFractional();