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

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


The following commit(s) were added to refs/heads/master by this push:
     new e9435c14f8 [Improve](array-func)improve array union support multi 
params (#24327)
e9435c14f8 is described below

commit e9435c14f8f862930fcfa56e7fb1856abd2648c1
Author: amory <[email protected]>
AuthorDate: Wed Sep 20 14:29:48 2023 +0800

    [Improve](array-func)improve array union support multi params (#24327)
---
 be/src/vec/functions/array/function_array_map.h    |  55 ++++++---
 be/src/vec/functions/array/function_array_set.h    |   5 -
 .../vec/functions/array/function_array_union.cpp   |  49 ++++----
 .../expressions/functions/scalar/ArrayUnion.java   |  14 ++-
 gensrc/script/doris_builtins_functions.py          |  36 +++---
 .../nereids_function_p0/scalar_function/Array.out  | 128 ++++++++++-----------
 .../array_functions/test_array_functions.out       |  33 ++++--
 .../test_array_functions_by_literal.out            |  40 +++----
 .../array_functions/test_array_functions.groovy    |  23 ++--
 .../test_array_functions_by_literal.groovy         |   6 +
 10 files changed, 216 insertions(+), 173 deletions(-)

diff --git a/be/src/vec/functions/array/function_array_map.h 
b/be/src/vec/functions/array/function_array_map.h
index be9cd1be3d..a586e262cb 100644
--- a/be/src/vec/functions/array/function_array_map.h
+++ b/be/src/vec/functions/array/function_array_map.h
@@ -27,13 +27,33 @@
 #include "vec/functions/array/function_array_utils.h"
 #include "vec/functions/function_helpers.h"
 
+#define FILL_MAP_DATA_INTO_DEFAULT_COLUMN()                                \
+    ++dst_off;                                                             \
+    auto& dst_data = static_cast<ColumnType&>(*dst.nested_col).get_data(); \
+    dst_data.push_back(entry.get_first());                                 \
+    if (dst.nested_nullmap_data) {                                         \
+        dst.nested_nullmap_data->push_back(0);                             \
+    }
+
+#define FILL_MAP_DATA_INTO_STRING_COLUMN()                       \
+    auto& dst_col = static_cast<ColumnString&>(*dst.nested_col); \
+    StringRef key = entry.get_first();                           \
+    ++dst_off;                                                   \
+    dst_col.insert_data(key.data, key.size);                     \
+    if (dst.nested_nullmap_data) {                               \
+        dst.nested_nullmap_data->push_back(0);                   \
+    }
+
 namespace doris::vectorized {
 
-enum class MapOperation { INTERSECT };
+enum class MapOperation { INTERSECT, UNION };
 
 template <typename Map, typename ColumnType>
 struct IntersectAction;
 
+template <typename Map, typename ColumnType>
+struct UnionAction;
+
 template <typename Map, typename ColumnType, MapOperation operation>
 struct MapActionImpl;
 
@@ -42,6 +62,11 @@ struct MapActionImpl<Map, ColumnType, 
MapOperation::INTERSECT> {
     using Action = IntersectAction<Map, ColumnType>;
 };
 
+template <typename Map, typename ColumnType>
+struct MapActionImpl<Map, ColumnType, MapOperation::UNION> {
+    using Action = UnionAction<Map, ColumnType>;
+};
+
 template <MapOperation operation, typename ColumnType>
 struct OpenMapImpl {
     using Element = typename ColumnType::value_type;
@@ -62,7 +87,7 @@ struct OpenMapImpl {
                std::vector<bool>& col_const, int start_row, int end_row) {
         size_t dst_off = 0;
         for (int row = start_row; row < end_row; ++row) {
-            map.clear();
+            reset();
             for (int i = 0; i < params.size(); ++i) {
                 action.apply(map, i, index_check_const(row, col_const[i]), 
params[i]);
             }
@@ -76,13 +101,13 @@ struct OpenMapImpl {
             }
             // make map result to dst
             for (const auto& entry : map) {
-                if (entry.get_mapped() == params.size()) {
-                    ++dst_off;
-                    auto& dst_data = 
static_cast<ColumnType&>(*dst.nested_col).get_data();
-                    dst_data.push_back(entry.get_first());
-                    if (dst.nested_nullmap_data) {
-                        dst.nested_nullmap_data->push_back(0);
+                if constexpr (operation == MapOperation::INTERSECT) {
+                    if (entry.get_mapped() == params.size()) {
+                        FILL_MAP_DATA_INTO_DEFAULT_COLUMN()
                     }
+                } else if constexpr (operation == MapOperation::UNION) {
+                    // union in map all key
+                    FILL_MAP_DATA_INTO_DEFAULT_COLUMN()
                 }
             }
             dst.offsets_ptr->push_back(dst_off);
@@ -107,7 +132,7 @@ struct OpenMapImpl<operation, ColumnString> {
                std::vector<bool>& col_const, int start_row, int end_row) {
         size_t dst_off = 0;
         for (int row = start_row; row < end_row; ++row) {
-            map.clear();
+            reset();
             for (int i = 0; i < params.size(); ++i) {
                 action.apply(map, i, index_check_const(row, col_const[i]), 
params[i]);
             }
@@ -121,14 +146,12 @@ struct OpenMapImpl<operation, ColumnString> {
             }
             // make map result to dst
             for (const auto& entry : map) {
-                if (entry.get_mapped() == params.size()) {
-                    auto& dst_col = 
static_cast<ColumnString&>(*dst.nested_col);
-                    StringRef key = entry.get_first();
-                    ++dst_off;
-                    dst_col.insert_data(key.data, key.size);
-                    if (dst.nested_nullmap_data) {
-                        dst.nested_nullmap_data->push_back(0);
+                if constexpr (operation == MapOperation::INTERSECT) {
+                    if (entry.get_mapped() == params.size()) {
+                        FILL_MAP_DATA_INTO_STRING_COLUMN()
                     }
+                } else if constexpr (operation == MapOperation::UNION) {
+                    FILL_MAP_DATA_INTO_STRING_COLUMN()
                 }
             }
             dst.offsets_ptr->push_back(dst_off);
diff --git a/be/src/vec/functions/array/function_array_set.h 
b/be/src/vec/functions/array/function_array_set.h
index 1012fd055e..41bf53f921 100644
--- a/be/src/vec/functions/array/function_array_set.h
+++ b/be/src/vec/functions/array/function_array_set.h
@@ -39,11 +39,6 @@ struct ExceptAction;
 template <typename Set, typename Element, SetOperation operation>
 struct ActionImpl;
 
-template <typename Set, typename Element>
-struct ActionImpl<Set, Element, SetOperation::UNION> {
-    using Action = UnionAction<Set, Element>;
-};
-
 template <typename Set, typename Element>
 struct ActionImpl<Set, Element, SetOperation::EXCEPT> {
     using Action = ExceptAction<Set, Element>;
diff --git a/be/src/vec/functions/array/function_array_union.cpp 
b/be/src/vec/functions/array/function_array_union.cpp
index 68c9c2043f..75f7ec211b 100644
--- a/be/src/vec/functions/array/function_array_union.cpp
+++ b/be/src/vec/functions/array/function_array_union.cpp
@@ -15,6 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include "function_array_map.h"
 #include "vec/columns/column_const.h"
 #include "vec/common/assert_cast.h"
 #include "vec/common/string_ref.h"
@@ -31,41 +32,43 @@ struct NameArrayUnion {
     static constexpr auto name = "array_union";
 };
 
-template <typename Set, typename Element>
+template <typename Map, typename ColumnType>
 struct UnionAction {
-    // True if set has null element
-    bool null_flag = false;
+    // True if current has null element
+    bool current_null_flag = false;
     // True if result_set has null element
     bool result_null_flag = false;
-    // True if it should execute the left array first.
-    static constexpr auto execute_left_column_first = true;
 
     // Handle Null element.
-    // Return true means this null element should put into result column.
-    template <bool is_left>
-    bool apply_null() {
-        if (!null_flag) {
-            null_flag = true;
-            return true;
-        }
-        return false;
-    }
+    bool apply_null() { return result_null_flag; }
 
     // Handle Non-Null element.
-    // Return ture means this Non-Null element should put into result column.
-    template <bool is_left>
-    bool apply(Set& set, Set& result_set, const Element& elem) {
-        if (!set.find(elem)) {
-            set.insert(elem);
-            return true;
+    void apply(Map& map, size_t arg_idx, size_t row_idx, const 
ColumnArrayExecutionData& param) {
+        current_null_flag = false;
+        size_t start_off = (*param.offsets_ptr)[row_idx - 1];
+        size_t end_off = (*param.offsets_ptr)[row_idx];
+        for (size_t off = start_off; off < end_off; ++off) {
+            if (param.nested_nullmap_data && param.nested_nullmap_data[off]) {
+                current_null_flag = true;
+            } else {
+                if constexpr (std::is_same_v<ColumnString, ColumnType>) {
+                    map[param.nested_col->get_data_at(off)];
+                } else {
+                    auto& data_col = static_cast<const 
ColumnType&>(*param.nested_col);
+                    map[data_col.get_element(off)];
+                }
+            }
         }
-        return false;
+        result_null_flag = result_null_flag || current_null_flag;
     }
 
-    void reset() { null_flag = false; }
+    void reset() {
+        current_null_flag = false;
+        result_null_flag = false;
+    }
 };
 
-using FunctionArrayUnion = 
FunctionArrayBinary<ArraySetImpl<SetOperation::UNION>, NameArrayUnion>;
+using FunctionArrayUnion = 
FunctionArrayNary<ArrayMapImpl<MapOperation::UNION>, NameArrayUnion>;
 
 void register_function_array_union(SimpleFunctionFactory& factory) {
     factory.register_function<FunctionArrayUnion>();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayUnion.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayUnion.java
index a1152b2c6d..67efc5d381 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayUnion.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayUnion.java
@@ -25,6 +25,7 @@ import 
org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.ArrayType;
 import org.apache.doris.nereids.types.coercion.AnyDataType;
+import org.apache.doris.nereids.util.ExpressionUtils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -39,14 +40,14 @@ public class ArrayUnion extends ScalarFunction implements 
ExplicitlyCastableSign
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.retArgType(0)
-                    .args(ArrayType.of(new AnyDataType(0)), ArrayType.of(new 
AnyDataType(0)))
+                    .varArgs(ArrayType.of(new AnyDataType(0)), 
ArrayType.of(new AnyDataType(0)))
     );
 
     /**
-     * constructor with 2 arguments.
+     * constructor with more than 2 arguments.
      */
-    public ArrayUnion(Expression arg0, Expression arg1) {
-        super("array_union", arg0, arg1);
+    public ArrayUnion(Expression arg0, Expression arg1, Expression ...varArgs) 
{
+        super("array_union", ExpressionUtils.mergeArguments(arg0, arg1, 
varArgs));
     }
 
     /**
@@ -54,8 +55,9 @@ public class ArrayUnion extends ScalarFunction implements 
ExplicitlyCastableSign
      */
     @Override
     public ArrayUnion withChildren(List<Expression> children) {
-        Preconditions.checkArgument(children.size() == 2);
-        return new ArrayUnion(children.get(0), children.get(1));
+        Preconditions.checkArgument(children.size() >= 2);
+        return new ArrayUnion(children.get(0), children.get(1),
+                children.subList(2, children.size()).toArray(new 
Expression[0]));
     }
 
     @Override
diff --git a/gensrc/script/doris_builtins_functions.py 
b/gensrc/script/doris_builtins_functions.py
index e93d466bc8..0eaa570cdf 100644
--- a/gensrc/script/doris_builtins_functions.py
+++ b/gensrc/script/doris_builtins_functions.py
@@ -469,24 +469,24 @@ visible_functions = {
         [['array_remove'], 'ARRAY_VARCHAR',   ['ARRAY_VARCHAR', 'VARCHAR'], 
''],
         [['array_remove'], 'ARRAY_STRING',    ['ARRAY_STRING', 'STRING'], ''],
 
-        [['array_union'], 'ARRAY_BOOLEAN',  ['ARRAY_BOOLEAN', 
'ARRAY_BOOLEAN'],  ''],
-        [['array_union'], 'ARRAY_TINYINT',  ['ARRAY_TINYINT', 
'ARRAY_TINYINT'],  ''],
-        [['array_union'], 'ARRAY_SMALLINT', ['ARRAY_SMALLINT', 
'ARRAY_SMALLINT'], ''],
-        [['array_union'], 'ARRAY_INT',      ['ARRAY_INT', 'ARRAY_INT'], ''],
-        [['array_union'], 'ARRAY_BIGINT',   ['ARRAY_BIGINT', 'ARRAY_BIGINT'],  
 ''],
-        [['array_union'], 'ARRAY_LARGEINT', ['ARRAY_LARGEINT', 
'ARRAY_LARGEINT'], ''],
-        [['array_union'], 'ARRAY_FLOAT',     ['ARRAY_FLOAT', 'ARRAY_FLOAT'],  
''],
-        [['array_union'], 'ARRAY_DOUBLE',    ['ARRAY_DOUBLE', 'ARRAY_DOUBLE'], 
''],
-        [['array_union'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2', 
'ARRAY_DECIMALV2'], ''],
-        [['array_union'], 'ARRAY_DECIMAL32', ['ARRAY_DECIMAL32', 
'ARRAY_DECIMAL32'], ''],
-        [['array_union'], 'ARRAY_DECIMAL64', ['ARRAY_DECIMAL64', 
'ARRAY_DECIMAL64'], ''],
-        [['array_union'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL128', 
'ARRAY_DECIMAL128'], ''],
-        [['array_union'], 'ARRAY_DATETIME',  ['ARRAY_DATETIME', 
'ARRAY_DATETIME'], ''],
-        [['array_union'], 'ARRAY_DATE',      ['ARRAY_DATE', 'ARRAY_DATE'], ''],
-        [['array_union'], 'ARRAY_DATETIMEV2',  ['ARRAY_DATETIMEV2', 
'ARRAY_DATETIMEV2'], ''],
-        [['array_union'], 'ARRAY_DATEV2',      ['ARRAY_DATEV2', 
'ARRAY_DATEV2'], ''],
-        [['array_union'], 'ARRAY_VARCHAR',   ['ARRAY_VARCHAR', 
'ARRAY_VARCHAR'], ''],
-        [['array_union'], 'ARRAY_STRING',    ['ARRAY_STRING', 'ARRAY_STRING'], 
''],
+        [['array_union'], 'ARRAY_BOOLEAN',  ['ARRAY_BOOLEAN', 'ARRAY_BOOLEAN', 
'...'],  ''],
+        [['array_union'], 'ARRAY_TINYINT',  ['ARRAY_TINYINT', 'ARRAY_TINYINT', 
'...'],  ''],
+        [['array_union'], 'ARRAY_SMALLINT', ['ARRAY_SMALLINT', 
'ARRAY_SMALLINT', '...'], ''],
+        [['array_union'], 'ARRAY_INT',      ['ARRAY_INT', 'ARRAY_INT', '...'], 
''],
+        [['array_union'], 'ARRAY_BIGINT',   ['ARRAY_BIGINT', 'ARRAY_BIGINT', 
'...'],   ''],
+        [['array_union'], 'ARRAY_LARGEINT', ['ARRAY_LARGEINT', 
'ARRAY_LARGEINT', '...'], ''],
+        [['array_union'], 'ARRAY_FLOAT',     ['ARRAY_FLOAT', 'ARRAY_FLOAT', 
'...'],  ''],
+        [['array_union'], 'ARRAY_DOUBLE',    ['ARRAY_DOUBLE', 'ARRAY_DOUBLE', 
'...'], ''],
+        [['array_union'], 'ARRAY_DECIMALV2', ['ARRAY_DECIMALV2', 
'ARRAY_DECIMALV2', '...'], ''],
+        [['array_union'], 'ARRAY_DECIMAL32', ['ARRAY_DECIMAL32', 
'ARRAY_DECIMAL32', '...'], ''],
+        [['array_union'], 'ARRAY_DECIMAL64', ['ARRAY_DECIMAL64', 
'ARRAY_DECIMAL64', '...'], ''],
+        [['array_union'], 'ARRAY_DECIMAL128', ['ARRAY_DECIMAL128', 
'ARRAY_DECIMAL128', '...'], ''],
+        [['array_union'], 'ARRAY_DATETIME',  ['ARRAY_DATETIME', 
'ARRAY_DATETIME', '...'], ''],
+        [['array_union'], 'ARRAY_DATE',      ['ARRAY_DATE', 'ARRAY_DATE', 
'...'], ''],
+        [['array_union'], 'ARRAY_DATETIMEV2',  ['ARRAY_DATETIMEV2', 
'ARRAY_DATETIMEV2', '...'], ''],
+        [['array_union'], 'ARRAY_DATEV2',      ['ARRAY_DATEV2', 
'ARRAY_DATEV2', '...'], ''],
+        [['array_union'], 'ARRAY_VARCHAR',   ['ARRAY_VARCHAR', 
'ARRAY_VARCHAR', '...'], ''],
+        [['array_union'], 'ARRAY_STRING',    ['ARRAY_STRING', 'ARRAY_STRING', 
'...'], ''],
 
         [['array_apply'], 'ARRAY_BOOLEAN',  ['ARRAY_BOOLEAN', 'VARCHAR', 
'BOOLEAN'],  ''],
         [['array_apply'], 'ARRAY_TINYINT',  ['ARRAY_TINYINT', 'VARCHAR', 
'TINYINT'],  ''],
diff --git a/regression-test/data/nereids_function_p0/scalar_function/Array.out 
b/regression-test/data/nereids_function_p0/scalar_function/Array.out
index 7c63c9abd8..a0a2b958e9 100644
--- a/regression-test/data/nereids_function_p0/scalar_function/Array.out
+++ b/regression-test/data/nereids_function_p0/scalar_function/Array.out
@@ -7773,90 +7773,90 @@ true
 
 -- !sql_array_union_Char --
 \N
-["char11", "char21", "char31"]
-["char11", "char21", "char31"]
-["char11", "char21", "char31"]
-["char11", "char21", "char31"]
-["char12", "char22", "char32"]
-["char12", "char22", "char32"]
-["char12", "char22", "char32"]
-["char12", "char22", "char32"]
+["char12", "char32", "char22"]
+["char12", "char32", "char22"]
+["char12", "char32", "char22"]
+["char12", "char32", "char22"]
 ["char13", "char23", "char33"]
 ["char13", "char23", "char33"]
 ["char13", "char23", "char33"]
 ["char13", "char23", "char33"]
+["char21", "char11", "char31"]
+["char21", "char11", "char31"]
+["char21", "char11", "char31"]
+["char21", "char11", "char31"]
 
 -- !sql_array_union_Char_notnull --
-["char11", "char21", "char31"]
-["char11", "char21", "char31"]
-["char11", "char21", "char31"]
-["char11", "char21", "char31"]
-["char12", "char22", "char32"]
-["char12", "char22", "char32"]
-["char12", "char22", "char32"]
-["char12", "char22", "char32"]
+["char12", "char32", "char22"]
+["char12", "char32", "char22"]
+["char12", "char32", "char22"]
+["char12", "char32", "char22"]
 ["char13", "char23", "char33"]
 ["char13", "char23", "char33"]
 ["char13", "char23", "char33"]
 ["char13", "char23", "char33"]
+["char21", "char11", "char31"]
+["char21", "char11", "char31"]
+["char21", "char11", "char31"]
+["char21", "char11", "char31"]
 
 -- !sql_array_union_Varchar --
 \N
-["char11", "char21", "char31", "varchar11", "varchar21", "varchar31"]
-["char11", "char21", "char31", "varchar11", "varchar21", "varchar31"]
-["char11", "char21", "char31", "varchar11", "varchar21", "varchar31"]
-["char11", "char21", "char31", "varchar11", "varchar21", "varchar31"]
-["char12", "char22", "char32", "varchar12", "varchar22", "varchar32"]
-["char12", "char22", "char32", "varchar12", "varchar22", "varchar32"]
-["char12", "char22", "char32", "varchar12", "varchar22", "varchar32"]
-["char12", "char22", "char32", "varchar12", "varchar22", "varchar32"]
-["char13", "char23", "char33", "varchar13", "varchar23", "varchar33"]
-["char13", "char23", "char33", "varchar13", "varchar23", "varchar33"]
-["char13", "char23", "char33", "varchar13", "varchar23", "varchar33"]
-["char13", "char23", "char33", "varchar13", "varchar23", "varchar33"]
+["varchar11", "varchar31", "char21", "char11", "char31", "varchar21"]
+["varchar11", "varchar31", "char21", "char11", "char31", "varchar21"]
+["varchar11", "varchar31", "char21", "char11", "char31", "varchar21"]
+["varchar11", "varchar31", "char21", "char11", "char31", "varchar21"]
+["varchar22", "char12", "char32", "varchar12", "char22", "varchar32"]
+["varchar22", "char12", "char32", "varchar12", "char22", "varchar32"]
+["varchar22", "char12", "char32", "varchar12", "char22", "varchar32"]
+["varchar22", "char12", "char32", "varchar12", "char22", "varchar32"]
+["varchar23", "char13", "char23", "char33", "varchar13", "varchar33"]
+["varchar23", "char13", "char23", "char33", "varchar13", "varchar33"]
+["varchar23", "char13", "char23", "char33", "varchar13", "varchar33"]
+["varchar23", "char13", "char23", "char33", "varchar13", "varchar33"]
 
 -- !sql_array_union_Varchar_notnull --
-["char11", "char21", "char31", "varchar11", "varchar21", "varchar31"]
-["char11", "char21", "char31", "varchar11", "varchar21", "varchar31"]
-["char11", "char21", "char31", "varchar11", "varchar21", "varchar31"]
-["char11", "char21", "char31", "varchar11", "varchar21", "varchar31"]
-["char12", "char22", "char32", "varchar12", "varchar22", "varchar32"]
-["char12", "char22", "char32", "varchar12", "varchar22", "varchar32"]
-["char12", "char22", "char32", "varchar12", "varchar22", "varchar32"]
-["char12", "char22", "char32", "varchar12", "varchar22", "varchar32"]
-["char13", "char23", "char33", "varchar13", "varchar23", "varchar33"]
-["char13", "char23", "char33", "varchar13", "varchar23", "varchar33"]
-["char13", "char23", "char33", "varchar13", "varchar23", "varchar33"]
-["char13", "char23", "char33", "varchar13", "varchar23", "varchar33"]
+["varchar11", "varchar31", "char21", "char11", "char31", "varchar21"]
+["varchar11", "varchar31", "char21", "char11", "char31", "varchar21"]
+["varchar11", "varchar31", "char21", "char11", "char31", "varchar21"]
+["varchar11", "varchar31", "char21", "char11", "char31", "varchar21"]
+["varchar22", "char12", "char32", "varchar12", "char22", "varchar32"]
+["varchar22", "char12", "char32", "varchar12", "char22", "varchar32"]
+["varchar22", "char12", "char32", "varchar12", "char22", "varchar32"]
+["varchar22", "char12", "char32", "varchar12", "char22", "varchar32"]
+["varchar23", "char13", "char23", "char33", "varchar13", "varchar33"]
+["varchar23", "char13", "char23", "char33", "varchar13", "varchar33"]
+["varchar23", "char13", "char23", "char33", "varchar13", "varchar33"]
+["varchar23", "char13", "char23", "char33", "varchar13", "varchar33"]
 
 -- !sql_array_union_String --
 \N
-["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"]
-["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"]
-["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"]
-["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"]
-["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"]
-["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"]
-["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"]
-["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"]
-["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"]
-["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"]
-["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"]
-["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"]
+["varchar11", "varchar31", "char21", "char31", "string1", "varchar21"]
+["varchar11", "varchar31", "char21", "char31", "string1", "varchar21"]
+["varchar11", "varchar31", "char21", "char31", "string1", "varchar21"]
+["varchar11", "varchar31", "char21", "char31", "string1", "varchar21"]
+["varchar22", "string2", "char32", "varchar12", "char22", "varchar32"]
+["varchar22", "string2", "char32", "varchar12", "char22", "varchar32"]
+["varchar22", "string2", "char32", "varchar12", "char22", "varchar32"]
+["varchar22", "string2", "char32", "varchar12", "char22", "varchar32"]
+["varchar23", "char23", "string3", "char33", "varchar13", "varchar33"]
+["varchar23", "char23", "string3", "char33", "varchar13", "varchar33"]
+["varchar23", "char23", "string3", "char33", "varchar13", "varchar33"]
+["varchar23", "char23", "string3", "char33", "varchar13", "varchar33"]
 
 -- !sql_array_union_String_notnull --
-["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"]
-["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"]
-["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"]
-["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"]
-["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"]
-["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"]
-["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"]
-["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"]
-["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"]
-["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"]
-["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"]
-["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"]
+["varchar11", "varchar31", "char21", "char31", "string1", "varchar21"]
+["varchar11", "varchar31", "char21", "char31", "string1", "varchar21"]
+["varchar11", "varchar31", "char21", "char31", "string1", "varchar21"]
+["varchar11", "varchar31", "char21", "char31", "string1", "varchar21"]
+["varchar22", "string2", "char32", "varchar12", "char22", "varchar32"]
+["varchar22", "string2", "char32", "varchar12", "char22", "varchar32"]
+["varchar22", "string2", "char32", "varchar12", "char22", "varchar32"]
+["varchar22", "string2", "char32", "varchar12", "char22", "varchar32"]
+["varchar23", "char23", "string3", "char33", "varchar13", "varchar33"]
+["varchar23", "char23", "string3", "char33", "varchar13", "varchar33"]
+["varchar23", "char23", "string3", "char33", "varchar13", "varchar33"]
+["varchar23", "char23", "string3", "char33", "varchar13", "varchar33"]
 
 -- !sql_array_union_DatetimeV2 --
 \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 086a172e3e..fb3ef0e747 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
@@ -209,19 +209,19 @@
 9      \N
 
 -- !select --
-1      [1, 2, 3]
+1      [3, 2, 1]
 2      [4, 5]
 3      \N
-4      [1, 2, 3, 4, 5]
+4      [3, 2, 1, 4, 5]
 5      \N
 6      \N
 7      \N
-8      [1, 2, 3, 4, NULL]
-9      [1, 2, 3]
+8      [NULL, 3, 2, 1, 4]
+9      [3, 2, 1]
 
 -- !select --
-1      [2023-02-05, 2023-02-06, 2023-02-07]
-2      [2023-01-05, 2023-01-06, 2023-01-07]
+1      [2023-02-07, 2023-02-06, 2023-02-05]
+2      [2023-01-06, 2023-01-07, 2023-01-05]
 3      \N
 4      \N
 5      \N
@@ -231,8 +231,8 @@
 9      \N
 
 -- !select --
-1      [2022-10-15 10:30:00.999, 2022-08-31 12:00:00.999, 2022-10-16 
10:30:00.999]
-2      [2022-11-15 10:30:00.999, 2022-01-31 12:00:00.999, 2022-11-16 
10:30:00.999]
+1      [2022-10-16 10:30:00.999, 2022-10-15 10:30:00.999, 2022-08-31 
12:00:00.999]
+2      [2022-11-15 10:30:00.999, 2022-11-16 10:30:00.999, 2022-01-31 
12:00:00.999]
 3      \N
 4      \N
 5      \N
@@ -243,7 +243,7 @@
 
 -- !select --
 1      [111.111, 222.222, 333.333]
-2      [333.333, 444.444, 555.556]
+2      [444.444, 555.556, 333.333]
 3      \N
 4      \N
 5      \N
@@ -252,6 +252,17 @@
 8      \N
 9      \N
 
+-- !select --
+1      [3, 2, 222, 1]
+2      \N
+3      \N
+4      [NULL, 3, 23, 2, 1, 4, 5]
+5      \N
+6      \N
+7      \N
+8      [NULL, 8, 10, 3, 9, 2, 1, 4]
+9      [NULL, 3, 2, 1, 12]
+
 -- !select --
 1      [3]
 2      [4]
@@ -1645,8 +1656,8 @@
 [1, 2, 3]      1,2,3
 
 -- !select_union --
-10005  [10005, NULL, NULL]     [10005, NULL, 1, 2, 3]
-10006  [60002, 60002, 60003, NULL, 60005]      [60002, 60003, NULL, 60005, 1, 
2, 3]
+10005  [10005, NULL, NULL]     [NULL, 3, 10005, 2, 1]
+10006  [60002, 60002, 60003, NULL, 60005]      [NULL, 3, 60002, 60005, 60003, 
2, 1]
 
 -- !select_except --
 10005  [10005, NULL, NULL]     [10005, NULL]
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 5d7965b29d..014067c7ec 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
@@ -39,7 +39,7 @@
 []
 
 -- !sql_11 --
-[1.0, 2.0, NULL]
+[NULL, 1.0, 2.0]
 
 -- !sql_14 --
 [2.0, NULL, NULL, 2.0]
@@ -459,7 +459,7 @@ false
 true
 
 -- !sql --
-[1, 2, 3, 4]
+[3, 2, 1, 4]
 
 -- !sql --
 [1]
@@ -468,7 +468,7 @@ true
 [3, 2]
 
 -- !sql --
-[1, 2, 3, 4, NULL]
+[NULL, 3, 2, 1, 4]
 
 -- !sql --
 [1]
@@ -477,7 +477,7 @@ true
 [3, 2]
 
 -- !sql --
-[1, 0]
+[0, 1]
 
 -- !sql --
 [0]
@@ -495,7 +495,7 @@ true
 []
 
 -- !sql --
-[1, 2, 3]
+[3, 2, 1]
 
 -- !sql --
 []
@@ -504,7 +504,7 @@ true
 []
 
 -- !sql --
-[NULL, 1, 2, 3]
+[NULL, 3, 2, 1]
 
 -- !sql --
 [NULL]
@@ -513,7 +513,7 @@ true
 []
 
 -- !sql --
-[1, 100000000]
+[100000000, 1]
 
 -- !sql --
 [1]
@@ -531,7 +531,7 @@ true
 [2023-02-04 23:07:34.999]
 
 -- !sql --
-[2023-02-06, 2023-02-05, 2023-02-07]
+[2023-02-07, 2023-02-06, 2023-02-05]
 
 -- !sql --
 [2023-02-06]
@@ -596,6 +596,18 @@ true
 -- !sql_intersect_4 --
 []
 
+-- !sql_union_1 --
+[NULL, 3, 2, 1]
+
+-- !sql_union_2 --
+[NULL, 3, 2, 1]
+
+-- !sql_union_3 --
+[NULL, 3, 2, 1]
+
+-- !sql_union_4 --
+[NULL, 3, 2, 1]
+
 -- !sql --
 [2, 3, 4, 5, 6]
 
@@ -755,18 +767,6 @@ _
 -- !sql --
 [2023-03-05 12:23:24.999, 2023-03-05 15:23:23.997]
 
--- !select_array_shuffle1 --
-17     [1, 3, 2, NULL, 3, 4, NULL, 4]  [1, 3, 2, NULL, 3, 4, NULL, 4]
-
--- !select_array_shuffle2 --
-6.666  [3.333, 2.222, 1.111]   [3.333, 2.222, 1.111]
-
--- !select_array_shuffle3 --
-4      ["aaa", "bbb", NULL, "fff"]     ["aaa", "bbb", NULL, "fff"]
-
--- !select_array_shuffle4 --
-4      ["2020-01-02", "2021-01-01", "2022-01-03", "1996-04-17"]        
["2020-01-02", "2021-01-01", "2022-01-03", "1996-04-17"]
-
 -- !sql --
 [{"a", "d"}, {"b", "e"}, {"c", "f"}]
 
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 6a770daa79..c043ada07a 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
@@ -34,7 +34,8 @@ suite("test_array_functions") {
               `k10` 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 ""
+              `k13` ARRAY<decimalv3(6, 3)> NULL COMMENT "",
+              `k14` ARRAY<int(11)> NULL COMMENT ""
             ) ENGINE=OLAP
             DUPLICATE KEY(`k1`)
             DISTRIBUTED BY HASH(`k1`) BUCKETS 1
@@ -43,15 +44,15 @@ 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'],[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'],[333.3333, 444.4444],[444.4444, 555.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) """
+    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],[1,222,3]) """
+    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'],[333.3333, 444.4444],[444.4444, 555.5555],NULL) """
+    sql """ INSERT INTO ${tableName} 
VALUES(3,[],[],NULL,["hi3"],NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,[2,3,4]) """
+    sql """ INSERT INTO ${tableName} 
VALUES(4,[1,2,3,4,5,4,3,2,1],[],[],NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,[NULL,
 23]) """
+    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,[NULL,
 22]) """
+    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,[8,9,NULL,10,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,[8,9,NULL,10,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,[NULL,12]) """
 
     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"
@@ -76,6 +77,8 @@ suite("test_array_functions") {
     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"
+    // multi-params array_union
+    qt_select "SELECT k1, array_union(k2, k4, k14) 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"
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 f35549019e..58e655608a 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
@@ -248,6 +248,12 @@ suite("test_array_functions_by_literal") {
     qt_sql_intersect_3 "select array_intersect([1,2,3, null], [1,2,3,null], 
[1,2,null], [1, null])"
     qt_sql_intersect_4 "select array_intersect([1,2,3], [1,2,3], [null], [])"
 
+    // array_union-with-multiple-arguments
+    qt_sql_union_1 "select array_union([1,2,3], [1,2,3], [null])"
+    qt_sql_union_2 "select array_union([1, 2, null], [1, 3, null], 
[1,2,3,null])"
+    qt_sql_union_3 "select array_union([1,2,3, null], [1,2,3,null], 
[1,2,null], [1, null])"
+    qt_sql_union_4 "select array_union([1,2,3], [1,2,3], [null], [])"
+
     // array_popfront function
     qt_sql "select array_popfront([1,2,3,4,5,6])"
     qt_sql "select array_popfront([])"


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


Reply via email to