From 7c41d091d15f764ad3c409c97852007c21c2e7e6 Mon Sep 17 00:00:00 2001 From: Han Fei Date: Mon, 11 Mar 2019 18:20:18 +0800 Subject: [PATCH] fix decimal bug --- .../AggregateFunctions/AggregateFunctionAvg.h | 29 +++++++++++++++++-- .../AggregateFunctions/AggregateFunctionSum.h | 29 +++++++++++++++++-- .../AggregateFunctions/IAggregateFunction.h | 2 ++ 3 files changed, 55 insertions(+), 5 deletions(-) diff --git a/dbms/src/AggregateFunctions/AggregateFunctionAvg.h b/dbms/src/AggregateFunctions/AggregateFunctionAvg.h index 18b734885cd..471691328f0 100644 --- a/dbms/src/AggregateFunctions/AggregateFunctionAvg.h +++ b/dbms/src/AggregateFunctions/AggregateFunctionAvg.h @@ -44,6 +44,16 @@ class AggregateFunctionAvg final : public IAggregateFunctionDataHelper) @@ -54,33 +64,48 @@ class AggregateFunctionAvg final : public IAggregateFunctionDataHelper) { + place = adjust_place(place); + } this->data(place).sum += static_cast &>(*columns[0]).getData()[row_num]; ++this->data(place).count; } void merge(AggregateDataPtr place, ConstAggregateDataPtr rhs, Arena *) const override { + if constexpr (IsDecimal) { + place = adjust_place(place); + rhs = adjust_place(rhs); + } this->data(place).sum += this->data(rhs).sum; this->data(place).count += this->data(rhs).count; } void serialize(ConstAggregateDataPtr place, WriteBuffer & buf) const override { + if constexpr (IsDecimal) { + place = adjust_place(place); + } writeBinary(this->data(place).sum, buf); writeVarUInt(this->data(place).count, buf); } void deserialize(AggregateDataPtr place, ReadBuffer & buf, Arena *) const override { + if constexpr (IsDecimal) { + place = adjust_place(place); + } readBinary(this->data(place).sum, buf); readVarUInt(this->data(place).count, buf); } void insertResultInto(ConstAggregateDataPtr place, IColumn & to) const override { - if constexpr (IsDecimal) + if constexpr (IsDecimal) { + place = adjust_place(place); static_cast(to).getData().push_back( this->data(place).sum.getAvg(this->data(place).count, result_prec, result_scale)); + } else static_cast(to).getData().push_back( static_cast(this->data(place).sum) / this->data(place).count); @@ -89,7 +114,7 @@ class AggregateFunctionAvg final : public IAggregateFunctionDataHelper::Type>; if constexpr (IsDecimal) - new (place) Data(result_prec, result_scale); + new (adjust_place(place)) Data(result_prec, result_scale); else new (place) Data; } diff --git a/dbms/src/AggregateFunctions/AggregateFunctionSum.h b/dbms/src/AggregateFunctions/AggregateFunctionSum.h index 45b66929281..dc45fe10146 100644 --- a/dbms/src/AggregateFunctions/AggregateFunctionSum.h +++ b/dbms/src/AggregateFunctions/AggregateFunctionSum.h @@ -107,7 +107,7 @@ class AggregateFunctionSum final : public IAggregateFunctionDataHelper && IsDecimal) - new (place) Data(result_prec, result_scale); + if constexpr (IsDecimal && IsDecimal) { + new (adjust_place(place)) Data(result_prec, result_scale); + } else new (place) Data; } void add(AggregateDataPtr place, const IColumn ** columns, size_t row_num, Arena *) const override { + if constexpr (IsDecimal && IsDecimal) + place = adjust_place(place); this->data(place).add(static_cast &>(*columns[0]).getData()[row_num]); } void merge(AggregateDataPtr place, ConstAggregateDataPtr rhs, Arena *) const override { + if constexpr (IsDecimal && IsDecimal) { + place = adjust_place(place); + rhs = adjust_place(rhs); + } this->data(place).merge(this->data(rhs)); } void serialize(ConstAggregateDataPtr place, WriteBuffer & buf) const override { + if constexpr (IsDecimal && IsDecimal) + place = adjust_place(place); this->data(place).write(buf); } void deserialize(AggregateDataPtr place, ReadBuffer & buf, Arena *) const override { + if constexpr (IsDecimal && IsDecimal) + place = adjust_place(place); this->data(place).read(buf); } void insertResultInto(ConstAggregateDataPtr place, IColumn & to) const override { + if constexpr (IsDecimal && IsDecimal) + place = adjust_place(place); static_cast &>(to).getData().push_back(this->data(place).get()); } diff --git a/dbms/src/AggregateFunctions/IAggregateFunction.h b/dbms/src/AggregateFunctions/IAggregateFunction.h index 96d03f1be63..b0a72eb81ab 100644 --- a/dbms/src/AggregateFunctions/IAggregateFunction.h +++ b/dbms/src/AggregateFunctions/IAggregateFunction.h @@ -154,6 +154,8 @@ class IAggregateFunctionDataHelper : public IAggregateFunctionHelper size_t sizeOfData() const override { + if constexpr (IsDecimal) + return sizeof(Data) + 32; return sizeof(Data); }