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]