diff --git a/utils/funcexp/func_math.cpp b/utils/funcexp/func_math.cpp index 6ef3868c2..705a13620 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); @@ -310,8 +340,6 @@ double Func_asin::getDoubleVal(Row& row, } } - - // // atan // @@ -376,6 +404,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) + { + 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 +600,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) + { + isNull = true; + return doubleNullVal(); + } + + return cos(value); + } + break; + case execplan::CalpontSystemCatalog::DATE: { int32_t value = parm[0]->data()->getDateIntVal(row, isNull); @@ -672,6 +741,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 +929,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 +1132,22 @@ 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(); + } + + return log2(value); + } + break; + case execplan::CalpontSystemCatalog::DATE: { int32_t value = parm[0]->data()->getDateIntVal(row, isNull); @@ -1132,6 +1270,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 +1410,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) + { + isNull = true; + return doubleNullVal(); + } + + return sin(value); + } + break; + case execplan::CalpontSystemCatalog::DATE: { int32_t value = parm[0]->data()->getDateIntVal(row, isNull); @@ -1374,6 +1542,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 +1674,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) + { + isNull = true; + return doubleNullVal(); + } + + return tan(value); + } + break; + case execplan::CalpontSystemCatalog::DATE: { int32_t value = parm[0]->data()->getDateIntVal(row, isNull); @@ -1859,6 +2057,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 +2189,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); 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);