diff --git a/be/src/vec/aggregate_functions/aggregate_function_approx_count_distinct.h b/be/src/vec/aggregate_functions/aggregate_function_approx_count_distinct.h index e66686d725..f9be31ac0a 100644 --- a/be/src/vec/aggregate_functions/aggregate_function_approx_count_distinct.h +++ b/be/src/vec/aggregate_functions/aggregate_function_approx_count_distinct.h @@ -22,6 +22,7 @@ #include "udf/udf.h" #include "vec/aggregate_functions/aggregate_function.h" #include "vec/aggregate_functions/aggregate_function_simple_factory.h" +#include "vec/common/hash_table/hash.h" #include "vec/common/string_ref.h" #include "vec/data_types/data_type_number.h" #include "vec/io/io_helper.h" @@ -31,9 +32,7 @@ namespace doris::vectorized { struct AggregateFunctionApproxCountDistinctData { HyperLogLog hll_data; - void add(StringRef value) { - StringVal sv = value.to_string_val(); - uint64_t hash_value = AnyValUtil::hash64_murmur(sv, HashUtil::MURMUR_SEED); + void add(uint64_t hash_value) { if (hash_value != 0) { hll_data.update(hash_value); } @@ -80,7 +79,17 @@ public: void add(AggregateDataPtr __restrict place, const IColumn** columns, size_t row_num, Arena*) const override { - this->data(place).add(static_cast(columns[0])->get_data_at(row_num)); + if constexpr (IsFixLenColumnType::value) { + auto column = static_cast(columns[0]); + auto value = column->get_element(row_num); + this->data(place).add( + HashUtil::murmur_hash64A((char*)&value, sizeof(value), HashUtil::MURMUR_SEED)); + } else { + auto value = static_cast(columns[0])->get_data_at(row_num); + StringVal sv = value.to_string_val(); + uint64_t hash_value = AnyValUtil::hash64_murmur(sv, HashUtil::MURMUR_SEED); + this->data(place).add(hash_value); + } } void reset(AggregateDataPtr place) const override { this->data(place).reset(); } diff --git a/be/src/vec/columns/column_decimal.h b/be/src/vec/columns/column_decimal.h index 8f6520e92c..a3960067cb 100644 --- a/be/src/vec/columns/column_decimal.h +++ b/be/src/vec/columns/column_decimal.h @@ -298,8 +298,4 @@ ColumnPtr ColumnDecimal::index_impl(const PaddedPODArray& indexes, size return res; } -using ColumnDecimal32 = ColumnDecimal; -using ColumnDecimal64 = ColumnDecimal; -using ColumnDecimal128 = ColumnDecimal; - } // namespace doris::vectorized diff --git a/be/src/vec/columns/columns_number.h b/be/src/vec/columns/columns_number.h index 2cc96d3f39..df21f7e567 100644 --- a/be/src/vec/columns/columns_number.h +++ b/be/src/vec/columns/columns_number.h @@ -20,6 +20,7 @@ #pragma once +#include "vec/columns/column_decimal.h" #include "vec/columns/column_vector.h" #include "vec/core/types.h" @@ -48,4 +49,21 @@ using ColumnDateTimeV2 = ColumnVector; using ColumnFloat32 = ColumnVector; using ColumnFloat64 = ColumnVector; +using ColumnDecimal32 = ColumnDecimal; +using ColumnDecimal64 = ColumnDecimal; +using ColumnDecimal128 = ColumnDecimal; + +template +struct IsFixLenColumnType { + static constexpr bool value = false; +}; +template +struct IsFixLenColumnType> { + static constexpr bool value = true; +}; +template +struct IsFixLenColumnType> { + static constexpr bool value = true; +}; + } // namespace doris::vectorized