You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by da...@apache.org on 2023/03/13 02:48:20 UTC

[doris] branch master updated: [Feature](array) Support array data type (#16640)

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

dataroaring 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 55c42da511 [Feature](array) Support array<decimalv3> data type (#16640)
55c42da511 is described below

commit 55c42da511af0f9a4f406cf34602308a678c0933
Author: abmdocrt <Yu...@gmail.com>
AuthorDate: Mon Mar 13 10:48:13 2023 +0800

    [Feature](array) Support array<decimalv3> data type (#16640)
---
 be/src/vec/data_types/data_type_factory.hpp        |  19 +++
 .../functions/array/function_array_aggregation.cpp |   2 +
 .../functions/array/function_array_difference.h    |   3 +
 .../vec/functions/array/function_array_distinct.h  |   9 ++
 .../vec/functions/array/function_array_element.h   |  12 ++
 be/src/vec/functions/array/function_array_index.h  |  24 +++
 be/src/vec/functions/array/function_array_join.h   |  10 ++
 be/src/vec/functions/array/function_array_remove.h |  19 +++
 be/src/vec/functions/array/function_array_set.h    |   3 +
 be/src/vec/functions/array/function_array_sort.h   |  10 ++
 .../vec/functions/array/function_arrays_overlap.h  |  14 +-
 be/src/vec/functions/function.cpp                  |  65 ++++++++
 be/src/vec/functions/function.h                    |  42 +-----
 .../main/java/org/apache/doris/catalog/Type.java   |   3 +
 .../main/java/org/apache/doris/analysis/Expr.java  |  19 +++
 .../apache/doris/analysis/FunctionCallExpr.java    |  38 ++++-
 gensrc/script/doris_builtins_functions.py          |  12 +-
 .../test_aggregate_histogram.out                   |   8 +-
 .../test_array_aggregation_functions.out           |  40 ++---
 .../array_functions/test_array_functions.out       | 165 +++++++++++++++++++++
 .../test_array_functions_by_literal.out            |  63 ++++++++
 .../test_array_aggregation_functions.groovy        |  24 +--
 .../array_functions/test_array_functions.groovy    |  37 +++--
 .../test_array_functions_by_literal.groovy         |  21 +++
 24 files changed, 574 insertions(+), 88 deletions(-)

diff --git a/be/src/vec/data_types/data_type_factory.hpp b/be/src/vec/data_types/data_type_factory.hpp
index b2623b06da..ec229980af 100644
--- a/be/src/vec/data_types/data_type_factory.hpp
+++ b/be/src/vec/data_types/data_type_factory.hpp
@@ -21,6 +21,7 @@
 #pragma once
 #include <mutex>
 #include <string>
+#include <type_traits>
 
 #include "arrow/type.h"
 #include "common/consts.h"
@@ -112,6 +113,24 @@ public:
             if (is_decimal(type_ptr) && type_ptr->get_type_id() == entity.first->get_type_id()) {
                 return entity.second;
             }
+            if (is_array(type_ptr) && is_array(entity.first)) {
+                auto nested_nullable_type_ptr =
+                        (assert_cast<const DataTypeArray*>(type_ptr.get()))->get_nested_type();
+                auto nested_nullable_entity_ptr =
+                        (assert_cast<const DataTypeArray*>(entity.first.get()))->get_nested_type();
+                // There must be nullable inside array type.
+                if (nested_nullable_type_ptr->is_nullable() &&
+                    nested_nullable_entity_ptr->is_nullable()) {
+                    auto nested_type_ptr = ((DataTypeNullable*)(nested_nullable_type_ptr.get()))
+                                                   ->get_nested_type();
+                    auto nested_entity_ptr = ((DataTypeNullable*)(nested_nullable_entity_ptr.get()))
+                                                     ->get_nested_type();
+                    if (is_decimal(nested_type_ptr) &&
+                        nested_type_ptr->get_type_id() == nested_entity_ptr->get_type_id()) {
+                        return entity.second;
+                    }
+                }
+            }
         }
         if (type_ptr->get_type_id() == TypeIndex::Struct ||
             type_ptr->get_type_id() == TypeIndex::Map) {
diff --git a/be/src/vec/functions/array/function_array_aggregation.cpp b/be/src/vec/functions/array/function_array_aggregation.cpp
index bb468c3241..588c15edbe 100644
--- a/be/src/vec/functions/array/function_array_aggregation.cpp
+++ b/be/src/vec/functions/array/function_array_aggregation.cpp
@@ -154,6 +154,8 @@ struct ArrayAggregateImpl {
             execute_type<Int128>(res, type, data, offsets) ||
             execute_type<Float32>(res, type, data, offsets) ||
             execute_type<Float64>(res, type, data, offsets) ||
+            execute_type<Decimal32>(res, type, data, offsets) ||
+            execute_type<Decimal64>(res, type, data, offsets) ||
             execute_type<Decimal128>(res, type, data, offsets) ||
             execute_type<Decimal128I>(res, type, data, offsets) ||
             execute_type<Date>(res, type, data, offsets) ||
diff --git a/be/src/vec/functions/array/function_array_difference.h b/be/src/vec/functions/array/function_array_difference.h
index 3fa1792c95..7e6c957a96 100644
--- a/be/src/vec/functions/array/function_array_difference.h
+++ b/be/src/vec/functions/array/function_array_difference.h
@@ -199,6 +199,9 @@ private:
         } else if (check_column<ColumnDecimal64>(*nested_column)) {
             res = _execute_number_expanded<Decimal64, Decimal64>(offsets, *nested_column,
                                                                  nested_null_map);
+        } else if (check_column<ColumnDecimal128I>(*nested_column)) {
+            res = _execute_number_expanded<Decimal128I, Decimal128I>(offsets, *nested_column,
+                                                                     nested_null_map);
         } else if (check_column<ColumnDecimal128>(*nested_column)) {
             res = _execute_number_expanded<Decimal128, Decimal128>(offsets, *nested_column,
                                                                    nested_null_map);
diff --git a/be/src/vec/functions/array/function_array_distinct.h b/be/src/vec/functions/array/function_array_distinct.h
index e19368d6df..7707438dce 100644
--- a/be/src/vec/functions/array/function_array_distinct.h
+++ b/be/src/vec/functions/array/function_array_distinct.h
@@ -265,6 +265,15 @@ private:
         } else if (which.is_date_time_v2()) {
             res = _execute_number<ColumnDateTimeV2>(src_column, src_offsets, dest_column,
                                                     dest_offsets, src_null_map, dest_null_map);
+        } else if (which.is_decimal32()) {
+            res = _execute_number<ColumnDecimal32>(src_column, src_offsets, dest_column,
+                                                   dest_offsets, src_null_map, dest_null_map);
+        } else if (which.is_decimal64()) {
+            res = _execute_number<ColumnDecimal64>(src_column, src_offsets, dest_column,
+                                                   dest_offsets, src_null_map, dest_null_map);
+        } else if (which.is_decimal128i()) {
+            res = _execute_number<ColumnDecimal128I>(src_column, src_offsets, dest_column,
+                                                     dest_offsets, src_null_map, dest_null_map);
         } else if (which.is_decimal128()) {
             res = _execute_number<ColumnDecimal128>(src_column, src_offsets, dest_column,
                                                     dest_offsets, src_null_map, dest_null_map);
diff --git a/be/src/vec/functions/array/function_array_element.h b/be/src/vec/functions/array/function_array_element.h
index faee04fcb3..094802f886 100644
--- a/be/src/vec/functions/array/function_array_element.h
+++ b/be/src/vec/functions/array/function_array_element.h
@@ -319,6 +319,18 @@ private:
             res = _execute_number<ColumnFloat64>(offsets, *nested_column, src_null_map,
                                                  *arguments[1].column, nested_null_map,
                                                  dst_null_map);
+        } else if (check_column<ColumnDecimal32>(*nested_column)) {
+            res = _execute_number<ColumnDecimal32>(offsets, *nested_column, src_null_map,
+                                                   *arguments[1].column, nested_null_map,
+                                                   dst_null_map);
+        } else if (check_column<ColumnDecimal64>(*nested_column)) {
+            res = _execute_number<ColumnDecimal64>(offsets, *nested_column, src_null_map,
+                                                   *arguments[1].column, nested_null_map,
+                                                   dst_null_map);
+        } else if (check_column<ColumnDecimal128I>(*nested_column)) {
+            res = _execute_number<ColumnDecimal128I>(offsets, *nested_column, src_null_map,
+                                                     *arguments[1].column, nested_null_map,
+                                                     dst_null_map);
         } else if (check_column<ColumnDecimal128>(*nested_column)) {
             res = _execute_number<ColumnDecimal128>(offsets, *nested_column, src_null_map,
                                                     *arguments[1].column, nested_null_map,
diff --git a/be/src/vec/functions/array/function_array_index.h b/be/src/vec/functions/array/function_array_index.h
index 9818d20d32..93978327d1 100644
--- a/be/src/vec/functions/array/function_array_index.h
+++ b/be/src/vec/functions/array/function_array_index.h
@@ -241,6 +241,18 @@ private:
             return _execute_number<NestedColumnType, ColumnDateTimeV2>(
                     offsets, nested_null_map, nested_column, right_column, right_nested_null_map,
                     outer_null_map);
+        } else if (check_column<ColumnDecimal32>(right_column)) {
+            return _execute_number<NestedColumnType, ColumnDecimal32>(
+                    offsets, nested_null_map, nested_column, right_column, right_nested_null_map,
+                    outer_null_map);
+        } else if (check_column<ColumnDecimal64>(right_column)) {
+            return _execute_number<NestedColumnType, ColumnDecimal64>(
+                    offsets, nested_null_map, nested_column, right_column, right_nested_null_map,
+                    outer_null_map);
+        } else if (check_column<ColumnDecimal128I>(right_column)) {
+            return _execute_number<NestedColumnType, ColumnDecimal128I>(
+                    offsets, nested_null_map, nested_column, right_column, right_nested_null_map,
+                    outer_null_map);
         } else if (check_column<ColumnDecimal128>(right_column)) {
             return _execute_number<NestedColumnType, ColumnDecimal128>(
                     offsets, nested_null_map, nested_column, right_column, right_nested_null_map,
@@ -329,6 +341,18 @@ private:
                 return_column = _execute_number_expanded<ColumnFloat64>(
                         offsets, nested_null_map, *nested_column, *right_column,
                         right_nested_null_map, array_null_map);
+            } else if (check_column<ColumnDecimal32>(*nested_column)) {
+                return_column = _execute_number_expanded<ColumnDecimal32>(
+                        offsets, nested_null_map, *nested_column, *right_column,
+                        right_nested_null_map, array_null_map);
+            } else if (check_column<ColumnDecimal64>(*nested_column)) {
+                return_column = _execute_number_expanded<ColumnDecimal64>(
+                        offsets, nested_null_map, *nested_column, *right_column,
+                        right_nested_null_map, array_null_map);
+            } else if (check_column<ColumnDecimal128I>(*nested_column)) {
+                return_column = _execute_number_expanded<ColumnDecimal128I>(
+                        offsets, nested_null_map, *nested_column, *right_column,
+                        right_nested_null_map, array_null_map);
             } else if (check_column<ColumnDecimal128>(*nested_column)) {
                 return_column = _execute_number_expanded<ColumnDecimal128>(
                         offsets, nested_null_map, *nested_column, *right_column,
diff --git a/be/src/vec/functions/array/function_array_join.h b/be/src/vec/functions/array/function_array_join.h
index 05b69901cc..d822c45a41 100644
--- a/be/src/vec/functions/array/function_array_join.h
+++ b/be/src/vec/functions/array/function_array_join.h
@@ -241,6 +241,16 @@ private:
         } else if (which.is_date_time_v2()) {
             res = _execute_number<ColumnDateTimeV2>(src_column, src_offsets, src_null_map, sep_str,
                                                     null_replace_str, nested_type, dest_column_ptr);
+        } else if (which.is_decimal32()) {
+            res = _execute_number<ColumnDecimal32>(src_column, src_offsets, src_null_map, sep_str,
+                                                   null_replace_str, nested_type, dest_column_ptr);
+        } else if (which.is_decimal64()) {
+            res = _execute_number<ColumnDecimal64>(src_column, src_offsets, src_null_map, sep_str,
+                                                   null_replace_str, nested_type, dest_column_ptr);
+        } else if (which.is_decimal128i()) {
+            res = _execute_number<ColumnDecimal128I>(src_column, src_offsets, src_null_map, sep_str,
+                                                     null_replace_str, nested_type,
+                                                     dest_column_ptr);
         } else if (which.is_decimal128()) {
             res = _execute_number<ColumnDecimal128>(src_column, src_offsets, src_null_map, sep_str,
                                                     null_replace_str, nested_type, dest_column_ptr);
diff --git a/be/src/vec/functions/array/function_array_remove.h b/be/src/vec/functions/array/function_array_remove.h
index cb8ef46a0a..58566f34cb 100644
--- a/be/src/vec/functions/array/function_array_remove.h
+++ b/be/src/vec/functions/array/function_array_remove.h
@@ -20,6 +20,7 @@
 #include "vec/columns/column.h"
 #include "vec/columns/column_array.h"
 #include "vec/columns/column_const.h"
+#include "vec/columns/columns_number.h"
 #include "vec/data_types/data_type.h"
 #include "vec/data_types/data_type_array.h"
 #include "vec/data_types/data_type_number.h"
@@ -265,6 +266,15 @@ private:
         } else if (check_column<ColumnFloat64>(right_column)) {
             return _execute_number<NestedColumnType, ColumnFloat64>(offsets, nested_column,
                                                                     right_column, nested_null_map);
+        } else if (check_column<ColumnDecimal32>(right_column)) {
+            return _execute_number<NestedColumnType, ColumnDecimal32>(
+                    offsets, nested_column, right_column, nested_null_map);
+        } else if (check_column<ColumnDecimal64>(right_column)) {
+            return _execute_number<NestedColumnType, ColumnDecimal64>(
+                    offsets, nested_column, right_column, nested_null_map);
+        } else if (check_column<ColumnDecimal128I>(right_column)) {
+            return _execute_number<NestedColumnType, ColumnDecimal128I>(
+                    offsets, nested_column, right_column, nested_null_map);
         } else if (check_column<ColumnDecimal128>(right_column)) {
             return _execute_number<NestedColumnType, ColumnDecimal128>(
                     offsets, nested_column, right_column, nested_null_map);
@@ -326,6 +336,15 @@ private:
             } else if (check_column<ColumnFloat64>(*nested_column)) {
                 res = _execute_number_expanded<ColumnFloat64>(offsets, *nested_column,
                                                               *right_column, nested_null_map);
+            } else if (check_column<ColumnDecimal32>(*nested_column)) {
+                res = _execute_number_expanded<ColumnDecimal32>(offsets, *nested_column,
+                                                                *right_column, nested_null_map);
+            } else if (check_column<ColumnDecimal64>(*nested_column)) {
+                res = _execute_number_expanded<ColumnDecimal64>(offsets, *nested_column,
+                                                                *right_column, nested_null_map);
+            } else if (check_column<ColumnDecimal128I>(*nested_column)) {
+                res = _execute_number_expanded<ColumnDecimal128I>(offsets, *nested_column,
+                                                                  *right_column, nested_null_map);
             } else if (check_column<ColumnDecimal128>(*nested_column)) {
                 res = _execute_number_expanded<ColumnDecimal128>(offsets, *nested_column,
                                                                  *right_column, nested_null_map);
diff --git a/be/src/vec/functions/array/function_array_set.h b/be/src/vec/functions/array/function_array_set.h
index aeb895e07d..fa9a6451e3 100644
--- a/be/src/vec/functions/array/function_array_set.h
+++ b/be/src/vec/functions/array/function_array_set.h
@@ -171,6 +171,9 @@ public:
             _execute_internal<ColumnInt128>(dst, left_data, right_data) ||
             _execute_internal<ColumnFloat32>(dst, left_data, right_data) ||
             _execute_internal<ColumnFloat64>(dst, left_data, right_data) ||
+            _execute_internal<ColumnDecimal32>(dst, left_data, right_data) ||
+            _execute_internal<ColumnDecimal64>(dst, left_data, right_data) ||
+            _execute_internal<ColumnDecimal128I>(dst, left_data, right_data) ||
             _execute_internal<ColumnDecimal128>(dst, left_data, right_data)) {
             res_column = assemble_column_array(dst);
             if (res_column) {
diff --git a/be/src/vec/functions/array/function_array_sort.h b/be/src/vec/functions/array/function_array_sort.h
index 5b1b78fed0..0f72093bd2 100644
--- a/be/src/vec/functions/array/function_array_sort.h
+++ b/be/src/vec/functions/array/function_array_sort.h
@@ -20,6 +20,7 @@
 #pragma once
 
 #include "vec/columns/column_array.h"
+#include "vec/columns/columns_number.h"
 #include "vec/data_types/data_type_array.h"
 #include "vec/functions/function.h"
 
@@ -276,6 +277,15 @@ private:
         } else if (which.is_date_time_v2()) {
             res = _execute_number<ColumnDateTimeV2>(src_column, src_offsets, dest_column,
                                                     dest_offsets, src_null_map, dest_null_map);
+        } else if (which.is_decimal32()) {
+            res = _execute_number<ColumnDecimal32>(src_column, src_offsets, dest_column,
+                                                   dest_offsets, src_null_map, dest_null_map);
+        } else if (which.is_decimal64()) {
+            res = _execute_number<ColumnDecimal64>(src_column, src_offsets, dest_column,
+                                                   dest_offsets, src_null_map, dest_null_map);
+        } else if (which.is_decimal128i()) {
+            res = _execute_number<ColumnDecimal128I>(src_column, src_offsets, dest_column,
+                                                     dest_offsets, src_null_map, dest_null_map);
         } else if (which.is_decimal128()) {
             res = _execute_number<ColumnDecimal128>(src_column, src_offsets, dest_column,
                                                     dest_offsets, src_null_map, dest_null_map);
diff --git a/be/src/vec/functions/array/function_arrays_overlap.h b/be/src/vec/functions/array/function_arrays_overlap.h
index 21eb10e24e..4256dd3229 100644
--- a/be/src/vec/functions/array/function_arrays_overlap.h
+++ b/be/src/vec/functions/array/function_arrays_overlap.h
@@ -183,7 +183,19 @@ public:
                                                        dst_nested_col->get_data().data());
             }
         } else if (left_exec_data.nested_col->is_column_decimal()) {
-            if (check_column<ColumnDecimal128>(*left_exec_data.nested_col)) {
+            if (check_column<ColumnDecimal32>(*left_exec_data.nested_col)) {
+                ret = _execute_internal<ColumnDecimal32>(left_exec_data, right_exec_data,
+                                                         dst_null_map_data,
+                                                         dst_nested_col->get_data().data());
+            } else if (check_column<ColumnDecimal64>(*left_exec_data.nested_col)) {
+                ret = _execute_internal<ColumnDecimal64>(left_exec_data, right_exec_data,
+                                                         dst_null_map_data,
+                                                         dst_nested_col->get_data().data());
+            } else if (check_column<ColumnDecimal128I>(*left_exec_data.nested_col)) {
+                ret = _execute_internal<ColumnDecimal128I>(left_exec_data, right_exec_data,
+                                                           dst_null_map_data,
+                                                           dst_nested_col->get_data().data());
+            } else if (check_column<ColumnDecimal128>(*left_exec_data.nested_col)) {
                 ret = _execute_internal<ColumnDecimal128>(left_exec_data, right_exec_data,
                                                           dst_null_map_data,
                                                           dst_nested_col->get_data().data());
diff --git a/be/src/vec/functions/function.cpp b/be/src/vec/functions/function.cpp
index e7c6871690..91ab3f71ed 100644
--- a/be/src/vec/functions/function.cpp
+++ b/be/src/vec/functions/function.cpp
@@ -27,6 +27,7 @@
 #include "vec/columns/column_nullable.h"
 #include "vec/common/assert_cast.h"
 #include "vec/common/typeid_cast.h"
+#include "vec/data_types/data_type_array.h"
 #include "vec/data_types/data_type_nothing.h"
 #include "vec/data_types/data_type_nullable.h"
 #include "vec/functions/function_helpers.h"
@@ -338,4 +339,68 @@ DataTypePtr FunctionBuilderImpl::get_return_type(const ColumnsWithTypeAndName& a
 
     return get_return_type_without_low_cardinality(arguments);
 }
+
+bool FunctionBuilderImpl::is_date_or_datetime_or_decimal(
+        const DataTypePtr& return_type, const DataTypePtr& func_return_type) const {
+    return (is_date_or_datetime(return_type->is_nullable()
+                                        ? ((DataTypeNullable*)return_type.get())->get_nested_type()
+                                        : return_type) &&
+            is_date_or_datetime(
+                    func_return_type->is_nullable()
+                            ? ((DataTypeNullable*)func_return_type.get())->get_nested_type()
+                            : func_return_type)) ||
+           (is_date_v2_or_datetime_v2(
+                    return_type->is_nullable()
+                            ? ((DataTypeNullable*)return_type.get())->get_nested_type()
+                            : return_type) &&
+            is_date_v2_or_datetime_v2(
+                    func_return_type->is_nullable()
+                            ? ((DataTypeNullable*)func_return_type.get())->get_nested_type()
+                            : func_return_type)) ||
+           // For some date functions such as str_to_date(string, string), return_type will
+           // be datetimev2 if users enable datev2 but get_return_type(arguments) will still
+           // return datetime. We need keep backward compatibility here.
+           (is_date_v2_or_datetime_v2(
+                    return_type->is_nullable()
+                            ? ((DataTypeNullable*)return_type.get())->get_nested_type()
+                            : return_type) &&
+            is_date_or_datetime(
+                    func_return_type->is_nullable()
+                            ? ((DataTypeNullable*)func_return_type.get())->get_nested_type()
+                            : func_return_type)) ||
+           (is_decimal(return_type->is_nullable()
+                               ? ((DataTypeNullable*)return_type.get())->get_nested_type()
+                               : return_type) &&
+            is_decimal(func_return_type->is_nullable()
+                               ? ((DataTypeNullable*)func_return_type.get())->get_nested_type()
+                               : func_return_type));
+}
+
+bool FunctionBuilderImpl::is_array_nested_type_date_or_datetime_or_decimal(
+        const DataTypePtr& return_type, const DataTypePtr& func_return_type) const {
+    auto return_type_ptr = return_type->is_nullable()
+                                   ? ((DataTypeNullable*)return_type.get())->get_nested_type()
+                                   : return_type;
+    auto func_return_type_ptr =
+            func_return_type->is_nullable()
+                    ? ((DataTypeNullable*)func_return_type.get())->get_nested_type()
+                    : func_return_type;
+    if (!(is_array(return_type_ptr) && is_array(func_return_type_ptr))) {
+        return false;
+    }
+    auto nested_nullable_return_type_ptr =
+            (assert_cast<const DataTypeArray*>(return_type_ptr.get()))->get_nested_type();
+    auto nested_nullable_func_return_type =
+            (assert_cast<const DataTypeArray*>(func_return_type_ptr.get()))->get_nested_type();
+    // There must be nullable inside array type.
+    if (nested_nullable_return_type_ptr->is_nullable() &&
+        nested_nullable_func_return_type->is_nullable()) {
+        auto nested_return_type_ptr =
+                ((DataTypeNullable*)(nested_nullable_return_type_ptr.get()))->get_nested_type();
+        auto nested_func_return_type_ptr =
+                ((DataTypeNullable*)(nested_nullable_func_return_type.get()))->get_nested_type();
+        return is_date_or_datetime_or_decimal(nested_return_type_ptr, nested_func_return_type_ptr);
+    }
+    return false;
+}
 } // namespace doris::vectorized
diff --git a/be/src/vec/functions/function.h b/be/src/vec/functions/function.h
index 9117599edb..a002e90760 100644
--- a/be/src/vec/functions/function.h
+++ b/be/src/vec/functions/function.h
@@ -298,41 +298,8 @@ public:
                // Nullable<DataTypeNothing> when `use_default_implementation_for_nulls` is true.
                (return_type->is_nullable() && func_return_type->is_nullable() &&
                 is_nothing(((DataTypeNullable*)func_return_type.get())->get_nested_type())) ||
-               (is_date_or_datetime(
-                        return_type->is_nullable()
-                                ? ((DataTypeNullable*)return_type.get())->get_nested_type()
-                                : return_type) &&
-                is_date_or_datetime(get_return_type(arguments)->is_nullable()
-                                            ? ((DataTypeNullable*)get_return_type(arguments).get())
-                                                      ->get_nested_type()
-                                            : get_return_type(arguments))) ||
-               (is_date_v2_or_datetime_v2(
-                        return_type->is_nullable()
-                                ? ((DataTypeNullable*)return_type.get())->get_nested_type()
-                                : return_type) &&
-                is_date_v2_or_datetime_v2(
-                        get_return_type(arguments)->is_nullable()
-                                ? ((DataTypeNullable*)get_return_type(arguments).get())
-                                          ->get_nested_type()
-                                : get_return_type(arguments))) ||
-               // For some date functions such as str_to_date(string, string), return_type will
-               // be datetimev2 if users enable datev2 but get_return_type(arguments) will still
-               // return datetime. We need keep backward compatibility here.
-               (is_date_v2_or_datetime_v2(
-                        return_type->is_nullable()
-                                ? ((DataTypeNullable*)return_type.get())->get_nested_type()
-                                : return_type) &&
-                is_date_or_datetime(get_return_type(arguments)->is_nullable()
-                                            ? ((DataTypeNullable*)get_return_type(arguments).get())
-                                                      ->get_nested_type()
-                                            : get_return_type(arguments))) ||
-               (is_decimal(return_type->is_nullable()
-                                   ? ((DataTypeNullable*)return_type.get())->get_nested_type()
-                                   : return_type) &&
-                is_decimal(get_return_type(arguments)->is_nullable()
-                                   ? ((DataTypeNullable*)get_return_type(arguments).get())
-                                             ->get_nested_type()
-                                   : get_return_type(arguments))))
+               is_date_or_datetime_or_decimal(return_type, func_return_type) ||
+               is_array_nested_type_date_or_datetime_or_decimal(return_type, func_return_type))
                 << " for function '" << this->get_name() << "' with " << return_type->get_name()
                 << " and " << func_return_type->get_name();
 
@@ -400,6 +367,11 @@ protected:
 private:
     DataTypePtr get_return_type_without_low_cardinality(
             const ColumnsWithTypeAndName& arguments) const;
+
+    bool is_date_or_datetime_or_decimal(const DataTypePtr& return_type,
+                                        const DataTypePtr& func_return_type) const;
+    bool is_array_nested_type_date_or_datetime_or_decimal(
+            const DataTypePtr& return_type, const DataTypePtr& func_return_type) const;
 };
 
 /// Previous function interface.
diff --git a/fe/fe-common/src/main/java/org/apache/doris/catalog/Type.java b/fe/fe-common/src/main/java/org/apache/doris/catalog/Type.java
index bc696c4753..c70a9d91d3 100644
--- a/fe/fe-common/src/main/java/org/apache/doris/catalog/Type.java
+++ b/fe/fe-common/src/main/java/org/apache/doris/catalog/Type.java
@@ -181,6 +181,9 @@ public abstract class Type {
         arraySubTypes.add(CHAR);
         arraySubTypes.add(VARCHAR);
         arraySubTypes.add(STRING);
+        arraySubTypes.add(DECIMAL32);
+        arraySubTypes.add(DECIMAL64);
+        arraySubTypes.add(DECIMAL128);
 
         mapSubTypes = Lists.newArrayList();
         mapSubTypes.add(BOOLEAN);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
index dc32900bbc..da71acf8c3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
@@ -21,6 +21,7 @@
 package org.apache.doris.analysis;
 
 import org.apache.doris.analysis.ArithmeticExpr.Operator;
+import org.apache.doris.catalog.ArrayType;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.Function;
 import org.apache.doris.catalog.FunctionSet;
@@ -2201,11 +2202,29 @@ public abstract class Expr extends TreeNode<Expr> implements ParseNode, Cloneabl
                         return Type.DECIMAL128;
                     } else if (type.getPrimitiveType() == PrimitiveType.DATETIMEV2) {
                         return Type.DATETIMEV2;
+                    } else if (type.getPrimitiveType() == PrimitiveType.ARRAY) {
+                        return getActualArrayType((ArrayType) type);
                     }
                     return type;
                 }).toArray(Type[]::new);
     }
 
+    private ArrayType getActualArrayType(ArrayType originArrayType) {
+        // Now we only support single-level array nesting.
+        // Multi-layer array nesting will be supported in the future.
+        Type type = originArrayType.getItemType();
+        if (type.getPrimitiveType() == PrimitiveType.DECIMAL32) {
+            return new ArrayType(Type.DECIMAL32);
+        } else if (type.getPrimitiveType() == PrimitiveType.DECIMAL64) {
+            return new ArrayType(Type.DECIMAL64);
+        } else if (type.getPrimitiveType() == PrimitiveType.DECIMAL128) {
+            return new ArrayType(Type.DECIMAL128);
+        } else if (type.getPrimitiveType() == PrimitiveType.DATETIMEV2) {
+            return new ArrayType(Type.DATETIMEV2);
+        }
+        return originArrayType;
+    }
+
     public boolean refToCountStar() {
         if (this instanceof SlotRef) {
             SlotRef slotRef = (SlotRef) this;
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 f4be4f309b..a54594b50a 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
@@ -137,6 +137,17 @@ public class FunctionCallExpr extends Expr {
                         return returnType;
                     }
                 };
+        java.util.function.BiFunction<ArrayList<Expr>, Type, Type> arrayDecimal128Rule
+                = (children, returnType) -> {
+                    Preconditions.checkArgument(children != null && children.size() > 0);
+                    if (children.get(0).getType().isArrayType() && (
+                            ((ArrayType) children.get(0).getType()).getItemType().isDecimalV3())) {
+                        return ScalarType.createDecimalV3Type(ScalarType.MAX_DECIMAL128_PRECISION,
+                                ((ScalarType) ((ArrayType) children.get(0).getType()).getItemType()).getScalarScale());
+                    } else {
+                        return returnType;
+                    }
+                };
         PRECISION_INFER_RULE = new HashMap<>();
         PRECISION_INFER_RULE.put("sum", sumRule);
         PRECISION_INFER_RULE.put("multi_distinct_sum", sumRule);
@@ -172,7 +183,9 @@ public class FunctionCallExpr extends Expr {
         PRECISION_INFER_RULE.put("array_max", arrayDateTimeV2OrDecimalV3Rule);
         PRECISION_INFER_RULE.put("element_at", arrayDateTimeV2OrDecimalV3Rule);
         PRECISION_INFER_RULE.put("%element_extract%", arrayDateTimeV2OrDecimalV3Rule);
-
+        PRECISION_INFER_RULE.put("array_avg", arrayDecimal128Rule);
+        PRECISION_INFER_RULE.put("array_sum", arrayDecimal128Rule);
+        PRECISION_INFER_RULE.put("array_product", arrayDecimal128Rule);
         PRECISION_INFER_RULE.put("round", roundRule);
         PRECISION_INFER_RULE.put("round_bankers", roundRule);
         PRECISION_INFER_RULE.put("ceil", roundRule);
@@ -1382,7 +1395,9 @@ public class FunctionCallExpr extends Expr {
             for (int i = 0; i < argTypes.length - orderByElements.size(); ++i) {
                 // For varargs, we must compare with the last type in callArgs.argTypes.
                 int ix = Math.min(args.length - 1, i);
-                if (fnName.getFunction().equalsIgnoreCase("money_format")
+                if ((fnName.getFunction().equalsIgnoreCase("money_format") || fnName.getFunction()
+                        .equalsIgnoreCase("histogram")
+                        || fnName.getFunction().equalsIgnoreCase("hist"))
                         && children.get(0).getType().isDecimalV3() && args[ix].isDecimalV3()) {
                     continue;
                 } else if (fnName.getFunction().equalsIgnoreCase("array")
@@ -1399,6 +1414,25 @@ public class FunctionCallExpr extends Expr {
                         || (children.get(0).getType().isDecimalV2()
                         && ((ArrayType) args[ix]).getItemType().isDecimalV2()))) {
                     continue;
+                } else if ((fnName.getFunction().equalsIgnoreCase("array_distinct") || fnName.getFunction()
+                        .equalsIgnoreCase("array_remove") || fnName.getFunction().equalsIgnoreCase("array_sort")
+                        || fnName.getFunction().equalsIgnoreCase("array_overlap")
+                        || fnName.getFunction().equalsIgnoreCase("array_union")
+                        || fnName.getFunction().equalsIgnoreCase("array_intersect")
+                        || fnName.getFunction().equalsIgnoreCase("array_compact")
+                        || fnName.getFunction().equalsIgnoreCase("array_slice")
+                        || fnName.getFunction().equalsIgnoreCase("array_popback")
+                        || fnName.getFunction().equalsIgnoreCase("array_popfront")
+                        || fnName.getFunction().equalsIgnoreCase("reverse")
+                        || fnName.getFunction().equalsIgnoreCase("%element_slice%")
+                        || fnName.getFunction().equalsIgnoreCase("array_concat")
+                        || fnName.getFunction().equalsIgnoreCase("array_except"))
+                        && ((args[ix].isDecimalV3())
+                        || (children.get(0).getType().isArrayType()
+                        && (((ArrayType) children.get(0).getType()).getItemType().isDecimalV3())
+                        && (args[ix].isArrayType())
+                        && ((ArrayType) args[ix]).getItemType().isDecimalV3()))) {
+                    continue;
                 } else if (!argTypes[i].matchesType(args[ix]) && !(
                         argTypes[i].isDateOrDateTime() && args[ix].isDateOrDateTime())
                         && (!fn.getReturnType().isDecimalV3()
diff --git a/gensrc/script/doris_builtins_functions.py b/gensrc/script/doris_builtins_functions.py
index f2e7bf9011..33e783ea62 100644
--- a/gensrc/script/doris_builtins_functions.py
+++ b/gensrc/script/doris_builtins_functions.py
@@ -351,8 +351,8 @@ visible_functions = [
     [['array_sum'],     'DOUBLE',   ['ARRAY_FLOAT'], 'ALWAYS_NULLABLE'],
     [['array_sum'],     'DOUBLE',   ['ARRAY_DOUBLE'],   'ALWAYS_NULLABLE'],
     [['array_sum'],     'DECIMALV2',['ARRAY_DECIMALV2'], 'ALWAYS_NULLABLE'],
-    [['array_sum'],     'DECIMAL32',['ARRAY_DECIMAL32'], 'ALWAYS_NULLABLE'],
-    [['array_sum'],     'DECIMAL64',['ARRAY_DECIMAL64'], 'ALWAYS_NULLABLE'],
+    [['array_sum'],     'DECIMAL128',['ARRAY_DECIMAL32'], 'ALWAYS_NULLABLE'],
+    [['array_sum'],     'DECIMAL128',['ARRAY_DECIMAL64'], 'ALWAYS_NULLABLE'],
     [['array_sum'],     'DECIMAL128',['ARRAY_DECIMAL128'], 'ALWAYS_NULLABLE'],
     [['array_avg'],     'DOUBLE',   ['ARRAY_BOOLEAN'],  'ALWAYS_NULLABLE'],
     [['array_avg'],     'DOUBLE',   ['ARRAY_TINYINT'],  'ALWAYS_NULLABLE'],
@@ -363,8 +363,8 @@ visible_functions = [
     [['array_avg'],     'DOUBLE',   ['ARRAY_FLOAT'],    'ALWAYS_NULLABLE'],
     [['array_avg'],     'DOUBLE',   ['ARRAY_DOUBLE'],   'ALWAYS_NULLABLE'],
     [['array_avg'],     'DECIMALV2',['ARRAY_DECIMALV2'], 'ALWAYS_NULLABLE'],
-    [['array_avg'],     'DECIMAL32',['ARRAY_DECIMAL32'], 'ALWAYS_NULLABLE'],
-    [['array_avg'],     'DECIMAL64',['ARRAY_DECIMAL64'], 'ALWAYS_NULLABLE'],
+    [['array_avg'],     'DECIMAL128',['ARRAY_DECIMAL32'], 'ALWAYS_NULLABLE'],
+    [['array_avg'],     'DECIMAL128',['ARRAY_DECIMAL64'], 'ALWAYS_NULLABLE'],
     [['array_avg'],     'DECIMAL128',['ARRAY_DECIMAL128'], 'ALWAYS_NULLABLE'],
     [['array_product'], 'DOUBLE',   ['ARRAY_BOOLEAN'],  'ALWAYS_NULLABLE'],
     [['array_product'], 'DOUBLE',   ['ARRAY_TINYINT'],  'ALWAYS_NULLABLE'],
@@ -375,8 +375,8 @@ visible_functions = [
     [['array_product'], 'DOUBLE',   ['ARRAY_FLOAT'],    'ALWAYS_NULLABLE'],
     [['array_product'], 'DOUBLE',   ['ARRAY_DOUBLE'],   'ALWAYS_NULLABLE'],
     [['array_product'], 'DECIMALV2',['ARRAY_DECIMALV2'], 'ALWAYS_NULLABLE'],
-    [['array_product'], 'DECIMAL32',['ARRAY_DECIMAL32'], 'ALWAYS_NULLABLE'],
-    [['array_product'], 'DECIMAL64',['ARRAY_DECIMAL64'], 'ALWAYS_NULLABLE'],
+    [['array_product'], 'DECIMAL128',['ARRAY_DECIMAL32'], 'ALWAYS_NULLABLE'],
+    [['array_product'], 'DECIMAL128',['ARRAY_DECIMAL64'], 'ALWAYS_NULLABLE'],
     [['array_product'], 'DECIMAL128',['ARRAY_DECIMAL128'], 'ALWAYS_NULLABLE'],
 
     [['array_remove'], 'ARRAY_BOOLEAN',   ['ARRAY_BOOLEAN', 'BOOLEAN'], ''],
diff --git a/regression-test/data/query_p0/sql_functions/aggregate_functions/test_aggregate_histogram.out b/regression-test/data/query_p0/sql_functions/aggregate_functions/test_aggregate_histogram.out
index 27f900650d..b42a07ae2d 100644
--- a/regression-test/data/query_p0/sql_functions/aggregate_functions/test_aggregate_histogram.out
+++ b/regression-test/data/query_p0/sql_functions/aggregate_functions/test_aggregate_histogram.out
@@ -1,14 +1,14 @@
 -- This file is automatically generated. You should know what you did if you want to edit this
 -- !select --
-{"num_buckets":2,"buckets":[{"lower":"0","upper":"0","ndv":1,"count":4,"pre_sum":0},{"lower":"1","upper":"1","ndv":1,"count":2,"pre_sum":4}]}	{"num_buckets":2,"buckets":[{"lower":"10","upper":"11","ndv":2,"count":4,"pre_sum":0},{"lower":"21","upper":"31","ndv":2,"count":2,"pre_sum":4}]}	{"num_buckets":2,"buckets":[{"lower":"12","upper":"20","ndv":2,"count":3,"pre_sum":0},{"lower":"21","upper":"32","ndv":3,"count":3,"pre_sum":3}]}	{"num_buckets":2,"buckets":[{"lower":"944444444444","upper [...]
+{"num_buckets":2,"buckets":[{"lower":"0","upper":"0","ndv":1,"count":4,"pre_sum":0},{"lower":"1","upper":"1","ndv":1,"count":2,"pre_sum":4}]}	{"num_buckets":2,"buckets":[{"lower":"10","upper":"11","ndv":2,"count":4,"pre_sum":0},{"lower":"21","upper":"31","ndv":2,"count":2,"pre_sum":4}]}	{"num_buckets":2,"buckets":[{"lower":"12","upper":"20","ndv":2,"count":3,"pre_sum":0},{"lower":"21","upper":"32","ndv":3,"count":3,"pre_sum":3}]}	{"num_buckets":2,"buckets":[{"lower":"944444444444","upper [...]
 
 -- !select --
-1	{"num_buckets":2,"buckets":[{"lower":"0","upper":"0","ndv":1,"count":2,"pre_sum":0},{"lower":"1","upper":"1","ndv":1,"count":1,"pre_sum":2}]}	{"num_buckets":2,"buckets":[{"lower":"10","upper":"10","ndv":1,"count":1,"pre_sum":0},{"lower":"11","upper":"11","ndv":1,"count":2,"pre_sum":1}]}	{"num_buckets":2,"buckets":[{"lower":"12","upper":"20","ndv":2,"count":2,"pre_sum":0},{"lower":"21","upper":"21","ndv":1,"count":1,"pre_sum":2}]}	{"num_buckets":2,"buckets":[{"lower":"1444444444444","up [...]
+1	{"num_buckets":2,"buckets":[{"lower":"0","upper":"0","ndv":1,"count":2,"pre_sum":0},{"lower":"1","upper":"1","ndv":1,"count":1,"pre_sum":2}]}	{"num_buckets":2,"buckets":[{"lower":"10","upper":"10","ndv":1,"count":1,"pre_sum":0},{"lower":"11","upper":"11","ndv":1,"count":2,"pre_sum":1}]}	{"num_buckets":2,"buckets":[{"lower":"12","upper":"20","ndv":2,"count":2,"pre_sum":0},{"lower":"21","upper":"21","ndv":1,"count":1,"pre_sum":2}]}	{"num_buckets":2,"buckets":[{"lower":"1444444444444","up [...]
 2	{"num_buckets":2,"buckets":[{"lower":"0","upper":"0","ndv":1,"count":2,"pre_sum":0},{"lower":"1","upper":"1","ndv":1,"count":1,"pre_sum":2}]}	{"num_buckets":2,"buckets":[{"lower":"10","upper":"21","ndv":2,"count":2,"pre_sum":0},{"lower":"31","upper":"31","ndv":1,"count":1,"pre_sum":2}]}	{"num_buckets":2,"buckets":[{"lower":"20","upper":"22","ndv":2,"count":2,"pre_sum":0},{"lower":"32","upper":"32","ndv":1,"count":1,"pre_sum":2}]}	{"num_buckets":2,"buckets":[{"lower":"944444444444","upp [...]
 
 -- !select --
-1	{"num_buckets":2,"buckets":[{"lower":"0","upper":"0","ndv":1,"count":4,"pre_sum":0},{"lower":"1","upper":"1","ndv":1,"count":2,"pre_sum":4}]}	{"num_buckets":2,"buckets":[{"lower":"10","upper":"11","ndv":2,"count":4,"pre_sum":0},{"lower":"21","upper":"31","ndv":2,"count":2,"pre_sum":4}]}	{"num_buckets":2,"buckets":[{"lower":"12","upper":"20","ndv":2,"count":3,"pre_sum":0},{"lower":"21","upper":"32","ndv":3,"count":3,"pre_sum":3}]}	{"num_buckets":2,"buckets":[{"lower":"944444444444","upp [...]
+1	{"num_buckets":2,"buckets":[{"lower":"0","upper":"0","ndv":1,"count":4,"pre_sum":0},{"lower":"1","upper":"1","ndv":1,"count":2,"pre_sum":4}]}	{"num_buckets":2,"buckets":[{"lower":"10","upper":"11","ndv":2,"count":4,"pre_sum":0},{"lower":"21","upper":"31","ndv":2,"count":2,"pre_sum":4}]}	{"num_buckets":2,"buckets":[{"lower":"12","upper":"20","ndv":2,"count":3,"pre_sum":0},{"lower":"21","upper":"32","ndv":3,"count":3,"pre_sum":3}]}	{"num_buckets":2,"buckets":[{"lower":"944444444444","upp [...]
 
 -- !select --
-1	{"num_buckets":2,"buckets":[{"lower":"0","upper":"0","ndv":1,"count":4,"pre_sum":0},{"lower":"1","upper":"1","ndv":1,"count":2,"pre_sum":4}]}	{"num_buckets":2,"buckets":[{"lower":"10","upper":"11","ndv":2,"count":4,"pre_sum":0},{"lower":"21","upper":"31","ndv":2,"count":2,"pre_sum":4}]}	{"num_buckets":2,"buckets":[{"lower":"12","upper":"20","ndv":2,"count":3,"pre_sum":0},{"lower":"21","upper":"32","ndv":3,"count":3,"pre_sum":3}]}	{"num_buckets":2,"buckets":[{"lower":"944444444444","upp [...]
+1	{"num_buckets":2,"buckets":[{"lower":"0","upper":"0","ndv":1,"count":4,"pre_sum":0},{"lower":"1","upper":"1","ndv":1,"count":2,"pre_sum":4}]}	{"num_buckets":2,"buckets":[{"lower":"10","upper":"11","ndv":2,"count":4,"pre_sum":0},{"lower":"21","upper":"31","ndv":2,"count":2,"pre_sum":4}]}	{"num_buckets":2,"buckets":[{"lower":"12","upper":"20","ndv":2,"count":3,"pre_sum":0},{"lower":"21","upper":"32","ndv":3,"count":3,"pre_sum":3}]}	{"num_buckets":2,"buckets":[{"lower":"944444444444","upp [...]
 
diff --git a/regression-test/data/query_p0/sql_functions/array_functions/test_array_aggregation_functions.out b/regression-test/data/query_p0/sql_functions/array_functions/test_array_aggregation_functions.out
index c0a773048f..906452af47 100644
--- a/regression-test/data/query_p0/sql_functions/array_functions/test_array_aggregation_functions.out
+++ b/regression-test/data/query_p0/sql_functions/array_functions/test_array_aggregation_functions.out
@@ -1,31 +1,31 @@
 -- This file is automatically generated. You should know what you did if you want to edit this
 -- !select --
-1	1	100	1000	2147483648	9223372036854775808	0E-9	1.0	100.0001	2022-08-31	2022-08-31T12:00	2022-08-31	2022-08-31T12:00:00.999
-2	1	\N	\N	\N	\N	\N	127.0	4.023	\N	\N	\N	\N
-3	-1	-32768	-2147483647	-9223372036854775808	-117341182548128045443221445	-9.999999000	-1.0	-128.0001	\N	\N	\N	\N
-4	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N
+1	1	100	1000	2147483648	9223372036854775808	0E-9	1.0	100.0001	2022-08-31	2022-08-31T12:00	2022-08-31	2022-08-31T12:00:00.999	111111	222222.222	333333.333	444444.444
+2	1	\N	\N	\N	\N	\N	127.0	4.023	\N	\N	\N	\N	\N	\N	\N	\N
+3	-1	-32768	-2147483647	-9223372036854775808	-117341182548128045443221445	-9.999999000	-1.0	-128.0001	\N	\N	\N	\N	111111	222222.222	333333.333	444444.444
+4	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N
 
 -- !select --
-1	3	101	1001	2147483649	9223372036854775808	9.999999000	1.5	100.0005	2022-10-15	2022-10-15T10:30	2022-10-15	2022-10-15T10:30:00.999
-2	3	\N	\N	\N	\N	\N	128.1	4.023	\N	\N	\N	\N
-3	1	-32767	-50000	0	170141183460469231731687303715884105727	9.999999000	1.0	127.0001	\N	\N	\N	\N
-4	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N
+1	3	101	1001	2147483649	9223372036854775808	9.999999000	1.5	100.0005	2022-10-15	2022-10-15T10:30	2022-10-15	2022-10-15T10:30:00.999	111111	222222.222	333333.333	444444.444
+2	3	\N	\N	\N	\N	\N	128.1	4.023	\N	\N	\N	\N	\N	\N	\N	\N
+3	1	-32767	-50000	0	170141183460469231731687303715884105727	9.999999000	1.0	127.0001	\N	\N	\N	\N	111111	222222.222	333333.333	444444.444
+4	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N
 
 -- !select --
-1	2.0	100.5	1000.5	2.1474836485E9	9.223372036854776E18	4.999999500	1.25	100.00030000000001
-2	2.0	\N	\N	\N	\N	\N	127.55000305175781	4.023
-3	0.0	-32767.5	-1.0737668235E9	-4.6116860184273879E18	8.5070591730175945E37	0E-9	0.0	-0.5
-4	\N	\N	\N	\N	\N	\N	\N	\N
+1	2.0	100.5	1000.5	2.1474836485E9	9.223372036854776E18	4.999999500	1.25	100.00030000000001	111111	222222.222	333333.333	444444.444
+2	2.0	\N	\N	\N	\N	\N	127.55000305175781	4.023	\N	\N	\N	\N
+3	0.0	-32767.5	-1.0737668235E9	-4.6116860184273879E18	8.5070591730175945E37	0E-9	0.0	-0.5	111111	222222.222	333333.333	444444.444
+4	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N
 
 -- !select --
-1	6	201	2001	4294967297	9223372036854775808	9.999999000	2.5	200.00060000000002
-2	12	\N	\N	\N	\N	\N	255.10000610351562	4.023
-3	0	-65535	-2147533647	-9223372036854775808	170141183460351890549139175670440884282	0E-9	0.0	-1.0
-4	\N	\N	\N	\N	\N	\N	\N	\N
+1	6	201	2001	4294967297	9223372036854775808	9.999999000	2.5	200.00060000000002	222222	444444.444	666666.666	888888.888
+2	12	\N	\N	\N	\N	\N	255.10000610351562	4.023	\N	\N	\N	\N
+3	0	-65535	-2147533647	-9223372036854775808	170141183460351890549139175670440884282	0E-9	0.0	-1.0	222222	444444.444	666666.666	888888.888
+4	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N
 
 -- !select --
-1	6.0	10100.0	1001000.0	4.6116860205748716E18	9.223372036854776E18	0E-9	1.5	10000.06000005
-2	36.0	\N	\N	\N	\N	\N	16268.700775146484	4.023
-3	-0.0	1.073709056E9	1.0737418235E14	-0.0	-1.9964567667389465E64	-99.999980000	-0.0	-16256.02550001
-4	\N	\N	\N	\N	\N	\N	\N	\N
+1	6.0	10100.0	1001000.0	4.6116860205748716E18	9.223372036854776E18	0E-9	1.5	10000.06000005	12345654321	49382715950617284.000	111111110888888889.000	197530863802469136.000
+2	36.0	\N	\N	\N	\N	\N	16268.700775146484	4.023	\N	\N	\N	\N
+3	-0.0	1.073709056E9	1.0737418235E14	-0.0	-1.9964567667389465E64	-99.999980000	-0.0	-16256.02550001	12345654321	49382715950617284.000	111111110888888889.000	197530863802469136.000
+4	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N	\N
 
diff --git a/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions.out b/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions.out
index a1e1c10ae4..b37edf7d80 100644
--- a/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions.out
+++ b/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions.out
@@ -54,6 +54,17 @@
 8	\N
 9	\N
 
+-- !select --
+1	true
+2	true
+3	\N
+4	\N
+5	\N
+6	\N
+7	\N
+8	\N
+9	\N
+
 -- !select --
 1	[1, 2, 3]	['a', 'b', '']
 2	[4]	\N
@@ -76,6 +87,17 @@
 8	\N	\N
 9	\N	\N
 
+-- !select --
+1	[111.111, 222.222]
+2	[3333.333, 4444.444]
+3	\N
+4	\N
+5	\N
+6	\N
+7	\N
+8	\N
+9	\N
+
 -- !select --
 [2, 3]	1
 [4]	2
@@ -109,6 +131,17 @@
 \N
 \N
 
+-- !select --
+[111.111, 222.222]
+[3333.333, 4444.444]
+\N
+\N
+\N
+\N
+\N
+\N
+\N
+
 -- !select --
 1	[1, 2, 3]	['', 'a', 'b']	[1, 2]
 2	[4]	\N	[5]
@@ -131,6 +164,17 @@
 8	\N	\N
 9	\N	\N
 
+-- !select --
+1	[111.111, 222.222]
+2	[3333.333, 4444.444]
+3	\N
+4	\N
+5	\N
+6	\N
+7	\N
+8	\N
+9	\N
+
 -- !select --
 1	[1, 2, 3]
 2	[4, 5]
@@ -164,6 +208,17 @@
 8	\N
 9	\N
 
+-- !select --
+1	[111.111, 222.222, 333.333]
+2	[3333.333, 4444.444, 5555.555]
+3	\N
+4	\N
+5	\N
+6	\N
+7	\N
+8	\N
+9	\N
+
 -- !select --
 1	[3]
 2	[4]
@@ -197,6 +252,17 @@
 8	\N
 9	\N
 
+-- !select --
+1	[111.111]
+2	[3333.333]
+3	\N
+4	\N
+5	\N
+6	\N
+7	\N
+8	\N
+9	\N
+
 -- !select --
 1	[1, 2]
 2	[]
@@ -230,6 +296,17 @@
 8	\N
 9	\N
 
+-- !select --
+1	[222.222]
+2	[4444.444]
+3	\N
+4	\N
+5	\N
+6	\N
+7	\N
+8	\N
+9	\N
+
 -- !select --
 1	[2, 3]
 2	[]
@@ -274,6 +351,17 @@
 8	\N
 9	\N
 
+-- !select --
+1	[111.111, 222.222]
+2	[3333.333, 4444.444]
+3	\N
+4	\N
+5	\N
+6	\N
+7	\N
+8	\N
+9	\N
+
 -- !select --
 1	[3, 2, 1]	['', 'b', 'a']	[2, 1]
 2	[4]	\N	[5]
@@ -296,6 +384,17 @@
 8	\N	\N
 9	\N	\N
 
+-- !select --
+1	[222.222, 111.111]
+2	[4444.444, 3333.333]
+3	\N
+4	\N
+5	\N
+6	\N
+7	\N
+8	\N
+9	\N
+
 -- !select --
 1	1_2_3	a-b-
 2	4	\N
@@ -406,6 +505,17 @@
 8	\N
 9	\N
 
+-- !select --
+1	true
+2	false
+3	\N
+4	\N
+5	\N
+6	\N
+7	\N
+8	\N
+9	\N
+
 -- !select --
 1	[1, 2, 3]
 2	[1]
@@ -472,6 +582,17 @@
 8	\N
 9	\N
 
+-- !select --
+1	[1, 2]
+2	[1, 2]
+3	\N
+4	\N
+5	\N
+6	\N
+7	\N
+8	\N
+9	\N
+
 -- !select --
 1	[1, 1, 1]
 2	[1]
@@ -604,6 +725,17 @@
 8	\N
 9	\N
 
+-- !select --
+1	[111.111]
+2	[3333.333]
+3	\N
+4	\N
+5	\N
+6	\N
+7	\N
+8	\N
+9	\N
+
 -- !select --
 1	[2, 3]
 2	[]
@@ -670,6 +802,17 @@
 8	\N
 9	\N
 
+-- !select --
+1	[222.222]
+2	[4444.444]
+3	\N
+4	\N
+5	\N
+6	\N
+7	\N
+8	\N
+9	\N
+
 -- !select --
 1	[1, 1, 1]
 2	[2, 2, 2]
@@ -846,6 +989,17 @@
 8	\N
 9	\N
 
+-- !select --
+1	1
+2	0
+3	\N
+4	\N
+5	\N
+6	\N
+7	\N
+8	\N
+9	\N
+
 -- !select_array --
 1	[1]	true
 2	[2]	true
@@ -901,6 +1055,17 @@
 8	\N
 9	\N
 
+-- !select --
+1	[111.111, 222.222, 222.222, 333.333]
+2	[3333.333, 4444.444, 4444.444, 5555.555]
+3	\N
+4	\N
+5	\N
+6	\N
+7	\N
+8	\N
+9	\N
+
 -- !select --
 \N	\N
 -1	\N
diff --git a/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions_by_literal.out b/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions_by_literal.out
index 8ca4024fc9..145a9f5f16 100644
--- a/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions_by_literal.out
+++ b/regression-test/data/query_p0/sql_functions/array_functions/test_array_functions_by_literal.out
@@ -32,6 +32,9 @@ true
 -- !sql --
 true
 
+-- !sql --
+true
+
 -- !sql --
 1
 
@@ -83,6 +86,9 @@ true
 -- !sql --
 1
 
+-- !sql --
+1
+
 -- !sql --
 3
 
@@ -113,6 +119,9 @@ true
 -- !sql --
 2023-02-05
 
+-- !sql --
+111.111
+
 -- !sql --
 1
 
@@ -146,6 +155,9 @@ true
 -- !sql --
 2023-02-05
 
+-- !sql --
+222.222
+
 -- !sql --
 2.0
 
@@ -224,6 +236,21 @@ true
 -- !sql --
 2023-02-05
 
+-- !sql --
+166.666
+
+-- !sql --
+333.333
+
+-- !sql --
+111.111
+
+-- !sql --
+222.222
+
+-- !sql --
+24691.308
+
 -- !sql --
 [1, 2, 3]
 
@@ -257,6 +284,9 @@ true
 -- !sql --
 [2023-02-04, 2023-02-05]
 
+-- !sql --
+[111.111, 222.222]
+
 -- !sql --
 [2, 3]
 
@@ -278,6 +308,9 @@ true
 -- !sql --
 [2023-02-04]
 
+-- !sql --
+[222.222]
+
 -- !sql --
 [1, 2, 3]
 
@@ -308,6 +341,9 @@ true
 -- !sql --
 [2023-02-05, 2023-02-06]
 
+-- !sql --
+[111.111, 222.222]
+
 -- !sql --
 false
 
@@ -335,6 +371,9 @@ true
 -- !sql --
 false
 
+-- !sql --
+true
+
 -- !sql --
 [1, 2, 3, 4]
 
@@ -416,6 +455,15 @@ false
 -- !sql --
 [2023-02-05]
 
+-- !sql --
+[111.111, 222.222, 333.333]
+
+-- !sql --
+[111.111]
+
+-- !sql --
+[222.222]
+
 -- !sql --
 [1]
 
@@ -449,6 +497,9 @@ false
 -- !sql --
 [2023-02-06, 2023-02-05]
 
+-- !sql --
+[111.111, 222.222]
+
 -- !sql --
 [2, 3, 4, 5, 6]
 
@@ -482,6 +533,9 @@ false
 -- !sql --
 [2023-02-04 23:07:34.999, 2023-02-07 22:07:34.999, 2023-02-04 23:07:34.999]
 
+-- !sql --
+[222.222]
+
 -- !sql --
 1_2_3
 
@@ -554,6 +608,12 @@ _
 -- !sql --
 [2023-02-06, 2023-02-05, 2023-02-07, 2023-02-05]
 
+-- !sql --
+[111.111, 222.222, 333.333]
+
+-- !sql --
+[111.111, 222.222]
+
 -- !sql --
 [1000002]
 
@@ -569,6 +629,9 @@ _
 -- !sql --
 [24.99]
 
+-- !sql --
+[111, 222]
+
 -- !sql --
 [1, 2, 3, 2, 3, 4, 8, 1, 2, 9]
 
diff --git a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_aggregation_functions.groovy b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_aggregation_functions.groovy
index fb7839c110..de827daa43 100644
--- a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_aggregation_functions.groovy
+++ b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_aggregation_functions.groovy
@@ -33,7 +33,11 @@ suite("test_array_aggregation_functions") {
               `a9` array<date> NULL COMMENT "",
               `a10` array<datetime> NULL COMMENT "",
               `a11` array<datev2> NULL COMMENT "",
-              `a12` array<datetimev2(3)> NULL COMMENT ""
+              `a12` array<datetimev2(3)> NULL COMMENT "",
+              `a13` array<decimalv3> NULL COMMENT "",
+              `a14` array<decimalv3(6, 3)> NULL COMMENT "",
+              `a15` array<decimalv3(10, 3)> NULL COMMENT "",
+              `a16` array<decimalv3(20, 3)> NULL COMMENT ""
             ) ENGINE=OLAP
             DUPLICATE KEY(`k1`)
             DISTRIBUTED BY HASH(`k1`) BUCKETS 1
@@ -42,14 +46,14 @@ suite("test_array_aggregation_functions") {
             "storage_format" = "V2"
             )
         """
-    sql """ INSERT INTO ${tableName} VALUES(1, [1, 2, 3], [100, 101], [1000, 1001], [2147483648, 2147483649], [9223372036854775808], [0.0, 9.999999], [1.0, 1.5], [100.0001, 100.0005], ['2022-10-15', '2022-08-31', '2022-09-01'], ['2022-10-15 10:30:00', '2022-08-31 12:00:00', '2022-09-01 09:00:00'], ['2022-10-15', '2022-08-31', '2022-09-01'], ['2022-10-15 10:30:00.999', '2022-08-31 12:00:00.999', '2022-09-01 09:00:00.999']) """
-    sql """ INSERT INTO ${tableName} VALUES(2, [1, 2, 3, NULL, 3, 2, 1], NULL, NULL, NULL, NULL, NULL, [127, 128.1], [NULL, 4.023], NULL, NULL, NULL, NULL) """
-    sql """ INSERT INTO ${tableName} VALUES(3, [-1, 0, 1], [-32767, -32768], [-50000, -2147483647], [-9223372036854775808, 0], [-117341182548128045443221445, 170141183460469231731687303715884105727], [-9.999999, 9.999999], [-1.0, 0.0, 1.0], [-128.0001, 127.0001], NULL, NULL, NULL, NULL) """
-    sql """ INSERT INTO ${tableName} VALUES(4, [], [], [], [], [], [], [], [], [], NULL, NULL, NULL) """
+    sql """ INSERT INTO ${tableName} VALUES(1, [1, 2, 3], [100, 101], [1000, 1001], [2147483648, 2147483649], [9223372036854775808], [0.0, 9.999999], [1.0, 1.5], [100.0001, 100.0005], ['2022-10-15', '2022-08-31', '2022-09-01'], ['2022-10-15 10:30:00', '2022-08-31 12:00:00', '2022-09-01 09:00:00'], ['2022-10-15', '2022-08-31', '2022-09-01'], ['2022-10-15 10:30:00.999', '2022-08-31 12:00:00.999', '2022-09-01 09:00:00.999'], [111111.111, 111111.111], [222222.2222, 222222.2222], [333333.3333 [...]
+    sql """ INSERT INTO ${tableName} VALUES(2, [1, 2, 3, NULL, 3, 2, 1], NULL, NULL, NULL, NULL, NULL, [127, 128.1], [NULL, 4.023], NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) """
+    sql """ INSERT INTO ${tableName} VALUES(3, [-1, 0, 1], [-32767, -32768], [-50000, -2147483647], [-9223372036854775808, 0], [-117341182548128045443221445, 170141183460469231731687303715884105727], [-9.999999, 9.999999], [-1.0, 0.0, 1.0], [-128.0001, 127.0001], NULL, NULL, NULL, NULL, [111111.111, 111111.111], [222222.2222, 222222.2222], [333333.33333, 333333.33333], [444444.44444, 444444.44444]) """
+    sql """ INSERT INTO ${tableName} VALUES(4, [], [], [], [], [], [], [], [], [], NULL, NULL, NULL, [], [], [], []) """
 
-    qt_select "SELECT k1, array_min(a1), array_min(a2), array_min(a3), array_min(a4), array_min(a5), array_min(a6), array_min(a7), array_min(a8), array_min(a9), array_min(a10), array_min(a11), array_min(a12) from ${tableName} order by k1"
-    qt_select "SELECT k1, array_max(a1), array_max(a2), array_max(a3), array_max(a4), array_max(a5), array_max(a6), array_max(a7), array_max(a8), array_max(a9), array_max(a10), array_max(a11), array_max(a12) from ${tableName} order by k1"
-    qt_select "SELECT k1, array_avg(a1), array_avg(a2), array_avg(a3), array_avg(a4), array_avg(a5), array_avg(a6), array_avg(a7), array_avg(a8) from ${tableName} order by k1"
-    qt_select "SELECT k1, array_sum(a1), array_sum(a2), array_sum(a3), array_sum(a4), array_sum(a5), array_sum(a6), array_sum(a7), array_sum(a8) from ${tableName} order by k1"
-    qt_select "SELECT k1, array_product(a1), array_product(a2), array_product(a3), array_product(a4), array_product(a5), array_product(a6), array_product(a7), array_product(a8) from ${tableName} order by k1"
+    qt_select "SELECT k1, array_min(a1), array_min(a2), array_min(a3), array_min(a4), array_min(a5), array_min(a6), array_min(a7), array_min(a8), array_min(a9), array_min(a10), array_min(a11), array_min(a12), array_min(a13), array_min(a14), array_min(a15), array_min(a16) from ${tableName} order by k1"
+    qt_select "SELECT k1, array_max(a1), array_max(a2), array_max(a3), array_max(a4), array_max(a5), array_max(a6), array_max(a7), array_max(a8), array_max(a9), array_max(a10), array_max(a11), array_max(a12), array_max(a13), array_max(a14), array_max(a15), array_max(a16)from ${tableName} order by k1"
+    qt_select "SELECT k1, array_avg(a1), array_avg(a2), array_avg(a3), array_avg(a4), array_avg(a5), array_avg(a6), array_avg(a7), array_avg(a8), array_avg(a13), array_avg(a14), array_avg(a15), array_avg(a16) from ${tableName} order by k1"
+    qt_select "SELECT k1, array_sum(a1), array_sum(a2), array_sum(a3), array_sum(a4), array_sum(a5), array_sum(a6), array_sum(a7), array_sum(a8), array_sum(a13), array_sum(a14), array_sum(a15), array_sum(a16) from ${tableName} order by k1"
+    qt_select "SELECT k1, array_product(a1), array_product(a2), array_product(a3), array_product(a4), array_product(a5), array_product(a6), array_product(a7), array_product(a8), array_product(a13), array_product(a14), array_product(a15), array_product(a16) from ${tableName} order by k1"
 }
diff --git a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions.groovy b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions.groovy
index e178eb6e65..5c08acdbec 100644
--- a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions.groovy
+++ b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions.groovy
@@ -31,7 +31,9 @@ suite("test_array_functions") {
               `k8` ARRAY<datev2> NULL COMMENT "",
               `k9` ARRAY<datev2> NULL COMMENT "",
               `k10` ARRAY<datetimev2(3)> NULL COMMENT "",
-              `k11` ARRAY<datetimev2(3)> NULL COMMENT ""
+              `k11` ARRAY<datetimev2(3)> NULL COMMENT "",
+              `k12` ARRAY<decimalv3(6, 3)> NULL COMMENT "",
+              `k13` ARRAY<decimalv3(6, 3)> NULL COMMENT ""
             ) ENGINE=OLAP
             DUPLICATE KEY(`k1`)
             DISTRIBUTED BY HASH(`k1`) BUCKETS 1
@@ -40,43 +42,52 @@ suite("test_array_functions") {
             "storage_format" = "V2"
             )
         """
-    sql """ INSERT INTO ${tableName} VALUES(1,[1,2,3],["a","b",""],[1,2],["hi"],["2015-03-13"],["2015-03-13 12:36:38"],["2023-02-05","2023-02-06"],["2023-02-07","2023-02-06"],['2022-10-15 10:30:00.999', '2022-08-31 12:00:00.999'],['2022-10-16 10:30:00.999', '2022-08-31 12:00:00.999']) """
-    sql """ INSERT INTO ${tableName} VALUES(2,[4],NULL,[5],["hi2"],NULL,NULL,["2023-01-05","2023-01-06"],["2023-01-07","2023-01-06"],['2022-11-15 10:30:00.999', '2022-01-31 12:00:00.999'],['2022-11-16 10:30:00.999', '2022-01-31 12:00:00.999']) """
-    sql """ INSERT INTO ${tableName} VALUES(3,[],[],NULL,["hi3"],NULL,NULL,NULL,NULL,NULL,NULL) """
-    sql """ INSERT INTO ${tableName} VALUES(4,[1,2,3,4,5,4,3,2,1],[],[],NULL,NULL,NULL,NULL,NULL,NULL,NULL) """
-    sql """ INSERT INTO ${tableName} VALUES(5,[],["a","b","c","d","c","b","a"],NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) """
-    sql """ INSERT INTO ${tableName} VALUES(6,[1,2,3,4,5,4,3,2,1],["a","b","c","d","c","b","a"],NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) """
-    sql """ INSERT INTO ${tableName} VALUES(7,[8,9,NULL,10,NULL],["f",NULL,"g",NULL,"h"],NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) """
-    sql """ INSERT INTO ${tableName} VALUES(8,[1,2,3,3,4,4,NULL],["a","b","b","b"],[1,2,2,3],["hi","hi","hello"],["2015-03-13"],["2015-03-13 12:36:38"],NULL,NULL,NULL,NULL) """
-    sql """ INSERT INTO ${tableName} VALUES(9,[1,2,3],["a","b",""],[1,2],["hi"],["2015-03-13","2015-03-13","2015-03-14"],["2015-03-13 12:36:38","2015-03-13 12:36:38"],NULL,NULL,NULL,NULL) """
+    sql """ INSERT INTO ${tableName} VALUES(1,[1,2,3],["a","b",""],[1,2],["hi"],["2015-03-13"],["2015-03-13 12:36:38"],["2023-02-05","2023-02-06"],["2023-02-07","2023-02-06"],['2022-10-15 10:30:00.999', '2022-08-31 12:00:00.999'],['2022-10-16 10:30:00.999', '2022-08-31 12:00:00.999'],[111.111, 222.222],[222.222, 333.333]) """
+    sql """ INSERT INTO ${tableName} VALUES(2,[4],NULL,[5],["hi2"],NULL,NULL,["2023-01-05","2023-01-06"],["2023-01-07","2023-01-06"],['2022-11-15 10:30:00.999', '2022-01-31 12:00:00.999'],['2022-11-16 10:30:00.999', '2022-01-31 12:00:00.999'],[3333.3333, 4444.4444],[4444.4444, 5555.5555]) """
+    sql """ INSERT INTO ${tableName} VALUES(3,[],[],NULL,["hi3"],NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) """
+    sql """ INSERT INTO ${tableName} VALUES(4,[1,2,3,4,5,4,3,2,1],[],[],NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) """
+    sql """ INSERT INTO ${tableName} VALUES(5,[],["a","b","c","d","c","b","a"],NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) """
+    sql """ INSERT INTO ${tableName} VALUES(6,[1,2,3,4,5,4,3,2,1],["a","b","c","d","c","b","a"],NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) """
+    sql """ INSERT INTO ${tableName} VALUES(7,[8,9,NULL,10,NULL],["f",NULL,"g",NULL,"h"],NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) """
+    sql """ INSERT INTO ${tableName} VALUES(8,[1,2,3,3,4,4,NULL],["a","b","b","b"],[1,2,2,3],["hi","hi","hello"],["2015-03-13"],["2015-03-13 12:36:38"],NULL,NULL,NULL,NULL,NULL,NULL) """
+    sql """ INSERT INTO ${tableName} VALUES(9,[1,2,3],["a","b",""],[1,2],["hi"],["2015-03-13","2015-03-13","2015-03-14"],["2015-03-13 12:36:38","2015-03-13 12:36:38"],NULL,NULL,NULL,NULL,NULL,NULL) """
 
     qt_select "SELECT k1, size(k2), size(k3) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, cardinality(k2), cardinality(k3) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, arrays_overlap(k2, k4) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, arrays_overlap(k8, k9) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, arrays_overlap(k10, k11) FROM ${tableName} ORDER BY k1"
+    qt_select "SELECT k1, arrays_overlap(k12, k13) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_distinct(k2), array_distinct(k3) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_distinct(k8), array_distinct(k10) FROM ${tableName} ORDER BY k1"
+    qt_select "SELECT k1, array_distinct(k12) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT array_remove(k2, k1), k1 FROM ${tableName} ORDER BY k1"
     qt_select "SELECT array_remove(k8, cast('2023-02-05' as datev2)) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT array_remove(k10, cast('2022-10-15 10:30:00.999' as datetimev2(3))) FROM ${tableName} ORDER BY k1"
+    qt_select "SELECT array_remove(k12, cast(111.111 as decimalv3(6,3))) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_sort(k2), array_sort(k3), array_sort(k4) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_sort(k8), array_sort(k10) FROM ${tableName} ORDER BY k1"
+    qt_select "SELECT k1, array_sort(k12) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_union(k2, k4) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_union(k8, k9) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_union(k10, k11) FROM ${tableName} ORDER BY k1"
+    qt_select "SELECT k1, array_union(k12, k13) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_except(k2, k4) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_except(k8, k9) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_except(k10, k11) FROM ${tableName} ORDER BY k1"
+    qt_select "SELECT k1, array_except(k12, k13) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_intersect(k2, k4) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_intersect(k8, k9) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_intersect(k10, k11) FROM ${tableName} ORDER BY k1"
+    qt_select "SELECT k1, array_intersect(k12, k13) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_slice(k2, 2) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_slice(k2, 1, 2) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_slice(k8, 1, 2) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_slice(k10, 1, 2) FROM ${tableName} ORDER BY k1"
+    qt_select "SELECT k1, array_slice(k12, 1, 2) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, reverse(k2), reverse(k3), reverse(k4) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, reverse(k8), reverse(k10) FROM ${tableName} ORDER BY k1"
+    qt_select "SELECT k1, reverse(k12) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_join(k2, '_', 'null'), array_join(k3, '-', 'null') FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_contains(k2, 1) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_contains(k3, 'a') FROM ${tableName} ORDER BY k1"
@@ -87,12 +98,14 @@ suite("test_array_functions") {
     qt_select "SELECT k1, array_contains(k6, null) from ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_contains(k8, cast('2023-02-05' as datev2)) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_contains(k10, cast('2022-10-15 10:30:00.999' as datetimev2(3))) FROM ${tableName} ORDER BY k1"
+    qt_select "SELECT k1, array_contains(k12, cast(111.111 as decimalv3(6,3))) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_enumerate(k2) from ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_enumerate(k5) from ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_enumerate(k6) from ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_enumerate(k7) from ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_enumerate(k8) from ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_enumerate(k10) from ${tableName} ORDER BY k1"
+    qt_select "SELECT k1, array_enumerate(k12) from ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_enumerate_uniq(k2) from ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_enumerate_uniq(k5) from ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_enumerate_uniq(k6) from ${tableName} ORDER BY k1"
@@ -105,12 +118,14 @@ suite("test_array_functions") {
     qt_select "SELECT k1, array_popback(k7) from ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_popback(k8) from ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_popback(k10) from ${tableName} ORDER BY k1"
+    qt_select "SELECT k1, array_popback(k12) from ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_popfront(k2) from ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_popfront(k5) from ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_popfront(k6) from ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_popfront(k7) from ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_popfront(k8) from ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_popfront(k10) from ${tableName} ORDER BY k1"
+    qt_select "SELECT k1, array_popfront(k12) from ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_with_constant(3, k1) from ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_with_constant(10, null) from ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_with_constant(2, 'a') from ${tableName} ORDER BY k1"
@@ -127,11 +142,13 @@ suite("test_array_functions") {
     qt_select "SELECT k1, array_position(k6, null) from ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_position(k8, cast('2023-02-05' as datev2)) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_position(k10, cast('2022-10-15 10:30:00.999' as datetimev2(3))) FROM ${tableName} ORDER BY k1"
+    qt_select "SELECT k1, array_position(k12, cast(111.111 as decimalv3(6,3))) FROM ${tableName} ORDER BY k1"
     qt_select_array "SELECT k1, array(k1), array_contains(array(k1), k1) from ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_concat(k2, k4) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_concat(k2, [1, null, 2], k4, [null]) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_concat(k8, k9) FROM ${tableName} ORDER BY k1"
     qt_select "SELECT k1, array_concat(k10, k11, array(cast('2023-03-05 10:30:00.999' as datetimev2(3)))) FROM ${tableName} ORDER BY k1"
+    qt_select "SELECT k1, array_concat(k12, k13) FROM ${tableName} ORDER BY k1"
 
     def tableName2 = "tbl_test_array_range"
     sql """DROP TABLE IF EXISTS ${tableName2}"""
diff --git a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions_by_literal.groovy b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions_by_literal.groovy
index 7cafdc54b6..5102c2b2cf 100644
--- a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions_by_literal.groovy
+++ b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions_by_literal.groovy
@@ -28,6 +28,7 @@ suite("test_array_functions_by_literal") {
     qt_sql "select array_contains([true], false)"
     qt_sql "select array_contains(array(cast ('2023-02-04 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))), cast ('2023-02-04 22:07:34.999' as datetimev2(3)))"
     qt_sql "select array_contains(array(cast ('2023-02-04' as datev2),cast ('2023-02-05' as datev2)), cast ('2023-02-05' as datev2))"
+    qt_sql "select array_contains(array(cast (111.111 as decimalv3(6,3)),cast (222.222 as decimalv3(6,3))), cast (111.111 as decimalv3(6,3)))"
 
     // array_position function
     qt_sql "select array_position([1,2,3], 1)"
@@ -46,6 +47,7 @@ suite("test_array_functions_by_literal") {
     qt_sql "select array_position([false, NULL, true], true)"
     qt_sql "select array_position(array(cast ('2023-02-04 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))), cast ('2023-02-04 22:07:34.999' as datetimev2(3)))"
     qt_sql "select array_position(array(cast ('2023-02-04' as datev2),cast ('2023-02-05' as datev2)), cast ('2023-02-05' as datev2))"
+    qt_sql "select array_position(array(cast (111.111 as decimalv3(6,3)),cast (222.222 as decimalv3(6,3))), cast (111.111 as decimalv3(6,3)))"
 
     // element_at function
     qt_sql "select element_at([1,2,3], 1)"
@@ -59,6 +61,7 @@ suite("test_array_functions_by_literal") {
     qt_sql "select element_at([true, NULL, false], 2)"
     qt_sql "select element_at(array(cast ('2023-02-04 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))), 1)"
     qt_sql "select element_at(array(cast ('2023-02-04' as datev2),cast ('2023-02-05' as datev2)), 2)"
+    qt_sql "select element_at(array(cast (111.111 as decimalv3(6,3)),cast (222.222 as decimalv3(6,3))), 1)"
 
     // array subscript function
     qt_sql "select [1,2,3][1]"
@@ -72,6 +75,7 @@ suite("test_array_functions_by_literal") {
     qt_sql "select [true, false]"
     qt_sql "select (array(cast ('2023-02-04 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))))[2]"
     qt_sql "select (array(cast ('2023-02-04' as datev2),cast ('2023-02-05' as datev2)))[2]"
+    qt_sql "select (array(cast (111.111 as decimalv3(6,3)),cast (222.222 as decimalv3(6,3))))[2]"
 
     // array_aggregation function
     qt_sql "select array_avg([1,2,3])"
@@ -100,6 +104,11 @@ suite("test_array_functions_by_literal") {
     qt_sql "select array_max(array(cast ('2023-02-04 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))))"
     qt_sql "select array_min(array(cast ('2023-02-04' as datev2),cast ('2023-02-05' as datev2)))"
     qt_sql "select array_max(array(cast ('2023-02-04' as datev2),cast ('2023-02-05' as datev2)))"
+    qt_sql "select array_avg(array(cast (111.111 as decimalv3(6,3)),cast (222.222 as decimalv3(6,3))))"
+    qt_sql "select array_sum(array(cast (111.111 as decimalv3(6,3)),cast (222.222 as decimalv3(6,3))))"
+    qt_sql "select array_min(array(cast (111.111 as decimalv3(6,3)),cast (222.222 as decimalv3(6,3))))"
+    qt_sql "select array_max(array(cast (111.111 as decimalv3(6,3)),cast (222.222 as decimalv3(6,3))))"
+    qt_sql "select array_product(array(cast (111.111 as decimalv3(6,3)),cast (222.222 as decimalv3(6,3))))"
 
     // array_distinct function
     qt_sql "select array_distinct([1,1,2,2,3,3])"
@@ -113,6 +122,7 @@ suite("test_array_functions_by_literal") {
     qt_sql "select array_distinct([1, 0, 0, null])"
     qt_sql "select array_distinct(array(cast ('2023-02-04 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))))"
     qt_sql "select array_distinct(array(cast ('2023-02-04' as datev2),cast ('2023-02-05' as datev2),cast ('2023-02-05' as datev2)))"
+    qt_sql "select array_distinct(array(cast (111.111 as decimalv3(6,3)),cast (222.222 as decimalv3(6,3))))"
 
 
     // array_remove function
@@ -123,6 +133,7 @@ suite("test_array_functions_by_literal") {
     qt_sql "select array_remove([true, false, false], false)"
     qt_sql "select array_remove(array(cast ('2023-02-04 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))), cast ('2023-02-04 22:07:34.999' as datetimev2(3)))"
     qt_sql "select array_remove(array(cast ('2023-02-04' as datev2),cast ('2023-02-05' as datev2)), cast ('2023-02-05' as datev2))"
+    qt_sql "select array_remove(array(cast (111.111 as decimalv3(6,3)),cast (222.222 as decimalv3(6,3))), cast (111.111 as decimalv3(6,3)))"
  
     // array_sort function
     qt_sql "select array_sort([1,2,3])"
@@ -135,6 +146,7 @@ suite("test_array_functions_by_literal") {
     qt_sql "select array_sort([])"
     qt_sql "select array_sort(array(cast ('2023-02-06 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))))"
     qt_sql "select array_sort(array(cast ('2023-02-06' as datev2),cast ('2023-02-05' as datev2)))"
+    qt_sql "select array_sort(array(cast (111.111 as decimalv3(6,3)),cast (222.222 as decimalv3(6,3))))"
 
     // array_overlap function
     qt_sql "select arrays_overlap([1,2,3], [4,5,6])"
@@ -146,6 +158,7 @@ suite("test_array_functions_by_literal") {
     qt_sql "select arrays_overlap(array(cast ('2023-02-06 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))),array(cast ('2023-02-07 22:07:34.999' as datetimev2(3)),cast ('2023-02-08 23:07:34.999' as datetimev2(3))))"
     qt_sql "select arrays_overlap(array(cast ('2023-02-06' as datev2), cast ('2023-02-05' as datev2)), array(cast ('2023-02-07' as datev2), cast ('2023-02-05' as datev2)))"
     qt_sql "select arrays_overlap(array(cast ('2023-02-06' as datev2), cast ('2023-02-05' as datev2)), array(cast ('2023-02-07' as datev2), cast ('2023-02-08' as datev2)))"
+    qt_sql "select arrays_overlap(array(cast (111.111 as decimalv3(6,3)),cast (222.222 as decimalv3(6,3))), array(cast (222.222 as decimalv3(6,3)),cast (333.333 as decimalv3(6,3))))"
 
     // array_binary function
     qt_sql "select array_union([1,2,3], [2,3,4])"
@@ -175,6 +188,9 @@ suite("test_array_functions_by_literal") {
     qt_sql "select array_union(array(cast ('2023-02-06' as datev2), cast ('2023-02-05' as datev2)), array(cast ('2023-02-07' as datev2), cast ('2023-02-05' as datev2)))"
     qt_sql "select array_except(array(cast ('2023-02-06' as datev2), cast ('2023-02-05' as datev2)), array(cast ('2023-02-07' as datev2), cast ('2023-02-05' as datev2)))"
     qt_sql "select array_intersect(array(cast ('2023-02-06' as datev2), cast ('2023-02-05' as datev2)), array(cast ('2023-02-07' as datev2), cast ('2023-02-05' as datev2)))"
+    qt_sql "select array_union(array(cast (111.111 as decimalv3(6,3)),cast (222.222 as decimalv3(6,3))), array(cast (222.222 as decimalv3(6,3)),cast (333.333 as decimalv3(6,3))))"
+    qt_sql "select array_except(array(cast (111.111 as decimalv3(6,3)),cast (222.222 as decimalv3(6,3))), array(cast (222.222 as decimalv3(6,3)),cast (333.333 as decimalv3(6,3))))"
+    qt_sql "select array_intersect(array(cast (111.111 as decimalv3(6,3)),cast (222.222 as decimalv3(6,3))), array(cast (222.222 as decimalv3(6,3)),cast (333.333 as decimalv3(6,3))))"
 
     // array_slice function
     qt_sql "select [1,2,3][1:1]"
@@ -188,6 +204,7 @@ suite("test_array_functions_by_literal") {
     qt_sql "select [true, false, false][2:]"
     qt_sql "select (array(cast ('2023-02-06 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))))[1:2]"
     qt_sql "select (array(cast ('2023-02-06' as datev2), cast ('2023-02-05' as datev2)))[1:2]"
+    qt_sql "select (array(cast (111.111 as decimalv3(6,3)),cast (222.222 as decimalv3(6,3))))[1:2]"
 
     // array_popfront function
     qt_sql "select array_popfront([1,2,3,4,5,6])"
@@ -201,6 +218,7 @@ suite("test_array_functions_by_literal") {
     qt_sql "select array_popfront(array(cast ('2023-02-06' as datev2), cast ('2023-02-05' as datev2), cast ('2023-02-07' as datev2), cast ('2023-02-05' as datev2)))"
     qt_sql "select array_popfront(array(null, cast ('2023-02-06' as datev2), cast ('2023-02-05' as datev2), cast ('2023-02-07' as datev2), cast ('2023-02-05' as datev2)))"
     qt_sql "select array_popfront(array(cast ('2023-02-06 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3)), cast ('2023-02-07 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))))"
+    qt_sql "select array_popfront(array(cast (111.111 as decimalv3(6,3)),cast (222.222 as decimalv3(6,3))))"
 
     // array_join function 
     qt_sql "select array_join([1, 2, 3], '_')"
@@ -228,6 +246,8 @@ suite("test_array_functions_by_literal") {
     qt_sql "select array_compact(['2015-03-13','2015-03-13'])"
     qt_sql "select array_compact(array(cast ('2023-02-06 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3)), cast ('2023-02-07 22:07:34.999' as datetimev2(3)),cast ('2023-02-04 23:07:34.999' as datetimev2(3))))"
     qt_sql "select array_compact(array(cast ('2023-02-06' as datev2), cast ('2023-02-05' as datev2), cast ('2023-02-07' as datev2), cast ('2023-02-05' as datev2)))"
+    qt_sql "select array_compact(array(cast (111.111 as decimalv3(6,3)),cast (222.222 as decimalv3(6,3)),cast (222.222 as decimalv3(6,3)),cast (333.333 as decimalv3(6,3))))"
+    qt_sql "select array_compact(array(cast (111.111 as decimalv3(6,3)),cast (222.222 as decimalv3(6,3))))"
 
     // array_apply
     qt_sql """select array_apply([1000000, 1000001, 1000002], '=', 1000002)"""
@@ -235,6 +255,7 @@ suite("test_array_functions_by_literal") {
     qt_sql """select array_apply(cast(array("2020-01-02", "2022-01-03", "2021-01-01", "1996-04-17") as array<datetimev2>), ">", '2020-01-02')"""
     qt_sql """select array_apply(array(cast (24.99 as decimal(10,3)),cast (25.99 as decimal(10,3))), ">", '25')"""
     qt_sql """select array_apply(array(cast (24.99 as decimal(10,3)),cast (25.99 as decimal(10,3))), "!=", '25.99')"""
+    qt_sql """select array_apply(array(cast (111.111 as decimalv3(6,3)),cast (222.222 as decimalv3(6,3))), ">", '111.111')"""
 
     qt_sql "select array_concat([1, 2, 3], [2, 3, 4], [8, 1, 2], [9])"
     qt_sql "select array_concat([12, 23], [25, null], [null], [66])"


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