From c654e8621eb8b633eda2b024f5a07f8a4d25c515 Mon Sep 17 00:00:00 2001 From: David Hall Date: Wed, 27 Feb 2019 13:09:37 -0600 Subject: [PATCH] MCOL-1822 interim checkin --- dbcon/execplan/arithmeticoperator.h | 11 +++++++++++ dbcon/execplan/simplecolumn.h | 6 ++++++ dbcon/execplan/simplecolumn_decimal.h | 10 ++++++++++ dbcon/execplan/simplecolumn_int.h | 10 ++++++++++ dbcon/execplan/simplecolumn_uint.h | 10 ++++++++++ dbcon/execplan/simplefilter.h | 6 ++++++ dbcon/joblist/tupleunion.cpp | 8 ++------ dbcon/mysql/ha_calpont_impl.cpp | 1 - utils/rowgroup/rowaggregation.cpp | 17 ++++++----------- utils/rowgroup/rowgroup.h | 5 +++++ 10 files changed, 66 insertions(+), 18 deletions(-) diff --git a/dbcon/execplan/arithmeticoperator.h b/dbcon/execplan/arithmeticoperator.h index ca254075b..74b8fe271 100644 --- a/dbcon/execplan/arithmeticoperator.h +++ b/dbcon/execplan/arithmeticoperator.h @@ -123,6 +123,11 @@ public: evaluate(row, isNull, lop, rop); return TreeNode::getDoubleVal(); } + virtual long double getLongDoubleVal(rowgroup::Row& row, bool& isNull, ParseTree* lop, ParseTree* rop) + { + evaluate(row, isNull, lop, rop); + return TreeNode::getLongDoubleVal(); + } virtual IDB_Decimal getDecimalVal(rowgroup::Row& row, bool& isNull, ParseTree* lop, ParseTree* rop) { evaluate(row, isNull, lop, rop); @@ -194,9 +199,15 @@ inline void ArithmeticOperator::evaluate(rowgroup::Row& row, bool& isNull, Parse case execplan::CalpontSystemCatalog::DOUBLE: case execplan::CalpontSystemCatalog::FLOAT: + case execplan::CalpontSystemCatalog::UDOUBLE: + case execplan::CalpontSystemCatalog::UFLOAT: fResult.doubleVal = execute(lop->getDoubleVal(row, isNull), rop->getDoubleVal(row, isNull), isNull); break; + case execplan::CalpontSystemCatalog::LONGDOUBLE: + fResult.longDoubleVal = execute(lop->getLongDoubleVal(row, isNull), rop->getLongDoubleVal(row, isNull), isNull); + break; + case execplan::CalpontSystemCatalog::DECIMAL: case execplan::CalpontSystemCatalog::UDECIMAL: execute (fResult.decimalVal, lop->getDecimalVal(row, isNull), rop->getDecimalVal(row, isNull), isNull); diff --git a/dbcon/execplan/simplecolumn.h b/dbcon/execplan/simplecolumn.h index 60eff939b..634399f3c 100644 --- a/dbcon/execplan/simplecolumn.h +++ b/dbcon/execplan/simplecolumn.h @@ -300,6 +300,12 @@ public: return TreeNode::getDoubleVal(); } + virtual long double getLongDoubleVal(rowgroup::Row& row, bool& isNull) + { + evaluate(row, isNull); + return TreeNode::getLongDoubleVal(); + } + virtual IDB_Decimal getDecimalVal(rowgroup::Row& row, bool& isNull) { evaluate(row, isNull); diff --git a/dbcon/execplan/simplecolumn_decimal.h b/dbcon/execplan/simplecolumn_decimal.h index 2b7b90cf6..dc2fdc268 100644 --- a/dbcon/execplan/simplecolumn_decimal.h +++ b/dbcon/execplan/simplecolumn_decimal.h @@ -76,6 +76,7 @@ public: virtual inline int64_t getIntVal(rowgroup::Row& row, bool& isNull); virtual inline float getFloatVal(rowgroup::Row& row, bool& isNull); virtual inline double getDoubleVal(rowgroup::Row& row, bool& isNull); + virtual inline long double getLongDoubleVal(rowgroup::Row& row, bool& isNull); virtual inline IDB_Decimal getDecimalVal(rowgroup::Row& row, bool& isNull); /** The serialize interface */ @@ -180,6 +181,15 @@ inline double SimpleColumn_Decimal::getDoubleVal(rowgroup::Row& row, bool& return (row.getIntField(fInputIndex) / pow((double)10, fResultType.scale)); } +template +inline long double SimpleColumn_Decimal::getLongDoubleVal(rowgroup::Row& row, bool& isNull) +{ + if (row.equals(fNullVal, fInputIndex)) + isNull = true; + + return (row.getIntField(fInputIndex) / pow((double)10, fResultType.scale)); +} + template inline IDB_Decimal SimpleColumn_Decimal::getDecimalVal(rowgroup::Row& row, bool& isNull) { diff --git a/dbcon/execplan/simplecolumn_int.h b/dbcon/execplan/simplecolumn_int.h index fd171909c..1fe58dd17 100644 --- a/dbcon/execplan/simplecolumn_int.h +++ b/dbcon/execplan/simplecolumn_int.h @@ -75,6 +75,7 @@ public: virtual inline uint64_t getUintVal(rowgroup::Row& row, bool& isNull); virtual inline float getFloatVal(rowgroup::Row& row, bool& isNull); virtual inline double getDoubleVal(rowgroup::Row& row, bool& isNull); + virtual inline long double getLongDoubleVal(rowgroup::Row& row, bool& isNull); virtual inline IDB_Decimal getDecimalVal(rowgroup::Row& row, bool& isNull); /** The serialize interface */ @@ -198,6 +199,15 @@ inline double SimpleColumn_INT::getDoubleVal(rowgroup::Row& row, bool& isNu return (double)row.getIntField(fInputIndex); } +template +inline long double SimpleColumn_INT::getLongDoubleVal(rowgroup::Row& row, bool& isNull) +{ + if (row.equals(fNullVal, fInputIndex)) + isNull = true; + + return (long double)row.getIntField(fInputIndex); +} + template inline IDB_Decimal SimpleColumn_INT::getDecimalVal(rowgroup::Row& row, bool& isNull) { diff --git a/dbcon/execplan/simplecolumn_uint.h b/dbcon/execplan/simplecolumn_uint.h index 2bb98cbd4..4027994df 100644 --- a/dbcon/execplan/simplecolumn_uint.h +++ b/dbcon/execplan/simplecolumn_uint.h @@ -75,6 +75,7 @@ public: virtual inline uint64_t getUintVal(rowgroup::Row& row, bool& isNull); virtual inline float getFloatVal(rowgroup::Row& row, bool& isNull); virtual inline double getDoubleVal(rowgroup::Row& row, bool& isNull); + virtual inline long double getLongDoubleVal(rowgroup::Row& row, bool& isNull); virtual inline IDB_Decimal getDecimalVal(rowgroup::Row& row, bool& isNull); /** The serialize interface */ @@ -198,6 +199,15 @@ inline double SimpleColumn_UINT::getDoubleVal(rowgroup::Row& row, bool& isN return (double)row.getUintField(fInputIndex); } +template +inline long double SimpleColumn_UINT::getLongDoubleVal(rowgroup::Row& row, bool& isNull) +{ + if (row.equals(fNullVal, fInputIndex)) + isNull = true; + + return (long double)row.getUintField(fInputIndex); +} + template inline IDB_Decimal SimpleColumn_UINT::getDecimalVal(rowgroup::Row& row, bool& isNull) { diff --git a/dbcon/execplan/simplefilter.h b/dbcon/execplan/simplefilter.h index d784aefcd..2081710aa 100644 --- a/dbcon/execplan/simplefilter.h +++ b/dbcon/execplan/simplefilter.h @@ -212,6 +212,7 @@ public: inline virtual bool getBoolVal(rowgroup::Row& row, bool& isNull); inline virtual int64_t getIntVal(rowgroup::Row& row, bool& isNull); inline virtual double getDoubleVal(rowgroup::Row& row, bool& isNull); + inline virtual long double getLongDoubleVal(rowgroup::Row& row, bool& isNull); // get all simple columns involved in this column const std::vector& simpleColumnList(); @@ -253,6 +254,11 @@ inline double SimpleFilter::getDoubleVal(rowgroup::Row& row, bool& isNull) return getIntVal(row, isNull); } +inline long double SimpleFilter::getLongDoubleVal(rowgroup::Row& row, bool& isNull) +{ + return getIntVal(row, isNull); +} + typedef boost::shared_ptr SSFP; std::ostream& operator<<(std::ostream& output, const SimpleFilter& rhs); diff --git a/dbcon/joblist/tupleunion.cpp b/dbcon/joblist/tupleunion.cpp index d23a9d4d9..792b95713 100644 --- a/dbcon/joblist/tupleunion.cpp +++ b/dbcon/joblist/tupleunion.cpp @@ -513,16 +513,12 @@ void TupleUnion::normalize(const Row& in, Row* out) case CalpontSystemCatalog::LONGDOUBLE: { int scale = in.getScale(i); - + long double d = in.getIntField(i); if (scale != 0) { - long double d = in.getIntField(i); d /= (uint64_t) pow(10.0, scale); - out->setLongDoubleField(d, i); } - else - out->setLongDoubleField(in.getIntField(i), i); - + out->setLongDoubleField(d, i); break; } diff --git a/dbcon/mysql/ha_calpont_impl.cpp b/dbcon/mysql/ha_calpont_impl.cpp index 58170f5aa..c9af2fdd0 100644 --- a/dbcon/mysql/ha_calpont_impl.cpp +++ b/dbcon/mysql/ha_calpont_impl.cpp @@ -743,7 +743,6 @@ int fetchNextRow(uchar* buf, cal_table_info& ti, cal_connection_info* ci, bool h { f2->dec = row.getScale(s); } - dl /= pow(10.0, (double)f2->dec); f2->store(static_cast(dl)); if ((*f)->null_ptr) diff --git a/utils/rowgroup/rowaggregation.cpp b/utils/rowgroup/rowaggregation.cpp index ac3310326..7df68392b 100644 --- a/utils/rowgroup/rowaggregation.cpp +++ b/utils/rowgroup/rowaggregation.cpp @@ -1297,8 +1297,8 @@ void RowAggregation::doMinMax(const Row& rowIn, int64_t colIn, int64_t colOut, i case execplan::CalpontSystemCatalog::LONGDOUBLE: { - long double valIn = rowIn.getDoubleField(colIn); - long double valOut = fRow.getDoubleField(colOut); + long double valIn = rowIn.getLongDoubleField(colIn); + long double valOut = fRow.getLongDoubleField(colOut); updateLongDoubleMinMax(valIn, valOut, colOut, funcType); break; } @@ -3186,6 +3186,10 @@ void RowAggregationUM::doNullConstantAggregate(const ConstantAggData& aggData, u { case ROWAGG_MIN: case ROWAGG_MAX: + case ROWAGG_AVG: + case ROWAGG_SUM: + case ROWAGG_DISTINCT_AVG: + case ROWAGG_DISTINCT_SUM: case ROWAGG_STATS: { switch (colDataType) @@ -3258,15 +3262,6 @@ void RowAggregationUM::doNullConstantAggregate(const ConstantAggData& aggData, u } break; - case ROWAGG_AVG: - case ROWAGG_SUM: - case ROWAGG_DISTINCT_AVG: - case ROWAGG_DISTINCT_SUM: - { - fRow.setLongDoubleField(getLongDoubleNullValue(), colOut); - } - break; - case ROWAGG_COUNT_COL_NAME: case ROWAGG_COUNT_DISTINCT_COL_NAME: { diff --git a/utils/rowgroup/rowgroup.h b/utils/rowgroup/rowgroup.h index 1c3618735..cbf74ef32 100644 --- a/utils/rowgroup/rowgroup.h +++ b/utils/rowgroup/rowgroup.h @@ -1036,6 +1036,11 @@ inline void Row::setFloatField(float val, uint32_t colIndex) inline void Row::setLongDoubleField(long double val, uint32_t colIndex) { + if (sizeof(long double) == 16) + { + // zero out the unused portion as there may be garbage there. + *((uint64_t*)&val+1) &= 0x000000000000FFFFULL; + } *((long double*) &data[offsets[colIndex]]) = val; }