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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to