diff --git a/be/src/runtime/primitive_type.h b/be/src/runtime/primitive_type.h index c33f446e2cfa0e..c503721cfe0e30 100644 --- a/be/src/runtime/primitive_type.h +++ b/be/src/runtime/primitive_type.h @@ -270,7 +270,6 @@ struct PrimitiveTypeTraits; * ColumnItemType: Data item type in column * DataType: DataType which is mapping to this PrimitiveType * ColumnType: ColumnType which is mapping to this PrimitiveType - * NearestPrimitiveType: Nearest primitive type */ template <> struct PrimitiveTypeTraits { @@ -280,8 +279,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = vectorized::UInt8; using DataType = vectorized::DataTypeBool; using ColumnType = vectorized::ColumnUInt8; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_BIGINT; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_BIGINT; }; template <> struct PrimitiveTypeTraits { @@ -291,8 +288,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeInt8; using ColumnType = vectorized::ColumnInt8; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_BIGINT; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_BIGINT; }; template <> struct PrimitiveTypeTraits { @@ -302,8 +297,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeInt16; using ColumnType = vectorized::ColumnInt16; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_BIGINT; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_BIGINT; }; template <> struct PrimitiveTypeTraits { @@ -313,8 +306,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeInt32; using ColumnType = vectorized::ColumnInt32; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_BIGINT; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_BIGINT; }; template <> struct PrimitiveTypeTraits { @@ -324,8 +315,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeInt64; using ColumnType = vectorized::ColumnInt64; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_BIGINT; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_LARGEINT; }; template <> struct PrimitiveTypeTraits { @@ -335,8 +324,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeInt128; using ColumnType = vectorized::ColumnInt128; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_LARGEINT; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_LARGEINT; }; template <> struct PrimitiveTypeTraits { @@ -346,8 +333,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeNothing; using ColumnType = vectorized::IColumnDummy; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_NULL; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_NULL; }; template <> struct PrimitiveTypeTraits { @@ -357,8 +342,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeFloat32; using ColumnType = vectorized::ColumnFloat32; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_DOUBLE; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_DOUBLE; }; template <> struct PrimitiveTypeTraits { @@ -368,8 +351,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeFloat64; using ColumnType = vectorized::ColumnFloat64; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_DOUBLE; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_DOUBLE; }; template <> struct PrimitiveTypeTraits { @@ -379,8 +360,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeTimeV2; using ColumnType = vectorized::ColumnTimeV2; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_DOUBLE; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_DOUBLE; }; template <> struct PrimitiveTypeTraits { @@ -390,8 +369,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeTimeV2; using ColumnType = vectorized::ColumnTime; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_DOUBLE; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_DOUBLE; }; template <> struct PrimitiveTypeTraits { @@ -402,8 +379,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = vectorized::Int64; using DataType = vectorized::DataTypeDate; using ColumnType = vectorized::ColumnDate; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_DATE; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_DATE; }; template <> struct PrimitiveTypeTraits { @@ -413,8 +388,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = vectorized::Int64; using DataType = vectorized::DataTypeDateTime; using ColumnType = vectorized::ColumnDateTime; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_DATETIME; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_DATETIME; }; template <> struct PrimitiveTypeTraits { @@ -424,8 +397,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = vectorized::UInt64; using DataType = vectorized::DataTypeDateTimeV2; using ColumnType = vectorized::ColumnDateTimeV2; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_DATETIMEV2; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_DATETIMEV2; }; template <> struct PrimitiveTypeTraits { @@ -435,8 +406,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = vectorized::UInt32; using DataType = vectorized::DataTypeDateV2; using ColumnType = vectorized::ColumnDateV2; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_DATEV2; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_DATEV2; }; template <> @@ -447,9 +416,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = vectorized::UInt64; using DataType = vectorized::DataTypeTimeStampTz; using ColumnType = vectorized::ColumnTimeStampTz; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_TIMESTAMPTZ; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_TIMESTAMPTZ; - static constexpr PrimitiveType AvgNearestPrimitiveType256 = TYPE_TIMESTAMPTZ; }; template <> @@ -461,8 +427,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = vectorized::Decimal128V2; using DataType = vectorized::DataTypeDecimalV2; using ColumnType = vectorized::ColumnDecimal128V2; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_DECIMALV2; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_DECIMALV2; }; template <> struct PrimitiveTypeTraits { @@ -472,8 +436,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeDecimal32; using ColumnType = vectorized::ColumnDecimal32; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_DECIMAL32; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_DECIMAL128I; }; template <> struct PrimitiveTypeTraits { @@ -483,8 +445,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeDecimal64; using ColumnType = vectorized::ColumnDecimal64; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_DECIMAL64; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_DECIMAL128I; }; template <> struct PrimitiveTypeTraits { @@ -494,8 +454,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeDecimal128; using ColumnType = vectorized::ColumnDecimal128V3; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_DECIMAL128I; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_DECIMAL128I; }; template <> struct PrimitiveTypeTraits { @@ -505,8 +463,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeDecimal256; using ColumnType = vectorized::ColumnDecimal256; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_DECIMAL256; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_DECIMAL256; }; template <> struct PrimitiveTypeTraits { @@ -516,8 +472,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeIPv4; using ColumnType = vectorized::ColumnIPv4; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_IPV4; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_IPV4; }; template <> struct PrimitiveTypeTraits { @@ -527,8 +481,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeIPv6; using ColumnType = vectorized::ColumnIPv6; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_IPV6; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_IPV6; }; template <> struct PrimitiveTypeTraits { @@ -538,8 +490,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeString; using ColumnType = vectorized::ColumnString; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_CHAR; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_CHAR; }; template <> struct PrimitiveTypeTraits { @@ -549,8 +499,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeString; using ColumnType = vectorized::ColumnString; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_VARCHAR; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_VARCHAR; }; template <> struct PrimitiveTypeTraits { @@ -560,8 +508,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeString; using ColumnType = vectorized::ColumnString; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_STRING; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_STRING; }; template <> struct PrimitiveTypeTraits { @@ -571,9 +517,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeVarbinary; using ColumnType = vectorized::ColumnVarbinary; - // StringView is non-owning, but StringViewField wraps it with String for ownership - static constexpr PrimitiveType NearestPrimitiveType = TYPE_VARBINARY; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_VARBINARY; }; template <> struct PrimitiveTypeTraits { @@ -583,8 +526,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeHLL; using ColumnType = vectorized::ColumnHLL; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_HLL; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_HLL; }; template <> struct PrimitiveTypeTraits { @@ -594,8 +535,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeJsonb; using ColumnType = vectorized::ColumnString; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_JSONB; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_JSONB; }; template <> struct PrimitiveTypeTraits { @@ -605,8 +544,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeArray; using ColumnType = vectorized::ColumnArray; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_ARRAY; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_ARRAY; }; template <> struct PrimitiveTypeTraits { @@ -616,8 +553,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeMap; using ColumnType = vectorized::ColumnMap; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_MAP; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_MAP; }; template <> struct PrimitiveTypeTraits { @@ -627,8 +562,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeStruct; using ColumnType = vectorized::ColumnStruct; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_STRUCT; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_STRUCT; }; template <> struct PrimitiveTypeTraits { @@ -638,8 +571,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeVariant; using ColumnType = vectorized::ColumnVariant; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_VARIANT; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_VARIANT; }; template <> struct PrimitiveTypeTraits { @@ -649,8 +580,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeBitMap; using ColumnType = vectorized::ColumnBitmap; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_BITMAP; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_BITMAP; }; template <> struct PrimitiveTypeTraits { @@ -660,8 +589,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeQuantileState; using ColumnType = vectorized::ColumnQuantileState; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_QUANTILE_STATE; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_QUANTILE_STATE; }; template <> struct PrimitiveTypeTraits { @@ -671,8 +598,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeNothing; using ColumnType = vectorized::ColumnOffset32; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_UINT32; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_UINT32; }; template <> struct PrimitiveTypeTraits { @@ -682,8 +607,6 @@ struct PrimitiveTypeTraits { using ColumnItemType = CppType; using DataType = vectorized::DataTypeNothing; using ColumnType = vectorized::ColumnOffset64; - static constexpr PrimitiveType NearestPrimitiveType = TYPE_UINT64; - static constexpr PrimitiveType AvgNearestPrimitiveType = TYPE_DOUBLE; }; template diff --git a/be/src/vec/aggregate_functions/aggregate_function_avg.cpp b/be/src/vec/aggregate_functions/aggregate_function_avg.cpp index bf73f3fc2e996f..d48128a7133bd7 100644 --- a/be/src/vec/aggregate_functions/aggregate_function_avg.cpp +++ b/be/src/vec/aggregate_functions/aggregate_function_avg.cpp @@ -28,13 +28,25 @@ namespace doris::vectorized { #include "common/compile_check_begin.h" +constexpr PrimitiveType result_type(PrimitiveType T) { + if (T == TYPE_LARGEINT) { + return TYPE_LARGEINT; + } else if (is_int_or_bool(T)) { + return TYPE_BIGINT; + } else if (is_float_or_double(T) || is_time_type(T)) { + return TYPE_DOUBLE; + } else if (is_decimalv3(T) && T != TYPE_DECIMAL256) { + return TYPE_DECIMAL128I; + } else { + return T; + } +} + // TODO: use result type got from FE plan template struct Avg { static constexpr PrimitiveType ResultPType = T == TYPE_DECIMALV2 ? T : TYPE_DOUBLE; - using Function = AggregateFunctionAvg< - T, ResultPType, - AggregateFunctionAvgData::AvgNearestPrimitiveType>>; + using Function = AggregateFunctionAvg>; }; template diff --git a/be/src/vec/aggregate_functions/aggregate_function_sum.h b/be/src/vec/aggregate_functions/aggregate_function_sum.h index e7967db7d9498e..d1be3edcfa3f5f 100644 --- a/be/src/vec/aggregate_functions/aggregate_function_sum.h +++ b/be/src/vec/aggregate_functions/aggregate_function_sum.h @@ -285,13 +285,24 @@ class AggregateFunctionSum final UInt32 scale; }; +constexpr PrimitiveType result_type(PrimitiveType T) { + if (T == TYPE_LARGEINT) { + return TYPE_LARGEINT; + } else if (is_int_or_bool(T)) { + return TYPE_BIGINT; + } else if (is_float_or_double(T) || is_time_type(T)) { + return TYPE_DOUBLE; + } else { + return T; + } +} + // TODO: use result type from FE plan template struct SumSimple { static_assert(!is_decimalv3(T)); /// @note It uses slow Decimal128 (cause we need such a variant). sumWithOverflow is faster for Decimal32/64 - static constexpr PrimitiveType ResultType = - T == TYPE_DECIMALV2 ? TYPE_DECIMALV2 : PrimitiveTypeTraits::NearestPrimitiveType; + static constexpr PrimitiveType ResultType = result_type(T); using AggregateDataType = AggregateFunctionSumData; using Function = AggregateFunctionSum; };