From 882f767b15e5bf2d901898743d84fa8bae00bc66 Mon Sep 17 00:00:00 2001 From: David Hall Date: Tue, 12 Nov 2019 17:17:35 -0600 Subject: [PATCH 1/4] MCOL-3607 Add long double support to math functions --- utils/funcexp/func_math.cpp | 243 ++++++++++++++++++++++++++++++++++++ 1 file changed, 243 insertions(+) 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); From ea8e604324c8f4618176d3f46e8bb35db09d4f15 Mon Sep 17 00:00:00 2001 From: David Hall Date: Wed, 13 Nov 2019 09:29:40 -0600 Subject: [PATCH 2/4] MCOL-3607 Fixed some types for long double math functions --- utils/funcexp/func_math.cpp | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/utils/funcexp/func_math.cpp b/utils/funcexp/func_math.cpp index ee422703b..8690999db 100644 --- a/utils/funcexp/func_math.cpp +++ b/utils/funcexp/func_math.cpp @@ -340,8 +340,6 @@ double Func_asin::getDoubleVal(Row& row, } } - - // // atan // @@ -411,7 +409,7 @@ double Func_atan::getDoubleVal(Row& row, // null value is indicated by isNull long double value = parm[0]->data()->getLongDoubleVal(row, isNull); - if (isNull || (value < -1.0 || value > 1.0)) + if (isNull) { isNull = true; return doubleNullVal(); @@ -607,7 +605,7 @@ double Func_cos::getDoubleVal(Row& row, // null value is indicated by isNull long double value = parm[0]->data()->getLongDoubleVal(row, isNull); - if (isNull || (value < -1.0 || value > 1.0)) + if (isNull) { isNull = true; return doubleNullVal(); @@ -1146,19 +1144,6 @@ double Func_log2::getDoubleVal(Row& row, 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; @@ -1430,7 +1415,7 @@ double Func_sin::getDoubleVal(Row& row, // null value is indicated by NaN long double value = parm[0]->data()->getLongDoubleVal(row, isNull); - if (isNull || value <= 0.0) + if (isNull) { isNull = true; return doubleNullVal(); @@ -1694,7 +1679,7 @@ double Func_tan::getDoubleVal(Row& row, // null value is indicated by NaN long double value = parm[0]->data()->getLongDoubleVal(row, isNull); - if (isNull || value <= 0.0) + if (isNull) { isNull = true; return doubleNullVal(); From 69e7880358489c939fd5d50720c9c99a4a218428 Mon Sep 17 00:00:00 2001 From: David Hall Date: Thu, 14 Nov 2019 11:02:05 -0600 Subject: [PATCH 3/4] MCOL-3607 sqrt should handle 0.0 --- utils/funcexp/func_math.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/funcexp/func_math.cpp b/utils/funcexp/func_math.cpp index 8690999db..705a13620 100644 --- a/utils/funcexp/func_math.cpp +++ b/utils/funcexp/func_math.cpp @@ -1547,7 +1547,7 @@ double Func_sqrt::getDoubleVal(Row& row, // null value is indicated by NaN long double value = parm[0]->data()->getLongDoubleVal(row, isNull); - if (isNull || value <= 0.0) + if (isNull || value < 0.0) { isNull = true; return doubleNullVal(); From 1c0afc95bc280890fd65e276fa4b9f58d28ec0de Mon Sep 17 00:00:00 2001 From: jmrojas2332 Date: Tue, 19 Nov 2019 14:07:47 +0000 Subject: [PATCH 4/4] MCOL 2072 Query Stats supress warning when calling libmysql::run --- utils/libmysql_client/libmysql_client.cpp | 4 ++-- utils/libmysql_client/libmysql_client.h | 2 +- utils/querystats/querystats.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/utils/libmysql_client/libmysql_client.cpp b/utils/libmysql_client/libmysql_client.cpp index 32f117dd5..71cf6ec3d 100644 --- a/utils/libmysql_client/libmysql_client.cpp +++ b/utils/libmysql_client/libmysql_client.cpp @@ -96,7 +96,7 @@ int LibMySQL::init(const char* h, unsigned int p, const char* u, const char* w, } -int LibMySQL::run(const char* query) +int LibMySQL::run(const char* query, bool resultExpected) { int ret = 0; @@ -109,7 +109,7 @@ int LibMySQL::run(const char* query) fRes = mysql_use_result(fCon); - if (fRes == NULL) + if (fRes == NULL && resultExpected) { fErrStr = "fatal error running mysql_use_result() or empty result set in libmysql_client lib"; ret = -1; diff --git a/utils/libmysql_client/libmysql_client.h b/utils/libmysql_client/libmysql_client.h index b866d4104..e7437c83c 100644 --- a/utils/libmysql_client/libmysql_client.h +++ b/utils/libmysql_client/libmysql_client.h @@ -36,7 +36,7 @@ public: int init(const char*, unsigned int, const char*, const char*, const char*); // run the query - int run(const char* q); + int run(const char* q, bool resultExpected = true); void handleMySqlError(const char*, int); diff --git a/utils/querystats/querystats.cpp b/utils/querystats/querystats.cpp index 306ed7c11..cc9a1d51c 100644 --- a/utils/querystats/querystats.cpp +++ b/utils/querystats/querystats.cpp @@ -228,7 +228,7 @@ void QueryStats::insert() insert << fNumFiles << ", "; insert << fFileBytes << ")"; // the last 2 fields are not populated yet - ret = mysql.run(insert.str().c_str()); + ret = mysql.run(insert.str().c_str(), false); if (ret != 0) mysql.handleMySqlError(mysql.getError().c_str(), ret);