diff --git a/utils/funcexp/func_math.cpp b/utils/funcexp/func_math.cpp index 6ef3868c2..ee422703b 100644 --- a/utils/funcexp/func_math.cpp +++ b/utils/funcexp/func_math.cpp @@ -127,6 +127,21 @@ double Func_acos::getDoubleVal(Row& row, } break; + case execplan::CalpontSystemCatalog::LONGDOUBLE: + { + // null value is indicated by NaN + long double value = parm[0]->data()->getLongDoubleVal(row, isNull); + + if (isNull || (value < -1.0 || value > 1.0)) + { + isNull = true; + return doubleNullVal(); + } + + return acos(value); + } + break; + case execplan::CalpontSystemCatalog::DATE: { int32_t value = parm[0]->data()->getDateIntVal(row, isNull); @@ -245,6 +260,21 @@ double Func_asin::getDoubleVal(Row& row, } break; + case execplan::CalpontSystemCatalog::LONGDOUBLE: + { + // null value is indicated by isNull + long double value = parm[0]->data()->getLongDoubleVal(row, isNull); + + if (isNull || (value < -1.0 || value > 1.0)) + { + isNull = true; + return doubleNullVal(); + } + + return asin(value); + } + break; + case execplan::CalpontSystemCatalog::DATE: { int32_t value = parm[0]->data()->getDateIntVal(row, isNull); @@ -376,6 +406,32 @@ double Func_atan::getDoubleVal(Row& row, } break; + case execplan::CalpontSystemCatalog::LONGDOUBLE: + { + // null value is indicated by isNull + long double value = parm[0]->data()->getLongDoubleVal(row, isNull); + + if (isNull || (value < -1.0 || value > 1.0)) + { + isNull = true; + return doubleNullVal(); + } + if (parm.size() > 1 ) + { + long double value2 = parm[1]->data()->getLongDoubleVal(row, isNull); + + if (isNull) + { + isNull = true; + return doubleNullVal(); + } + + return atan2(value, value2); + } + return atan(value); + } + break; + case execplan::CalpontSystemCatalog::DATE: { int32_t value = parm[0]->data()->getDateIntVal(row, isNull); @@ -546,6 +602,21 @@ double Func_cos::getDoubleVal(Row& row, } break; + case execplan::CalpontSystemCatalog::LONGDOUBLE: + { + // null value is indicated by isNull + long double value = parm[0]->data()->getLongDoubleVal(row, isNull); + + if (isNull || (value < -1.0 || value > 1.0)) + { + isNull = true; + return doubleNullVal(); + } + + return cos(value); + } + break; + case execplan::CalpontSystemCatalog::DATE: { int32_t value = parm[0]->data()->getDateIntVal(row, isNull); @@ -672,6 +743,30 @@ double Func_cot::getDoubleVal(Row& row, } break; + case execplan::CalpontSystemCatalog::LONGDOUBLE: + { + // null value is indicated by NaN + long double value = parm[0]->data()->getLongDoubleVal(row, isNull); + + if (value == 0) + { + Message::Args args; + args.add("cot"); + args.add((double)value); + unsigned errcode = ERR_FUNC_OUT_OF_RANGE_RESULT; + throw IDBExcept(IDBErrorInfo::instance()->errorMsg(errcode, args), errcode); + } + + if (isNull) + { + isNull = true; + return doubleNullVal(); + } + + return 1.0 / tan(value); + } + break; + case execplan::CalpontSystemCatalog::DATE: { int32_t value = parm[0]->data()->getDateIntVal(row, isNull); @@ -836,6 +931,35 @@ double Func_log::getDoubleVal(Row& row, } break; + case execplan::CalpontSystemCatalog::LONGDOUBLE: + { + // null value is indicated by NaN + long double value = parm[0]->data()->getLongDoubleVal(row, isNull); + + + if (isNull || value <= 0.0) + { + isNull = true; + return doubleNullVal(); + } + + if (parm.size() > 1 ) + { + long double value2 = parm[1]->data()->getLongDoubleVal(row, isNull); + + if (isNull || (value2 <= 0.0 || value == 1.0) ) + { + isNull = true; + return doubleNullVal(); + } + + return log(value2) / log(value); + } + + return log(value); + } + break; + case execplan::CalpontSystemCatalog::DATE: { int32_t value = parm[0]->data()->getDateIntVal(row, isNull); @@ -1010,6 +1134,35 @@ double Func_log2::getDoubleVal(Row& row, } break; + case execplan::CalpontSystemCatalog::LONGDOUBLE: + { + // null value is indicated by NaN + long double value = parm[0]->data()->getLongDoubleVal(row, isNull); + + + if (isNull || value <= 0.0) + { + isNull = true; + return doubleNullVal(); + } + + if (parm.size() > 1 ) + { + long double value2 = parm[1]->data()->getLongDoubleVal(row, isNull); + + if (isNull || (value2 <= 0.0 || value == 1.0) ) + { + isNull = true; + return doubleNullVal(); + } + + return log2(value2) / log(value); + } + + return log2(value); + } + break; + case execplan::CalpontSystemCatalog::DATE: { int32_t value = parm[0]->data()->getDateIntVal(row, isNull); @@ -1132,6 +1285,21 @@ double Func_log10::getDoubleVal(Row& row, } break; + case execplan::CalpontSystemCatalog::LONGDOUBLE: + { + // null value is indicated by NaN + long double value = parm[0]->data()->getLongDoubleVal(row, isNull); + + if (isNull || value <= 0.0) + { + isNull = true; + return doubleNullVal(); + } + + return log10(value); + } + break; + case execplan::CalpontSystemCatalog::DATE: { int32_t value = parm[0]->data()->getDateIntVal(row, isNull); @@ -1257,6 +1425,21 @@ double Func_sin::getDoubleVal(Row& row, } break; + case execplan::CalpontSystemCatalog::LONGDOUBLE: + { + // null value is indicated by NaN + long double value = parm[0]->data()->getLongDoubleVal(row, isNull); + + if (isNull || value <= 0.0) + { + isNull = true; + return doubleNullVal(); + } + + return sin(value); + } + break; + case execplan::CalpontSystemCatalog::DATE: { int32_t value = parm[0]->data()->getDateIntVal(row, isNull); @@ -1374,6 +1557,21 @@ double Func_sqrt::getDoubleVal(Row& row, } break; + case execplan::CalpontSystemCatalog::LONGDOUBLE: + { + // null value is indicated by NaN + long double value = parm[0]->data()->getLongDoubleVal(row, isNull); + + if (isNull || value <= 0.0) + { + isNull = true; + return doubleNullVal(); + } + + return sqrt(value); + } + break; + case execplan::CalpontSystemCatalog::DATE: { int32_t value = parm[0]->data()->getDateIntVal(row, isNull); @@ -1491,6 +1689,21 @@ double Func_tan::getDoubleVal(Row& row, } break; + case execplan::CalpontSystemCatalog::LONGDOUBLE: + { + // null value is indicated by NaN + long double value = parm[0]->data()->getLongDoubleVal(row, isNull); + + if (isNull || value <= 0.0) + { + isNull = true; + return doubleNullVal(); + } + + return tan(value); + } + break; + case execplan::CalpontSystemCatalog::DATE: { int32_t value = parm[0]->data()->getDateIntVal(row, isNull); @@ -1859,6 +2072,21 @@ double Func_radians::getDoubleVal(Row& row, } break; + case execplan::CalpontSystemCatalog::LONGDOUBLE: + { + // null value is indicated by isNull + long double value = parm[0]->data()->getLongDoubleVal(row, isNull); + + if (isNull) + { + isNull = true; + return doubleNullVal(); + } + + return radians(value); + } + break; + case execplan::CalpontSystemCatalog::DATE: { int32_t value = parm[0]->data()->getDateIntVal(row, isNull); @@ -1976,6 +2204,21 @@ double Func_degrees::getDoubleVal(Row& row, } break; + case execplan::CalpontSystemCatalog::LONGDOUBLE: + { + // null value is indicated by isNull + long double value = parm[0]->data()->getLongDoubleVal(row, isNull); + + if (isNull) + { + isNull = true; + return doubleNullVal(); + } + + return degrees(value); + } + break; + case execplan::CalpontSystemCatalog::DATE: { int32_t value = parm[0]->data()->getDateIntVal(row, isNull);