This is an automated email from the ASF dual-hosted git repository.

kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git

commit cf23eb72701e5db05405c49ea9f3a26fead9fe95
Author: Pxl <pxl...@qq.com>
AuthorDate: Fri Aug 25 14:08:24 2023 +0800

    [Bug](jdbc) support get_default on complex type (#23325)
    
    support get_default on complex type
---
 be/CMakeLists.txt                               |  17 +-
 be/src/vec/common/field_visitors.h              |  58 -----
 be/src/vec/core/field.cpp                       |  12 -
 be/src/vec/core/field.h                         | 325 ++++++------------------
 be/src/vec/data_types/convert_field_to_type.cpp |   3 -
 be/src/vec/data_types/data_type_bitmap.h        |   5 +-
 be/src/vec/data_types/data_type_hll.h           |   6 +-
 be/src/vec/data_types/data_type_quantilestate.h |   5 +-
 8 files changed, 94 insertions(+), 337 deletions(-)

diff --git a/be/CMakeLists.txt b/be/CMakeLists.txt
index 9839312a47..eddbfe0d3e 100644
--- a/be/CMakeLists.txt
+++ b/be/CMakeLists.txt
@@ -224,15 +224,18 @@ function(TRY_TO_CHANGE_LINKER LINKER_COMMAND LINKER_NAME)
     endif()
 endfunction()
 
-# In terms of performance, mold> lld> gold> ld
-set(CUSTUM_LINKER_COMMAND "ld")
-TRY_TO_CHANGE_LINKER("mold" "mold")
-TRY_TO_CHANGE_LINKER("lld" "LLD")
-TRY_TO_CHANGE_LINKER("gold" "GNU gold")
-if (NOT CUSTUM_LINKER_COMMAND STREQUAL "ld")
-    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} 
-fuse-ld=${CUSTUM_LINKER_COMMAND}")
+if (NOT OS_MACOSX) # MACOSX's lld will core dump
+    # In terms of performance, mold> lld> gold> ld
+    set(CUSTUM_LINKER_COMMAND "ld")
+    TRY_TO_CHANGE_LINKER("mold" "mold")
+    TRY_TO_CHANGE_LINKER("lld" "LLD")
+    TRY_TO_CHANGE_LINKER("gold" "GNU gold")
+    if (NOT CUSTUM_LINKER_COMMAND STREQUAL "ld")
+        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} 
-fuse-ld=${CUSTUM_LINKER_COMMAND}")
+    endif()
 endif()
 
+
 set(CMAKE_CXX_STANDARD 20)
 set(CMAKE_C_STANDARD 17)
 
diff --git a/be/src/vec/common/field_visitors.h 
b/be/src/vec/common/field_visitors.h
index 7a37499ff6..c2d92a90d9 100644
--- a/be/src/vec/common/field_visitors.h
+++ b/be/src/vec/common/field_visitors.h
@@ -67,64 +67,6 @@ typename std::decay_t<Visitor>::ResultType 
apply_visitor(Visitor&& visitor, F&&
         return visitor(field.template get<DecimalField<Decimal128>>());
     case Field::Types::Decimal128I:
         return visitor(field.template get<DecimalField<Decimal128I>>());
-    case Field::Types::AggregateFunctionState:
-        return visitor(field.template get<AggregateFunctionStateData>());
-
-    default:
-        LOG(FATAL) << "Bad type of Field";
-        return {};
-    }
-}
-
-template <typename Visitor, typename F1, typename F2>
-typename std::decay_t<Visitor>::ResultType apply_visitor(Visitor&& visitor, 
F1&& field1,
-                                                         F2&& field2) {
-    switch (field1.getType()) {
-    case Field::Types::Null:
-        return apply_binary_visitor_impl(std::forward<Visitor>(visitor),
-                                         field1.template get<Null>(), 
std::forward<F2>(field2));
-    case Field::Types::UInt64:
-        return apply_binary_visitor_impl(std::forward<Visitor>(visitor),
-                                         field1.template get<UInt64>(), 
std::forward<F2>(field2));
-    case Field::Types::UInt128:
-        return apply_binary_visitor_impl(std::forward<Visitor>(visitor),
-                                         field1.template get<UInt128>(), 
std::forward<F2>(field2));
-    case Field::Types::Int64:
-        return apply_binary_visitor_impl(std::forward<Visitor>(visitor),
-                                         field1.template get<Int64>(), 
std::forward<F2>(field2));
-    case Field::Types::Float64:
-        return apply_binary_visitor_impl(std::forward<Visitor>(visitor),
-                                         field1.template get<Float64>(), 
std::forward<F2>(field2));
-    case Field::Types::String:
-        return apply_binary_visitor_impl(std::forward<Visitor>(visitor),
-                                         field1.template get<String>(), 
std::forward<F2>(field2));
-    case Field::Types::Array:
-        return apply_binary_visitor_impl(std::forward<Visitor>(visitor),
-                                         field1.template get<Array>(), 
std::forward<F2>(field2));
-    case Field::Types::Tuple:
-        return apply_binary_visitor_impl(std::forward<Visitor>(visitor),
-                                         field1.template get<Tuple>(), 
std::forward<F2>(field2));
-    case Field::Types::Decimal32:
-        return apply_binary_visitor_impl(std::forward<Visitor>(visitor),
-                                         field1.template 
get<DecimalField<Decimal32>>(),
-                                         std::forward<F2>(field2));
-    case Field::Types::Decimal64:
-        return apply_binary_visitor_impl(std::forward<Visitor>(visitor),
-                                         field1.template 
get<DecimalField<Decimal64>>(),
-                                         std::forward<F2>(field2));
-    case Field::Types::Decimal128:
-        return apply_binary_visitor_impl(std::forward<Visitor>(visitor),
-                                         field1.template 
get<DecimalField<Decimal128>>(),
-                                         std::forward<F2>(field2));
-    case Field::Types::Decimal128I:
-        return apply_binary_visitor_impl(std::forward<Visitor>(visitor),
-                                         field1.template 
get<DecimalField<Decimal128I>>(),
-                                         std::forward<F2>(field2));
-    case Field::Types::AggregateFunctionState:
-        return apply_binary_visitor_impl(std::forward<Visitor>(visitor),
-                                         field1.template 
get<AggregateFunctionStateData>(),
-                                         std::forward<F2>(field2));
-
     default:
         LOG(FATAL) << "Bad type of Field";
         return {};
diff --git a/be/src/vec/core/field.cpp b/be/src/vec/core/field.cpp
index aeb55c1d79..9970b284ce 100644
--- a/be/src/vec/core/field.cpp
+++ b/be/src/vec/core/field.cpp
@@ -83,13 +83,6 @@ void read_binary(Array& x, BufferReadable& buf) {
             x.push_back(value);
             break;
         }
-        case Field::Types::AggregateFunctionState: {
-            AggregateFunctionStateData value;
-            doris::vectorized::read_string_binary(value.name, buf);
-            doris::vectorized::read_string_binary(value.data, buf);
-            x.push_back(value);
-            break;
-        }
         }
     }
 }
@@ -129,11 +122,6 @@ void write_binary(const Array& x, BufferWritable& buf) {
             doris::vectorized::write_json_binary(get<JsonbField>(*it), buf);
             break;
         }
-        case Field::Types::AggregateFunctionState: {
-            
doris::vectorized::write_string_binary(it->get<AggregateFunctionStateData>().name,
 buf);
-            
doris::vectorized::write_string_binary(it->get<AggregateFunctionStateData>().data,
 buf);
-            break;
-        }
         }
     };
 }
diff --git a/be/src/vec/core/field.h b/be/src/vec/core/field.h
index 89c7d79934..941ca3fe3d 100644
--- a/be/src/vec/core/field.h
+++ b/be/src/vec/core/field.h
@@ -39,6 +39,9 @@
 
 // IWYU pragma: no_include <opentelemetry/common/threadlocal.h>
 #include "common/compiler_util.h" // IWYU pragma: keep
+#include "olap/hll.h"
+#include "util/bitmap_value.h"
+#include "util/quantile_state.h"
 #include "vec/common/uint128.h"
 #include "vec/core/types.h"
 
@@ -55,7 +58,9 @@ struct PackedInt128;
 namespace doris::vectorized {
 
 template <typename T>
-struct NearestFieldTypeImpl;
+struct NearestFieldTypeImpl {
+    using Type = T;
+};
 
 template <typename T>
 using NearestFieldType = typename NearestFieldTypeImpl<T>::Type;
@@ -117,37 +122,6 @@ using FieldMap = std::map<String, Field, 
std::less<String>>;
 DEFINE_FIELD_MAP(VariantMap);
 #undef DEFINE_FIELD_MAP
 
-struct AggregateFunctionStateData {
-    String name; /// Name with arguments.
-    String data;
-
-    bool operator<(const AggregateFunctionStateData&) const {
-        LOG(FATAL) << "Operator < is not implemented for 
AggregateFunctionStateData.";
-    }
-
-    bool operator<=(const AggregateFunctionStateData&) const {
-        LOG(FATAL) << "Operator <= is not implemented for 
AggregateFunctionStateData.";
-    }
-
-    bool operator>(const AggregateFunctionStateData&) const {
-        LOG(FATAL) << "Operator <= is not implemented for 
AggregateFunctionStateData.";
-    }
-
-    bool operator>=(const AggregateFunctionStateData&) const {
-        LOG(FATAL) << "Operator >= is not implemented for 
AggregateFunctionStateData.";
-    }
-
-    bool operator==(const AggregateFunctionStateData& rhs) const {
-        if (name != rhs.name) {
-            LOG(FATAL) << fmt::format(
-                    "Comparing aggregate functions with different types: {} 
and {}", name,
-                    rhs.name);
-        }
-
-        return data == rhs.data;
-    }
-};
-
 class JsonbField {
 public:
     JsonbField() = default;
@@ -342,6 +316,9 @@ public:
             Decimal128I = 24,
             Map = 25,
             VariantMap = 26,
+            Bitmap = 27,
+            HyperLogLog = 28,
+            QuantileState = 29,
         };
 
         static const int MIN_NON_POD = 16;
@@ -378,16 +355,20 @@ public:
                 return "Decimal128";
             case Decimal128I:
                 return "Decimal128I";
-            case AggregateFunctionState:
-                return "AggregateFunctionState";
             case FixedLengthObject:
                 return "FixedLengthObject";
             case VariantMap:
                 return "VariantMap";
+            case Bitmap:
+                return "Bitmap";
+            case HyperLogLog:
+                return "HyperLogLog";
+            case QuantileState:
+                return "QuantileState";
+            default:
+                LOG(FATAL) << "type not supported, type=" << 
Types::to_string(which);
+                break;
             }
-
-            LOG(FATAL) << "Bad type of Field";
-            return nullptr;
         }
     };
 
@@ -523,153 +504,65 @@ public:
         return get<T>();
     }
 
-    bool operator<(const Field& rhs) const {
-        if (which < rhs.which) return true;
-        if (which > rhs.which) return false;
+    bool operator==(const Field& rhs) const {
+        return operator<=>(rhs) == std::strong_ordering::equal;
+    }
+
+    std::strong_ordering operator<=>(const Field& rhs) const {
+        if (which == Types::Null || rhs == Types::Null) {
+            return std::strong_ordering::equal;
+        }
+        if (which != rhs.which) {
+            LOG(FATAL) << "lhs type not equal with rhs, lhs=" << 
Types::to_string(which)
+                       << ", rhs=" << Types::to_string(rhs.which);
+        }
 
         switch (which) {
-        case Types::Null:
-            return false;
-        case Types::UInt64:
-            return get<UInt64>() < rhs.get<UInt64>();
-        case Types::UInt128:
-            return get<UInt128>() < rhs.get<UInt128>();
-        case Types::Int64:
-            return get<Int64>() < rhs.get<Int64>();
-        case Types::Int128:
-            return get<Int128>() < rhs.get<Int128>();
-        case Types::Float64:
-            return get<Float64>() < rhs.get<Float64>();
-        case Types::String:
-            return get<String>() < rhs.get<String>();
+        case Types::Bitmap:
+        case Types::HyperLogLog:
+        case Types::QuantileState:
+        case Types::FixedLengthObject:
         case Types::JSONB:
-            return get<JsonbField>() < rhs.get<JsonbField>();
+        case Types::Null:
         case Types::Array:
-            return get<Array>() < rhs.get<Array>();
         case Types::Tuple:
-            return get<Tuple>() < rhs.get<Tuple>();
         case Types::Map:
-            return get<Map>() < rhs.get<Map>();
-        case Types::Decimal32:
-            return get<DecimalField<Decimal32>>() < 
rhs.get<DecimalField<Decimal32>>();
-        case Types::Decimal64:
-            return get<DecimalField<Decimal64>>() < 
rhs.get<DecimalField<Decimal64>>();
-        case Types::Decimal128:
-            return get<DecimalField<Decimal128>>() < 
rhs.get<DecimalField<Decimal128>>();
-        case Types::Decimal128I:
-            return get<DecimalField<Decimal128I>>() < 
rhs.get<DecimalField<Decimal128I>>();
-        case Types::AggregateFunctionState:
-            return get<AggregateFunctionStateData>() < 
rhs.get<AggregateFunctionStateData>();
-        case Types::FixedLengthObject:
-            break;
         case Types::VariantMap:
-            return get<VariantMap>() < rhs.get<VariantMap>();
-        }
-
-        LOG(FATAL) << "Bad type of Field";
-        return {};
-    }
-
-    bool operator>(const Field& rhs) const { return rhs < *this; }
-
-    bool operator<=(const Field& rhs) const {
-        if (which < rhs.which) return true;
-        if (which > rhs.which) return false;
-
-        switch (which) {
-        case Types::Null:
-            return true;
+            return std::strong_ordering::equal;
         case Types::UInt64:
-            return get<UInt64>() <= rhs.get<UInt64>();
+            return get<UInt64>() <=> rhs.get<UInt64>();
         case Types::UInt128:
-            return get<UInt128>() <= rhs.get<UInt128>();
+            return get<UInt128>() <=> rhs.get<UInt128>();
         case Types::Int64:
-            return get<Int64>() <= rhs.get<Int64>();
+            return get<Int64>() <=> rhs.get<Int64>();
         case Types::Int128:
-            return get<Int128>() <= rhs.get<Int128>();
+            return get<Int128>() <=> rhs.get<Int128>();
         case Types::Float64:
-            return get<Float64>() <= rhs.get<Float64>();
+            return get<Float64>() < rhs.get<Float64>()    ? 
std::strong_ordering::less
+                   : get<Float64>() == rhs.get<Float64>() ? 
std::strong_ordering::equal
+                                                          : 
std::strong_ordering::greater;
         case Types::String:
-            return get<String>() <= rhs.get<String>();
-        case Types::JSONB:
-            return get<JsonbField>() <= rhs.get<JsonbField>();
-        case Types::Array:
-            return get<Array>() <= rhs.get<Array>();
-        case Types::Tuple:
-            return get<Tuple>() <= rhs.get<Tuple>();
-        case Types::Map:
-            return get<Map>() < rhs.get<Map>();
+            return get<String>() <=> rhs.get<String>();
         case Types::Decimal32:
-            return get<DecimalField<Decimal32>>() <= 
rhs.get<DecimalField<Decimal32>>();
+            return get<Decimal32>() <=> rhs.get<Decimal32>();
         case Types::Decimal64:
-            return get<DecimalField<Decimal64>>() <= 
rhs.get<DecimalField<Decimal64>>();
+            return get<Decimal64>() <=> rhs.get<Decimal64>();
         case Types::Decimal128:
-            return get<DecimalField<Decimal128>>() <= 
rhs.get<DecimalField<Decimal128>>();
+            return get<Decimal128>() <=> rhs.get<Decimal128>();
         case Types::Decimal128I:
-            return get<DecimalField<Decimal128I>>() <= 
rhs.get<DecimalField<Decimal128I>>();
-        case Types::AggregateFunctionState:
-            return get<AggregateFunctionStateData>() <= 
rhs.get<AggregateFunctionStateData>();
-        case Types::FixedLengthObject:
+            return get<Decimal128I>() <=> rhs.get<Decimal128I>();
+        default:
+            LOG(FATAL) << "lhs type not equal with rhs, lhs=" << 
Types::to_string(which)
+                       << ", rhs=" << Types::to_string(rhs.which);
             break;
-        case Types::VariantMap:
-            return get<VariantMap>() <= rhs.get<VariantMap>();
         }
-        LOG(FATAL) << "Bad type of Field";
-        return {};
     }
 
-    bool operator>=(const Field& rhs) const { return rhs <= *this; }
-
-    bool operator==(const Field& rhs) const {
-        if (which != rhs.which) return false;
-
-        switch (which) {
-        case Types::Null:
-            return true;
-        case Types::UInt64:
-        case Types::Int64:
-        case Types::Float64:
-            return get<UInt64>() == rhs.get<UInt64>();
-        case Types::String:
-            return get<String>() == rhs.get<String>();
-        case Types::JSONB:
-            return get<JsonbField>() == rhs.get<JsonbField>();
-        case Types::Array:
-            return get<Array>() == rhs.get<Array>();
-        case Types::Tuple:
-            return get<Tuple>() == rhs.get<Tuple>();
-        case Types::Map:
-            return get<Map>() < rhs.get<Map>();
-        case Types::UInt128:
-            return get<UInt128>() == rhs.get<UInt128>();
-        case Types::Int128:
-            return get<Int128>() == rhs.get<Int128>();
-        case Types::Decimal32:
-            return get<DecimalField<Decimal32>>() == 
rhs.get<DecimalField<Decimal32>>();
-        case Types::Decimal64:
-            return get<DecimalField<Decimal64>>() == 
rhs.get<DecimalField<Decimal64>>();
-        case Types::Decimal128:
-            return get<DecimalField<Decimal128>>() == 
rhs.get<DecimalField<Decimal128>>();
-        case Types::Decimal128I:
-            return get<DecimalField<Decimal128I>>() == 
rhs.get<DecimalField<Decimal128I>>();
-        case Types::AggregateFunctionState:
-            return get<AggregateFunctionStateData>() == 
rhs.get<AggregateFunctionStateData>();
-        case Types::FixedLengthObject:
-            break;
-        case Types::VariantMap:
-            return get<VariantMap>() == rhs.get<VariantMap>();
-        }
-
-        CHECK(false) << "Bad type of Field";
-    }
-
-    bool operator!=(const Field& rhs) const { return !(*this == rhs); }
-
 private:
     std::aligned_union_t<DBMS_MIN_FIELD_SIZE - sizeof(Types::Which), Null, 
UInt64, UInt128, Int64,
                          Int128, Float64, String, JsonbField, Array, Tuple, 
Map, VariantMap,
                          DecimalField<Decimal32>, DecimalField<Decimal64>, 
DecimalField<Decimal128>,
-                         DecimalField<Decimal128I>, AggregateFunctionStateData>
+                         DecimalField<Decimal128I>, BitmapValue, HyperLogLog, 
QuantileState<double>>
             storage;
 
     Types::Which which;
@@ -747,15 +640,21 @@ private:
         case Types::Decimal128I:
             f(field.template get<DecimalField<Decimal128I>>());
             return;
-        case Types::AggregateFunctionState:
-            f(field.template get<AggregateFunctionStateData>());
-            return;
-        case Types::FixedLengthObject:
-            LOG(FATAL) << "FixedLengthObject not supported";
-            break;
         case Types::VariantMap:
             f(field.template get<VariantMap>());
             return;
+        case Types::Bitmap:
+            f(field.template get<BitmapValue>());
+            return;
+        case Types::HyperLogLog:
+            f(field.template get<HyperLogLog>());
+            return;
+        case Types::QuantileState:
+            f(field.template get<QuantileState<double>>());
+            return;
+        default:
+            LOG(FATAL) << "type not supported, type=" << 
Types::to_string(field.which);
+            break;
         }
     }
 
@@ -813,9 +712,6 @@ private:
         case Types::Map:
             destroy<Map>();
             break;
-        case Types::AggregateFunctionState:
-            destroy<AggregateFunctionStateData>();
-            break;
         case Types::VariantMap:
             destroy<VariantMap>();
             break;
@@ -836,10 +732,6 @@ private:
 
 #undef DBMS_MIN_FIELD_SIZE
 
-template <>
-struct TypeId<AggregateFunctionStateData> {
-    static constexpr const TypeIndex value = TypeIndex::AggregateFunction;
-};
 template <>
 struct TypeId<Tuple> {
     static constexpr const TypeIndex value = TypeIndex::Tuple;
@@ -921,14 +813,25 @@ struct Field::TypeToEnum<DecimalField<Decimal128I>> {
     static constexpr Types::Which value = Types::Decimal128I;
 };
 template <>
-struct Field::TypeToEnum<AggregateFunctionStateData> {
-    static constexpr Types::Which value = Types::AggregateFunctionState;
-};
-template <>
 struct Field::TypeToEnum<VariantMap> {
     static constexpr Types::Which value = Types::VariantMap;
 };
 
+template <>
+struct Field::TypeToEnum<BitmapValue> {
+    static constexpr Types::Which value = Types::Bitmap;
+};
+
+template <>
+struct Field::TypeToEnum<HyperLogLog> {
+    static constexpr Types::Which value = Types::HyperLogLog;
+};
+
+template <>
+struct Field::TypeToEnum<QuantileState<double>> {
+    static constexpr Types::Which value = Types::QuantileState;
+};
+
 template <>
 struct Field::EnumToType<Field::Types::Null> {
     using Type = Null;
@@ -990,10 +893,6 @@ struct Field::EnumToType<Field::Types::Decimal128I> {
     using Type = DecimalField<Decimal128I>;
 };
 template <>
-struct Field::EnumToType<Field::Types::AggregateFunctionState> {
-    using Type = DecimalField<AggregateFunctionStateData>;
-};
-template <>
 struct Field::EnumToType<Field::Types::VariantMap> {
     using Type = VariantMap;
 };
@@ -1035,10 +934,6 @@ template <>
 struct TypeName<Map> {
     static std::string get() { return "Map"; }
 };
-template <>
-struct TypeName<AggregateFunctionStateData> {
-    static std::string get() { return "AggregateFunctionState"; }
-};
 
 /// char may be signed or unsigned, and behave identically to signed char or 
unsigned char,
 ///  but they are always three different types.
@@ -1065,11 +960,6 @@ struct NearestFieldTypeImpl<UInt32> {
     using Type = UInt64;
 };
 
-template <>
-struct NearestFieldTypeImpl<UInt128> {
-    using Type = UInt128;
-};
-//template <> struct NearestFieldTypeImpl<UUID> { using Type = UInt128; };
 template <>
 struct NearestFieldTypeImpl<Int16> {
     using Type = Int64;
@@ -1079,34 +969,13 @@ struct NearestFieldTypeImpl<Int32> {
     using Type = Int64;
 };
 
-template <>
-struct NearestFieldTypeImpl<VariantMap> {
-    using Type = VariantMap;
-};
-
 /// long and long long are always different types that may behave identically 
or not.
 /// This is different on Linux and Mac.
 template <>
 struct NearestFieldTypeImpl<long> {
     using Type = Int64;
 };
-template <>
-struct NearestFieldTypeImpl<long long> {
-    using Type = Int64;
-};
-template <>
-struct NearestFieldTypeImpl<unsigned long> {
-    using Type = UInt64;
-};
-template <>
-struct NearestFieldTypeImpl<unsigned long long> {
-    using Type = UInt64;
-};
 
-template <>
-struct NearestFieldTypeImpl<Int128> {
-    using Type = Int128;
-};
 template <>
 struct NearestFieldTypeImpl<Decimal32> {
     using Type = DecimalField<Decimal32>;
@@ -1144,52 +1013,19 @@ struct NearestFieldTypeImpl<Float32> {
     using Type = Float64;
 };
 template <>
-struct NearestFieldTypeImpl<Float64> {
-    using Type = Float64;
-};
-template <>
 struct NearestFieldTypeImpl<const char*> {
     using Type = String;
 };
 template <>
-struct NearestFieldTypeImpl<String> {
-    using Type = String;
-};
-template <>
-struct NearestFieldTypeImpl<JsonbField> {
-    using Type = JsonbField;
-};
-template <>
-struct NearestFieldTypeImpl<Array> {
-    using Type = Array;
-};
-template <>
-struct NearestFieldTypeImpl<Tuple> {
-    using Type = Tuple;
-};
-template <>
-struct NearestFieldTypeImpl<Map> {
-    using Type = Map;
-};
-template <>
 struct NearestFieldTypeImpl<bool> {
     using Type = UInt64;
 };
-template <>
-struct NearestFieldTypeImpl<Null> {
-    using Type = Null;
-};
 
 template <>
 struct NearestFieldTypeImpl<std::string_view> {
     using Type = String;
 };
 
-template <>
-struct NearestFieldTypeImpl<AggregateFunctionStateData> {
-    using Type = AggregateFunctionStateData;
-};
-
 template <>
 struct Field::TypeToEnum<PackedInt128> {
     static const Types::Which value = Types::Int128;
@@ -1234,8 +1070,9 @@ Field& Field::operator=(T&& rhs) {
     if (which != TypeToEnum<std::decay_t<U>>::value) {
         destroy();
         create_concrete(std::forward<U>(val));
-    } else
+    } else {
         assign_concrete(std::forward<U>(val));
+    }
 
     return *this;
 }
diff --git a/be/src/vec/data_types/convert_field_to_type.cpp 
b/be/src/vec/data_types/convert_field_to_type.cpp
index a2a1377050..ba49257898 100644
--- a/be/src/vec/data_types/convert_field_to_type.cpp
+++ b/be/src/vec/data_types/convert_field_to_type.cpp
@@ -82,9 +82,6 @@ public:
     [[noreturn]] String operator()(const DecimalField<Decimal128I>& x) const {
         LOG(FATAL) << "not implemeted";
     }
-    [[noreturn]] String operator()(const AggregateFunctionStateData& x) const {
-        LOG(FATAL) << "not implemeted";
-    }
 };
 
 namespace {
diff --git a/be/src/vec/data_types/data_type_bitmap.h 
b/be/src/vec/data_types/data_type_bitmap.h
index 2579a68378..6dabd87f34 100644
--- a/be/src/vec/data_types/data_type_bitmap.h
+++ b/be/src/vec/data_types/data_type_bitmap.h
@@ -94,10 +94,7 @@ public:
     }
     void to_string(const IColumn& column, size_t row_num, BufferWritable& 
ostr) const override;
 
-    [[noreturn]] virtual Field get_default() const override {
-        LOG(FATAL) << "Method get_default() is not implemented for data type " 
<< get_name();
-        __builtin_unreachable();
-    }
+    Field get_default() const override { return BitmapValue(); }
 
     [[noreturn]] Field get_field(const TExprNode& node) const override {
         LOG(FATAL) << "Unimplemented get_field for BitMap";
diff --git a/be/src/vec/data_types/data_type_hll.h 
b/be/src/vec/data_types/data_type_hll.h
index 2d397b5832..2b85e27914 100644
--- a/be/src/vec/data_types/data_type_hll.h
+++ b/be/src/vec/data_types/data_type_hll.h
@@ -91,11 +91,7 @@ public:
     void to_string(const IColumn& column, size_t row_num, BufferWritable& 
ostr) const override;
     Status from_string(ReadBuffer& rb, IColumn* column) const override;
 
-    Field get_default() const override {
-        LOG(FATAL) << "Method get_default() is not implemented for data type " 
<< get_name();
-        // unreachable
-        return String();
-    }
+    Field get_default() const override { return HyperLogLog::empty(); }
 
     [[noreturn]] Field get_field(const TExprNode& node) const override {
         LOG(FATAL) << "Unimplemented get_field for HLL";
diff --git a/be/src/vec/data_types/data_type_quantilestate.h 
b/be/src/vec/data_types/data_type_quantilestate.h
index e4afebfd04..c3bcf29464 100644
--- a/be/src/vec/data_types/data_type_quantilestate.h
+++ b/be/src/vec/data_types/data_type_quantilestate.h
@@ -93,10 +93,7 @@ public:
     }
     void to_string(const IColumn& column, size_t row_num, BufferWritable& 
ostr) const override;
 
-    [[noreturn]] virtual Field get_default() const override {
-        LOG(FATAL) << "Method get_default() is not implemented for data type " 
<< get_name();
-        __builtin_unreachable();
-    }
+    Field get_default() const override { return QuantileState<T>(); }
 
     [[noreturn]] Field get_field(const TExprNode& node) const override {
         LOG(FATAL) << "Unimplemented get_field for quantilestate";


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to