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

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


The following commit(s) were added to refs/heads/master by this push:
     new 6d6c4410a59 [feature](agg-func) agg function linear_histogram (#39546)
6d6c4410a59 is described below

commit 6d6c4410a5929bf3d4d0c652a7c29ae7ae4169f3
Author: Mingxi <71588583+joker-sta...@users.noreply.github.com>
AuthorDate: Mon Oct 14 08:30:38 2024 +0800

    [feature](agg-func) agg function linear_histogram (#39546)
    
    add aggregate function: `linear_histogram(expr, DOUBLE interval[, DOUBLE 
offset)`
    
    The linear_histogram function is used to describe the distribution of
    the data, It uses an "equal width" bucking strategy, and divides the
    data into buckets according to the value of the data.
---
 .../aggregate_function_linear_histogram.cpp        |   64 ++
 .../aggregate_function_linear_histogram.h          |  258 +++++
 .../aggregate_function_simple_factory.cpp          |    2 +
 .../agg_linear_histogram_test.cpp                  |  340 +++++++
 .../apache/doris/analysis/FunctionCallExpr.java    |    3 +-
 .../apache/doris/catalog/AggregateFunction.java    |    2 +-
 .../doris/catalog/BuiltinAggregateFunctions.java   |    2 +
 .../java/org/apache/doris/catalog/FunctionSet.java |    9 +
 .../expressions/functions/agg/LinearHistogram.java |   89 ++
 .../visitor/AggregateFunctionVisitor.java          |    5 +
 .../nereids/rules/analysis/GenerateFunction.java   |    1 +
 .../data/nereids_function_p0/agg_function/agg.out  | 1029 +++++++++++++-------
 .../data/nereids_p0/aggregate/agg_nullable.out     |    8 +
 .../data/nereids_p0/aggregate/agg_nullable_2.out   |    9 +
 .../nereids_syntax_p0/mv/aggregate/agg_sync_mv.out |   30 +
 .../nereids_function_p0/agg_function/agg.groovy    |  177 ++++
 .../nereids_p0/aggregate/agg_nullable.groovy       |   18 +
 .../nereids_p0/aggregate/agg_nullable_2.groovy     |   18 +
 .../mv/aggregate/agg_sync_mv.groovy                |    9 +
 19 files changed, 1718 insertions(+), 355 deletions(-)

diff --git 
a/be/src/vec/aggregate_functions/aggregate_function_linear_histogram.cpp 
b/be/src/vec/aggregate_functions/aggregate_function_linear_histogram.cpp
new file mode 100644
index 00000000000..62ce1657526
--- /dev/null
+++ b/be/src/vec/aggregate_functions/aggregate_function_linear_histogram.cpp
@@ -0,0 +1,64 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#include "vec/aggregate_functions/aggregate_function_linear_histogram.h"
+
+#include "vec/aggregate_functions/helpers.h"
+
+namespace doris::vectorized {
+
+const std::string AggregateFunctionLinearHistogramConsts::NAME = 
"linear_histogram";
+
+template <typename T>
+AggregateFunctionPtr create_agg_function_linear_histogram(const DataTypes& 
argument_types,
+                                                          const bool 
result_is_nullable) {
+    bool has_offset = (argument_types.size() == 3);
+
+    if (has_offset) {
+        return creator_without_type::create<
+                AggregateFunctionLinearHistogram<T, 
AggregateFunctionLinearHistogramData<T>, true>>(
+                argument_types, result_is_nullable);
+    } else {
+        return creator_without_type::create<AggregateFunctionLinearHistogram<
+                T, AggregateFunctionLinearHistogramData<T>, 
false>>(argument_types,
+                                                                    
result_is_nullable);
+    }
+}
+
+AggregateFunctionPtr create_aggregate_function_linear_histogram(const 
std::string& name,
+                                                                const 
DataTypes& argument_types,
+                                                                const bool 
result_is_nullable) {
+    WhichDataType type(remove_nullable(argument_types[0]));
+
+#define DISPATCH(TYPE)               \
+    if (type.idx == TypeIndex::TYPE) \
+        return create_agg_function_linear_histogram<TYPE>(argument_types, 
result_is_nullable);
+    FOR_NUMERIC_TYPES(DISPATCH)
+    FOR_DECIMAL_TYPES(DISPATCH)
+#undef DISPATCH
+
+    LOG(WARNING) << fmt::format("unsupported input type {} for aggregate 
function {}",
+                                argument_types[0]->get_name(), name);
+    return nullptr;
+}
+
+void 
register_aggregate_function_linear_histogram(AggregateFunctionSimpleFactory& 
factory) {
+    
factory.register_function_both(AggregateFunctionLinearHistogramConsts::NAME,
+                                   create_aggregate_function_linear_histogram);
+}
+
+} // namespace doris::vectorized
diff --git 
a/be/src/vec/aggregate_functions/aggregate_function_linear_histogram.h 
b/be/src/vec/aggregate_functions/aggregate_function_linear_histogram.h
new file mode 100644
index 00000000000..3366cc5f70a
--- /dev/null
+++ b/be/src/vec/aggregate_functions/aggregate_function_linear_histogram.h
@@ -0,0 +1,258 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#pragma once
+
+#include <rapidjson/document.h>
+#include <rapidjson/prettywriter.h>
+#include <rapidjson/stringbuffer.h>
+
+#include <unordered_map>
+#include <vector>
+
+#include "vec/aggregate_functions/aggregate_function.h"
+#include "vec/aggregate_functions/aggregate_function_simple_factory.h"
+#include "vec/core/types.h"
+#include "vec/data_types/data_type_decimal.h"
+#include "vec/io/io_helper.h"
+
+// TODO: optimize count=0
+// TODO: support datetime
+// TODO: support foreach
+
+namespace doris::vectorized {
+
+template <typename T>
+struct AggregateFunctionLinearHistogramData {
+    // bucket key limits
+    const static int32_t MIN_BUCKET_KEY = std::numeric_limits<int32_t>::min();
+    const static int32_t MAX_BUCKET_KEY = std::numeric_limits<int32_t>::max();
+
+private:
+    // influxdb use double
+    double interval = 0;
+    double offset;
+    double lower; // not used yet
+    double upper; // not used yet
+    std::unordered_map<int32_t, size_t,
+                       decltype([](int32_t key) { return 
static_cast<size_t>(key); })>
+            buckets;
+
+public:
+    // reset
+    void reset() {
+        offset = 0;
+        interval = 0;
+        buckets.clear();
+    }
+
+    void set_parameters(double input_interval, double input_offset) {
+        interval = input_interval;
+        offset = input_offset;
+    }
+
+    // add
+    void add(const T& value, UInt32 scale) {
+        double val = 0;
+        if constexpr (IsDecimalNumber<T>) {
+            using NativeType = typename T::NativeType;
+            val = static_cast<double>(value.value) / 
decimal_scale_multiplier<NativeType>(scale);
+        } else {
+            val = static_cast<double>(value);
+        }
+        double key = std::floor((val - offset) / interval);
+        if (key <= MIN_BUCKET_KEY || key >= MAX_BUCKET_KEY) {
+            throw doris::Exception(ErrorCode::INVALID_ARGUMENT, "{} exceeds 
the bucket range limit",
+                                   value);
+        }
+        buckets[static_cast<int32_t>(key)]++;
+    }
+
+    // merge
+    void merge(const AggregateFunctionLinearHistogramData& rhs) {
+        if (rhs.interval == 0) {
+            return;
+        }
+
+        interval = rhs.interval;
+        offset = rhs.offset;
+
+        for (const auto& [key, count] : rhs.buckets) {
+            buckets[key] += count;
+        }
+    }
+
+    // write
+    void write(BufferWritable& buf) const {
+        write_binary(offset, buf);
+        write_binary(interval, buf);
+        write_binary(lower, buf);
+        write_binary(upper, buf);
+        write_binary(buckets.size(), buf);
+        for (const auto& [key, count] : buckets) {
+            write_binary(key, buf);
+            write_binary(count, buf);
+        }
+    }
+
+    // read
+    void read(BufferReadable& buf) {
+        read_binary(offset, buf);
+        read_binary(interval, buf);
+        read_binary(lower, buf);
+        read_binary(upper, buf);
+        size_t size;
+        read_binary(size, buf);
+        for (size_t i = 0; i < size; i++) {
+            int32_t key;
+            size_t count;
+            read_binary(key, buf);
+            read_binary(count, buf);
+            buckets[key] = count;
+        }
+    }
+
+    // insert_result_into
+    void insert_result_into(IColumn& to) const {
+        std::vector<std::pair<int32_t, size_t>> bucket_vector(buckets.begin(), 
buckets.end());
+        std::sort(bucket_vector.begin(), bucket_vector.end(),
+                  [](const auto& lhs, const auto& rhs) { return lhs.first < 
rhs.first; });
+
+        rapidjson::Document doc;
+        doc.SetObject();
+        rapidjson::Document::AllocatorType& allocator = doc.GetAllocator();
+
+        unsigned num_buckets = bucket_vector.empty() ? 0
+                                                     : 
bucket_vector.rbegin()->first -
+                                                               
bucket_vector.begin()->first + 1;
+        doc.AddMember("num_buckets", num_buckets, allocator);
+
+        rapidjson::Value bucket_arr(rapidjson::kArrayType);
+        bucket_arr.Reserve(num_buckets, allocator);
+
+        if (num_buckets > 0) {
+            int32_t idx = bucket_vector.begin()->first;
+            double left = bucket_vector.begin()->first * interval + offset;
+            size_t count = 0;
+            size_t acc_count = 0;
+
+            for (const auto& [key, count_] : bucket_vector) {
+                for (; idx <= key; ++idx) {
+                    rapidjson::Value bucket_json(rapidjson::kObjectType);
+                    bucket_json.AddMember("lower", left, allocator);
+                    left += interval;
+                    bucket_json.AddMember("upper", left, allocator);
+                    count = (idx == key) ? count_ : 0;
+                    bucket_json.AddMember("count", count, allocator);
+                    acc_count += count;
+                    bucket_json.AddMember("acc_count", acc_count, allocator);
+
+                    bucket_arr.PushBack(bucket_json, allocator);
+                }
+            }
+        }
+
+        doc.AddMember("buckets", bucket_arr, allocator);
+
+        rapidjson::StringBuffer buffer;
+        rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
+        doc.Accept(writer);
+
+        auto& column = assert_cast<ColumnString&>(to);
+        column.insert_data(buffer.GetString(), buffer.GetSize());
+    }
+};
+
+class AggregateFunctionLinearHistogramConsts {
+public:
+    const static std::string NAME;
+};
+
+template <typename T, typename Data, bool has_offset>
+class AggregateFunctionLinearHistogram final
+        : public IAggregateFunctionDataHelper<
+                  Data, AggregateFunctionLinearHistogram<T, Data, has_offset>> 
{
+public:
+    using ColVecType = ColumnVectorOrDecimal<T>;
+
+    AggregateFunctionLinearHistogram(const DataTypes& argument_types_)
+            : IAggregateFunctionDataHelper<Data,
+                                           AggregateFunctionLinearHistogram<T, 
Data, has_offset>>(
+                      argument_types_),
+              scale(get_decimal_scale(*argument_types_[0])) {}
+
+    std::string get_name() const override { return 
AggregateFunctionLinearHistogramConsts::NAME; }
+
+    DataTypePtr get_return_type() const override { return 
std::make_shared<DataTypeString>(); }
+
+    void add(AggregateDataPtr __restrict place, const IColumn** columns, 
ssize_t row_num,
+             Arena* arena) const override {
+        double interval =
+                assert_cast<const ColumnFloat64&, 
TypeCheckOnRelease::DISABLE>(*columns[1])
+                        .get_data()[row_num];
+        if (interval <= 0) {
+            throw doris::Exception(
+                    ErrorCode::INVALID_ARGUMENT,
+                    "Invalid interval {}, row_num {}, interval should be 
larger than 0", interval,
+                    row_num);
+        }
+
+        double offset = 0;
+        if constexpr (has_offset) {
+            offset = assert_cast<const ColumnFloat64&, 
TypeCheckOnRelease::DISABLE>(*columns[2])
+                             .get_data()[row_num];
+            if (offset < 0 || offset >= interval) {
+                throw doris::Exception(
+                        ErrorCode::INVALID_ARGUMENT,
+                        "Invalid offset {}, row_num {}, offset should be in 
[0, interval)", offset,
+                        row_num);
+            }
+        }
+
+        this->data(place).set_parameters(interval, offset);
+
+        this->data(place).add(
+                assert_cast<const ColVecType&, 
TypeCheckOnRelease::DISABLE>(*columns[0])
+                        .get_data()[row_num],
+                scale);
+    }
+
+    void reset(AggregateDataPtr place) const override { 
this->data(place).reset(); }
+
+    void merge(AggregateDataPtr __restrict place, ConstAggregateDataPtr rhs,
+               Arena* arena) const override {
+        this->data(place).merge(this->data(rhs));
+    }
+
+    void serialize(ConstAggregateDataPtr __restrict place, BufferWritable& 
buf) const override {
+        this->data(place).write(buf);
+    }
+
+    void deserialize(AggregateDataPtr __restrict place, BufferReadable& buf,
+                     Arena*) const override {
+        this->data(place).read(buf);
+    }
+
+    void insert_result_into(ConstAggregateDataPtr __restrict place, IColumn& 
to) const override {
+        this->data(place).insert_result_into(to);
+    }
+
+private:
+    UInt32 scale;
+};
+
+} // namespace doris::vectorized
diff --git 
a/be/src/vec/aggregate_functions/aggregate_function_simple_factory.cpp 
b/be/src/vec/aggregate_functions/aggregate_function_simple_factory.cpp
index 0a31fd6c576..daf3884cc28 100644
--- a/be/src/vec/aggregate_functions/aggregate_function_simple_factory.cpp
+++ b/be/src/vec/aggregate_functions/aggregate_function_simple_factory.cpp
@@ -64,6 +64,7 @@ void 
register_aggregate_function_collect_list(AggregateFunctionSimpleFactory& fa
 void 
register_aggregate_function_sequence_match(AggregateFunctionSimpleFactory& 
factory);
 void register_aggregate_function_avg_weighted(AggregateFunctionSimpleFactory& 
factory);
 void register_aggregate_function_histogram(AggregateFunctionSimpleFactory& 
factory);
+void 
register_aggregate_function_linear_histogram(AggregateFunctionSimpleFactory& 
factory);
 void register_aggregate_function_map_agg(AggregateFunctionSimpleFactory& 
factory);
 void register_aggregate_function_bitmap_agg(AggregateFunctionSimpleFactory& 
factory);
 void register_aggregate_functions_corr(AggregateFunctionSimpleFactory& 
factory);
@@ -110,6 +111,7 @@ AggregateFunctionSimpleFactory& 
AggregateFunctionSimpleFactory::instance() {
         register_aggregate_function_sequence_match(instance);
         register_aggregate_function_avg_weighted(instance);
         register_aggregate_function_histogram(instance);
+        register_aggregate_function_linear_histogram(instance);
         register_aggregate_function_map_agg(instance);
         register_aggregate_function_bitmap_agg(instance);
 
diff --git a/be/test/vec/aggregate_functions/agg_linear_histogram_test.cpp 
b/be/test/vec/aggregate_functions/agg_linear_histogram_test.cpp
new file mode 100644
index 00000000000..9406e96f4a2
--- /dev/null
+++ b/be/test/vec/aggregate_functions/agg_linear_histogram_test.cpp
@@ -0,0 +1,340 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#include <glog/logging.h>
+#include <gtest/gtest-message.h>
+#include <gtest/gtest-test-part.h>
+
+#include "gtest/gtest_pred_impl.h"
+#include "vec/aggregate_functions/aggregate_function.h"
+#include "vec/aggregate_functions/aggregate_function_simple_factory.h"
+#include "vec/common/arena.h"
+#include "vec/data_types/data_type_decimal.h"
+#include "vec/data_types/data_type_number.h"
+
+namespace doris::vectorized {
+
+void 
register_aggregate_function_linear_histogram(AggregateFunctionSimpleFactory& 
factory);
+
+std::string s1 =
+        "{\"num_buckets\":10,\"buckets\":["
+        "{\"lower\":0.0,\"upper\":10.0,\"count\":20,\"acc_count\":20},"
+        "{\"lower\":10.0,\"upper\":20.0,\"count\":20,\"acc_count\":40},"
+        "{\"lower\":20.0,\"upper\":30.0,\"count\":20,\"acc_count\":60},"
+        "{\"lower\":30.0,\"upper\":40.0,\"count\":20,\"acc_count\":80},"
+        "{\"lower\":40.0,\"upper\":50.0,\"count\":20,\"acc_count\":100},"
+        "{\"lower\":50.0,\"upper\":60.0,\"count\":20,\"acc_count\":120},"
+        "{\"lower\":60.0,\"upper\":70.0,\"count\":20,\"acc_count\":140},"
+        "{\"lower\":70.0,\"upper\":80.0,\"count\":20,\"acc_count\":160},"
+        "{\"lower\":80.0,\"upper\":90.0,\"count\":20,\"acc_count\":180},"
+        "{\"lower\":90.0,\"upper\":100.0,\"count\":20,\"acc_count\":200}"
+        "]}";
+std::string s2 =
+        "{\"num_buckets\":10,\"buckets\":["
+        "{\"lower\":0.0,\"upper\":10.0,\"count\":10,\"acc_count\":10},"
+        "{\"lower\":10.0,\"upper\":20.0,\"count\":10,\"acc_count\":20},"
+        "{\"lower\":20.0,\"upper\":30.0,\"count\":10,\"acc_count\":30},"
+        "{\"lower\":30.0,\"upper\":40.0,\"count\":10,\"acc_count\":40},"
+        "{\"lower\":40.0,\"upper\":50.0,\"count\":10,\"acc_count\":50},"
+        "{\"lower\":50.0,\"upper\":60.0,\"count\":10,\"acc_count\":60},"
+        "{\"lower\":60.0,\"upper\":70.0,\"count\":10,\"acc_count\":70},"
+        "{\"lower\":70.0,\"upper\":80.0,\"count\":10,\"acc_count\":80},"
+        "{\"lower\":80.0,\"upper\":90.0,\"count\":10,\"acc_count\":90},"
+        "{\"lower\":90.0,\"upper\":100.0,\"count\":10,\"acc_count\":100}"
+        "]}";
+std::string s3 =
+        "{\"num_buckets\":11,\"buckets\":["
+        "{\"lower\":-5.0,\"upper\":5.0,\"count\":10,\"acc_count\":10},"
+        "{\"lower\":5.0,\"upper\":15.0,\"count\":20,\"acc_count\":30},"
+        "{\"lower\":15.0,\"upper\":25.0,\"count\":20,\"acc_count\":50},"
+        "{\"lower\":25.0,\"upper\":35.0,\"count\":20,\"acc_count\":70},"
+        "{\"lower\":35.0,\"upper\":45.0,\"count\":20,\"acc_count\":90},"
+        "{\"lower\":45.0,\"upper\":55.0,\"count\":20,\"acc_count\":110},"
+        "{\"lower\":55.0,\"upper\":65.0,\"count\":20,\"acc_count\":130},"
+        "{\"lower\":65.0,\"upper\":75.0,\"count\":20,\"acc_count\":150},"
+        "{\"lower\":75.0,\"upper\":85.0,\"count\":20,\"acc_count\":170},"
+        "{\"lower\":85.0,\"upper\":95.0,\"count\":20,\"acc_count\":190},"
+        "{\"lower\":95.0,\"upper\":105.0,\"count\":10,\"acc_count\":200}"
+        "]}";
+std::string s4 =
+        "{\"num_buckets\":11,\"buckets\":["
+        "{\"lower\":-5.0,\"upper\":5.0,\"count\":5,\"acc_count\":5},"
+        "{\"lower\":5.0,\"upper\":15.0,\"count\":10,\"acc_count\":15},"
+        "{\"lower\":15.0,\"upper\":25.0,\"count\":10,\"acc_count\":25},"
+        "{\"lower\":25.0,\"upper\":35.0,\"count\":10,\"acc_count\":35},"
+        "{\"lower\":35.0,\"upper\":45.0,\"count\":10,\"acc_count\":45},"
+        "{\"lower\":45.0,\"upper\":55.0,\"count\":10,\"acc_count\":55},"
+        "{\"lower\":55.0,\"upper\":65.0,\"count\":10,\"acc_count\":65},"
+        "{\"lower\":65.0,\"upper\":75.0,\"count\":10,\"acc_count\":75},"
+        "{\"lower\":75.0,\"upper\":85.0,\"count\":10,\"acc_count\":85},"
+        "{\"lower\":85.0,\"upper\":95.0,\"count\":10,\"acc_count\":95},"
+        "{\"lower\":95.0,\"upper\":105.0,\"count\":5,\"acc_count\":100}"
+        "]}";
+std::string s5 =
+        "{\"num_buckets\":9,\"buckets\":["
+        "{\"lower\":0.0,\"upper\":0.5,\"count\":2,\"acc_count\":2},"
+        "{\"lower\":0.5,\"upper\":1.0,\"count\":0,\"acc_count\":2},"
+        "{\"lower\":1.0,\"upper\":1.5,\"count\":2,\"acc_count\":4},"
+        "{\"lower\":1.5,\"upper\":2.0,\"count\":0,\"acc_count\":4},"
+        "{\"lower\":2.0,\"upper\":2.5,\"count\":2,\"acc_count\":6},"
+        "{\"lower\":2.5,\"upper\":3.0,\"count\":0,\"acc_count\":6},"
+        "{\"lower\":3.0,\"upper\":3.5,\"count\":2,\"acc_count\":8},"
+        "{\"lower\":3.5,\"upper\":4.0,\"count\":0,\"acc_count\":8},"
+        "{\"lower\":4.0,\"upper\":4.5,\"count\":2,\"acc_count\":10}"
+        "]}";
+std::string s6 =
+        "{\"num_buckets\":9,\"buckets\":["
+        "{\"lower\":0.0,\"upper\":0.5,\"count\":1,\"acc_count\":1},"
+        "{\"lower\":0.5,\"upper\":1.0,\"count\":0,\"acc_count\":1},"
+        "{\"lower\":1.0,\"upper\":1.5,\"count\":1,\"acc_count\":2},"
+        "{\"lower\":1.5,\"upper\":2.0,\"count\":0,\"acc_count\":2},"
+        "{\"lower\":2.0,\"upper\":2.5,\"count\":1,\"acc_count\":3},"
+        "{\"lower\":2.5,\"upper\":3.0,\"count\":0,\"acc_count\":3},"
+        "{\"lower\":3.0,\"upper\":3.5,\"count\":1,\"acc_count\":4},"
+        "{\"lower\":3.5,\"upper\":4.0,\"count\":0,\"acc_count\":4},"
+        "{\"lower\":4.0,\"upper\":4.5,\"count\":1,\"acc_count\":5}"
+        "]}";
+std::string s7 =
+        "{\"num_buckets\":9,\"buckets\":["
+        "{\"lower\":-0.25,\"upper\":0.25,\"count\":2,\"acc_count\":2},"
+        "{\"lower\":0.25,\"upper\":0.75,\"count\":0,\"acc_count\":2},"
+        "{\"lower\":0.75,\"upper\":1.25,\"count\":2,\"acc_count\":4},"
+        "{\"lower\":1.25,\"upper\":1.75,\"count\":0,\"acc_count\":4},"
+        "{\"lower\":1.75,\"upper\":2.25,\"count\":2,\"acc_count\":6},"
+        "{\"lower\":2.25,\"upper\":2.75,\"count\":0,\"acc_count\":6},"
+        "{\"lower\":2.75,\"upper\":3.25,\"count\":2,\"acc_count\":8},"
+        "{\"lower\":3.25,\"upper\":3.75,\"count\":0,\"acc_count\":8},"
+        "{\"lower\":3.75,\"upper\":4.25,\"count\":2,\"acc_count\":10}"
+        "]}";
+std::string s8 =
+        "{\"num_buckets\":9,\"buckets\":["
+        "{\"lower\":-0.25,\"upper\":0.25,\"count\":1,\"acc_count\":1},"
+        "{\"lower\":0.25,\"upper\":0.75,\"count\":0,\"acc_count\":1},"
+        "{\"lower\":0.75,\"upper\":1.25,\"count\":1,\"acc_count\":2},"
+        "{\"lower\":1.25,\"upper\":1.75,\"count\":0,\"acc_count\":2},"
+        "{\"lower\":1.75,\"upper\":2.25,\"count\":1,\"acc_count\":3},"
+        "{\"lower\":2.25,\"upper\":2.75,\"count\":0,\"acc_count\":3},"
+        "{\"lower\":2.75,\"upper\":3.25,\"count\":1,\"acc_count\":4},"
+        "{\"lower\":3.25,\"upper\":3.75,\"count\":0,\"acc_count\":4},"
+        "{\"lower\":3.75,\"upper\":4.25,\"count\":1,\"acc_count\":5}"
+        "]}";
+
+class AggLinearHistogramTest : public testing::Test {
+public:
+    void SetUp() override {
+        AggregateFunctionSimpleFactory factory = 
AggregateFunctionSimpleFactory::instance();
+        register_aggregate_function_linear_histogram(factory);
+    }
+
+    void TearDown() override {}
+
+    template <typename DataType>
+    void agg_linear_histogram_add_elements(AggregateFunctionPtr agg_function,
+                                           AggregateDataPtr place, size_t 
input_rows,
+                                           double interval, double offset) {
+        using FieldType = typename DataType::FieldType;
+
+        std::shared_ptr<DataType> type;
+        if constexpr (IsDecimalNumber<FieldType>) {
+            type = std::make_shared<DataType>(9, 0);
+        } else {
+            type = std::make_shared<DataType>();
+        }
+
+        MutableColumns columns(3);
+        columns[0] = type->create_column();
+        columns[1] = ColumnFloat64::create();
+        columns[2] = ColumnFloat64::create();
+
+        for (size_t i = 0; i < input_rows; ++i) {
+            auto item0 = FieldType(static_cast<uint64_t>(i));
+            columns[0]->insert_data(reinterpret_cast<const char*>(&item0), 0);
+            columns[1]->insert_data(reinterpret_cast<const char*>(&interval), 
0);
+            if (offset != 0) {
+                columns[2]->insert_data(reinterpret_cast<const 
char*>(&offset), 0);
+            }
+        }
+
+        EXPECT_EQ(columns[0]->size(), input_rows);
+
+        if (offset != 0) {
+            const IColumn* column[3] = {columns[0].get(), columns[1].get(), 
columns[2].get()};
+            for (int i = 0; i < input_rows; i++) {
+                agg_function->add(place, column, i, &_agg_arena_pool);
+            }
+        } else {
+            const IColumn* column[2] = {columns[0].get(), columns[1].get()};
+            for (int i = 0; i < input_rows; i++) {
+                agg_function->add(place, column, i, &_agg_arena_pool);
+            }
+        }
+    }
+
+    template <typename DataType>
+    void test_agg_linear_histogram(size_t input_rows, double interval, double 
offset) {
+        using FieldType = typename DataType::FieldType;
+
+        std::shared_ptr<DataType> type;
+        if constexpr (IsDecimalNumber<FieldType>) {
+            type = std::make_shared<DataType>(9, 0);
+        } else {
+            type = std::make_shared<DataType>();
+        }
+        DataTypes data_types1 = {(DataTypePtr)type, 
std::make_shared<DataTypeFloat64>()};
+        DataTypes data_types2 = {(DataTypePtr)type, 
std::make_shared<DataTypeFloat64>(),
+                                 std::make_shared<DataTypeFloat64>()};
+
+        auto data_types = (offset == 0) ? data_types1 : data_types2;
+
+        GTEST_LOG_(INFO) << "test_agg_linear_histogram for type"
+                         << "(" << data_types[0]->get_name() << ")";
+
+        AggregateFunctionSimpleFactory factory = 
AggregateFunctionSimpleFactory::instance();
+        auto agg_function = factory.get("linear_histogram", data_types, false, 
-1, true);
+        EXPECT_NE(agg_function, nullptr);
+
+        std::unique_ptr<char[]> memory(new char[agg_function->size_of_data()]);
+        AggregateDataPtr place = memory.get();
+        agg_function->create(place);
+        agg_linear_histogram_add_elements<DataType>(agg_function, place, 
input_rows, interval,
+                                                    offset);
+
+        ColumnString buf;
+        VectorBufferWriter buf_writer(buf);
+        agg_function->serialize(place, buf_writer);
+        buf_writer.commit();
+        VectorBufferReader buf_reader(buf.get_data_at(0));
+        agg_function->deserialize(place, buf_reader, &_agg_arena_pool);
+
+        std::unique_ptr<char[]> memory2(new 
char[agg_function->size_of_data()]);
+        AggregateDataPtr place2 = memory2.get();
+        agg_function->create(place2);
+        agg_linear_histogram_add_elements<DataType>(agg_function, place2, 
input_rows, interval,
+                                                    offset);
+        agg_function->merge(place, place2, &_agg_arena_pool);
+
+        auto column_result1 = ColumnString::create();
+        agg_function->insert_result_into(place, *column_result1);
+        EXPECT_EQ(column_result1->size(), 1);
+        EXPECT_TRUE(column_result1->get_offsets()[0] >= 1);
+
+        auto column_result2 = ColumnString::create();
+        agg_function->insert_result_into(place2, *column_result2);
+        EXPECT_EQ(column_result2->size(), 1);
+        EXPECT_TRUE(column_result2->get_offsets()[0] >= 1);
+
+        std::string result1 = column_result1->get_data_at(0).to_string();
+        std::string result2 = column_result2->get_data_at(0).to_string();
+
+        expect_eq(input_rows, interval, offset, result1, result2);
+
+        agg_function->destroy(place);
+        agg_function->destroy(place2);
+    }
+
+    void expect_eq(size_t input_rows, double interval, double offset, 
std::string& result1,
+                   std::string& result2) {
+        // test empty data
+        if (input_rows == 0) {
+            std::string expect_empty_result = 
"{\"num_buckets\":0,\"buckets\":[]}";
+            EXPECT_EQ(result1, expect_empty_result);
+            EXPECT_EQ(result2, expect_empty_result);
+        }
+
+        // test with data
+        if (input_rows == 100 && interval == 10 && offset == 0) {
+            std::string expect_result1 = s1;
+            std::string expect_result2 = s2;
+            EXPECT_EQ(result1, expect_result1);
+            EXPECT_EQ(result2, expect_result2);
+        }
+
+        if (input_rows == 100 && interval == 10 && offset == 5) {
+            std::string expect_result1 = s3;
+            std::string expect_result2 = s4;
+            EXPECT_EQ(result1, expect_result1);
+            EXPECT_EQ(result2, expect_result2);
+        }
+
+        if (input_rows == 5 && interval == 0.5 && offset == 0) {
+            std::string expect_result1 = s5;
+            std::string expect_result2 = s6;
+            EXPECT_EQ(result1, expect_result1);
+            EXPECT_EQ(result2, expect_result2);
+        }
+
+        if (input_rows == 5 && interval == 0.5 && offset == 0.25) {
+            std::string expect_result1 = s7;
+            std::string expect_result2 = s8;
+            EXPECT_EQ(result1, expect_result1);
+            EXPECT_EQ(result2, expect_result2);
+        }
+    }
+
+private:
+    vectorized::Arena _agg_arena_pool;
+};
+
+TEST_F(AggLinearHistogramTest, test_empty) {
+    test_agg_linear_histogram<DataTypeInt8>(0, 10, 0);
+    test_agg_linear_histogram<DataTypeInt16>(0, 10, 0);
+    test_agg_linear_histogram<DataTypeInt32>(0, 10, 0);
+    test_agg_linear_histogram<DataTypeInt64>(0, 10, 0);
+    test_agg_linear_histogram<DataTypeInt128>(0, 10, 0);
+    test_agg_linear_histogram<DataTypeFloat32>(0, 0.5, 0);
+    test_agg_linear_histogram<DataTypeFloat64>(0, 0.5, 0);
+
+    test_agg_linear_histogram<DataTypeDecimal<Decimal32>>(0, 0.5, 0);
+    test_agg_linear_histogram<DataTypeDecimal<Decimal64>>(0, 0.5, 0);
+    test_agg_linear_histogram<DataTypeDecimal<Decimal128V2>>(0, 0.5, 0);
+    test_agg_linear_histogram<DataTypeDecimal<Decimal128V3>>(0, 0.5, 0);
+    test_agg_linear_histogram<DataTypeDecimal<Decimal256>>(0, 0.5, 0);
+}
+
+TEST_F(AggLinearHistogramTest, test_with_data) {
+    GTEST_LOG_(INFO) << "no offset";
+    test_agg_linear_histogram<DataTypeInt8>(100, 10, 0);
+    test_agg_linear_histogram<DataTypeInt16>(100, 10, 0);
+    test_agg_linear_histogram<DataTypeInt32>(100, 10, 0);
+    test_agg_linear_histogram<DataTypeInt64>(100, 10, 0);
+    test_agg_linear_histogram<DataTypeInt128>(100, 10, 0);
+    test_agg_linear_histogram<DataTypeFloat32>(5, 0.5, 0);
+    test_agg_linear_histogram<DataTypeFloat64>(5, 0.5, 0);
+
+    test_agg_linear_histogram<DataTypeDecimal<Decimal32>>(5, 0.5, 0);
+    test_agg_linear_histogram<DataTypeDecimal<Decimal64>>(5, 0.5, 0);
+    test_agg_linear_histogram<DataTypeDecimal<Decimal128V2>>(5, 0.5, 0);
+    test_agg_linear_histogram<DataTypeDecimal<Decimal128V3>>(5, 0.5, 0);
+    test_agg_linear_histogram<DataTypeDecimal<Decimal256>>(5, 0.5, 0);
+
+    GTEST_LOG_(INFO) << "has offset";
+    test_agg_linear_histogram<DataTypeInt8>(100, 10, 5);
+    test_agg_linear_histogram<DataTypeInt16>(100, 10, 5);
+    test_agg_linear_histogram<DataTypeInt32>(100, 10, 5);
+    test_agg_linear_histogram<DataTypeInt64>(100, 10, 5);
+    test_agg_linear_histogram<DataTypeInt128>(100, 10, 5);
+    test_agg_linear_histogram<DataTypeFloat32>(5, 0.5, 0.25);
+    test_agg_linear_histogram<DataTypeFloat64>(5, 0.5, 0.25);
+
+    test_agg_linear_histogram<DataTypeDecimal<Decimal32>>(5, 0.5, 0.25);
+    test_agg_linear_histogram<DataTypeDecimal<Decimal64>>(5, 0.5, 0.25);
+    test_agg_linear_histogram<DataTypeDecimal<Decimal128V2>>(5, 0.5, 0.25);
+    test_agg_linear_histogram<DataTypeDecimal<Decimal128V3>>(5, 0.5, 0.25);
+    test_agg_linear_histogram<DataTypeDecimal<Decimal256>>(5, 0.5, 0.25);
+}
+
+} // namespace doris::vectorized
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
index 369f4594dca..2a8ae667fde 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
@@ -1922,7 +1922,8 @@ public class FunctionCallExpr extends Expr {
 
                 if ((fnName.getFunction().equalsIgnoreCase("money_format") || 
fnName.getFunction()
                         .equalsIgnoreCase("histogram")
-                        || fnName.getFunction().equalsIgnoreCase("hist"))
+                        || fnName.getFunction().equalsIgnoreCase("hist")
+                        || 
fnName.getFunction().equalsIgnoreCase("linear_histogram"))
                         && children.get(0).getType().isDecimalV3() && 
args[ix].isDecimalV3()) {
                     continue;
                 } else if ((fnName.getFunction().equalsIgnoreCase("array_min") 
|| fnName.getFunction()
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateFunction.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateFunction.java
index df9c792aec6..31fc09b9775 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateFunction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateFunction.java
@@ -53,7 +53,7 @@ public class AggregateFunction extends Function {
             FunctionSet.ORTHOGONAL_BITMAP_EXPR_CALCULATE_COUNT, 
FunctionSet.ORTHOGONAL_BITMAP_EXPR_CALCULATE,
             FunctionSet.INTERSECT_COUNT, 
FunctionSet.ORTHOGONAL_BITMAP_UNION_COUNT, FunctionSet.COUNT,
             "approx_count_distinct", "ndv", FunctionSet.BITMAP_UNION_INT, 
FunctionSet.BITMAP_UNION_COUNT,
-            "ndv_no_finalize", "percentile_array", "histogram",
+            "ndv_no_finalize", "percentile_array", "histogram", 
FunctionSet.LINEAR_HISTOGRAM,
             FunctionSet.SEQUENCE_COUNT, FunctionSet.MAP_AGG, 
FunctionSet.BITMAP_AGG, FunctionSet.ARRAY_AGG,
             FunctionSet.COLLECT_LIST, FunctionSet.COLLECT_SET, 
FunctionSet.GROUP_ARRAY_INTERSECT,
             FunctionSet.SUM0, FunctionSet.MULTI_DISTINCT_SUM0, 
FunctionSet.REGR_INTERCEPT, FunctionSet.REGR_SLOPE);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinAggregateFunctions.java
 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinAggregateFunctions.java
index 3611764886b..be4b300f96c 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinAggregateFunctions.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinAggregateFunctions.java
@@ -44,6 +44,7 @@ import 
org.apache.doris.nereids.trees.expressions.functions.agg.HllUnion;
 import org.apache.doris.nereids.trees.expressions.functions.agg.HllUnionAgg;
 import org.apache.doris.nereids.trees.expressions.functions.agg.IntersectCount;
 import org.apache.doris.nereids.trees.expressions.functions.agg.Kurt;
+import 
org.apache.doris.nereids.trees.expressions.functions.agg.LinearHistogram;
 import org.apache.doris.nereids.trees.expressions.functions.agg.MapAgg;
 import org.apache.doris.nereids.trees.expressions.functions.agg.Max;
 import org.apache.doris.nereids.trees.expressions.functions.agg.MaxBy;
@@ -119,6 +120,7 @@ public class BuiltinAggregateFunctions implements 
FunctionHelper {
             agg(HllUnion.class, "hll_raw_agg", "hll_union"),
             agg(HllUnionAgg.class, "hll_union_agg"),
             agg(IntersectCount.class, "intersect_count"),
+            agg(LinearHistogram.class, FunctionSet.LINEAR_HISTOGRAM),
             agg(MapAgg.class, "map_agg"),
             agg(Max.class, "max"),
             agg(MaxBy.class, "max_by"),
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java
index c9110bb0e13..452460334f6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java
@@ -230,6 +230,7 @@ public class FunctionSet<T> {
     public static final String COLLECT_LIST = "collect_list";
     public static final String COLLECT_SET = "collect_set";
     public static final String HISTOGRAM = "histogram";
+    public static final String LINEAR_HISTOGRAM = "linear_histogram";
     public static final String HIST = "hist";
     public static final String MAP_AGG = "map_agg";
 
@@ -1548,6 +1549,14 @@ public class FunctionSet<T> {
                     Type.VARCHAR, t,
                     "", "", "", "", "", true, false, true, true));
 
+            // linear histogram
+            addBuiltin(AggregateFunction.createBuiltin(LINEAR_HISTOGRAM,
+                    Lists.<Type>newArrayList(t, Type.DOUBLE), Type.VARCHAR, t,
+                    "", "", "", "", "", true, false, true, true));
+            addBuiltin(AggregateFunction.createBuiltin(LINEAR_HISTOGRAM,
+                    Lists.<Type>newArrayList(t, Type.DOUBLE, Type.DOUBLE), 
Type.VARCHAR, t,
+                    "", "", "", "", "", true, false, true, true));
+
             // group array
             addBuiltin(AggregateFunction.createBuiltin(GROUP_UNIQ_ARRAY, 
Lists.newArrayList(t), new ArrayType(t), t,
                     "", "", "", "", "", true, false, true, true));
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/LinearHistogram.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/LinearHistogram.java
new file mode 100644
index 00000000000..ac172fc7881
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/LinearHistogram.java
@@ -0,0 +1,89 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.trees.expressions.functions.agg;
+
+import org.apache.doris.catalog.FunctionSet;
+import org.apache.doris.catalog.FunctionSignature;
+import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.functions.AlwaysNotNullable;
+import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
+import org.apache.doris.nereids.trees.expressions.functions.SearchSignature;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+import org.apache.doris.nereids.types.DoubleType;
+import org.apache.doris.nereids.types.VarcharType;
+import org.apache.doris.nereids.types.coercion.AnyDataType;
+import org.apache.doris.nereids.types.coercion.PrimitiveType;
+
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+
+/**
+ * AggregateFunction 'linear_histogram'.
+ */
+public class LinearHistogram extends AggregateFunction implements 
ExplicitlyCastableSignature, AlwaysNotNullable {
+
+    public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
+            FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT)
+                .args(AnyDataType.INSTANCE_WITHOUT_INDEX, DoubleType.INSTANCE),
+            FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT)
+                .args(AnyDataType.INSTANCE_WITHOUT_INDEX, DoubleType.INSTANCE, 
DoubleType.INSTANCE)
+    );
+
+    public LinearHistogram(Expression arg0, Expression arg1) {
+        super(FunctionSet.LINEAR_HISTOGRAM, arg0, arg1);
+    }
+
+    public LinearHistogram(Expression arg0, Expression arg1, Expression arg2) {
+        super(FunctionSet.LINEAR_HISTOGRAM, arg0, arg1, arg2);
+    }
+
+    private LinearHistogram(boolean distinct, List<Expression> args) {
+        super(FunctionSet.LINEAR_HISTOGRAM, distinct, args);
+    }
+
+    public LinearHistogram(boolean distinct, Expression arg0, Expression arg1) 
{
+        super(FunctionSet.LINEAR_HISTOGRAM, distinct, arg0, arg1);
+    }
+
+    public LinearHistogram(boolean distinct, Expression arg0, Expression arg1, 
Expression arg2) {
+        super(FunctionSet.LINEAR_HISTOGRAM, distinct, arg0, arg1, arg2);
+    }
+
+    @Override
+    public void checkLegalityBeforeTypeCoercion() {
+        if (!(child(0).getDataType() instanceof PrimitiveType)) {
+            SearchSignature.throwCanNotFoundFunctionException(this.getName(), 
getArguments());
+        }
+    }
+
+    @Override
+    public AggregateFunction withDistinctAndChildren(boolean distinct, 
List<Expression> children) {
+        return new LinearHistogram(distinct, children);
+    }
+
+    @Override
+    public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
+        return visitor.visitLinearHistogram(this, context);
+    }
+
+    @Override
+    public List<FunctionSignature> getSignatures() {
+        return SIGNATURES;
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/AggregateFunctionVisitor.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/AggregateFunctionVisitor.java
index 4f9f9e5e364..4e7870609e1 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/AggregateFunctionVisitor.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/AggregateFunctionVisitor.java
@@ -45,6 +45,7 @@ import 
org.apache.doris.nereids.trees.expressions.functions.agg.HllUnion;
 import org.apache.doris.nereids.trees.expressions.functions.agg.HllUnionAgg;
 import org.apache.doris.nereids.trees.expressions.functions.agg.IntersectCount;
 import org.apache.doris.nereids.trees.expressions.functions.agg.Kurt;
+import 
org.apache.doris.nereids.trees.expressions.functions.agg.LinearHistogram;
 import org.apache.doris.nereids.trees.expressions.functions.agg.MapAgg;
 import org.apache.doris.nereids.trees.expressions.functions.agg.Max;
 import org.apache.doris.nereids.trees.expressions.functions.agg.MaxBy;
@@ -218,6 +219,10 @@ public interface AggregateFunctionVisitor<R, C> {
         return visitAggregateFunction(kurt, context);
     }
 
+    default R visitLinearHistogram(LinearHistogram linearHistogram, C context) 
{
+        return visitAggregateFunction(linearHistogram, context);
+    }
+
     default R visitMapAgg(MapAgg mapAgg, C context) {
         return visitAggregateFunction(mapAgg, context);
     }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/GenerateFunction.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/GenerateFunction.java
index 2d010df4c51..4760e86a921 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/GenerateFunction.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/GenerateFunction.java
@@ -95,6 +95,7 @@ import java.util.TreeMap;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
+@Deprecated
 public class GenerateFunction {
 
     static final Set<String> unaryArithmeticOperators = 
Arrays.stream(ArithmeticExpr.Operator.values())
diff --git a/regression-test/data/nereids_function_p0/agg_function/agg.out 
b/regression-test/data/nereids_function_p0/agg_function/agg.out
index a84deaf7bac..10406714f50 100644
--- a/regression-test/data/nereids_function_p0/agg_function/agg.out
+++ b/regression-test/data/nereids_function_p0/agg_function/agg.out
@@ -265,7 +265,7 @@
 
 -- !sql_avg_Double_gb --
 \N
-0.4
+0.39999999999999997
 1.0
 
 -- !sql_avg_Double --
@@ -291,7 +291,7 @@
 
 -- !sql_avg_Double_agg_phase_3 --
 0      \N
-7      0.4
+7      0.39999999999999997
 5      1.0
 
 -- !sql_avg_Double_agg_phase_4 --
@@ -323,7 +323,7 @@
 
 -- !sql_avg_Double_agg_phase_3_notnull --
 0      \N
-7      0.4
+7      0.39999999999999997
 5      1.0
 
 -- !sql_avg_Double_agg_phase_4_notnull --
@@ -397,7 +397,7 @@
 
 -- !sql_avg_weighted_TinyInt_Double_gb --
 \N
-5.000000000000001
+5.0
 10.2
 
 -- !sql_avg_weighted_TinyInt_Double --
@@ -430,11 +430,11 @@
 12     8.333333333333332
 
 -- !sql_avg_weighted_TinyInt_Double_gb_notnull --
-4.999999999999999
+5.0
 10.2
 
 -- !sql_avg_weighted_TinyInt_Double_notnull --
-8.333333333333332
+8.333333333333334
 
 -- !sql_avg_weighted_TinyInt_Double_agg_phase_1_notnull --
 1      1.0
@@ -451,7 +451,7 @@
 1      12.0
 
 -- !sql_avg_weighted_TinyInt_Double_agg_phase_2_notnull --
-12     8.333333333333334
+12     8.333333333333332
 
 -- !sql_avg_weighted_TinyInt_Double_agg_phase_3_notnull --
 0      \N
@@ -459,7 +459,7 @@
 5      10.2
 
 -- !sql_avg_weighted_TinyInt_Double_agg_phase_4_notnull --
-12     8.333333333333334
+12     8.333333333333332
 
 -- !sql_avg_weighted_SmallInt_Double_gb --
 \N
@@ -493,10 +493,10 @@
 5      10.2
 
 -- !sql_avg_weighted_SmallInt_Double_agg_phase_4 --
-12     8.333333333333332
+12     8.333333333333334
 
 -- !sql_avg_weighted_SmallInt_Double_gb_notnull --
-4.999999999999999
+5.0
 10.2
 
 -- !sql_avg_weighted_SmallInt_Double_notnull --
@@ -529,7 +529,7 @@
 
 -- !sql_avg_weighted_Integer_Double_gb --
 \N
-5.000000000000001
+4.999999999999999
 10.2
 
 -- !sql_avg_weighted_Integer_Double --
@@ -551,19 +551,19 @@
 1      12.0
 
 -- !sql_avg_weighted_Integer_Double_agg_phase_2 --
-12     8.333333333333332
+12     8.333333333333334
 
 -- !sql_avg_weighted_Integer_Double_agg_phase_3 --
 0      \N
-7      5.0
+7      4.999999999999999
 5      10.2
 
 -- !sql_avg_weighted_Integer_Double_agg_phase_4 --
-12     8.333333333333332
+12     8.333333333333334
 
 -- !sql_avg_weighted_Integer_Double_gb_notnull --
 5.0
-10.199999999999998
+10.2
 
 -- !sql_avg_weighted_Integer_Double_notnull --
 8.333333333333334
@@ -583,7 +583,7 @@
 1      12.0
 
 -- !sql_avg_weighted_Integer_Double_agg_phase_2_notnull --
-12     8.333333333333332
+12     8.333333333333334
 
 -- !sql_avg_weighted_Integer_Double_agg_phase_3_notnull --
 0      \N
@@ -599,7 +599,7 @@
 10.2
 
 -- !sql_avg_weighted_BigInt_Double --
-8.333333333333332
+8.333333333333334
 
 -- !sql_avg_weighted_BigInt_Double_agg_phase_1 --
 0      \N
@@ -625,10 +625,10 @@
 5      10.2
 
 -- !sql_avg_weighted_BigInt_Double_agg_phase_4 --
-12     8.333333333333334
+12     8.333333333333332
 
 -- !sql_avg_weighted_BigInt_Double_gb_notnull --
-4.999999999999999
+5.0
 10.2
 
 -- !sql_avg_weighted_BigInt_Double_notnull --
@@ -653,19 +653,19 @@
 
 -- !sql_avg_weighted_BigInt_Double_agg_phase_3_notnull --
 0      \N
-7      4.999999999999999
+7      5.0
 5      10.2
 
 -- !sql_avg_weighted_BigInt_Double_agg_phase_4_notnull --
-12     8.333333333333334
+12     8.333333333333332
 
 -- !sql_avg_weighted_Float_Double_gb --
 \N
 0.5000000045235667
-1.0200000143051147
+1.0200000143051144
 
 -- !sql_avg_weighted_Float_Double --
-0.8333333441271231
+0.833333344127123
 
 -- !sql_avg_weighted_Float_Double_agg_phase_1 --
 0      \N
@@ -683,7 +683,7 @@
 1      1.2000000476837158
 
 -- !sql_avg_weighted_Float_Double_agg_phase_2 --
-12     0.833333344127123
+12     0.8333333441271232
 
 -- !sql_avg_weighted_Float_Double_agg_phase_3 --
 0      \N
@@ -691,10 +691,10 @@
 5      1.0200000143051147
 
 -- !sql_avg_weighted_Float_Double_agg_phase_4 --
-12     0.833333344127123
+12     0.8333333441271232
 
 -- !sql_avg_weighted_Float_Double_gb_notnull --
-0.5000000045235669
+0.5000000045235667
 1.0200000143051147
 
 -- !sql_avg_weighted_Float_Double_notnull --
@@ -723,15 +723,15 @@
 5      1.0200000143051147
 
 -- !sql_avg_weighted_Float_Double_agg_phase_4_notnull --
-12     0.833333344127123
+12     0.8333333441271231
 
 -- !sql_avg_weighted_Double_Double_gb --
 \N
-0.49999999999999994
+0.5
 1.02
 
 -- !sql_avg_weighted_Double_Double --
-0.8333333333333334
+0.8333333333333333
 
 -- !sql_avg_weighted_Double_Double_agg_phase_1 --
 0      \N
@@ -749,11 +749,11 @@
 1      1.2
 
 -- !sql_avg_weighted_Double_Double_agg_phase_2 --
-12     0.8333333333333335
+12     0.8333333333333333
 
 -- !sql_avg_weighted_Double_Double_agg_phase_3 --
 0      \N
-7      0.5000000000000001
+7      0.49999999999999994
 5      1.02
 
 -- !sql_avg_weighted_Double_Double_agg_phase_4 --
@@ -764,7 +764,7 @@
 1.02
 
 -- !sql_avg_weighted_Double_Double_notnull --
-0.8333333333333331
+0.8333333333333334
 
 -- !sql_avg_weighted_Double_Double_agg_phase_1_notnull --
 1      0.10000000000000002
@@ -785,11 +785,11 @@
 
 -- !sql_avg_weighted_Double_Double_agg_phase_3_notnull --
 0      \N
-7      0.5000000000000001
+7      0.5
 5      1.02
 
 -- !sql_avg_weighted_Double_Double_agg_phase_4_notnull --
-12     0.8333333333333333
+12     0.8333333333333334
 
 -- !sql_avg_weighted_DecimalV2_Double_gb --
 \N
@@ -827,7 +827,7 @@
 
 -- !sql_avg_weighted_DecimalV2_Double_gb_notnull --
 0.5
-1.0199999999999998
+1.02
 
 -- !sql_avg_weighted_DecimalV2_Double_notnull --
 0.8333333333333333
@@ -851,8 +851,8 @@
 
 -- !sql_avg_weighted_DecimalV2_Double_agg_phase_3_notnull --
 0      \N
-7      0.5000000000000001
-5      1.0199999999999998
+7      0.49999999999999994
+5      1.02
 
 -- !sql_avg_weighted_DecimalV2_Double_agg_phase_4_notnull --
 12     0.8333333333333334
@@ -1410,148 +1410,6 @@
 -- !sql_count_AnyData_agg_phase_4_notnull --
 12     12
 
--- !sql_group_array_intersect_array_bool --
-[0]
-
--- !sql_group_array_intersect_array_tinyint --
-[1]
-
--- !sql_group_array_intersect_array_smallint --
-[]
-
--- !sql_group_array_intersect_array_int --
-[]
-[1]
-[2]
-[3]
-[4]
-[5]
-[6]
-[7]
-[8]
-[9]
-[10]
-[11]
-[12]
-
--- !sql_group_array_intersect_array_bigint --
-[]
-
--- !sql_group_array_intersect_array_largeint --
-[8]
-
--- !sql_group_array_intersect_array_float --
-[5]
-
--- !sql_group_array_intersect_array_double --
-[0.2]
-
--- !sql_group_array_intersect_array_date --
-["2012-03-03"]
-
--- !sql_group_array_intersect_array_datetime --
-["2012-03-04 04:03:04"]
-
--- !sql_group_array_intersect_array_datev2 --
-["2012-03-06"]
-
--- !sql_group_array_intersect_array_datetimev2 --
-["2012-03-09 09:08:09.000000"]
-
--- !sql_group_array_intersect_array_char --
-["char21", "char11", "char31"]
-
--- !sql_group_array_intersect_array_varchar --
-["varchar11", "char11", "varchar31", "char31", "varchar21", "char21"]
-
--- !sql_group_array_intersect_array_string --
-["varchar11", "string1", "varchar31", "char31", "varchar21", "char21"]
-
--- !sql_group_array_intersect_array_decimal --
-[]
-[0.100000000]
-[0.200000000]
-[0.300000000]
-[0.400000000]
-[0.500000000]
-[0.600000000]
-[0.700000000]
-[0.800000000]
-[0.900000000]
-[1.000000000]
-[1.100000000]
-[1.200000000]
-
--- !sql_group_array_intersect_array_bool_notnull --
-[0]
-
--- !sql_group_array_intersect_array_tinyint_notnull --
-[1]
-
--- !sql_group_array_intersect_array_smallint_notnull --
-[]
-
--- !sql_group_array_intersect_array_int_notnull --
-[1]
-[2]
-[3]
-[4]
-[5]
-[6]
-[7]
-[8]
-[9]
-[10]
-[11]
-[12]
-
--- !sql_group_array_intersect_array_bigint_notnull --
-[]
-
--- !sql_group_array_intersect_array_largeint_notnull --
-[8]
-
--- !sql_group_array_intersect_array_float_notnull --
-[5]
-
--- !sql_group_array_intersect_array_double_notnull --
-[0.2]
-
--- !sql_group_array_intersect_array_date_notnull --
-["2012-03-03"]
-
--- !sql_group_array_intersect_array_datetime_notnull --
-["2012-03-04 04:03:04"]
-
--- !sql_group_array_intersect_array_datev2_notnull --
-["2012-03-06"]
-
--- !sql_group_array_intersect_array_datetimev2_notnull --
-["2012-03-09 09:08:09.000000"]
-
--- !sql_group_array_intersect_array_char_notnull --
-["char21", "char11", "char31"]
-
--- !sql_group_array_intersect_array_varchar_notnull --
-["varchar11", "char11", "varchar31", "char31", "varchar21", "char21"]
-
--- !sql_group_array_intersect_array_string_notnull --
-["varchar11", "string1", "varchar31", "char31", "varchar21", "char21"]
-
--- !sql_group_array_intersect_array_decimal_notnull --
-[0.100000000]
-[0.200000000]
-[0.300000000]
-[0.400000000]
-[0.500000000]
-[0.600000000]
-[0.700000000]
-[0.800000000]
-[0.900000000]
-[1.000000000]
-[1.100000000]
-[1.200000000]
-
 -- !sql_group_bit_and_TinyInt_gb --
 \N
 0
@@ -2608,6 +2466,471 @@
 -- !sql_group_bitmap_xor_Bitmap_agg_phase_4_notnull --
 12     \N
 
+-- !sql_linear_histogram_TinyInt_gb --
+{"num_buckets":0,"buckets":[]}
+{"num_buckets":4,"buckets":[{"lower":0.0,"upper":2.0,"count":1,"acc_count":1},{"lower":2.0,"upper":4.0,"count":2,"acc_count":3},{"lower":4.0,"upper":6.0,"count":2,"acc_count":5},{"lower":6.0,"upper":8.0,"count":2,"acc_count":7}]}
+{"num_buckets":3,"buckets":[{"lower":8.0,"upper":10.0,"count":2,"acc_count":2},{"lower":10.0,"upper":12.0,"count":2,"acc_count":4},{"lower":12.0,"upper":14.0,"count":1,"acc_count":5}]}
+
+-- !sql_linear_histogram_TinyInt --
+{"num_buckets":7,"buckets":[{"lower":0.0,"upper":2.0,"count":1,"acc_count":1},{"lower":2.0,"upper":4.0,"count":2,"acc_count":3},{"lower":4.0,"upper":6.0,"count":2,"acc_count":5},{"lower":6.0,"upper":8.0,"count":2,"acc_count":7},{"lower":8.0,"upper":10.0,"count":2,"acc_count":9},{"lower":10.0,"upper":12.0,"count":2,"acc_count":11},{"lower":12.0,"upper":14.0,"count":1,"acc_count":12}]}
+
+-- !sql_linear_histogram_TinyInt_offset --
+{"num_buckets":6,"buckets":[{"lower":1.0,"upper":3.0,"count":2,"acc_count":2},{"lower":3.0,"upper":5.0,"count":2,"acc_count":4},{"lower":5.0,"upper":7.0,"count":2,"acc_count":6},{"lower":7.0,"upper":9.0,"count":2,"acc_count":8},{"lower":9.0,"upper":11.0,"count":2,"acc_count":10},{"lower":11.0,"upper":13.0,"count":2,"acc_count":12}]}
+
+-- !sql_linear_histogram_TinyInt_agg_phase_1 --
+0      {"num_buckets":0,"buckets":[]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":2.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":2.0,"upper":4.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":2.0,"upper":4.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":4.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":4.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":6.0,"upper":8.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":6.0,"upper":8.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":8.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":8.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":12.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":12.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":12.0,"upper":14.0,"count":1,"acc_count":1}]}
+
+-- !sql_linear_histogram_TinyInt_agg_phase_2 --
+12     
{"num_buckets":7,"buckets":[{"lower":0.0,"upper":2.0,"count":1,"acc_count":1},{"lower":2.0,"upper":4.0,"count":2,"acc_count":3},{"lower":4.0,"upper":6.0,"count":2,"acc_count":5},{"lower":6.0,"upper":8.0,"count":2,"acc_count":7},{"lower":8.0,"upper":10.0,"count":2,"acc_count":9},{"lower":10.0,"upper":12.0,"count":2,"acc_count":11},{"lower":12.0,"upper":14.0,"count":1,"acc_count":12}]}
+
+-- !sql_linear_histogram_TinyInt_agg_phase_3 --
+0      {"num_buckets":0,"buckets":[]}
+7      
{"num_buckets":4,"buckets":[{"lower":0.0,"upper":2.0,"count":1,"acc_count":1},{"lower":2.0,"upper":4.0,"count":2,"acc_count":3},{"lower":4.0,"upper":6.0,"count":2,"acc_count":5},{"lower":6.0,"upper":8.0,"count":2,"acc_count":7}]}
+5      
{"num_buckets":3,"buckets":[{"lower":8.0,"upper":10.0,"count":2,"acc_count":2},{"lower":10.0,"upper":12.0,"count":2,"acc_count":4},{"lower":12.0,"upper":14.0,"count":1,"acc_count":5}]}
+
+-- !sql_linear_histogram_TinyInt_agg_phase_4 --
+12     
{"num_buckets":7,"buckets":[{"lower":0.0,"upper":2.0,"count":1,"acc_count":1},{"lower":2.0,"upper":4.0,"count":2,"acc_count":3},{"lower":4.0,"upper":6.0,"count":2,"acc_count":5},{"lower":6.0,"upper":8.0,"count":2,"acc_count":7},{"lower":8.0,"upper":10.0,"count":2,"acc_count":9},{"lower":10.0,"upper":12.0,"count":2,"acc_count":11},{"lower":12.0,"upper":14.0,"count":1,"acc_count":12}]}
+
+-- !sql_linear_histogram_TinyInt_gb_notnull --
+{"num_buckets":4,"buckets":[{"lower":0.0,"upper":2.0,"count":1,"acc_count":1},{"lower":2.0,"upper":4.0,"count":2,"acc_count":3},{"lower":4.0,"upper":6.0,"count":2,"acc_count":5},{"lower":6.0,"upper":8.0,"count":2,"acc_count":7}]}
+{"num_buckets":3,"buckets":[{"lower":8.0,"upper":10.0,"count":2,"acc_count":2},{"lower":10.0,"upper":12.0,"count":2,"acc_count":4},{"lower":12.0,"upper":14.0,"count":1,"acc_count":5}]}
+
+-- !sql_linear_histogram_TinyInt_notnull --
+{"num_buckets":7,"buckets":[{"lower":0.0,"upper":2.0,"count":1,"acc_count":1},{"lower":2.0,"upper":4.0,"count":2,"acc_count":3},{"lower":4.0,"upper":6.0,"count":2,"acc_count":5},{"lower":6.0,"upper":8.0,"count":2,"acc_count":7},{"lower":8.0,"upper":10.0,"count":2,"acc_count":9},{"lower":10.0,"upper":12.0,"count":2,"acc_count":11},{"lower":12.0,"upper":14.0,"count":1,"acc_count":12}]}
+
+-- !sql_linear_histogram_TinyInt_agg_phase_1_notnull --
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":2.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":2.0,"upper":4.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":2.0,"upper":4.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":4.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":4.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":6.0,"upper":8.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":6.0,"upper":8.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":8.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":8.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":12.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":12.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":12.0,"upper":14.0,"count":1,"acc_count":1}]}
+
+-- !sql_linear_histogram_TinyInt_agg_phase_2_notnull --
+12     
{"num_buckets":7,"buckets":[{"lower":0.0,"upper":2.0,"count":1,"acc_count":1},{"lower":2.0,"upper":4.0,"count":2,"acc_count":3},{"lower":4.0,"upper":6.0,"count":2,"acc_count":5},{"lower":6.0,"upper":8.0,"count":2,"acc_count":7},{"lower":8.0,"upper":10.0,"count":2,"acc_count":9},{"lower":10.0,"upper":12.0,"count":2,"acc_count":11},{"lower":12.0,"upper":14.0,"count":1,"acc_count":12}]}
+
+-- !sql_linear_histogram_TinyInt_agg_phase_3_notnull --
+0      {"num_buckets":0,"buckets":[]}
+7      
{"num_buckets":4,"buckets":[{"lower":0.0,"upper":2.0,"count":1,"acc_count":1},{"lower":2.0,"upper":4.0,"count":2,"acc_count":3},{"lower":4.0,"upper":6.0,"count":2,"acc_count":5},{"lower":6.0,"upper":8.0,"count":2,"acc_count":7}]}
+5      
{"num_buckets":3,"buckets":[{"lower":8.0,"upper":10.0,"count":2,"acc_count":2},{"lower":10.0,"upper":12.0,"count":2,"acc_count":4},{"lower":12.0,"upper":14.0,"count":1,"acc_count":5}]}
+
+-- !sql_linear_histogram_TinyInt_agg_phase_4_notnull --
+12     
{"num_buckets":7,"buckets":[{"lower":0.0,"upper":2.0,"count":1,"acc_count":1},{"lower":2.0,"upper":4.0,"count":2,"acc_count":3},{"lower":4.0,"upper":6.0,"count":2,"acc_count":5},{"lower":6.0,"upper":8.0,"count":2,"acc_count":7},{"lower":8.0,"upper":10.0,"count":2,"acc_count":9},{"lower":10.0,"upper":12.0,"count":2,"acc_count":11},{"lower":12.0,"upper":14.0,"count":1,"acc_count":12}]}
+
+-- !sql_linear_histogram_SmallInt_gb --
+{"num_buckets":0,"buckets":[]}
+{"num_buckets":3,"buckets":[{"lower":0.0,"upper":3.0,"count":2,"acc_count":2},{"lower":3.0,"upper":6.0,"count":3,"acc_count":5},{"lower":6.0,"upper":9.0,"count":2,"acc_count":7}]}
+{"num_buckets":3,"buckets":[{"lower":6.0,"upper":9.0,"count":1,"acc_count":1},{"lower":9.0,"upper":12.0,"count":3,"acc_count":4},{"lower":12.0,"upper":15.0,"count":1,"acc_count":5}]}
+
+-- !sql_linear_histogram_SmallInt --
+{"num_buckets":5,"buckets":[{"lower":0.0,"upper":3.0,"count":2,"acc_count":2},{"lower":3.0,"upper":6.0,"count":3,"acc_count":5},{"lower":6.0,"upper":9.0,"count":3,"acc_count":8},{"lower":9.0,"upper":12.0,"count":3,"acc_count":11},{"lower":12.0,"upper":15.0,"count":1,"acc_count":12}]}
+
+-- !sql_linear_histogram_SmallInt_agg_phase_1 --
+0      {"num_buckets":0,"buckets":[]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":3.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":3.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":3.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":3.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":3.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":6.0,"upper":9.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":6.0,"upper":9.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":6.0,"upper":9.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":9.0,"upper":12.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":9.0,"upper":12.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":9.0,"upper":12.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":12.0,"upper":15.0,"count":1,"acc_count":1}]}
+
+-- !sql_linear_histogram_SmallInt_agg_phase_2 --
+12     
{"num_buckets":5,"buckets":[{"lower":0.0,"upper":3.0,"count":2,"acc_count":2},{"lower":3.0,"upper":6.0,"count":3,"acc_count":5},{"lower":6.0,"upper":9.0,"count":3,"acc_count":8},{"lower":9.0,"upper":12.0,"count":3,"acc_count":11},{"lower":12.0,"upper":15.0,"count":1,"acc_count":12}]}
+
+-- !sql_linear_histogram_SmallInt_agg_phase_3 --
+0      {"num_buckets":0,"buckets":[]}
+7      
{"num_buckets":3,"buckets":[{"lower":0.0,"upper":3.0,"count":2,"acc_count":2},{"lower":3.0,"upper":6.0,"count":3,"acc_count":5},{"lower":6.0,"upper":9.0,"count":2,"acc_count":7}]}
+5      
{"num_buckets":3,"buckets":[{"lower":6.0,"upper":9.0,"count":1,"acc_count":1},{"lower":9.0,"upper":12.0,"count":3,"acc_count":4},{"lower":12.0,"upper":15.0,"count":1,"acc_count":5}]}
+
+-- !sql_linear_histogram_SmallInt_agg_phase_4 --
+12     
{"num_buckets":5,"buckets":[{"lower":0.0,"upper":3.0,"count":2,"acc_count":2},{"lower":3.0,"upper":6.0,"count":3,"acc_count":5},{"lower":6.0,"upper":9.0,"count":3,"acc_count":8},{"lower":9.0,"upper":12.0,"count":3,"acc_count":11},{"lower":12.0,"upper":15.0,"count":1,"acc_count":12}]}
+
+-- !sql_linear_histogram_SmallInt_gb_notnull --
+{"num_buckets":3,"buckets":[{"lower":0.0,"upper":3.0,"count":2,"acc_count":2},{"lower":3.0,"upper":6.0,"count":3,"acc_count":5},{"lower":6.0,"upper":9.0,"count":2,"acc_count":7}]}
+{"num_buckets":3,"buckets":[{"lower":6.0,"upper":9.0,"count":1,"acc_count":1},{"lower":9.0,"upper":12.0,"count":3,"acc_count":4},{"lower":12.0,"upper":15.0,"count":1,"acc_count":5}]}
+
+-- !sql_linear_histogram_SmallInt_notnull --
+{"num_buckets":5,"buckets":[{"lower":0.0,"upper":3.0,"count":2,"acc_count":2},{"lower":3.0,"upper":6.0,"count":3,"acc_count":5},{"lower":6.0,"upper":9.0,"count":3,"acc_count":8},{"lower":9.0,"upper":12.0,"count":3,"acc_count":11},{"lower":12.0,"upper":15.0,"count":1,"acc_count":12}]}
+
+-- !sql_linear_histogram_SmallInt_agg_phase_1_notnull --
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":3.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":3.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":3.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":3.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":3.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":6.0,"upper":9.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":6.0,"upper":9.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":6.0,"upper":9.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":9.0,"upper":12.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":9.0,"upper":12.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":9.0,"upper":12.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":12.0,"upper":15.0,"count":1,"acc_count":1}]}
+
+-- !sql_linear_histogram_SmallInt_agg_phase_2_notnull --
+12     
{"num_buckets":5,"buckets":[{"lower":0.0,"upper":3.0,"count":2,"acc_count":2},{"lower":3.0,"upper":6.0,"count":3,"acc_count":5},{"lower":6.0,"upper":9.0,"count":3,"acc_count":8},{"lower":9.0,"upper":12.0,"count":3,"acc_count":11},{"lower":12.0,"upper":15.0,"count":1,"acc_count":12}]}
+
+-- !sql_linear_histogram_SmallInt_agg_phase_3_notnull --
+0      {"num_buckets":0,"buckets":[]}
+7      
{"num_buckets":3,"buckets":[{"lower":0.0,"upper":3.0,"count":2,"acc_count":2},{"lower":3.0,"upper":6.0,"count":3,"acc_count":5},{"lower":6.0,"upper":9.0,"count":2,"acc_count":7}]}
+5      
{"num_buckets":3,"buckets":[{"lower":6.0,"upper":9.0,"count":1,"acc_count":1},{"lower":9.0,"upper":12.0,"count":3,"acc_count":4},{"lower":12.0,"upper":15.0,"count":1,"acc_count":5}]}
+
+-- !sql_linear_histogram_SmallInt_agg_phase_4_notnull --
+12     
{"num_buckets":5,"buckets":[{"lower":0.0,"upper":3.0,"count":2,"acc_count":2},{"lower":3.0,"upper":6.0,"count":3,"acc_count":5},{"lower":6.0,"upper":9.0,"count":3,"acc_count":8},{"lower":9.0,"upper":12.0,"count":3,"acc_count":11},{"lower":12.0,"upper":15.0,"count":1,"acc_count":12}]}
+
+-- !sql_linear_histogram_Integer_gb --
+{"num_buckets":0,"buckets":[]}
+{"num_buckets":2,"buckets":[{"lower":0.0,"upper":5.0,"count":4,"acc_count":4},{"lower":5.0,"upper":10.0,"count":3,"acc_count":7}]}
+{"num_buckets":2,"buckets":[{"lower":5.0,"upper":10.0,"count":2,"acc_count":2},{"lower":10.0,"upper":15.0,"count":3,"acc_count":5}]}
+
+-- !sql_linear_histogram_Integer --
+{"num_buckets":3,"buckets":[{"lower":0.0,"upper":5.0,"count":4,"acc_count":4},{"lower":5.0,"upper":10.0,"count":5,"acc_count":9},{"lower":10.0,"upper":15.0,"count":3,"acc_count":12}]}
+
+-- !sql_linear_histogram_Integer_agg_phase_1 --
+0      {"num_buckets":0,"buckets":[]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":5.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":5.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":5.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":5.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":5.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":5.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":5.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":5.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":5.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":15.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":15.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":15.0,"count":1,"acc_count":1}]}
+
+-- !sql_linear_histogram_Integer_agg_phase_2 --
+12     
{"num_buckets":3,"buckets":[{"lower":0.0,"upper":5.0,"count":4,"acc_count":4},{"lower":5.0,"upper":10.0,"count":5,"acc_count":9},{"lower":10.0,"upper":15.0,"count":3,"acc_count":12}]}
+
+-- !sql_linear_histogram_Integer_agg_phase_3 --
+0      {"num_buckets":0,"buckets":[]}
+7      
{"num_buckets":2,"buckets":[{"lower":0.0,"upper":5.0,"count":4,"acc_count":4},{"lower":5.0,"upper":10.0,"count":3,"acc_count":7}]}
+5      
{"num_buckets":2,"buckets":[{"lower":5.0,"upper":10.0,"count":2,"acc_count":2},{"lower":10.0,"upper":15.0,"count":3,"acc_count":5}]}
+
+-- !sql_linear_histogram_Integer_agg_phase_4 --
+12     
{"num_buckets":3,"buckets":[{"lower":0.0,"upper":5.0,"count":4,"acc_count":4},{"lower":5.0,"upper":10.0,"count":5,"acc_count":9},{"lower":10.0,"upper":15.0,"count":3,"acc_count":12}]}
+
+-- !sql_linear_histogram_Integer_gb_notnull --
+{"num_buckets":2,"buckets":[{"lower":0.0,"upper":5.0,"count":4,"acc_count":4},{"lower":5.0,"upper":10.0,"count":3,"acc_count":7}]}
+{"num_buckets":2,"buckets":[{"lower":5.0,"upper":10.0,"count":2,"acc_count":2},{"lower":10.0,"upper":15.0,"count":3,"acc_count":5}]}
+
+-- !sql_linear_histogram_Integer_notnull --
+{"num_buckets":3,"buckets":[{"lower":0.0,"upper":5.0,"count":4,"acc_count":4},{"lower":5.0,"upper":10.0,"count":5,"acc_count":9},{"lower":10.0,"upper":15.0,"count":3,"acc_count":12}]}
+
+-- !sql_linear_histogram_Integer_agg_phase_1_notnull --
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":5.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":5.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":5.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":5.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":5.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":5.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":5.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":5.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":5.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":15.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":15.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":15.0,"count":1,"acc_count":1}]}
+
+-- !sql_linear_histogram_Integer_agg_phase_2_notnull --
+12     
{"num_buckets":3,"buckets":[{"lower":0.0,"upper":5.0,"count":4,"acc_count":4},{"lower":5.0,"upper":10.0,"count":5,"acc_count":9},{"lower":10.0,"upper":15.0,"count":3,"acc_count":12}]}
+
+-- !sql_linear_histogram_Integer_agg_phase_3_notnull --
+0      {"num_buckets":0,"buckets":[]}
+7      
{"num_buckets":2,"buckets":[{"lower":0.0,"upper":5.0,"count":4,"acc_count":4},{"lower":5.0,"upper":10.0,"count":3,"acc_count":7}]}
+5      
{"num_buckets":2,"buckets":[{"lower":5.0,"upper":10.0,"count":2,"acc_count":2},{"lower":10.0,"upper":15.0,"count":3,"acc_count":5}]}
+
+-- !sql_linear_histogram_Integer_agg_phase_4_notnull --
+12     
{"num_buckets":3,"buckets":[{"lower":0.0,"upper":5.0,"count":4,"acc_count":4},{"lower":5.0,"upper":10.0,"count":5,"acc_count":9},{"lower":10.0,"upper":15.0,"count":3,"acc_count":12}]}
+
+-- !sql_linear_histogram_BigInt_gb --
+{"num_buckets":0,"buckets":[]}
+{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":7,"acc_count":7}]}
+{"num_buckets":2,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2},{"lower":10.0,"upper":20.0,"count":3,"acc_count":5}]}
+
+-- !sql_linear_histogram_BigInt --
+{"num_buckets":2,"buckets":[{"lower":0.0,"upper":10.0,"count":9,"acc_count":9},{"lower":10.0,"upper":20.0,"count":3,"acc_count":12}]}
+
+-- !sql_linear_histogram_BigInt_agg_phase_1 --
+0      {"num_buckets":0,"buckets":[]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":20.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":20.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":20.0,"count":1,"acc_count":1}]}
+
+-- !sql_linear_histogram_BigInt_agg_phase_2 --
+12     
{"num_buckets":2,"buckets":[{"lower":0.0,"upper":10.0,"count":9,"acc_count":9},{"lower":10.0,"upper":20.0,"count":3,"acc_count":12}]}
+
+-- !sql_linear_histogram_BigInt_agg_phase_3 --
+0      {"num_buckets":0,"buckets":[]}
+7      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":7,"acc_count":7}]}
+5      
{"num_buckets":2,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2},{"lower":10.0,"upper":20.0,"count":3,"acc_count":5}]}
+
+-- !sql_linear_histogram_BigInt_agg_phase_4 --
+12     
{"num_buckets":2,"buckets":[{"lower":0.0,"upper":10.0,"count":9,"acc_count":9},{"lower":10.0,"upper":20.0,"count":3,"acc_count":12}]}
+
+-- !sql_linear_histogram_BigInt_gb_notnull --
+{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":7,"acc_count":7}]}
+{"num_buckets":2,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2},{"lower":10.0,"upper":20.0,"count":3,"acc_count":5}]}
+
+-- !sql_linear_histogram_BigInt_notnull --
+{"num_buckets":2,"buckets":[{"lower":0.0,"upper":10.0,"count":9,"acc_count":9},{"lower":10.0,"upper":20.0,"count":3,"acc_count":12}]}
+
+-- !sql_linear_histogram_BigInt_agg_phase_1_notnull --
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":20.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":20.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":20.0,"count":1,"acc_count":1}]}
+
+-- !sql_linear_histogram_BigInt_agg_phase_2_notnull --
+12     
{"num_buckets":2,"buckets":[{"lower":0.0,"upper":10.0,"count":9,"acc_count":9},{"lower":10.0,"upper":20.0,"count":3,"acc_count":12}]}
+
+-- !sql_linear_histogram_BigInt_agg_phase_3_notnull --
+0      {"num_buckets":0,"buckets":[]}
+7      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":7,"acc_count":7}]}
+5      
{"num_buckets":2,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2},{"lower":10.0,"upper":20.0,"count":3,"acc_count":5}]}
+
+-- !sql_linear_histogram_BigInt_agg_phase_4_notnull --
+12     
{"num_buckets":2,"buckets":[{"lower":0.0,"upper":10.0,"count":9,"acc_count":9},{"lower":10.0,"upper":20.0,"count":3,"acc_count":12}]}
+
+-- !sql_linear_histogram_Double_gb --
+{"num_buckets":0,"buckets":[]}
+{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":7,"acc_count":7}]}
+{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":5,"acc_count":5}]}
+
+-- !sql_linear_histogram_Double --
+{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":12,"acc_count":12}]}
+
+-- !sql_linear_histogram_Double_agg_phase_1 --
+0      {"num_buckets":0,"buckets":[]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":1,"acc_count":1}]}
+
+-- !sql_linear_histogram_Double_agg_phase_2 --
+12     
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":12,"acc_count":12}]}
+
+-- !sql_linear_histogram_Double_agg_phase_3 --
+0      {"num_buckets":0,"buckets":[]}
+7      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":7,"acc_count":7}]}
+5      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":5,"acc_count":5}]}
+
+-- !sql_linear_histogram_Double_agg_phase_4 --
+12     
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":12,"acc_count":12}]}
+
+-- !sql_linear_histogram_Double_gb_notnull --
+{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":7,"acc_count":7}]}
+{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":5,"acc_count":5}]}
+
+-- !sql_linear_histogram_Double_notnull --
+{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":12,"acc_count":12}]}
+
+-- !sql_linear_histogram_Double_agg_phase_1_notnull --
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":1,"acc_count":1}]}
+
+-- !sql_linear_histogram_Double_agg_phase_2_notnull --
+12     
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":12,"acc_count":12}]}
+
+-- !sql_linear_histogram_Double_agg_phase_3_notnull --
+0      {"num_buckets":0,"buckets":[]}
+7      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":7,"acc_count":7}]}
+5      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":5,"acc_count":5}]}
+
+-- !sql_linear_histogram_Double_agg_phase_4_notnull --
+12     
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":6.0,"count":12,"acc_count":12}]}
+
+-- !sql_linear_histogram_DecimalV2_gb --
+{"num_buckets":0,"buckets":[]}
+{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":7,"acc_count":7}]}
+{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":5,"acc_count":5}]}
+
+-- !sql_linear_histogram_DecimalV2 --
+{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":12,"acc_count":12}]}
+
+-- !sql_linear_histogram_DecimalV2_agg_phase_1 --
+0      {"num_buckets":0,"buckets":[]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+
+-- !sql_linear_histogram_DecimalV2_agg_phase_2 --
+12     
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":12,"acc_count":12}]}
+
+-- !sql_linear_histogram_DecimalV2_agg_phase_3 --
+0      {"num_buckets":0,"buckets":[]}
+7      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":7,"acc_count":7}]}
+5      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":5,"acc_count":5}]}
+
+-- !sql_linear_histogram_DecimalV2_agg_phase_4 --
+12     
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":12,"acc_count":12}]}
+
+-- !sql_linear_histogram_DecimalV2_gb_notnull --
+{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":7,"acc_count":7}]}
+{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":5,"acc_count":5}]}
+
+-- !sql_linear_histogram_DecimalV2_notnull --
+{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":12,"acc_count":12}]}
+
+-- !sql_linear_histogram_DecimalV2_agg_phase_1_notnull --
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+
+-- !sql_linear_histogram_DecimalV2_agg_phase_2_notnull --
+12     
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":12,"acc_count":12}]}
+
+-- !sql_linear_histogram_DecimalV2_agg_phase_3_notnull --
+0      {"num_buckets":0,"buckets":[]}
+7      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":7,"acc_count":7}]}
+5      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":5,"acc_count":5}]}
+
+-- !sql_linear_histogram_DecimalV2_agg_phase_4_notnull --
+12     
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":12,"acc_count":12}]}
+
+-- !sql_linear_histogram_LargeInt_gb --
+{"num_buckets":0,"buckets":[]}
+{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":7,"acc_count":7}]}
+{"num_buckets":2,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2},{"lower":10.0,"upper":20.0,"count":3,"acc_count":5}]}
+
+-- !sql_linear_histogram_LargeInt --
+{"num_buckets":2,"buckets":[{"lower":0.0,"upper":10.0,"count":9,"acc_count":9},{"lower":10.0,"upper":20.0,"count":3,"acc_count":12}]}
+
+-- !sql_linear_histogram_LargeInt_agg_phase_1 --
+0      {"num_buckets":0,"buckets":[]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":20.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":20.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":20.0,"count":1,"acc_count":1}]}
+
+-- !sql_linear_histogram_LargeInt_agg_phase_2 --
+12     
{"num_buckets":2,"buckets":[{"lower":0.0,"upper":10.0,"count":9,"acc_count":9},{"lower":10.0,"upper":20.0,"count":3,"acc_count":12}]}
+
+-- !sql_linear_histogram_LargeInt_agg_phase_3 --
+0      {"num_buckets":0,"buckets":[]}
+7      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":7,"acc_count":7}]}
+5      
{"num_buckets":2,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2},{"lower":10.0,"upper":20.0,"count":3,"acc_count":5}]}
+
+-- !sql_linear_histogram_LargeInt_agg_phase_4 --
+12     
{"num_buckets":2,"buckets":[{"lower":0.0,"upper":10.0,"count":9,"acc_count":9},{"lower":10.0,"upper":20.0,"count":3,"acc_count":12}]}
+
+-- !sql_linear_histogram_LargeInt_gb_notnull --
+{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":7,"acc_count":7}]}
+{"num_buckets":2,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2},{"lower":10.0,"upper":20.0,"count":3,"acc_count":5}]}
+
+-- !sql_linear_histogram_LargeInt_notnull --
+{"num_buckets":2,"buckets":[{"lower":0.0,"upper":10.0,"count":9,"acc_count":9},{"lower":10.0,"upper":20.0,"count":3,"acc_count":12}]}
+
+-- !sql_linear_histogram_LargeInt_agg_phase_1_notnull --
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":20.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":20.0,"count":1,"acc_count":1}]}
+1      
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":20.0,"count":1,"acc_count":1}]}
+
+-- !sql_linear_histogram_LargeInt_agg_phase_2_notnull --
+12     
{"num_buckets":2,"buckets":[{"lower":0.0,"upper":10.0,"count":9,"acc_count":9},{"lower":10.0,"upper":20.0,"count":3,"acc_count":12}]}
+
+-- !sql_linear_histogram_LargeInt_agg_phase_3_notnull --
+0      {"num_buckets":0,"buckets":[]}
+7      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":7,"acc_count":7}]}
+5      
{"num_buckets":2,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2},{"lower":10.0,"upper":20.0,"count":3,"acc_count":5}]}
+
+-- !sql_linear_histogram_LargeInt_agg_phase_4_notnull --
+12     
{"num_buckets":2,"buckets":[{"lower":0.0,"upper":10.0,"count":9,"acc_count":9},{"lower":10.0,"upper":20.0,"count":3,"acc_count":12}]}
+
 -- !sql_max_by_AnyData_AnyData_gb --
 \N
 7
@@ -2850,7 +3173,7 @@
 -- !sql_percentile_BigInt_Double_gb --
 \N
 4.6
-10.399999999999999
+10.4
 
 -- !sql_percentile_BigInt_Double --
 7.6
@@ -2879,14 +3202,14 @@
 -- !sql_percentile_BigInt_Double_agg_phase_3 --
 0      \N
 7      4.6
-5      10.399999999999999
+5      10.4
 
 -- !sql_percentile_BigInt_Double_agg_phase_4 --
 12     7.6
 
 -- !sql_percentile_BigInt_Double_gb_notnull --
 4.6
-10.399999999999999
+10.4
 
 -- !sql_percentile_BigInt_Double_notnull --
 7.6
@@ -2911,7 +3234,7 @@
 -- !sql_percentile_BigInt_Double_agg_phase_3_notnull --
 0      \N
 7      4.6
-5      10.399999999999999
+5      10.4
 
 -- !sql_percentile_BigInt_Double_agg_phase_4_notnull --
 12     7.6
@@ -3446,11 +3769,11 @@ true
 
 -- !sql_stddev_TinyInt_gb --
 \N
-1.9999999999999998
+2.0
 1.4142135623730951
 
 -- !sql_stddev_TinyInt --
-3.452052529534663
+3.452052529534664
 
 -- !sql_stddev_TinyInt_agg_phase_1 --
 0      \N
@@ -3472,14 +3795,14 @@ true
 
 -- !sql_stddev_TinyInt_agg_phase_3 --
 0      \N
-7      1.9999999999999998
+7      2.0
 5      1.4142135623730951
 
 -- !sql_stddev_TinyInt_agg_phase_4 --
-12     3.452052529534663
+12     3.452052529534664
 
 -- !sql_stddev_TinyInt_gb_notnull --
-1.9999999999999998
+2.0
 1.4142135623730951
 
 -- !sql_stddev_TinyInt_notnull --
@@ -3504,7 +3827,7 @@ true
 
 -- !sql_stddev_TinyInt_agg_phase_3_notnull --
 0      \N
-7      1.9999999999999998
+7      2.0
 5      1.4142135623730951
 
 -- !sql_stddev_TinyInt_agg_phase_4_notnull --
@@ -3516,7 +3839,7 @@ true
 1.4142135623730951
 
 -- !sql_stddev_SmallInt --
-3.452052529534663
+3.452052529534664
 
 -- !sql_stddev_SmallInt_agg_phase_1 --
 0      \N
@@ -3538,7 +3861,7 @@ true
 
 -- !sql_stddev_SmallInt_agg_phase_3 --
 0      \N
-7      1.9999999999999998
+7      2.0
 5      1.4142135623730951
 
 -- !sql_stddev_SmallInt_agg_phase_4 --
@@ -3571,7 +3894,7 @@ true
 -- !sql_stddev_SmallInt_agg_phase_3_notnull --
 0      \N
 7      2.0
-5      1.4142135623730954
+5      1.4142135623730951
 
 -- !sql_stddev_SmallInt_agg_phase_4_notnull --
 12     3.452052529534663
@@ -3582,7 +3905,7 @@ true
 1.4142135623730951
 
 -- !sql_stddev_Integer --
-3.452052529534663
+3.452052529534664
 
 -- !sql_stddev_Integer_agg_phase_1 --
 0      \N
@@ -3604,7 +3927,7 @@ true
 
 -- !sql_stddev_Integer_agg_phase_3 --
 0      \N
-7      2.0
+7      1.9999999999999998
 5      1.4142135623730951
 
 -- !sql_stddev_Integer_agg_phase_4 --
@@ -3615,7 +3938,7 @@ true
 1.4142135623730951
 
 -- !sql_stddev_Integer_notnull --
-3.452052529534663
+3.452052529534664
 
 -- !sql_stddev_Integer_agg_phase_1_notnull --
 1      0.0
@@ -3644,11 +3967,11 @@ true
 
 -- !sql_stddev_BigInt_gb --
 \N
-2.0
+1.9999999999999998
 1.4142135623730951
 
 -- !sql_stddev_BigInt --
-3.452052529534663
+3.452052529534664
 
 -- !sql_stddev_BigInt_agg_phase_1 --
 0      \N
@@ -3677,11 +4000,11 @@ true
 12     3.452052529534663
 
 -- !sql_stddev_BigInt_gb_notnull --
-2.0
+1.9999999999999998
 1.4142135623730951
 
 -- !sql_stddev_BigInt_notnull --
-3.452052529534663
+3.452052529534664
 
 -- !sql_stddev_BigInt_agg_phase_1_notnull --
 1      0.0
@@ -3702,7 +4025,7 @@ true
 
 -- !sql_stddev_BigInt_agg_phase_3_notnull --
 0      \N
-7      2.0
+7      1.9999999999999998
 5      1.4142135623730951
 
 -- !sql_stddev_BigInt_agg_phase_4_notnull --
@@ -3732,7 +4055,7 @@ true
 1      0.0
 
 -- !sql_stddev_Float_agg_phase_2 --
-12     0.34520525854707257
+12     0.3452052585470726
 
 -- !sql_stddev_Float_agg_phase_3 --
 0      \N
@@ -3740,7 +4063,7 @@ true
 5      0.1414213730960499
 
 -- !sql_stddev_Float_agg_phase_4 --
-12     0.34520525854707257
+12     0.3452052585470726
 
 -- !sql_stddev_Float_gb_notnull --
 0.1999999992549422
@@ -3776,7 +4099,7 @@ true
 
 -- !sql_stddev_Double_gb --
 \N
-0.2
+0.19999999999999998
 0.1414213562373095
 
 -- !sql_stddev_Double --
@@ -3802,8 +4125,8 @@ true
 
 -- !sql_stddev_Double_agg_phase_3 --
 0      \N
-7      0.19999999999999996
-5      0.1414213562373095
+7      0.19999999999999998
+5      0.14142135623730945
 
 -- !sql_stddev_Double_agg_phase_4 --
 12     0.3452052529534663
@@ -3834,7 +4157,7 @@ true
 
 -- !sql_stddev_Double_agg_phase_3_notnull --
 0      \N
-7      0.2
+7      0.19999999999999998
 5      0.1414213562373095
 
 -- !sql_stddev_Double_agg_phase_4_notnull --
@@ -3865,14 +4188,14 @@ true
 
 -- !sql_stddev_DecimalV2_agg_phase_3 --
 0      \N
-7      0.19999999999999998
+7      0.2
 5      0.1414213562373095
 
 -- !sql_stddev_DecimalV2_agg_phase_4 --
 12     0.3452052529534663
 
 -- !sql_stddev_DecimalV2_gb_notnull --
-0.19999999999999996
+0.19999999999999998
 0.1414213562373095
 
 -- !sql_stddev_DecimalV2_agg_phase_1_notnull --
@@ -3902,11 +4225,11 @@ true
 
 -- !sql_stddev_samp_TinyInt_gb --
 \N
-2.1602468994692865
+2.160246899469287
 1.5811388300841898
 
 -- !sql_stddev_samp_TinyInt --
-3.605551275463989
+3.6055512754639896
 
 -- !sql_stddev_samp_TinyInt_agg_phase_1 --
 0      \N
@@ -3929,13 +4252,13 @@ true
 -- !sql_stddev_samp_TinyInt_agg_phase_3 --
 0      \N
 7      2.160246899469287
-5      1.58113883008419
+5      1.5811388300841898
 
 -- !sql_stddev_samp_TinyInt_agg_phase_4 --
 12     3.605551275463989
 
 -- !sql_stddev_samp_TinyInt_gb_notnull --
-2.1602468994692865
+2.160246899469287
 1.5811388300841898
 
 -- !sql_stddev_samp_TinyInt_notnull --
@@ -3956,11 +4279,11 @@ true
 1      0.0
 
 -- !sql_stddev_samp_TinyInt_agg_phase_2_notnull --
-12     3.605551275463989
+12     3.6055512754639896
 
 -- !sql_stddev_samp_TinyInt_agg_phase_3_notnull --
 0      \N
-7      2.1602468994692865
+7      2.160246899469287
 5      1.5811388300841898
 
 -- !sql_stddev_samp_TinyInt_agg_phase_4_notnull --
@@ -3972,7 +4295,7 @@ true
 1.5811388300841898
 
 -- !sql_stddev_samp_SmallInt --
-3.605551275463989
+3.6055512754639896
 
 -- !sql_stddev_samp_SmallInt_agg_phase_1 --
 0      \N
@@ -3990,7 +4313,7 @@ true
 1      0.0
 
 -- !sql_stddev_samp_SmallInt_agg_phase_2 --
-12     3.605551275463989
+12     3.6055512754639896
 
 -- !sql_stddev_samp_SmallInt_agg_phase_3 --
 0      \N
@@ -3998,10 +4321,10 @@ true
 5      1.5811388300841898
 
 -- !sql_stddev_samp_SmallInt_agg_phase_4 --
-12     3.605551275463989
+12     3.6055512754639896
 
 -- !sql_stddev_samp_SmallInt_gb_notnull --
-2.1602468994692865
+2.160246899469287
 1.5811388300841898
 
 -- !sql_stddev_samp_SmallInt_notnull --
@@ -4026,15 +4349,15 @@ true
 
 -- !sql_stddev_samp_SmallInt_agg_phase_3_notnull --
 0      \N
-7      2.1602468994692865
-5      1.5811388300841898
+7      2.160246899469287
+5      1.58113883008419
 
 -- !sql_stddev_samp_SmallInt_agg_phase_4_notnull --
 12     3.605551275463989
 
 -- !sql_stddev_samp_Integer_gb --
 \N
-2.1602468994692865
+2.160246899469287
 1.5811388300841898
 
 -- !sql_stddev_samp_Integer --
@@ -4060,18 +4383,18 @@ true
 
 -- !sql_stddev_samp_Integer_agg_phase_3 --
 0      \N
-7      2.1602468994692865
+7      2.160246899469287
 5      1.5811388300841898
 
 -- !sql_stddev_samp_Integer_agg_phase_4 --
 12     3.605551275463989
 
 -- !sql_stddev_samp_Integer_gb_notnull --
-2.160246899469287
+2.1602468994692865
 1.5811388300841898
 
 -- !sql_stddev_samp_Integer_notnull --
-3.6055512754639896
+3.605551275463989
 
 -- !sql_stddev_samp_Integer_agg_phase_1_notnull --
 1      0.0
@@ -4100,7 +4423,7 @@ true
 
 -- !sql_stddev_samp_BigInt_gb --
 \N
-2.1602468994692865
+2.160246899469287
 1.5811388300841898
 
 -- !sql_stddev_samp_BigInt --
@@ -4126,14 +4449,14 @@ true
 
 -- !sql_stddev_samp_BigInt_agg_phase_3 --
 0      \N
-7      2.1602468994692865
+7      2.160246899469287
 5      1.5811388300841898
 
 -- !sql_stddev_samp_BigInt_agg_phase_4 --
 12     3.605551275463989
 
 -- !sql_stddev_samp_BigInt_gb_notnull --
-2.160246899469287
+2.1602468994692865
 1.5811388300841898
 
 -- !sql_stddev_samp_BigInt_notnull --
@@ -4192,14 +4515,14 @@ true
 
 -- !sql_stddev_samp_Float_agg_phase_3 --
 0      \N
-7      0.21602468914217424
+7      0.2160246891421743
 5      0.15811390185706375
 
 -- !sql_stddev_samp_Float_agg_phase_4 --
-12     0.36055513338873013
+12     0.3605551333887302
 
 -- !sql_stddev_samp_Float_gb_notnull --
-0.21602468914217424
+0.2160246891421743
 0.15811390185706375
 
 -- !sql_stddev_samp_Float_notnull --
@@ -4228,12 +4551,12 @@ true
 5      0.15811390185706375
 
 -- !sql_stddev_samp_Float_agg_phase_4_notnull --
-12     0.3605551333887302
+12     0.36055513338873013
 
 -- !sql_stddev_samp_Double_gb --
 \N
 0.21602468994692867
-0.15811388300841894
+0.15811388300841897
 
 -- !sql_stddev_samp_Double --
 0.36055512754639896
@@ -4254,7 +4577,7 @@ true
 1      0.0
 
 -- !sql_stddev_samp_Double_agg_phase_2 --
-12     0.3605551275463989
+12     0.36055512754639896
 
 -- !sql_stddev_samp_Double_agg_phase_3 --
 0      \N
@@ -4290,11 +4613,11 @@ true
 
 -- !sql_stddev_samp_Double_agg_phase_3_notnull --
 0      \N
-7      0.21602468994692864
-5      0.15811388300841897
+7      0.21602468994692867
+5      0.15811388300841892
 
 -- !sql_stddev_samp_Double_agg_phase_4_notnull --
-12     0.3605551275463989
+12     0.36055512754639896
 
 -- !sql_stddev_samp_DecimalV2_agg_phase_1 --
 0      \N
@@ -4320,7 +4643,7 @@ true
 5      0.15811388300841894
 
 -- !sql_stddev_samp_DecimalV2_agg_phase_4 --
-12     0.3605551275463989
+12     0.36055512754639896
 
 -- !sql_stddev_samp_DecimalV2_agg_phase_1_notnull --
 1      0.0
@@ -4337,12 +4660,12 @@ true
 1      0.0
 
 -- !sql_stddev_samp_DecimalV2_agg_phase_2_notnull --
-12     0.3605551275463989
+12     0.36055512754639896
 
 -- !sql_stddev_samp_DecimalV2_agg_phase_3_notnull --
 0      \N
-7      0.21602468994692867
-5      0.15811388300841897
+7      0.21602468994692864
+5      0.15811388300841892
 
 -- !sql_stddev_samp_DecimalV2_agg_phase_4_notnull --
 12     0.36055512754639896
@@ -4631,7 +4954,7 @@ true
 
 -- !sql_sum_Double_gb --
 \N
-2.8000000000000003
+2.8
 5.0
 
 -- !sql_sum_Double --
@@ -4653,18 +4976,18 @@ true
 1      1.2
 
 -- !sql_sum_Double_agg_phase_2 --
-12     7.8
+12     7.800000000000001
 
 -- !sql_sum_Double_agg_phase_3 --
 0      \N
 7      2.8
-5      5.0
+5      5.000000000000001
 
 -- !sql_sum_Double_agg_phase_4 --
 12     7.800000000000001
 
 -- !sql_sum_Double_gb_notnull --
-2.8
+2.8000000000000003
 5.0
 
 -- !sql_sum_Double_notnull --
@@ -4693,7 +5016,7 @@ true
 5      5.0
 
 -- !sql_sum_Double_agg_phase_4_notnull --
-12     7.799999999999999
+12     7.8
 
 -- !sql_sum_DecimalV2_gb --
 \N
@@ -5115,7 +5438,7 @@ true
 5.0
 
 -- !sql_sum0_Double --
-7.800000000000001
+7.8
 
 -- !sql_sum0_Double_agg_phase_1 --
 0      0.0
@@ -5133,15 +5456,15 @@ true
 1      1.2
 
 -- !sql_sum0_Double_agg_phase_2 --
-12     7.800000000000001
+12     7.8
 
 -- !sql_sum0_Double_agg_phase_3 --
 0      0.0
-7      2.8000000000000003
-5      5.0
+7      2.8
+5      5.000000000000001
 
 -- !sql_sum0_Double_agg_phase_4 --
-12     7.8
+12     7.800000000000001
 
 -- !sql_sum0_Double_gb_notnull --
 2.8
@@ -5165,7 +5488,7 @@ true
 1      1.2
 
 -- !sql_sum0_Double_agg_phase_2_notnull --
-12     7.8
+12     7.799999999999999
 
 -- !sql_sum0_Double_agg_phase_3_notnull --
 0      0.0
@@ -5573,8 +5896,8 @@ true
 
 -- !sql_variance_TinyInt_gb --
 \N
-3.9999999999999996
-1.9999999999999993
+4.0
+2.0
 
 -- !sql_variance_TinyInt --
 11.916666666666666
@@ -5599,18 +5922,18 @@ true
 
 -- !sql_variance_TinyInt_agg_phase_3 --
 0      \N
-7      4.0
-5      2.000000000000001
+7      3.9999999999999996
+5      2.0
 
 -- !sql_variance_TinyInt_agg_phase_4 --
-12     11.916666666666666
+12     11.91666666666667
 
 -- !sql_variance_TinyInt_gb_notnull --
-4.0
-2.0000000000000004
+4.000000000000001
+2.0
 
 -- !sql_variance_TinyInt_notnull --
-11.916666666666666
+11.91666666666667
 
 -- !sql_variance_TinyInt_agg_phase_1_notnull --
 1      0.0
@@ -5632,15 +5955,15 @@ true
 -- !sql_variance_TinyInt_agg_phase_3_notnull --
 0      \N
 7      4.0
-5      2.000000000000001
+5      2.0
 
 -- !sql_variance_TinyInt_agg_phase_4_notnull --
-12     11.916666666666666
+12     11.91666666666667
 
 -- !sql_variance_SmallInt_gb --
 \N
-3.9999999999999996
-1.9999999999999993
+4.0
+2.0
 
 -- !sql_variance_SmallInt --
 11.916666666666666
@@ -5665,8 +5988,8 @@ true
 
 -- !sql_variance_SmallInt_agg_phase_3 --
 0      \N
-7      4.0
-5      2.000000000000001
+7      3.9999999999999996
+5      2.0
 
 -- !sql_variance_SmallInt_agg_phase_4 --
 12     11.916666666666666
@@ -5676,7 +5999,7 @@ true
 2.0
 
 -- !sql_variance_SmallInt_notnull --
-11.916666666666666
+11.91666666666667
 
 -- !sql_variance_SmallInt_agg_phase_1_notnull --
 1      0.0
@@ -5693,23 +6016,23 @@ true
 1      0.0
 
 -- !sql_variance_SmallInt_agg_phase_2_notnull --
-12     11.916666666666666
+12     11.91666666666667
 
 -- !sql_variance_SmallInt_agg_phase_3_notnull --
 0      \N
 7      4.0
-5      2.000000000000001
+5      2.0
 
 -- !sql_variance_SmallInt_agg_phase_4_notnull --
-12     11.916666666666666
+12     11.916666666666664
 
 -- !sql_variance_Integer_gb --
 \N
-3.9999999999999996
+4.0
 2.0
 
 -- !sql_variance_Integer --
-11.916666666666666
+11.91666666666667
 
 -- !sql_variance_Integer_agg_phase_1 --
 0      \N
@@ -5727,22 +6050,22 @@ true
 1      0.0
 
 -- !sql_variance_Integer_agg_phase_2 --
-12     11.916666666666666
+12     11.916666666666664
 
 -- !sql_variance_Integer_agg_phase_3 --
 0      \N
 7      3.9999999999999996
-5      2.0000000000000004
+5      2.0
 
 -- !sql_variance_Integer_agg_phase_4 --
-12     11.916666666666666
+12     11.91666666666667
 
 -- !sql_variance_Integer_gb_notnull --
-4.0
-2.0000000000000004
+3.9999999999999996
+2.0
 
 -- !sql_variance_Integer_notnull --
-11.916666666666666
+11.91666666666667
 
 -- !sql_variance_Integer_agg_phase_1_notnull --
 1      0.0
@@ -5764,18 +6087,18 @@ true
 -- !sql_variance_Integer_agg_phase_3_notnull --
 0      \N
 7      3.9999999999999996
-5      1.9999999999999993
+5      2.0000000000000004
 
 -- !sql_variance_Integer_agg_phase_4_notnull --
 12     11.916666666666666
 
 -- !sql_variance_BigInt_gb --
 \N
-3.999999999999999
+4.000000000000001
 2.0
 
 -- !sql_variance_BigInt --
-11.916666666666666
+11.91666666666667
 
 -- !sql_variance_BigInt_agg_phase_1 --
 0      \N
@@ -5798,10 +6121,10 @@ true
 -- !sql_variance_BigInt_agg_phase_3 --
 0      \N
 7      3.9999999999999996
-5      2.0
+5      1.9999999999999993
 
 -- !sql_variance_BigInt_agg_phase_4 --
-12     11.916666666666666
+12     11.916666666666664
 
 -- !sql_variance_BigInt_gb_notnull --
 4.0
@@ -5829,8 +6152,8 @@ true
 
 -- !sql_variance_BigInt_agg_phase_3_notnull --
 0      \N
-7      3.9999999999999996
-5      2.0000000000000004
+7      4.000000000000001
+5      2.0
 
 -- !sql_variance_BigInt_agg_phase_4_notnull --
 12     11.916666666666666
@@ -5838,10 +6161,10 @@ true
 -- !sql_variance_Float_gb --
 \N
 0.03999999970197688
-0.02000000476837215
+0.020000004768372152
 
 -- !sql_variance_Float --
-0.11916667052855125
+0.11916667052855127
 
 -- !sql_variance_Float_agg_phase_1 --
 0      \N
@@ -5864,10 +6187,10 @@ true
 -- !sql_variance_Float_agg_phase_3 --
 0      \N
 7      0.03999999970197688
-5      0.020000004768372152
+5      0.020000004768372145
 
 -- !sql_variance_Float_agg_phase_4 --
-12     0.11916667052855125
+12     0.11916667052855123
 
 -- !sql_variance_Float_gb_notnull --
 0.03999999970197688
@@ -5895,16 +6218,16 @@ true
 
 -- !sql_variance_Float_agg_phase_3_notnull --
 0      \N
-7      0.03999999970197688
+7      0.039999999701976874
 5      0.020000004768372152
 
 -- !sql_variance_Float_agg_phase_4_notnull --
-12     0.11916667052855125
+12     0.11916667052855127
 
 -- !sql_variance_Double_gb --
 \N
 0.039999999999999994
-0.019999999999999993
+0.019999999999999997
 
 -- !sql_variance_Double --
 0.11916666666666666
@@ -5929,18 +6252,18 @@ true
 
 -- !sql_variance_Double_agg_phase_3 --
 0      \N
-7      0.03999999999999999
+7      0.039999999999999994
 5      0.019999999999999997
 
 -- !sql_variance_Double_agg_phase_4 --
-12     0.11916666666666668
+12     0.11916666666666664
 
 -- !sql_variance_Double_gb_notnull --
-0.039999999999999994
-0.019999999999999997
+0.04
+0.01999999999999999
 
 -- !sql_variance_Double_notnull --
-0.1191666666666667
+0.11916666666666666
 
 -- !sql_variance_Double_agg_phase_1_notnull --
 1      0.0
@@ -5957,23 +6280,23 @@ true
 1      0.0
 
 -- !sql_variance_Double_agg_phase_2_notnull --
-12     0.11916666666666668
+12     0.11916666666666666
 
 -- !sql_variance_Double_agg_phase_3_notnull --
 0      \N
-7      0.03999999999999999
+7      0.039999999999999994
 5      0.019999999999999997
 
 -- !sql_variance_Double_agg_phase_4_notnull --
-12     0.11916666666666666
+12     0.11916666666666668
 
 -- !sql_variance_DecimalV2_gb --
 \N
-0.04
-0.02
+0.039999999999999994
+0.019999999999999997
 
 -- !sql_variance_DecimalV2 --
-0.11916666666666666
+0.11916666666666664
 
 -- !sql_variance_DecimalV2_agg_phase_1 --
 0      \N
@@ -5991,11 +6314,11 @@ true
 1      0.0
 
 -- !sql_variance_DecimalV2_agg_phase_2 --
-12     0.11916666666666664
+12     0.11916666666666666
 
 -- !sql_variance_DecimalV2_agg_phase_3 --
 0      \N
-7      0.04
+7      0.039999999999999994
 5      0.02
 
 -- !sql_variance_DecimalV2_agg_phase_4 --
@@ -6003,7 +6326,7 @@ true
 
 -- !sql_variance_DecimalV2_gb_notnull --
 0.039999999999999994
-0.02
+0.019999999999999997
 
 -- !sql_variance_DecimalV2_notnull --
 0.11916666666666666
@@ -6023,12 +6346,12 @@ true
 1      0.0
 
 -- !sql_variance_DecimalV2_agg_phase_2_notnull --
-12     0.11916666666666666
+12     0.11916666666666668
 
 -- !sql_variance_DecimalV2_agg_phase_3_notnull --
 0      \N
 7      0.039999999999999994
-5      0.019999999999999987
+5      0.02
 
 -- !sql_variance_DecimalV2_agg_phase_4_notnull --
 12     0.11916666666666666
@@ -6036,7 +6359,7 @@ true
 -- !sql_variance_samp_TinyInt_gb --
 \N
 4.666666666666666
-2.499999999999999
+2.5
 
 -- !sql_variance_samp_TinyInt --
 13.0
@@ -6061,18 +6384,18 @@ true
 
 -- !sql_variance_samp_TinyInt_agg_phase_3 --
 0      \N
-7      4.666666666666666
+7      4.666666666666667
 5      2.5
 
 -- !sql_variance_samp_TinyInt_agg_phase_4 --
 12     13.0
 
 -- !sql_variance_samp_TinyInt_gb_notnull --
-4.666666666666666
+4.666666666666667
 2.5
 
 -- !sql_variance_samp_TinyInt_notnull --
-13.0
+13.000000000000002
 
 -- !sql_variance_samp_TinyInt_agg_phase_1_notnull --
 1      0.0
@@ -6093,19 +6416,19 @@ true
 
 -- !sql_variance_samp_TinyInt_agg_phase_3_notnull --
 0      \N
-7      4.666666666666667
-5      2.500000000000001
+7      4.666666666666666
+5      2.5000000000000004
 
 -- !sql_variance_samp_TinyInt_agg_phase_4_notnull --
-12     13.0
+12     13.000000000000002
 
 -- !sql_variance_samp_SmallInt_gb --
 \N
-4.666666666666667
+4.666666666666666
 2.5
 
 -- !sql_variance_samp_SmallInt --
-13.0
+13.000000000000002
 
 -- !sql_variance_samp_SmallInt_agg_phase_1 --
 0      \N
@@ -6123,18 +6446,18 @@ true
 1      0.0
 
 -- !sql_variance_samp_SmallInt_agg_phase_2 --
-12     13.0
+12     13.000000000000002
 
 -- !sql_variance_samp_SmallInt_agg_phase_3 --
 0      \N
 7      4.666666666666666
-5      2.5
+5      2.499999999999999
 
 -- !sql_variance_samp_SmallInt_agg_phase_4 --
 12     13.0
 
 -- !sql_variance_samp_SmallInt_gb_notnull --
-4.666666666666666
+4.666666666666667
 2.5
 
 -- !sql_variance_samp_SmallInt_notnull --
@@ -6155,23 +6478,23 @@ true
 1      0.0
 
 -- !sql_variance_samp_SmallInt_agg_phase_2_notnull --
-12     13.0
+12     12.999999999999998
 
 -- !sql_variance_samp_SmallInt_agg_phase_3_notnull --
 0      \N
-7      4.666666666666666
-5      2.499999999999999
+7      4.666666666666667
+5      2.5
 
 -- !sql_variance_samp_SmallInt_agg_phase_4_notnull --
-12     13.0
+12     12.999999999999998
 
 -- !sql_variance_samp_Integer_gb --
 \N
 4.666666666666667
-2.5000000000000004
+2.5
 
 -- !sql_variance_samp_Integer --
-13.0
+13.000000000000002
 
 -- !sql_variance_samp_Integer_agg_phase_1 --
 0      \N
@@ -6201,10 +6524,10 @@ true
 
 -- !sql_variance_samp_Integer_gb_notnull --
 4.666666666666667
-2.5000000000000004
+2.5
 
 -- !sql_variance_samp_Integer_notnull --
-13.0
+13.000000000000002
 
 -- !sql_variance_samp_Integer_agg_phase_1_notnull --
 1      0.0
@@ -6221,15 +6544,15 @@ true
 1      0.0
 
 -- !sql_variance_samp_Integer_agg_phase_2_notnull --
-12     13.0
+12     13.000000000000002
 
 -- !sql_variance_samp_Integer_agg_phase_3_notnull --
 0      \N
-7      4.666666666666668
+7      4.666666666666665
 5      2.5
 
 -- !sql_variance_samp_Integer_agg_phase_4_notnull --
-12     13.0
+12     13.000000000000002
 
 -- !sql_variance_samp_BigInt_gb --
 \N
@@ -6259,18 +6582,18 @@ true
 
 -- !sql_variance_samp_BigInt_agg_phase_3 --
 0      \N
-7      4.666666666666667
+7      4.666666666666668
 5      2.5
 
 -- !sql_variance_samp_BigInt_agg_phase_4 --
 12     13.0
 
 -- !sql_variance_samp_BigInt_gb_notnull --
-4.666666666666666
+4.666666666666667
 2.5
 
 -- !sql_variance_samp_BigInt_notnull --
-13.0
+13.000000000000002
 
 -- !sql_variance_samp_BigInt_agg_phase_1_notnull --
 1      0.0
@@ -6291,15 +6614,15 @@ true
 
 -- !sql_variance_samp_BigInt_agg_phase_3_notnull --
 0      \N
-7      4.666666666666668
-5      2.5
+7      4.666666666666666
+5      2.5000000000000004
 
 -- !sql_variance_samp_BigInt_agg_phase_4_notnull --
-12     13.0
+12     12.999999999999998
 
 -- !sql_variance_samp_Float_gb --
 \N
-0.04666666631897303
+0.04666666631897302
 0.02500000596046519
 
 -- !sql_variance_samp_Float --
@@ -6321,7 +6644,7 @@ true
 1      0.0
 
 -- !sql_variance_samp_Float_agg_phase_2 --
-12     0.13000000421296498
+12     0.130000004212965
 
 -- !sql_variance_samp_Float_agg_phase_3 --
 0      \N
@@ -6353,15 +6676,15 @@ true
 1      0.0
 
 -- !sql_variance_samp_Float_agg_phase_2_notnull --
-12     0.130000004212965
+12     0.13000000421296498
 
 -- !sql_variance_samp_Float_agg_phase_3_notnull --
 0      \N
-7      0.04666666631897302
+7      0.04666666631897303
 5      0.02500000596046519
 
 -- !sql_variance_samp_Float_agg_phase_4_notnull --
-12     0.13000000421296498
+12     0.130000004212965
 
 -- !sql_variance_samp_Double_gb --
 \N
@@ -6369,7 +6692,7 @@ true
 0.024999999999999998
 
 -- !sql_variance_samp_Double --
-0.13
+0.12999999999999998
 
 -- !sql_variance_samp_Double_agg_phase_1 --
 0      \N
@@ -6387,22 +6710,22 @@ true
 1      0.0
 
 -- !sql_variance_samp_Double_agg_phase_2 --
-12     0.13
+12     0.12999999999999998
 
 -- !sql_variance_samp_Double_agg_phase_3 --
 0      \N
 7      0.04666666666666666
-5      0.024999999999999998
+5      0.02499999999999999
 
 -- !sql_variance_samp_Double_agg_phase_4 --
 12     0.13
 
 -- !sql_variance_samp_Double_gb_notnull --
 0.04666666666666666
-0.025
+0.024999999999999994
 
 -- !sql_variance_samp_Double_notnull --
-0.13
+0.12999999999999998
 
 -- !sql_variance_samp_Double_agg_phase_1_notnull --
 1      0.0
@@ -6419,7 +6742,7 @@ true
 1      0.0
 
 -- !sql_variance_samp_Double_agg_phase_2_notnull --
-12     0.12999999999999998
+12     0.13
 
 -- !sql_variance_samp_Double_agg_phase_3_notnull --
 0      \N
@@ -6449,11 +6772,11 @@ true
 
 -- !sql_variance_samp_DecimalV2_agg_phase_3 --
 0      \N
-7      0.04666666666666666
-5      0.024999999999999994
+7      0.046666666666666655
+5      0.024999999999999998
 
 -- !sql_variance_samp_DecimalV2_agg_phase_4 --
-12     0.12999999999999998
+12     0.13
 
 -- !sql_variance_samp_DecimalV2_agg_phase_1_notnull --
 1      0.0
@@ -6470,12 +6793,12 @@ true
 1      0.0
 
 -- !sql_variance_samp_DecimalV2_agg_phase_2_notnull --
-12     0.13
+12     0.12999999999999998
 
 -- !sql_variance_samp_DecimalV2_agg_phase_3_notnull --
 0      \N
-7      0.04666666666666666
-5      0.024999999999999988
+7      0.046666666666666655
+5      0.025
 
 -- !sql_variance_samp_DecimalV2_agg_phase_4_notnull --
 12     0.13
diff --git a/regression-test/data/nereids_p0/aggregate/agg_nullable.out 
b/regression-test/data/nereids_p0/aggregate/agg_nullable.out
index 697e9478570..00be8e3c039 100644
--- a/regression-test/data/nereids_p0/aggregate/agg_nullable.out
+++ b/regression-test/data/nereids_p0/aggregate/agg_nullable.out
@@ -191,6 +191,14 @@
 -- !select_group_concat_n --
 \N
 
+-- !select_linear_histogram --
+{"num_buckets":0,"buckets":[]}
+
+-- !select_linear_histogram2 --
+
+-- !select_linear_histogram_n --
+{"num_buckets":0,"buckets":[]}
+
 -- !select_multi_distinct_group_concat --
 \N
 
diff --git a/regression-test/data/nereids_p0/aggregate/agg_nullable_2.out 
b/regression-test/data/nereids_p0/aggregate/agg_nullable_2.out
index a038340000d..4d498a30bae 100644
--- a/regression-test/data/nereids_p0/aggregate/agg_nullable_2.out
+++ b/regression-test/data/nereids_p0/aggregate/agg_nullable_2.out
@@ -215,6 +215,15 @@ non-null
 -- !select_group_concat_n --
 text
 
+-- !select_linear_histogram --
+{"num_buckets":1,"buckets":[{"lower":50.0,"upper":60.0,"count":1,"acc_count":1}]}
+
+-- !select_linear_histogram2 --
+{"num_buckets":1,"buckets":[{"lower":50.0,"upper":60.0,"count":1,"acc_count":1}]}
+
+-- !select_linear_histogram_n --
+{"num_buckets":1,"buckets":[{"lower":100.0,"upper":110.0,"count":1,"acc_count":1}]}
+
 -- !select_multi_distinct_group_concat --
 non-null
 
diff --git 
a/regression-test/data/nereids_syntax_p0/mv/aggregate/agg_sync_mv.out 
b/regression-test/data/nereids_syntax_p0/mv/aggregate/agg_sync_mv.out
index f1e41365705..4e8b306f8cd 100644
--- a/regression-test/data/nereids_syntax_p0/mv/aggregate/agg_sync_mv.out
+++ b/regression-test/data/nereids_syntax_p0/mv/aggregate/agg_sync_mv.out
@@ -689,6 +689,36 @@
 10     11,11
 11     12,12
 
+-- !select_linear_histogram --
+\N     
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+0      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2}]}
+2      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2}]}
+3      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2}]}
+4      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2}]}
+5      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2}]}
+6      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2}]}
+7      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2}]}
+8      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2}]}
+9      
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":20.0,"count":2,"acc_count":2}]}
+10     
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":20.0,"count":2,"acc_count":2}]}
+11     
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":20.0,"count":2,"acc_count":2}]}
+
+-- !select_linear_histogram_mv --
+\N     
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":1,"acc_count":1}]}
+0      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2}]}
+1      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2}]}
+2      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2}]}
+3      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2}]}
+4      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2}]}
+5      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2}]}
+6      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2}]}
+7      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2}]}
+8      
{"num_buckets":1,"buckets":[{"lower":0.0,"upper":10.0,"count":2,"acc_count":2}]}
+9      
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":20.0,"count":2,"acc_count":2}]}
+10     
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":20.0,"count":2,"acc_count":2}]}
+11     
{"num_buckets":1,"buckets":[{"lower":10.0,"upper":20.0,"count":2,"acc_count":2}]}
+
 -- !select_multi_distinct_group_concat --
 \N     1
 0      1
diff --git a/regression-test/suites/nereids_function_p0/agg_function/agg.groovy 
b/regression-test/suites/nereids_function_p0/agg_function/agg.groovy
index ba4ee172517..df4bea4227c 100644
--- a/regression-test/suites/nereids_function_p0/agg_function/agg.groovy
+++ b/regression-test/suites/nereids_function_p0/agg_function/agg.groovy
@@ -1474,6 +1474,183 @@ suite("nereids_agg_fn") {
        sql '''
                select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id), histogram(kstr) from 
fn_test'''
 
+       qt_sql_linear_histogram_TinyInt_gb '''
+               select linear_histogram(ktint, 2) from fn_test group by kbool 
order by kbool'''
+       qt_sql_linear_histogram_TinyInt '''
+               select linear_histogram(ktint, 2) from fn_test'''
+       qt_sql_linear_histogram_TinyInt_offset '''
+               select linear_histogram(ktint, 2, 1) from fn_test'''
+       qt_sql_linear_histogram_TinyInt_agg_phase_1 '''
+               select count(id), linear_histogram(ktint, 2) from fn_test group 
by id order by id'''
+       qt_sql_linear_histogram_TinyInt_agg_phase_2 '''
+               select count(distinct id), linear_histogram(ktint, 2) from 
fn_test'''
+       qt_sql_linear_histogram_TinyInt_agg_phase_3 '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id, kint), 
linear_histogram(ktint, 2) from fn_test group by kbool order by kbool'''
+       qt_sql_linear_histogram_TinyInt_agg_phase_4 '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id), 
linear_histogram(ktint, 2) from fn_test'''
+       qt_sql_linear_histogram_TinyInt_gb_notnull '''
+               select linear_histogram(ktint, 2) from fn_test_not_nullable 
group by kbool order by kbool'''
+       qt_sql_linear_histogram_TinyInt_notnull '''
+               select linear_histogram(ktint, 2) from fn_test_not_nullable'''
+       qt_sql_linear_histogram_TinyInt_agg_phase_1_notnull '''
+               select count(id), linear_histogram(ktint, 2) from 
fn_test_not_nullable group by id order by id'''
+       qt_sql_linear_histogram_TinyInt_agg_phase_2_notnull '''
+               select count(distinct id), linear_histogram(ktint, 2) from 
fn_test_not_nullable'''
+       qt_sql_linear_histogram_TinyInt_agg_phase_3_notnull '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id, kint), 
linear_histogram(ktint, 2) from fn_test group by kbool order by kbool'''
+       qt_sql_linear_histogram_TinyInt_agg_phase_4_notnull '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id), 
linear_histogram(ktint, 2) from fn_test'''
+
+       qt_sql_linear_histogram_SmallInt_gb '''
+               select linear_histogram(ksint, 3) from fn_test group by kbool 
order by kbool'''
+       qt_sql_linear_histogram_SmallInt '''
+               select linear_histogram(ksint, 3) from fn_test'''
+       qt_sql_linear_histogram_SmallInt_agg_phase_1 '''
+               select count(id), linear_histogram(ksint, 3) from fn_test group 
by id order by id'''
+       qt_sql_linear_histogram_SmallInt_agg_phase_2 '''
+               select count(distinct id), linear_histogram(ksint, 3) from 
fn_test'''
+       qt_sql_linear_histogram_SmallInt_agg_phase_3 '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id, kint), 
linear_histogram(ksint, 3) from fn_test group by kbool order by kbool'''
+       qt_sql_linear_histogram_SmallInt_agg_phase_4 '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id), 
linear_histogram(ksint, 3) from fn_test'''
+       qt_sql_linear_histogram_SmallInt_gb_notnull '''
+               select linear_histogram(ksint, 3) from fn_test_not_nullable 
group by kbool order by kbool'''
+       qt_sql_linear_histogram_SmallInt_notnull '''
+               select linear_histogram(ksint, 3) from fn_test_not_nullable'''
+       qt_sql_linear_histogram_SmallInt_agg_phase_1_notnull '''
+               select count(id), linear_histogram(ksint, 3) from 
fn_test_not_nullable group by id order by id'''
+       qt_sql_linear_histogram_SmallInt_agg_phase_2_notnull '''
+               select count(distinct id), linear_histogram(ksint, 3) from 
fn_test_not_nullable'''
+       qt_sql_linear_histogram_SmallInt_agg_phase_3_notnull '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id, kint), 
linear_histogram(ksint, 3) from fn_test group by kbool order by kbool'''
+       qt_sql_linear_histogram_SmallInt_agg_phase_4_notnull '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id), 
linear_histogram(ksint, 3) from fn_test'''
+
+       qt_sql_linear_histogram_Integer_gb '''
+               select linear_histogram(kint, 5) from fn_test group by kbool 
order by kbool'''
+       qt_sql_linear_histogram_Integer '''
+               select linear_histogram(kint, 5) from fn_test'''
+       qt_sql_linear_histogram_Integer_agg_phase_1 '''
+               select count(id), linear_histogram(kint, 5) from fn_test group 
by id order by id'''
+       qt_sql_linear_histogram_Integer_agg_phase_2 '''
+               select count(distinct id), linear_histogram(kint, 5) from 
fn_test'''
+       qt_sql_linear_histogram_Integer_agg_phase_3 '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id, kint), 
linear_histogram(kint, 5) from fn_test group by kbool order by kbool'''
+       qt_sql_linear_histogram_Integer_agg_phase_4 '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id), 
linear_histogram(kint, 5) from fn_test'''
+       qt_sql_linear_histogram_Integer_gb_notnull '''
+               select linear_histogram(kint, 5) from fn_test_not_nullable 
group by kbool order by kbool'''
+       qt_sql_linear_histogram_Integer_notnull '''
+               select linear_histogram(kint, 5) from fn_test_not_nullable'''
+       qt_sql_linear_histogram_Integer_agg_phase_1_notnull '''
+               select count(id), linear_histogram(kint, 5) from 
fn_test_not_nullable group by id order by id'''
+       qt_sql_linear_histogram_Integer_agg_phase_2_notnull '''
+               select count(distinct id), linear_histogram(kint, 5) from 
fn_test_not_nullable'''
+       qt_sql_linear_histogram_Integer_agg_phase_3_notnull '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id, kint), 
linear_histogram(kint, 5) from fn_test group by kbool order by kbool'''
+       qt_sql_linear_histogram_Integer_agg_phase_4_notnull '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id), 
linear_histogram(kint, 5) from fn_test'''
+
+       qt_sql_linear_histogram_BigInt_gb '''
+               select linear_histogram(kbint, 10) from fn_test group by kbool 
order by kbool'''
+       qt_sql_linear_histogram_BigInt '''
+               select linear_histogram(kbint, 10) from fn_test'''
+       qt_sql_linear_histogram_BigInt_agg_phase_1 '''
+               select count(id), linear_histogram(kbint, 10) from fn_test 
group by id order by id'''
+       qt_sql_linear_histogram_BigInt_agg_phase_2 '''
+               select count(distinct id), linear_histogram(kbint, 10) from 
fn_test'''
+       qt_sql_linear_histogram_BigInt_agg_phase_3 '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id, kint), 
linear_histogram(kbint, 10) from fn_test group by kbool order by kbool'''
+       qt_sql_linear_histogram_BigInt_agg_phase_4 '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id), 
linear_histogram(kbint, 10) from fn_test'''
+       qt_sql_linear_histogram_BigInt_gb_notnull '''
+               select linear_histogram(kbint, 10) from fn_test_not_nullable 
group by kbool order by kbool'''
+       qt_sql_linear_histogram_BigInt_notnull '''
+               select linear_histogram(kbint, 10) from fn_test_not_nullable'''
+       qt_sql_linear_histogram_BigInt_agg_phase_1_notnull '''
+               select count(id), linear_histogram(kbint, 10) from 
fn_test_not_nullable group by id order by id'''
+       qt_sql_linear_histogram_BigInt_agg_phase_2_notnull '''
+               select count(distinct id), linear_histogram(kbint, 10) from 
fn_test_not_nullable'''
+       qt_sql_linear_histogram_BigInt_agg_phase_3_notnull '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id, kint), 
linear_histogram(kbint, 10) from fn_test group by kbool order by kbool'''
+       qt_sql_linear_histogram_BigInt_agg_phase_4_notnull '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id), 
linear_histogram(kbint, 10) from fn_test'''
+
+       qt_sql_linear_histogram_Double_gb '''
+               select linear_histogram(kdbl, 6.0) from fn_test group by kbool 
order by kbool'''
+       qt_sql_linear_histogram_Double '''
+               select linear_histogram(kdbl, 6.0) from fn_test'''
+       qt_sql_linear_histogram_Double_agg_phase_1 '''
+               select count(id), linear_histogram(kdbl, 6.0) from fn_test 
group by id order by id'''
+       qt_sql_linear_histogram_Double_agg_phase_2 '''
+               select count(distinct id), linear_histogram(kdbl, 6.0) from 
fn_test'''
+       qt_sql_linear_histogram_Double_agg_phase_3 '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id, kint), 
linear_histogram(kdbl, 6.0) from fn_test group by kbool order by kbool'''
+       qt_sql_linear_histogram_Double_agg_phase_4 '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id), 
linear_histogram(kdbl, 6.0) from fn_test'''
+       qt_sql_linear_histogram_Double_gb_notnull '''
+               select linear_histogram(kdbl, 6.0) from fn_test_not_nullable 
group by kbool order by kbool'''
+       qt_sql_linear_histogram_Double_notnull '''
+               select linear_histogram(kdbl, 6.0) from fn_test_not_nullable'''
+       qt_sql_linear_histogram_Double_agg_phase_1_notnull '''
+               select count(id), linear_histogram(kdbl, 6.0) from 
fn_test_not_nullable group by id order by id'''
+       qt_sql_linear_histogram_Double_agg_phase_2_notnull '''
+               select count(distinct id), linear_histogram(kdbl, 6.0) from 
fn_test_not_nullable'''
+       qt_sql_linear_histogram_Double_agg_phase_3_notnull '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id, kint), 
linear_histogram(kdbl, 6.0) from fn_test group by kbool order by kbool'''
+       qt_sql_linear_histogram_Double_agg_phase_4_notnull '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id), 
linear_histogram(kdbl, 6.0) from fn_test'''
+
+       qt_sql_linear_histogram_DecimalV2_gb '''
+               select linear_histogram(kdcmls1, 10) from fn_test group by 
kbool order by kbool'''
+       qt_sql_linear_histogram_DecimalV2 '''
+               select linear_histogram(kdcmls1, 10) from fn_test'''
+       qt_sql_linear_histogram_DecimalV2_agg_phase_1 '''
+               select count(id), linear_histogram(kdcmls1, 10) from fn_test 
group by id order by id'''
+       qt_sql_linear_histogram_DecimalV2_agg_phase_2 '''
+               select count(distinct id), linear_histogram(kdcmls1, 10) from 
fn_test'''
+       qt_sql_linear_histogram_DecimalV2_agg_phase_3 '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id, kint), 
linear_histogram(kdcmls1, 10) from fn_test group by kbool order by kbool'''
+       qt_sql_linear_histogram_DecimalV2_agg_phase_4 '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id), 
linear_histogram(kdcmls1, 10) from fn_test'''
+       qt_sql_linear_histogram_DecimalV2_gb_notnull '''
+               select linear_histogram(kdcmls1, 10) from fn_test_not_nullable 
group by kbool order by kbool'''
+       qt_sql_linear_histogram_DecimalV2_notnull '''
+               select linear_histogram(kdcmls1, 10) from 
fn_test_not_nullable'''
+       qt_sql_linear_histogram_DecimalV2_agg_phase_1_notnull '''
+               select count(id), linear_histogram(kdcmls1, 10) from 
fn_test_not_nullable group by id order by id'''
+       qt_sql_linear_histogram_DecimalV2_agg_phase_2_notnull '''
+               select count(distinct id), linear_histogram(kdcmls1, 10) from 
fn_test_not_nullable'''
+       qt_sql_linear_histogram_DecimalV2_agg_phase_3_notnull '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id, kint), 
linear_histogram(kdcmls1, 10) from fn_test group by kbool order by kbool'''
+       qt_sql_linear_histogram_DecimalV2_agg_phase_4_notnull '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id), 
linear_histogram(kdcmls1, 10) from fn_test'''
+
+       qt_sql_linear_histogram_LargeInt_gb '''
+               select linear_histogram(klint, 10) from fn_test group by kbool 
order by kbool'''
+       qt_sql_linear_histogram_LargeInt '''
+               select linear_histogram(klint, 10) from fn_test'''
+       qt_sql_linear_histogram_LargeInt_agg_phase_1 '''
+               select count(id), linear_histogram(klint, 10) from fn_test 
group by id order by id'''
+       qt_sql_linear_histogram_LargeInt_agg_phase_2 '''
+               select count(distinct id), linear_histogram(klint, 10) from 
fn_test'''
+       qt_sql_linear_histogram_LargeInt_agg_phase_3 '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id, kint), 
linear_histogram(klint, 10) from fn_test group by kbool order by kbool'''
+       qt_sql_linear_histogram_LargeInt_agg_phase_4 '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id), 
linear_histogram(klint, 10) from fn_test'''
+       qt_sql_linear_histogram_LargeInt_gb_notnull '''
+               select linear_histogram(klint, 10) from fn_test_not_nullable 
group by kbool order by kbool'''
+       qt_sql_linear_histogram_LargeInt_notnull '''
+               select linear_histogram(klint, 10) from fn_test_not_nullable'''
+       qt_sql_linear_histogram_LargeInt_agg_phase_1_notnull '''
+               select count(id), linear_histogram(klint, 10) from 
fn_test_not_nullable group by id order by id'''
+       qt_sql_linear_histogram_LargeInt_agg_phase_2_notnull '''
+               select count(distinct id), linear_histogram(klint, 10) from 
fn_test_not_nullable'''
+       qt_sql_linear_histogram_LargeInt_agg_phase_3_notnull '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id, kint), 
linear_histogram(klint, 10) from fn_test group by kbool order by kbool'''
+       qt_sql_linear_histogram_LargeInt_agg_phase_4_notnull '''
+               select 
/*+SET_VAR(disable_nereids_rules='THREE_PHASE_AGGREGATE_WITH_DISTINCT, 
TWO_PHASE_AGGREGATE_WITH_DISTINCT')*/ count(distinct id), 
linear_histogram(klint, 10) from fn_test'''
+       
        qt_sql_max_by_AnyData_AnyData_gb '''
                select max_by(kint, kint) from fn_test group by kbool order by 
kbool'''
        qt_sql_max_by_AnyData_AnyData '''
diff --git a/regression-test/suites/nereids_p0/aggregate/agg_nullable.groovy 
b/regression-test/suites/nereids_p0/aggregate/agg_nullable.groovy
index 147750f8fdd..3773893b838 100644
--- a/regression-test/suites/nereids_p0/aggregate/agg_nullable.groovy
+++ b/regression-test/suites/nereids_p0/aggregate/agg_nullable.groovy
@@ -482,6 +482,24 @@ suite("agg_nullable") {
         contains "colUniqueId=null, type=varchar(65533), nullable=true"
     }
 
+    qt_select_linear_histogram """select linear_histogram(kint, 10) from 
agg_nullable_test;"""
+    explain {
+        sql("verbose select linear_histogram(kint, 10) from 
agg_nullable_test;")
+        contains "colUniqueId=null, type=varchar(65533), nullable=false"
+    }
+
+    qt_select_linear_histogram2 """select linear_histogram(kint, 10) from 
agg_nullable_test group by id;"""
+    explain {
+        sql("verbose select linear_histogram(kint, 10) from agg_nullable_test 
group by id;")
+        contains "colUniqueId=null, type=varchar(65533), nullable=false"
+    }
+
+    qt_select_linear_histogram_n """select linear_histogram(knint, 10) from 
agg_nullable_test;"""
+    explain {
+        sql("verbose select linear_histogram(knint, 10) from 
agg_nullable_test;")
+        contains "colUniqueId=null, type=varchar(65533), nullable=false"
+    }  
+
     qt_select_multi_distinct_group_concat """select 
multi_distinct_group_concat(kvchrs1) from agg_nullable_test;"""
     explain {
         sql("verbose select multi_distinct_group_concat(kvchrs1) from 
agg_nullable_test;")
diff --git a/regression-test/suites/nereids_p0/aggregate/agg_nullable_2.groovy 
b/regression-test/suites/nereids_p0/aggregate/agg_nullable_2.groovy
index 5337f59d015..98765557fbc 100644
--- a/regression-test/suites/nereids_p0/aggregate/agg_nullable_2.groovy
+++ b/regression-test/suites/nereids_p0/aggregate/agg_nullable_2.groovy
@@ -493,6 +493,24 @@ suite("agg_nullable_2") {
         contains "colUniqueId=null, type=varchar(65533), nullable=true"
     }
 
+    qt_select_linear_histogram """select linear_histogram(kint, 10) from 
agg_nullable_test_2;"""
+    explain {
+        sql("verbose select linear_histogram(kint, 10) from 
agg_nullable_test_2;")
+        contains "colUniqueId=null, type=varchar(65533), nullable=false"
+    }
+
+    qt_select_linear_histogram2 """select linear_histogram(kint, 10) from 
agg_nullable_test_2 group by id;"""
+    explain {
+        sql("verbose select linear_histogram(kint, 10) from 
agg_nullable_test_2 group by id;")
+        contains "colUniqueId=null, type=varchar(65533), nullable=false"
+    }
+
+    qt_select_linear_histogram_n """select linear_histogram(knint, 10) from 
agg_nullable_test_2;"""
+    explain {
+        sql("verbose select linear_histogram(knint, 10) from 
agg_nullable_test_2;")
+        contains "colUniqueId=null, type=varchar(65533), nullable=false"
+    }
+
     qt_select_multi_distinct_group_concat """select 
multi_distinct_group_concat(kvchrs1) from agg_nullable_test_2;"""
     explain {
         sql("verbose select multi_distinct_group_concat(kvchrs1) from 
agg_nullable_test_2;")
diff --git 
a/regression-test/suites/nereids_syntax_p0/mv/aggregate/agg_sync_mv.groovy 
b/regression-test/suites/nereids_syntax_p0/mv/aggregate/agg_sync_mv.groovy
index e63037ced79..7136d2a8703 100644
--- a/regression-test/suites/nereids_syntax_p0/mv/aggregate/agg_sync_mv.groovy
+++ b/regression-test/suites/nereids_syntax_p0/mv/aggregate/agg_sync_mv.groovy
@@ -239,6 +239,15 @@ suite("agg_sync_mv") {
     }
     qt_select_group_concat_mv """select id, group_concat(cast(abs(kint) as 
varchar)) from agg_mv_test group by id order by id;"""
 
+    qt_select_linear_histogram """select id, linear_histogram(kint, 10) from 
agg_mv_test group by id order by id;"""
+    sql """drop materialized view if exists mv_sync on agg_mv_test;"""
+    createMV("""create materialized view mv_sync as select id, 
linear_histogram(kint, 10) from agg_mv_test group by id order by id;""")
+    explain {
+        sql("select id, linear_histogram(kint, 10) from agg_mv_test group by 
id order by id;")
+        contains "(mv_sync)"
+    }
+    qt_select_linear_histogram_mv """select id, linear_histogram(kint, 10) 
from agg_mv_test group by id order by id;"""
+
     qt_select_multi_distinct_group_concat """select id, 
multi_distinct_group_concat(cast(abs(kint) as varchar)) from agg_mv_test group 
by id order by id;"""
     sql """drop materialized view if exists mv_sync25 on agg_mv_test;"""
     createMV("""create materialized view mv_sync25 as select id, 
multi_distinct_group_concat(cast(abs(kint) as varchar)) from agg_mv_test group 
by id order by id;""")


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

Reply via email to