This is an automated email from the ASF dual-hosted git repository. kxiao pushed a commit to branch branch-2.0 in repository https://gitbox.apache.org/repos/asf/doris.git
commit 6090063a892e36a219f4fd212a702ddeee317a84 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 | 63 ++-------- 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, 218 insertions(+), 220 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 1872c04e88..646027c540 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 @@ -23,22 +23,8 @@ import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable; 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.BigIntType; -import org.apache.doris.nereids.types.BooleanType; -import org.apache.doris.nereids.types.DateTimeType; -import org.apache.doris.nereids.types.DateTimeV2Type; -import org.apache.doris.nereids.types.DateType; -import org.apache.doris.nereids.types.DateV2Type; -import org.apache.doris.nereids.types.DecimalV2Type; -import org.apache.doris.nereids.types.DecimalV3Type; -import org.apache.doris.nereids.types.DoubleType; -import org.apache.doris.nereids.types.FloatType; -import org.apache.doris.nereids.types.IntegerType; -import org.apache.doris.nereids.types.LargeIntType; -import org.apache.doris.nereids.types.SmallIntType; -import org.apache.doris.nereids.types.StringType; -import org.apache.doris.nereids.types.TinyIntType; -import org.apache.doris.nereids.types.VarcharType; +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; @@ -52,45 +38,15 @@ public class ArrayUnion extends CompatibleTypeArrayFunction implements BinaryExpression, PropagateNullable { public static final List<FunctionSignature> SIGNATURES = ImmutableList.of( - FunctionSignature.ret(ArrayType.of(BooleanType.INSTANCE)) - .args(ArrayType.of(BooleanType.INSTANCE), ArrayType.of(BooleanType.INSTANCE)), - FunctionSignature.ret(ArrayType.of(TinyIntType.INSTANCE)) - .args(ArrayType.of(TinyIntType.INSTANCE), ArrayType.of(TinyIntType.INSTANCE)), - FunctionSignature.ret(ArrayType.of(SmallIntType.INSTANCE)) - .args(ArrayType.of(SmallIntType.INSTANCE), ArrayType.of(SmallIntType.INSTANCE)), - FunctionSignature.ret(ArrayType.of(IntegerType.INSTANCE)) - .args(ArrayType.of(IntegerType.INSTANCE), ArrayType.of(IntegerType.INSTANCE)), - FunctionSignature.ret(ArrayType.of(BigIntType.INSTANCE)) - .args(ArrayType.of(BigIntType.INSTANCE), ArrayType.of(BigIntType.INSTANCE)), - FunctionSignature.ret(ArrayType.of(LargeIntType.INSTANCE)) - .args(ArrayType.of(LargeIntType.INSTANCE), ArrayType.of(LargeIntType.INSTANCE)), - FunctionSignature.ret(ArrayType.of(FloatType.INSTANCE)) - .args(ArrayType.of(FloatType.INSTANCE), ArrayType.of(FloatType.INSTANCE)), - FunctionSignature.ret(ArrayType.of(DoubleType.INSTANCE)) - .args(ArrayType.of(DoubleType.INSTANCE), ArrayType.of(DoubleType.INSTANCE)), - FunctionSignature.ret(ArrayType.of(DecimalV2Type.SYSTEM_DEFAULT)) - .args(ArrayType.of(DecimalV2Type.SYSTEM_DEFAULT), ArrayType.of(DecimalV2Type.SYSTEM_DEFAULT)), - FunctionSignature.ret(ArrayType.of(DecimalV3Type.WILDCARD)) - .args(ArrayType.of(DecimalV3Type.WILDCARD), ArrayType.of(DecimalV3Type.WILDCARD)), - FunctionSignature.ret(ArrayType.of(DateTimeType.INSTANCE)) - .args(ArrayType.of(DateTimeType.INSTANCE), ArrayType.of(DateTimeType.INSTANCE)), - FunctionSignature.ret(ArrayType.of(DateType.INSTANCE)) - .args(ArrayType.of(DateType.INSTANCE), ArrayType.of(DateType.INSTANCE)), - FunctionSignature.ret(ArrayType.of(DateTimeV2Type.SYSTEM_DEFAULT)) - .args(ArrayType.of(DateTimeV2Type.SYSTEM_DEFAULT), ArrayType.of(DateTimeV2Type.SYSTEM_DEFAULT)), - FunctionSignature.ret(ArrayType.of(DateV2Type.INSTANCE)) - .args(ArrayType.of(DateV2Type.INSTANCE), ArrayType.of(DateV2Type.INSTANCE)), - FunctionSignature.ret(ArrayType.of(VarcharType.SYSTEM_DEFAULT)) - .args(ArrayType.of(VarcharType.SYSTEM_DEFAULT), ArrayType.of(VarcharType.SYSTEM_DEFAULT)), - FunctionSignature.ret(ArrayType.of(StringType.INSTANCE)) - .args(ArrayType.of(StringType.INSTANCE), ArrayType.of(StringType.INSTANCE)) + FunctionSignature.retArgType(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)); } /** @@ -98,8 +54,9 @@ public class ArrayUnion extends CompatibleTypeArrayFunction */ @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 14c4c216b2..d0a86533d1 100644 --- a/gensrc/script/doris_builtins_functions.py +++ b/gensrc/script/doris_builtins_functions.py @@ -437,24 +437,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 a255a65416..fe3f66f0ef 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 b3a4fa787a..2700cb62bc 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]
