From f3f350fbe672c9f8a369c06f4bf398e3fc57ad1e Mon Sep 17 00:00:00 2001 From: amorynan Date: Tue, 10 Sep 2024 15:45:39 +0800 Subject: [PATCH 1/5] support array_match_all/any --- .../lambda_function/lambda_function_factory.h | 2 + .../lambda_function/varray_match_function.cpp | 188 +++ .../doris/catalog/BuiltinScalarFunctions.java | 4 + .../functions/scalar/ArrayMatchAll.java | 74 + .../functions/scalar/ArrayMatchAny.java | 74 + .../visitor/ScalarFunctionVisitor.java | 10 + .../scalar_function/Array.out | 1320 +++++++++++++++++ .../suites/nereids_function_p0/load.groovy | 23 + .../scalar_function/Array.groovy | 42 + 9 files changed, 1737 insertions(+) create mode 100644 be/src/vec/exprs/lambda_function/varray_match_function.cpp create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMatchAll.java create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMatchAny.java diff --git a/be/src/vec/exprs/lambda_function/lambda_function_factory.h b/be/src/vec/exprs/lambda_function/lambda_function_factory.h index ce607748732fc0..d272f23cfe5f29 100644 --- a/be/src/vec/exprs/lambda_function/lambda_function_factory.h +++ b/be/src/vec/exprs/lambda_function/lambda_function_factory.h @@ -28,6 +28,7 @@ class LambdaFunctionFactory; void register_function_array_map(LambdaFunctionFactory& factory); void register_function_array_filter(LambdaFunctionFactory& factory); +void register_function_array_match(LambdaFunctionFactory& factory); class LambdaFunctionFactory { using Creator = std::function; @@ -62,6 +63,7 @@ class LambdaFunctionFactory { std::call_once(oc, []() { register_function_array_map(instance); register_function_array_filter(instance); + register_function_array_match(instance); }); return instance; } diff --git a/be/src/vec/exprs/lambda_function/varray_match_function.cpp b/be/src/vec/exprs/lambda_function/varray_match_function.cpp new file mode 100644 index 00000000000000..8ecff0faa1ed5d --- /dev/null +++ b/be/src/vec/exprs/lambda_function/varray_match_function.cpp @@ -0,0 +1,188 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +#include + +#include +#include +#include +#include + +#include "common/status.h" +#include "vec/aggregate_functions/aggregate_function.h" +#include "vec/columns/column.h" +#include "vec/columns/column_array.h" +#include "vec/columns/column_nullable.h" +#include "vec/columns/column_vector.h" +#include "vec/columns/columns_number.h" +#include "vec/common/assert_cast.h" +#include "vec/core/block.h" +#include "vec/core/column_numbers.h" +#include "vec/core/column_with_type_and_name.h" +#include "vec/data_types/data_type.h" +#include "vec/exprs/lambda_function/lambda_function.h" +#include "vec/exprs/lambda_function/lambda_function_factory.h" +#include "vec/exprs/vexpr.h" +#include "vec/utils/util.hpp" + +namespace doris { +namespace vectorized { +class VExprContext; +} // namespace vectorized +} // namespace doris + +namespace doris::vectorized { + +///* bool array_match_all/any(array, array) */// +template +class ArrayMatchFunction : public LambdaFunction { + ENABLE_FACTORY_CREATOR(ArrayMatchFunction); + +public: + ~ArrayMatchFunction() override = default; + + static constexpr auto name = MATCH_ALL ? "array_match_all" : "array_match_any"; + + static LambdaFunctionPtr create() { return std::make_shared(); } + + std::string get_name() const override { return name; } + + doris::Status execute(VExprContext* context, doris::vectorized::Block* block, + int* result_column_id, const DataTypePtr& result_type, + const VExprSPtrs& children) override { + DCHECK(children.size() == 2); + //1. child[0:end]->execute(src_block) + doris::vectorized::ColumnNumbers arguments(children.size()); + for (int i = 0; i < children.size(); ++i) { + int column_id = -1; + RETURN_IF_ERROR(children[i]->execute(context, block, &column_id)); + arguments[i] = column_id; + } + + //2. get second array column + auto first_column = + block->get_by_position(arguments[0]).column->convert_to_full_column_if_const(); + + auto second_column = + block->get_by_position(arguments[1]).column->convert_to_full_column_if_const(); + + int input_rows = first_column->size(); + auto first_outside_null_map = ColumnUInt8::create(input_rows, 0); + auto first_arg_column = first_column; + if (first_arg_column->is_nullable()) { + first_arg_column = + assert_cast(first_column.get())->get_nested_column_ptr(); + const auto& column_array_nullmap = + assert_cast(first_column.get())->get_null_map_column(); + VectorizedUtils::update_null_map(first_outside_null_map->get_data(), + column_array_nullmap.get_data()); + } + const ColumnArray& first_col_array = assert_cast(*first_arg_column); + const auto& first_off_data = + assert_cast(first_col_array.get_offsets_column()) + .get_data(); + const auto& first_nested_nullable_column = + assert_cast(*first_col_array.get_data_ptr()); + + // result is nullable bool column for every array column + auto result_data_column = ColumnUInt8::create(input_rows, 1); + auto result_null_column = ColumnUInt8::create(input_rows, 0); + + auto second_arg_column = second_column; + auto second_outside_null_map = ColumnUInt8::create(input_rows, 0); + if (second_arg_column->is_nullable()) { + second_arg_column = assert_cast(second_column.get()) + ->get_nested_column_ptr(); + const auto& column_array_nullmap = + assert_cast(second_column.get())->get_null_map_column(); + VectorizedUtils::update_null_map(second_outside_null_map->get_data(), + column_array_nullmap.get_data()); + } + const ColumnArray& second_col_array = assert_cast(*second_arg_column); + const auto& second_off_data = assert_cast( + second_col_array.get_offsets_column()) + .get_data(); + const auto& second_nested_null_map_data = + assert_cast(*second_col_array.get_data_ptr()) + .get_null_map_column() + .get_data(); + const auto& second_nested_column = + assert_cast(*second_col_array.get_data_ptr()) + .get_nested_column(); + const auto& second_nested_data = + assert_cast(second_nested_column).get_data(); + + //3. calculate result column with second bool column + for (int row = 0; row < input_rows; ++row) { + //first or second column is null, so current row is invalid data + if (first_outside_null_map->get_data()[row] || + second_outside_null_map->get_data()[row]) { + result_null_column->get_data()[row] = 1; + result_data_column->get_data()[row] = 0; + } else { + // has_null in current array + bool has_null_elem = false; + // res for current array + bool res_for_array = MATCH_ALL; + auto first_offset_start = first_off_data[row - 1]; + auto first_offset_end = first_off_data[row]; + auto second_offset_start = second_off_data[row - 1]; + auto second_offset_end = second_off_data[row]; + auto move_off = second_offset_start; + for (auto off = first_offset_start; + off < first_offset_end && move_off < second_offset_end; // not out range + ++off) { + if (first_nested_nullable_column.is_null_at(off)) { + has_null_elem = true; + } else { + if (!second_nested_null_map_data[move_off] && // not null + second_nested_data[move_off] != MATCH_ALL) { // not match + res_for_array = !MATCH_ALL; + break; + } // default is MATCH_ALL + } + move_off++; + } + result_null_column->get_data()[row] = has_null_elem && res_for_array == MATCH_ALL; + result_data_column->get_data()[row] = res_for_array; + } + } + + //4. insert the result column to block + ColumnWithTypeAndName result_arr; + if (result_type->is_nullable()) { + result_arr = {ColumnNullable::create(std::move(result_data_column), + std::move(result_null_column)), + result_type, get_name() + "_result"}; + + } else { + DCHECK(!first_column->is_nullable()); + DCHECK(!second_column->is_nullable()); + result_arr = {std::move(result_data_column), result_type, get_name() + "_result"}; + } + block->insert(std::move(result_arr)); + *result_column_id = block->columns() - 1; + return Status::OK(); + } +}; + +void register_function_array_match(doris::vectorized::LambdaFunctionFactory& factory) { + factory.register_function>(); // MATCH_ALL = true means array_match_all + factory.register_function< + ArrayMatchFunction>(); // MATCH_ALL = false means array_match_any +} +} // namespace doris::vectorized diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java index 383a8bbc4fee3c..361c8104a339f8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java @@ -49,6 +49,8 @@ import org.apache.doris.nereids.trees.expressions.functions.scalar.ArrayLast; import org.apache.doris.nereids.trees.expressions.functions.scalar.ArrayLastIndex; import org.apache.doris.nereids.trees.expressions.functions.scalar.ArrayMap; +import org.apache.doris.nereids.trees.expressions.functions.scalar.ArrayMatchAll; +import org.apache.doris.nereids.trees.expressions.functions.scalar.ArrayMatchAny; import org.apache.doris.nereids.trees.expressions.functions.scalar.ArrayMax; import org.apache.doris.nereids.trees.expressions.functions.scalar.ArrayMin; import org.apache.doris.nereids.trees.expressions.functions.scalar.ArrayPopBack; @@ -508,6 +510,8 @@ public class BuiltinScalarFunctions implements FunctionHelper { scalar(ArrayMap.class, "array_map"), scalar(ArrayMax.class, "array_max"), scalar(ArrayMin.class, "array_min"), + scalar(ArrayMatchAll.class, "array_match_all"), + scalar(ArrayMatchAny.class, "array_match_any"), scalar(ArrayPopBack.class, "array_popback"), scalar(ArrayPopFront.class, "array_popfront"), scalar(ArrayPosition.class, "array_position"), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMatchAll.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMatchAll.java new file mode 100644 index 00000000000000..247b2bf77c6511 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMatchAll.java @@ -0,0 +1,74 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.doris.nereids.trees.expressions.functions.scalar; + +import org.apache.doris.catalog.FunctionSignature; +import org.apache.doris.nereids.exceptions.AnalysisException; +import org.apache.doris.nereids.trees.expressions.Expression; +import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable; +import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; +import org.apache.doris.nereids.types.ArrayType; +import org.apache.doris.nereids.types.BooleanType; +import org.apache.doris.nereids.types.coercion.AnyDataType; + +import com.google.common.collect.ImmutableList; + +import java.util.List; + +/** + * ScalarFunction 'array_match_all'. + */ +public class ArrayMatchAll extends ScalarFunction + implements HighOrderFunction, PropagateNullable { + + public static final List SIGNATURES = ImmutableList.of( + FunctionSignature.ret(BooleanType.INSTANCE).args(ArrayType.of(AnyDataType.INSTANCE_WITHOUT_INDEX), + ArrayType.of(BooleanType.INSTANCE)) + ); + + private ArrayMatchAll(List expressions) { + super("array_match_all", expressions); + } + + /** + * constructor with arguments. + * array_match_all(lambda, a1, ...) = array_match(a1, array_map(lambda, a1, ...)) + */ + public ArrayMatchAll(Expression arg) { + super("array_match_all", arg instanceof Lambda ? arg.child(1).child(0) : arg, new ArrayMap(arg)); + if (!(arg instanceof Lambda)) { + throw new AnalysisException( + String.format("The 1st arg of %s must be lambda but is %s", getName(), arg)); + } + } + + @Override + public ArrayMatchAll withChildren(List children) { + return new ArrayMatchAll(children); + } + + @Override + public R accept(ExpressionVisitor visitor, C context) { + return visitor.visitArrayMatchAll(this, context); + } + + @Override + public List getImplSignature() { + return SIGNATURES; + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMatchAny.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMatchAny.java new file mode 100644 index 00000000000000..25efdafdad331a --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMatchAny.java @@ -0,0 +1,74 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.doris.nereids.trees.expressions.functions.scalar; + +import org.apache.doris.catalog.FunctionSignature; +import org.apache.doris.nereids.exceptions.AnalysisException; +import org.apache.doris.nereids.trees.expressions.Expression; +import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable; +import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; +import org.apache.doris.nereids.types.ArrayType; +import org.apache.doris.nereids.types.BooleanType; +import org.apache.doris.nereids.types.coercion.AnyDataType; + +import com.google.common.collect.ImmutableList; + +import java.util.List; + +/** + * ScalarFunction 'array_match_any'. + */ +public class ArrayMatchAny extends ScalarFunction + implements HighOrderFunction, PropagateNullable { + + public static final List SIGNATURES = ImmutableList.of( + FunctionSignature.ret(BooleanType.INSTANCE).args(ArrayType.of(AnyDataType.INSTANCE_WITHOUT_INDEX), + ArrayType.of(BooleanType.INSTANCE)) + ); + + private ArrayMatchAny(List expressions) { + super("array_match_any", expressions); + } + + /** + * constructor with arguments. + * array_match_any(lambda, a1, ...) = array_match_any(a1, array_map(lambda, a1, ...)) + */ + public ArrayMatchAny(Expression arg) { + super("array_match_any", arg instanceof Lambda ? arg.child(1).child(0) : arg, new ArrayMap(arg)); + if (!(arg instanceof Lambda)) { + throw new AnalysisException( + String.format("The 1st arg of %s must be lambda but is %s", getName(), arg)); + } + } + + @Override + public ArrayMatchAny withChildren(List children) { + return new ArrayMatchAny(children); + } + + @Override + public R accept(ExpressionVisitor visitor, C context) { + return visitor.visitArrayMatchAny(this, context); + } + + @Override + public List getImplSignature() { + return SIGNATURES; + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java index 5d47094f247e8c..e1be3b80d73ecc 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java @@ -49,6 +49,8 @@ import org.apache.doris.nereids.trees.expressions.functions.scalar.ArrayJoin; import org.apache.doris.nereids.trees.expressions.functions.scalar.ArrayLastIndex; import org.apache.doris.nereids.trees.expressions.functions.scalar.ArrayMap; +import org.apache.doris.nereids.trees.expressions.functions.scalar.ArrayMatchAll; +import org.apache.doris.nereids.trees.expressions.functions.scalar.ArrayMatchAny; import org.apache.doris.nereids.trees.expressions.functions.scalar.ArrayMax; import org.apache.doris.nereids.trees.expressions.functions.scalar.ArrayMin; import org.apache.doris.nereids.trees.expressions.functions.scalar.ArrayPopBack; @@ -560,6 +562,14 @@ default R visitArrayFilter(ArrayFilter arrayFilter, C context) { return visitScalarFunction(arrayFilter, context); } + default R visitArrayMatchAny(ArrayMatchAny arrayMatchAny, C context) { + return visitScalarFunction(arrayMatchAny, context); + } + + default R visitArrayMatchAll(ArrayMatchAll arrayMatchAll, C context) { + return visitScalarFunction(arrayMatchAll, context); + } + default R visitArrayFirstIndex(ArrayFirstIndex arrayFirstIndex, C context) { return visitScalarFunction(arrayFirstIndex, context); } 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 17e8db9a68d22e..c5161f2db60b9d 100644 --- a/regression-test/data/nereids_function_p0/scalar_function/Array.out +++ b/regression-test/data/nereids_function_p0/scalar_function/Array.out @@ -14454,3 +14454,1323 @@ true -- !sql_array_map -- [1, 1, 1, 1] +-- !sql_array_match_any_1 -- +["a", "b", "c"] true +["a", null, "c"] true +[] false +\N \N +[null, null] \N +\N \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["a", "b", "c"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +[] false +[null, null] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["a", null, "c"] true +\N \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["a", "b", "c"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +\N \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +[] false +[null, null] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["a", "b", "c"] true +[] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["a", null, "c"] true +["a", null, "c"] true +\N \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +[null, null] \N +\N \N +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +\N \N +[] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +[] false +\N \N +[null, null] \N +["a", null, "c"] true +\N \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +[null, null] \N +\N \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["a", "b", "c"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true + +-- !sql_array_match_all_1 -- +["a", "b", "c"] true +["a", null, "c"] \N +[] true +\N \N +[null, null] \N +\N \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["a", "b", "c"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +[] true +[null, null] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["a", null, "c"] \N +\N \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["a", "b", "c"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +\N \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +[] true +[null, null] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["a", "b", "c"] true +[] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["a", null, "c"] \N +["a", null, "c"] \N +\N \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +[null, null] \N +\N \N +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +\N \N +[] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +[] true +\N \N +[null, null] \N +["a", null, "c"] \N +\N \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +[null, null] \N +\N \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["a", "b", "c"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true + +-- !sql_array_match_any_2 -- +["a", "b", "c"] false +["a", null, "c"] \N +[] false +\N \N +[null, null] \N +\N \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["a", "b", "c"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +[] false +[null, null] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["a", null, "c"] \N +\N \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["a", "b", "c"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +\N \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +[] false +[null, null] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["a", "b", "c"] false +[] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["a", null, "c"] \N +["a", null, "c"] \N +\N \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +[null, null] \N +\N \N +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +\N \N +[] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +[] false +\N \N +[null, null] \N +["a", null, "c"] \N +\N \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +[null, null] \N +\N \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["a", "b", "c"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false + +-- !sql_array_match_all_2 -- +["a", "b", "c"] true +["a", null, "c"] \N +[] true +\N \N +[null, null] \N +\N \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["a", "b", "c"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +[] true +[null, null] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["a", null, "c"] \N +\N \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["a", "b", "c"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +\N \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +[] true +[null, null] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["a", "b", "c"] true +[] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["a", null, "c"] \N +["a", null, "c"] \N +\N \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +[null, null] \N +\N \N +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +\N \N +[] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +[] true +\N \N +[null, null] \N +["a", null, "c"] \N +\N \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +[null, null] \N +\N \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["a", "b", "c"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true + +-- !sql_array_match_any_3 -- +[] false +[1, 2, 3] false +[] false +[1, null, 3] \N +\N \N +\N \N +[1] false +[7] false +[11] false +[2] false +[8] false +[12] false +[3] false +[5] false +[9] false +[4] false +[6] false +[10] false +\N \N +[2] false +[12] false +[10] false +[] false +[1] false +[8] false +[3] false +[] false +\N \N +[11] false +[9] false +[6] false +[1, 2, 3] false +[1, null, 3] \N +[7] false +[5] false +[4] false +\N \N +[2] false +[12] false +[10] false +[2] false +[1] false +[9] false +[5] false +[] false +[1] false +[8] false +[3] false +\N \N +[12] false +[8] false +[6] false +[7] false +[4] false +[] false +\N \N +[11] false +[9] false +[6] false +[] false +[] false +[11] false +[1, 2, 3] false +[1, 2, 3] false +[1, null, 3] \N +[7] false +[5] false +[4] false +[10] false +[3] false +\N \N +[1, null, 3] \N +\N \N +[2] false +[12] false +[10] false +[2] false +[1] false +[9] false +[5] false +\N \N +[2] false +[8] false +\N \N +[] false +[6] false +[] false +[1, null, 3] \N +\N \N +[1, 2, 3] false +[1, null, 3] \N +[7] false +[5] false +[4] false +[10] false +[3] false +\N \N +[1, null, 3] \N +[12] false +[9] false +[] false +[8] false + +-- !sql_array_match_all_3 -- +[] true +[1, 2, 3] true +[] true +[1, null, 3] \N +\N \N +\N \N +[1] true +[7] true +[11] true +[2] true +[8] true +[12] true +[3] true +[5] true +[9] true +[4] true +[6] true +[10] true +\N \N +[2] true +[12] true +[10] true +[] true +[1] true +[8] true +[3] true +[] true +\N \N +[11] true +[9] true +[6] true +[1, 2, 3] true +[1, null, 3] \N +[7] true +[5] true +[4] true +\N \N +[2] true +[12] true +[10] true +[2] true +[1] true +[9] true +[5] true +[] true +[1] true +[8] true +[3] true +\N \N +[12] true +[8] true +[6] true +[7] true +[4] true +[] true +\N \N +[11] true +[9] true +[6] true +[] true +[] true +[11] true +[1, 2, 3] true +[1, 2, 3] true +[1, null, 3] \N +[7] true +[5] true +[4] true +[10] true +[3] true +\N \N +[1, null, 3] \N +\N \N +[2] true +[12] true +[10] true +[2] true +[1] true +[9] true +[5] true +\N \N +[2] true +[8] true +\N \N +[] true +[6] true +[] true +[1, null, 3] \N +\N \N +[1, 2, 3] true +[1, null, 3] \N +[7] true +[5] true +[4] true +[10] true +[3] true +\N \N +[1, null, 3] \N +[12] true +[9] true +[] true +[8] true + +-- !sql_array_match_any_4 -- +["a", "b", "c"] true +["a", null, "c"] true +[] false +\N \N +[null, null] \N +\N \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["a", "b", "c"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +[] false +[null, null] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["a", null, "c"] true +\N \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["a", "b", "c"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +\N \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +[] false +[null, null] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["a", "b", "c"] true +[] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["a", null, "c"] true +["a", null, "c"] true +\N \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +[null, null] \N +\N \N +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +\N \N +[] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +[] false +\N \N +[null, null] \N +["a", null, "c"] true +\N \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +[null, null] \N +\N \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["a", "b", "c"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false + +-- !sql_array_match_all_4 -- +["a", "b", "c"] false +["a", null, "c"] false +[] true +\N \N +[null, null] \N +\N \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["a", "b", "c"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +[] true +[null, null] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["a", null, "c"] false +\N \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["a", "b", "c"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +\N \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +[] true +[null, null] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["a", "b", "c"] false +[] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["a", null, "c"] false +["a", null, "c"] false +\N \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +[null, null] \N +\N \N +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +\N \N +[] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +[] true +\N \N +[null, null] \N +["a", null, "c"] false +\N \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +[null, null] \N +\N \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["a", "b", "c"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false + +-- !sql_array_match_any_5 -- +[] false +[1, 2, 3] true +[] false +[1, null, 3] \N +\N \N +\N \N +[1] false +[7] false +[11] false +[2] true +[8] false +[12] false +[3] false +[5] false +[9] false +[4] false +[6] false +[10] false +\N \N +[2] true +[12] false +[10] false +[] false +[1] false +[8] false +[3] false +[] false +\N \N +[11] false +[9] false +[6] false +[1, 2, 3] true +[1, null, 3] \N +[7] false +[5] false +[4] false +\N \N +[2] true +[12] false +[10] false +[2] true +[1] false +[9] false +[5] false +[] false +[1] false +[8] false +[3] false +\N \N +[12] false +[8] false +[6] false +[7] false +[4] false +[] false +\N \N +[11] false +[9] false +[6] false +[] false +[] false +[11] false +[1, 2, 3] true +[1, 2, 3] true +[1, null, 3] \N +[7] false +[5] false +[4] false +[10] false +[3] false +\N \N +[1, null, 3] \N +\N \N +[2] true +[12] false +[10] false +[2] true +[1] false +[9] false +[5] false +\N \N +[2] true +[8] false +\N \N +[] false +[6] false +[] false +[1, null, 3] \N +\N \N +[1, 2, 3] true +[1, null, 3] \N +[7] false +[5] false +[4] false +[10] false +[3] false +\N \N +[1, null, 3] \N +[12] false +[9] false +[] false +[8] false + +-- !sql_array_match_all_5 -- +[] true +[1, 2, 3] false +[] true +[1, null, 3] false +\N \N +\N \N +[1] false +[7] false +[11] false +[2] true +[8] false +[12] false +[3] false +[5] false +[9] false +[4] false +[6] false +[10] false +\N \N +[2] true +[12] false +[10] false +[] true +[1] false +[8] false +[3] false +[] true +\N \N +[11] false +[9] false +[6] false +[1, 2, 3] false +[1, null, 3] false +[7] false +[5] false +[4] false +\N \N +[2] true +[12] false +[10] false +[2] true +[1] false +[9] false +[5] false +[] true +[1] false +[8] false +[3] false +\N \N +[12] false +[8] false +[6] false +[7] false +[4] false +[] true +\N \N +[11] false +[9] false +[6] false +[] true +[] true +[11] false +[1, 2, 3] false +[1, 2, 3] false +[1, null, 3] false +[7] false +[5] false +[4] false +[10] false +[3] false +\N \N +[1, null, 3] false +\N \N +[2] true +[12] false +[10] false +[2] true +[1] false +[9] false +[5] false +\N \N +[2] true +[8] false +\N \N +[] true +[6] false +[] true +[1, null, 3] false +\N \N +[1, 2, 3] false +[1, null, 3] false +[7] false +[5] false +[4] false +[10] false +[3] false +\N \N +[1, null, 3] false +[12] false +[9] false +[] true +[8] false + +-- !sql_array_match_any_6 -- +[] false +[1, 2, 3] true +[] false +[1, null, 3] true +\N \N +\N \N +[1] true +[7] true +[11] true +[2] false +[8] true +[12] true +[3] true +[5] true +[9] true +[4] true +[6] true +[10] true +\N \N +[2] false +[12] true +[10] true +[] false +[1] true +[8] true +[3] true +[] false +\N \N +[11] true +[9] true +[6] true +[1, 2, 3] true +[1, null, 3] true +[7] true +[5] true +[4] true +\N \N +[2] false +[12] true +[10] true +[2] false +[1] true +[9] true +[5] true +[] false +[1] true +[8] true +[3] true +\N \N +[12] true +[8] true +[6] true +[7] true +[4] true +[] false +\N \N +[11] true +[9] true +[6] true +[] false +[] false +[11] true +[1, 2, 3] true +[1, 2, 3] true +[1, null, 3] true +[7] true +[5] true +[4] true +[10] true +[3] true +\N \N +[1, null, 3] true +\N \N +[2] false +[12] true +[10] true +[2] false +[1] true +[9] true +[5] true +\N \N +[2] false +[8] true +\N \N +[] false +[6] true +[] false +[1, null, 3] true +\N \N +[1, 2, 3] true +[1, null, 3] true +[7] true +[5] true +[4] true +[10] true +[3] true +\N \N +[1, null, 3] true +[12] true +[9] true +[] false +[8] true + +-- !sql_array_match_all_6 -- +[] false +[1, 2, 3] true +[] false +[1, null, 3] true +\N \N +\N \N +[1] true +[7] true +[11] true +[2] false +[8] true +[12] true +[3] true +[5] true +[9] true +[4] true +[6] true +[10] true +\N \N +[2] false +[12] true +[10] true +[] false +[1] true +[8] true +[3] true +[] false +\N \N +[11] true +[9] true +[6] true +[1, 2, 3] true +[1, null, 3] true +[7] true +[5] true +[4] true +\N \N +[2] false +[12] true +[10] true +[2] false +[1] true +[9] true +[5] true +[] false +[1] true +[8] true +[3] true +\N \N +[12] true +[8] true +[6] true +[7] true +[4] true +[] false +\N \N +[11] true +[9] true +[6] true +[] false +[] false +[11] true +[1, 2, 3] true +[1, 2, 3] true +[1, null, 3] true +[7] true +[5] true +[4] true +[10] true +[3] true +\N \N +[1, null, 3] true +\N \N +[2] false +[12] true +[10] true +[2] false +[1] true +[9] true +[5] true +\N \N +[2] false +[8] true +\N \N +[] false +[6] true +[] false +[1, null, 3] true +\N \N +[1, 2, 3] true +[1, null, 3] true +[7] true +[5] true +[4] true +[10] true +[3] true +\N \N +[1, null, 3] true +[12] true +[9] true +[] false +[8] true + +-- !sql_array_match_any_7 -- +false + +-- !sql_array_match_all_7 -- +true + +-- !sql_array_match_any_8 -- +false + +-- !sql_array_match_all_8 -- +true + +-- !sql_array_match_any_9 -- +false + +-- !sql_array_match_all_9 -- +true + +-- !sql_array_match_any_10 -- +false + +-- !sql_array_match_all_10 -- +true + +-- !sql_array_match_any_11 -- +true + +-- !sql_array_match_all_11 -- +false + +-- !sql_array_match_any_12 -- +true + +-- !sql_array_match_all_12 -- +false + +-- !sql_array_match_any_13 -- +false + +-- !sql_array_match_all_13 -- +false + +-- !sql_array_match_any_14 -- +false + +-- !sql_array_match_all_14 -- +true + +-- !sql_array_match_any_15 -- +false + +-- !sql_array_match_all_15 -- +true + +-- !sql_array_match_any_16 -- +true + +-- !sql_array_match_all_16 -- +false + +-- !sql_array_match_any_17 -- +false + +-- !sql_array_match_all_17 -- +false + +-- !sql_array_match_any_18 -- +false + +-- !sql_array_match_all_18 -- +true + diff --git a/regression-test/suites/nereids_function_p0/load.groovy b/regression-test/suites/nereids_function_p0/load.groovy index 104c2d30788f51..8a54b3bc250983 100644 --- a/regression-test/suites/nereids_function_p0/load.groovy +++ b/regression-test/suites/nereids_function_p0/load.groovy @@ -264,4 +264,27 @@ suite("load") { sql """ insert into fn_test_bitmap_not_nullable select * from fn_test_bitmap where id is not null """ + + // array_match_any && array_match_all + sql """ drop table if exists fn_test_am """ + sql """ CREATE TABLE IF NOT EXISTS fn_test_am (id int, kastr array, kaint array) engine=olap + DISTRIBUTED BY HASH(`id`) BUCKETS 4 + properties("replication_num" = "1") """ + streamLoad { + table "fn_test_am" + db "regression_test_nereids_function_p0" + file "fn_test_am.csv" + time 60000 + + check { result, exception, startTime, endTime -> + if (exception != null) { + throw exception + } + log.info("Stream load result: ${result}".toString()) + def json = parseJson(result) + assertEquals(102, json.NumberTotalRows) + assertEquals(102, json.NumberLoadedRows) + } + } + } diff --git a/regression-test/suites/nereids_function_p0/scalar_function/Array.groovy b/regression-test/suites/nereids_function_p0/scalar_function/Array.groovy index 61fe0e6e766767..9b2fb931d74c5a 100644 --- a/regression-test/suites/nereids_function_p0/scalar_function/Array.groovy +++ b/regression-test/suites/nereids_function_p0/scalar_function/Array.groovy @@ -1350,4 +1350,46 @@ suite("nereids_scalar_fn_Array") { exception("errCode = 2") } + + // array_match_any && array_match_all + // for table + qt_sql_array_match_any_1 "select kastr, array_match_any(x->x!='', kastr) from fn_test_am order by id" + qt_sql_array_match_all_1 "select kastr, array_match_all(x->x!='', kastr) from fn_test_am order by id" + qt_sql_array_match_any_2 "select kastr, array_match_any(x->x!=null, kastr) from fn_test_am order by id" + qt_sql_array_match_all_2 "select kastr, array_match_all(x->x!=null, kastr) from fn_test_am order by id" + qt_sql_array_match_any_3 "select kaint, array_match_any(x->x!=null, kaint) from fn_test_am order by id" + qt_sql_array_match_all_3 "select kaint, array_match_all(x->x!=null, kaint) from fn_test_am order by id" + qt_sql_array_match_any_4 "select kastr, array_match_any(x->x='a', kastr) from fn_test_am order by id" + qt_sql_array_match_all_4 "select kastr, array_match_all(x->x='a', kastr) from fn_test_am order by id" + qt_sql_array_match_any_5 "select kaint, array_match_any(x->x=2, kaint) from fn_test_am order by id" + qt_sql_array_match_all_5 "select kaint, array_match_all(x->x=2, kaint) from fn_test_am order by id" + qt_sql_array_match_any_6 "select kaint, array_match_any(x->x!=2, kaint) from fn_test_am order by id" + qt_sql_array_match_all_6 "select kaint, array_match_any(x->x!=2, kaint) from fn_test_am order by id" + + // for literal + qt_sql_array_match_any_7 "select array_match_any(x->x!=null, array('a', 'b', 'c'))" + qt_sql_array_match_all_7 "select array_match_all(x->x!=null, array('a', 'b', 'c'))" + qt_sql_array_match_any_8 "select array_match_any(x->x!=null, array('a', null, 'c'))" + qt_sql_array_match_all_8 "select array_match_all(x->x!=null, array('a', null, 'c'))" + qt_sql_array_match_any_9 "select array_match_any(x->x!=null, array())" + qt_sql_array_match_all_9 "select array_match_all(x->x!=null, array())" + qt_sql_array_match_any_10 "select array_match_any(x->x!=null, array(null, null))" + qt_sql_array_match_all_10 "select array_match_all(x->x!=null, array(null, null))" + qt_sql_array_match_any_11 "select array_match_any(x->x='a', array('a', 'b', 'c'))" + qt_sql_array_match_all_11 "select array_match_all(x->x='a', array('a', 'b', 'c'))" + qt_sql_array_match_any_12 "select array_match_any(x->x=2, array(1, 2, 3))" + qt_sql_array_match_all_12 "select array_match_all(x->x=2, array(1, 2, 3))" + qt_sql_array_match_any_13 "select array_match_any(x->x=2, array(1, null, 3))" + qt_sql_array_match_all_13 "select array_match_all(x->x=2, array(1, null, 3))" + qt_sql_array_match_any_14 "select array_match_any(x->x=2, array())" + qt_sql_array_match_all_14 "select array_match_all(x->x=2, array())" + qt_sql_array_match_any_15 "select array_match_any(x->x=2, array(null, null))" + qt_sql_array_match_all_15 "select array_match_all(x->x=2, array(null, null))" + qt_sql_array_match_any_16 "select array_match_any(x->x=2, array(1, 2, 3))" + qt_sql_array_match_all_16 "select array_match_all(x->x=2, array(1, 2, 3))" + qt_sql_array_match_any_17 "select array_match_any(x->x=2, array(1, null, 3))" + qt_sql_array_match_all_17 "select array_match_all(x->x=2, array(1, null, 3))" + qt_sql_array_match_any_18 "select array_match_any(x->x=2, array())" + qt_sql_array_match_all_18 "select array_match_all(x->x=2, array())" + } From eb746b9507aa0881f4eb1b56e468de19ace59907 Mon Sep 17 00:00:00 2001 From: amorynan Date: Tue, 10 Sep 2024 16:46:09 +0800 Subject: [PATCH 2/5] fix signature --- .../trees/expressions/functions/scalar/ArrayMatchAll.java | 4 +--- .../trees/expressions/functions/scalar/ArrayMatchAny.java | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMatchAll.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMatchAll.java index 247b2bf77c6511..523b2208486465 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMatchAll.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMatchAll.java @@ -24,7 +24,6 @@ import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; import org.apache.doris.nereids.types.ArrayType; import org.apache.doris.nereids.types.BooleanType; -import org.apache.doris.nereids.types.coercion.AnyDataType; import com.google.common.collect.ImmutableList; @@ -37,8 +36,7 @@ public class ArrayMatchAll extends ScalarFunction implements HighOrderFunction, PropagateNullable { public static final List SIGNATURES = ImmutableList.of( - FunctionSignature.ret(BooleanType.INSTANCE).args(ArrayType.of(AnyDataType.INSTANCE_WITHOUT_INDEX), - ArrayType.of(BooleanType.INSTANCE)) + FunctionSignature.ret(BooleanType.INSTANCE).args(ArrayType.of(BooleanType.INSTANCE)) ); private ArrayMatchAll(List expressions) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMatchAny.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMatchAny.java index 25efdafdad331a..3d593687007abf 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMatchAny.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMatchAny.java @@ -24,7 +24,6 @@ import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; import org.apache.doris.nereids.types.ArrayType; import org.apache.doris.nereids.types.BooleanType; -import org.apache.doris.nereids.types.coercion.AnyDataType; import com.google.common.collect.ImmutableList; @@ -37,8 +36,7 @@ public class ArrayMatchAny extends ScalarFunction implements HighOrderFunction, PropagateNullable { public static final List SIGNATURES = ImmutableList.of( - FunctionSignature.ret(BooleanType.INSTANCE).args(ArrayType.of(AnyDataType.INSTANCE_WITHOUT_INDEX), - ArrayType.of(BooleanType.INSTANCE)) + FunctionSignature.ret(BooleanType.INSTANCE).args(ArrayType.of(BooleanType.INSTANCE)) ); private ArrayMatchAny(List expressions) { From b08ec5ec4d93b6728c0c913291fc7fffec43a87a Mon Sep 17 00:00:00 2001 From: amorynan Date: Wed, 11 Sep 2024 09:38:24 +0800 Subject: [PATCH 3/5] update data file --- .../data/nereids_function_p0/fn_test_am.csv | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 regression-test/data/nereids_function_p0/fn_test_am.csv diff --git a/regression-test/data/nereids_function_p0/fn_test_am.csv b/regression-test/data/nereids_function_p0/fn_test_am.csv new file mode 100644 index 00000000000000..de0524a3ef65bb --- /dev/null +++ b/regression-test/data/nereids_function_p0/fn_test_am.csv @@ -0,0 +1,102 @@ +1 ["a", "b", "c"] [] +2 ["a", null, "c"] [1, 2, 3] +3 [] [] +4 \N [1, null, 3] +5 [null, null] \N +6 \N \N +7 ["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] [1] +8 ["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] [7] +9 ["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] [11] +10 ["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] [2] +11 ["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] [8] +12 ["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] [12] +13 ["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] [3] +14 ["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] [5] +15 ["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] [9] +16 ["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] [4] +17 ["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] [6] +18 ["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] [10] +19 \N \N +20 ["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] [2] +21 ["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] [12] +22 ["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] [10] +23 ["a", "b", "c"] [] +24 ["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] [1] +25 ["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] [8] +26 ["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] [3] +27 [] [] +28 [null, null] \N +29 ["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] [11] +30 ["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] [9] +31 ["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] [6] +32 ["a", null, "c"] [1, 2, 3] +33 \N [1, null, 3] +34 ["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] [7] +35 ["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] [5] +36 ["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] [4] +37 \N \N +38 ["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] [2] +39 ["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] [12] +40 ["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] [10] +41 ["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] [2] +42 ["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] [1] +43 ["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] [9] +44 ["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] [5] +45 ["a", "b", "c"] [] +46 ["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] [1] +47 ["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] [8] +48 ["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] [3] +49 \N \N +50 ["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] [12] +51 ["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] [8] +52 ["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] [6] +53 ["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] [7] +54 ["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] [4] +55 [] [] +56 [null, null] \N +57 ["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] [11] +58 ["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] [9] +59 ["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] [6] +60 ["a", "b", "c"] [] +61 [] [] +62 ["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] [11] +63 ["a", null, "c"] [1, 2, 3] +64 ["a", null, "c"] [1, 2, 3] +65 \N [1, null, 3] +66 ["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] [7] +67 ["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] [5] +68 ["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] [4] +69 ["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] [10] +70 ["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] [3] +71 [null, null] \N +72 \N [1, null, 3] +73 \N \N +74 ["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] [2] +75 ["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] [12] +76 ["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] [10] +77 ["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] [2] +78 ["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] [1] +79 ["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] [9] +80 ["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] [5] +81 \N \N +82 ["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] [2] +83 ["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] [8] +84 \N \N +85 [] [] +86 ["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] [6] +87 [] [] +88 \N [1, null, 3] +89 [null, null] \N +90 ["a", null, "c"] [1, 2, 3] +91 \N [1, null, 3] +92 ["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] [7] +93 ["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] [5] +94 ["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] [4] +95 ["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] [10] +96 ["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] [3] +97 [null, null] \N +98 \N [1, null, 3] +99 ["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] [12] +100 ["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] [9] +101 ["a", "b", "c"] [] +102 ["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] [8] From 494c49537930284690b1eb800b495ee84097bda6 Mon Sep 17 00:00:00 2001 From: amorynan Date: Wed, 11 Sep 2024 20:32:37 +0800 Subject: [PATCH 4/5] fix nereid --- .../lambda_function/lambda_function_factory.h | 2 - .../lambda_function/varray_match_function.cpp | 188 ------ .../array/function_array_register.cpp | 2 + .../functions/array/varray_match_function.cpp | 145 +++++ .../analysis/LambdaFunctionCallExpr.java | 4 +- .../doris/catalog/BuiltinScalarFunctions.java | 2 +- .../glue/translator/ExpressionTranslator.java | 7 +- .../functions/scalar/ArrayMatchAll.java | 20 +- .../functions/scalar/ArrayMatchAny.java | 20 +- .../scalar_function/Array.out | 612 +++++++++--------- 10 files changed, 473 insertions(+), 529 deletions(-) delete mode 100644 be/src/vec/exprs/lambda_function/varray_match_function.cpp create mode 100644 be/src/vec/functions/array/varray_match_function.cpp diff --git a/be/src/vec/exprs/lambda_function/lambda_function_factory.h b/be/src/vec/exprs/lambda_function/lambda_function_factory.h index d272f23cfe5f29..ce607748732fc0 100644 --- a/be/src/vec/exprs/lambda_function/lambda_function_factory.h +++ b/be/src/vec/exprs/lambda_function/lambda_function_factory.h @@ -28,7 +28,6 @@ class LambdaFunctionFactory; void register_function_array_map(LambdaFunctionFactory& factory); void register_function_array_filter(LambdaFunctionFactory& factory); -void register_function_array_match(LambdaFunctionFactory& factory); class LambdaFunctionFactory { using Creator = std::function; @@ -63,7 +62,6 @@ class LambdaFunctionFactory { std::call_once(oc, []() { register_function_array_map(instance); register_function_array_filter(instance); - register_function_array_match(instance); }); return instance; } diff --git a/be/src/vec/exprs/lambda_function/varray_match_function.cpp b/be/src/vec/exprs/lambda_function/varray_match_function.cpp deleted file mode 100644 index 8ecff0faa1ed5d..00000000000000 --- a/be/src/vec/exprs/lambda_function/varray_match_function.cpp +++ /dev/null @@ -1,188 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -#include - -#include -#include -#include -#include - -#include "common/status.h" -#include "vec/aggregate_functions/aggregate_function.h" -#include "vec/columns/column.h" -#include "vec/columns/column_array.h" -#include "vec/columns/column_nullable.h" -#include "vec/columns/column_vector.h" -#include "vec/columns/columns_number.h" -#include "vec/common/assert_cast.h" -#include "vec/core/block.h" -#include "vec/core/column_numbers.h" -#include "vec/core/column_with_type_and_name.h" -#include "vec/data_types/data_type.h" -#include "vec/exprs/lambda_function/lambda_function.h" -#include "vec/exprs/lambda_function/lambda_function_factory.h" -#include "vec/exprs/vexpr.h" -#include "vec/utils/util.hpp" - -namespace doris { -namespace vectorized { -class VExprContext; -} // namespace vectorized -} // namespace doris - -namespace doris::vectorized { - -///* bool array_match_all/any(array, array) */// -template -class ArrayMatchFunction : public LambdaFunction { - ENABLE_FACTORY_CREATOR(ArrayMatchFunction); - -public: - ~ArrayMatchFunction() override = default; - - static constexpr auto name = MATCH_ALL ? "array_match_all" : "array_match_any"; - - static LambdaFunctionPtr create() { return std::make_shared(); } - - std::string get_name() const override { return name; } - - doris::Status execute(VExprContext* context, doris::vectorized::Block* block, - int* result_column_id, const DataTypePtr& result_type, - const VExprSPtrs& children) override { - DCHECK(children.size() == 2); - //1. child[0:end]->execute(src_block) - doris::vectorized::ColumnNumbers arguments(children.size()); - for (int i = 0; i < children.size(); ++i) { - int column_id = -1; - RETURN_IF_ERROR(children[i]->execute(context, block, &column_id)); - arguments[i] = column_id; - } - - //2. get second array column - auto first_column = - block->get_by_position(arguments[0]).column->convert_to_full_column_if_const(); - - auto second_column = - block->get_by_position(arguments[1]).column->convert_to_full_column_if_const(); - - int input_rows = first_column->size(); - auto first_outside_null_map = ColumnUInt8::create(input_rows, 0); - auto first_arg_column = first_column; - if (first_arg_column->is_nullable()) { - first_arg_column = - assert_cast(first_column.get())->get_nested_column_ptr(); - const auto& column_array_nullmap = - assert_cast(first_column.get())->get_null_map_column(); - VectorizedUtils::update_null_map(first_outside_null_map->get_data(), - column_array_nullmap.get_data()); - } - const ColumnArray& first_col_array = assert_cast(*first_arg_column); - const auto& first_off_data = - assert_cast(first_col_array.get_offsets_column()) - .get_data(); - const auto& first_nested_nullable_column = - assert_cast(*first_col_array.get_data_ptr()); - - // result is nullable bool column for every array column - auto result_data_column = ColumnUInt8::create(input_rows, 1); - auto result_null_column = ColumnUInt8::create(input_rows, 0); - - auto second_arg_column = second_column; - auto second_outside_null_map = ColumnUInt8::create(input_rows, 0); - if (second_arg_column->is_nullable()) { - second_arg_column = assert_cast(second_column.get()) - ->get_nested_column_ptr(); - const auto& column_array_nullmap = - assert_cast(second_column.get())->get_null_map_column(); - VectorizedUtils::update_null_map(second_outside_null_map->get_data(), - column_array_nullmap.get_data()); - } - const ColumnArray& second_col_array = assert_cast(*second_arg_column); - const auto& second_off_data = assert_cast( - second_col_array.get_offsets_column()) - .get_data(); - const auto& second_nested_null_map_data = - assert_cast(*second_col_array.get_data_ptr()) - .get_null_map_column() - .get_data(); - const auto& second_nested_column = - assert_cast(*second_col_array.get_data_ptr()) - .get_nested_column(); - const auto& second_nested_data = - assert_cast(second_nested_column).get_data(); - - //3. calculate result column with second bool column - for (int row = 0; row < input_rows; ++row) { - //first or second column is null, so current row is invalid data - if (first_outside_null_map->get_data()[row] || - second_outside_null_map->get_data()[row]) { - result_null_column->get_data()[row] = 1; - result_data_column->get_data()[row] = 0; - } else { - // has_null in current array - bool has_null_elem = false; - // res for current array - bool res_for_array = MATCH_ALL; - auto first_offset_start = first_off_data[row - 1]; - auto first_offset_end = first_off_data[row]; - auto second_offset_start = second_off_data[row - 1]; - auto second_offset_end = second_off_data[row]; - auto move_off = second_offset_start; - for (auto off = first_offset_start; - off < first_offset_end && move_off < second_offset_end; // not out range - ++off) { - if (first_nested_nullable_column.is_null_at(off)) { - has_null_elem = true; - } else { - if (!second_nested_null_map_data[move_off] && // not null - second_nested_data[move_off] != MATCH_ALL) { // not match - res_for_array = !MATCH_ALL; - break; - } // default is MATCH_ALL - } - move_off++; - } - result_null_column->get_data()[row] = has_null_elem && res_for_array == MATCH_ALL; - result_data_column->get_data()[row] = res_for_array; - } - } - - //4. insert the result column to block - ColumnWithTypeAndName result_arr; - if (result_type->is_nullable()) { - result_arr = {ColumnNullable::create(std::move(result_data_column), - std::move(result_null_column)), - result_type, get_name() + "_result"}; - - } else { - DCHECK(!first_column->is_nullable()); - DCHECK(!second_column->is_nullable()); - result_arr = {std::move(result_data_column), result_type, get_name() + "_result"}; - } - block->insert(std::move(result_arr)); - *result_column_id = block->columns() - 1; - return Status::OK(); - } -}; - -void register_function_array_match(doris::vectorized::LambdaFunctionFactory& factory) { - factory.register_function>(); // MATCH_ALL = true means array_match_all - factory.register_function< - ArrayMatchFunction>(); // MATCH_ALL = false means array_match_any -} -} // namespace doris::vectorized diff --git a/be/src/vec/functions/array/function_array_register.cpp b/be/src/vec/functions/array/function_array_register.cpp index ea8a2bda397414..7b4103c54dff74 100644 --- a/be/src/vec/functions/array/function_array_register.cpp +++ b/be/src/vec/functions/array/function_array_register.cpp @@ -57,6 +57,7 @@ void register_function_array_count(SimpleFunctionFactory&); void register_function_array_filter_function(SimpleFunctionFactory&); void register_function_array_splits(SimpleFunctionFactory&); void register_function_array_contains_all(SimpleFunctionFactory&); +void register_function_array_match(SimpleFunctionFactory&); void register_function_array(SimpleFunctionFactory& factory) { register_function_array_shuffle(factory); @@ -94,6 +95,7 @@ void register_function_array(SimpleFunctionFactory& factory) { register_function_array_filter_function(factory); register_function_array_splits(factory); register_function_array_contains_all(factory); + register_function_array_match(factory); } } // namespace doris::vectorized diff --git a/be/src/vec/functions/array/varray_match_function.cpp b/be/src/vec/functions/array/varray_match_function.cpp new file mode 100644 index 00000000000000..c322fea7566303 --- /dev/null +++ b/be/src/vec/functions/array/varray_match_function.cpp @@ -0,0 +1,145 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +#include + +#include +#include +#include +#include + +#include "common/status.h" +#include "vec/aggregate_functions/aggregate_function.h" +#include "vec/columns/column.h" +#include "vec/columns/column_array.h" +#include "vec/columns/column_nullable.h" +#include "vec/columns/column_vector.h" +#include "vec/columns/columns_number.h" +#include "vec/common/assert_cast.h" +#include "vec/core/block.h" +#include "vec/core/column_numbers.h" +#include "vec/core/column_with_type_and_name.h" +#include "vec/utils/util.hpp" + +namespace doris::vectorized { + +///* bool array_match_all/any(array) */// +template +class ArrayMatchFunction : public IFunction { +public: + static constexpr auto name = MATCH_ALL ? "array_match_all" : "array_match_any"; + static FunctionPtr create() { return std::make_shared(); } + + std::string get_name() const override { return name; } + + bool is_variadic() const override { return false; } + + size_t get_number_of_arguments() const override { return 1; } + + bool is_use_default_implementation_for_constants() const override { return false; } + + bool use_default_implementation_for_nulls() const override { return false; } + + DataTypePtr get_return_type_impl(const DataTypes& arguments) const override { + return make_nullable(std::make_shared()); + } + + Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments, + size_t result, size_t input_rows_count) const override { + // here is executed by array_map filtered and arg[0] is bool result column + const auto& [src_column, src_const] = + unpack_if_const(block.get_by_position(arguments[0]).column); + const ColumnArray* array_column = nullptr; + const UInt8* array_null_map = nullptr; + if (src_column->is_nullable()) { + auto nullable_array = assert_cast(src_column.get()); + array_column = assert_cast(&nullable_array->get_nested_column()); + array_null_map = nullable_array->get_null_map_column().get_data().data(); + } else { + array_column = assert_cast(src_column.get()); + } + + if (!array_column) { + return Status::RuntimeError("unsupported types for function {}({})", get_name(), + block.get_by_position(arguments[0]).type->get_name()); + } + + const auto& offsets = array_column->get_offsets(); + ColumnPtr nested_column = nullptr; + const UInt8* nested_null_map = nullptr; + if (array_column->get_data().is_nullable()) { + const auto& nested_null_column = + assert_cast(array_column->get_data()); + nested_null_map = nested_null_column.get_null_map_column().get_data().data(); + nested_column = nested_null_column.get_nested_column_ptr(); + } else { + nested_column = array_column->get_data_ptr(); + } + + if (!nested_column) { + return Status::RuntimeError("unsupported types for function {}({})", get_name(), + block.get_by_position(arguments[0]).type->get_name()); + } + + const auto& nested_data = assert_cast(*nested_column).get_data(); + + // result is nullable bool column for every array column + auto result_data_column = ColumnUInt8::create(input_rows_count, 1); + auto result_null_column = ColumnUInt8::create(input_rows_count, 0); + + // iterate over all arrays with bool elements + for (int row = 0; row < input_rows_count; ++row) { + if (array_null_map && array_null_map[row]) { + // current array is null, this is always null + result_null_column->get_data()[row] = 1; + result_data_column->get_data()[row] = 0; + } else { + // we should calculate the bool result for current array + // has_null in current array + bool has_null_elem = false; + // res for current array + bool res_for_array = MATCH_ALL; + for (auto off = offsets[row - 1]; off < offsets[row]; ++off) { + if (nested_null_map && nested_null_map[off]) { + has_null_elem = true; + } else { + if (nested_data[off] != MATCH_ALL) { // not match + res_for_array = !MATCH_ALL; + break; + } // default is MATCH_ALL + } + } + result_null_column->get_data()[row] = has_null_elem && res_for_array == MATCH_ALL; + result_data_column->get_data()[row] = res_for_array; + } + } + + // insert the result column to block + DCHECK(block.get_by_position(result).type->is_nullable()); + ColumnPtr dst_column = ColumnNullable::create(std::move(result_data_column), + std::move(result_null_column)); + block.replace_by_position(result, std::move(dst_column)); + return Status::OK(); + } +}; + +void register_function_array_match(SimpleFunctionFactory& factory) { + factory.register_function>(); // MATCH_ALL = true means array_match_all + factory.register_function< + ArrayMatchFunction>(); // MATCH_ALL = false means array_match_any +} +} // namespace doris::vectorized diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/LambdaFunctionCallExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/LambdaFunctionCallExpr.java index 5fcb62f76ee3b9..707f76f9672868 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/LambdaFunctionCallExpr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/LambdaFunctionCallExpr.java @@ -46,8 +46,8 @@ public class LambdaFunctionCallExpr extends FunctionCallExpr { public static final ImmutableSet LAMBDA_MAPPED_FUNCTION_SET = new ImmutableSortedSet.Builder( String.CASE_INSENSITIVE_ORDER).add("array_exists").add("array_sortby") .add("array_first_index").add("array_last_index").add("array_first").add("array_last").add("array_count") - .add("element_at").add("array_split").add("array_reverse_split") - .build(); + .add("element_at").add("array_split").add("array_reverse_split").add("array_match_any") + .add("array_match_all").build(); private static final Logger LOG = LogManager.getLogger(LambdaFunctionCallExpr.class); diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java index 361c8104a339f8..07989d337cad8d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java @@ -510,8 +510,8 @@ public class BuiltinScalarFunctions implements FunctionHelper { scalar(ArrayMap.class, "array_map"), scalar(ArrayMax.class, "array_max"), scalar(ArrayMin.class, "array_min"), - scalar(ArrayMatchAll.class, "array_match_all"), scalar(ArrayMatchAny.class, "array_match_any"), + scalar(ArrayMatchAll.class, "array_match_all"), scalar(ArrayPopBack.class, "array_popback"), scalar(ArrayPopFront.class, "array_popfront"), scalar(ArrayPosition.class, "array_position"), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java index e876b30280b4a2..c9e49b7535b45f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java @@ -88,7 +88,6 @@ import org.apache.doris.nereids.trees.expressions.functions.generator.TableGeneratingFunction; import org.apache.doris.nereids.trees.expressions.functions.scalar.ArrayMap; import org.apache.doris.nereids.trees.expressions.functions.scalar.ElementAt; -import org.apache.doris.nereids.trees.expressions.functions.scalar.HighOrderFunction; import org.apache.doris.nereids.trees.expressions.functions.scalar.Lambda; import org.apache.doris.nereids.trees.expressions.functions.scalar.ScalarFunction; import org.apache.doris.nereids.trees.expressions.functions.udf.JavaUdaf; @@ -507,11 +506,7 @@ public Expr visitScalarFunction(ScalarFunction function, PlanTranslatorContext c FunctionCallExpr functionCallExpr; // create catalog FunctionCallExpr without analyze again - if (function instanceof HighOrderFunction) { - functionCallExpr = new LambdaFunctionCallExpr(catalogFunction, new FunctionParams(false, arguments)); - } else { - functionCallExpr = new FunctionCallExpr(catalogFunction, new FunctionParams(false, arguments)); - } + functionCallExpr = new FunctionCallExpr(catalogFunction, new FunctionParams(false, arguments)); functionCallExpr.setNullableFromNereids(function.nullable()); return functionCallExpr; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMatchAll.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMatchAll.java index 523b2208486465..adc0452b726936 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMatchAll.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMatchAll.java @@ -20,7 +20,7 @@ import org.apache.doris.catalog.FunctionSignature; import org.apache.doris.nereids.exceptions.AnalysisException; import org.apache.doris.nereids.trees.expressions.Expression; -import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable; +import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable; import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; import org.apache.doris.nereids.types.ArrayType; import org.apache.doris.nereids.types.BooleanType; @@ -33,31 +33,27 @@ * ScalarFunction 'array_match_all'. */ public class ArrayMatchAll extends ScalarFunction - implements HighOrderFunction, PropagateNullable { + implements HighOrderFunction, AlwaysNullable { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(BooleanType.INSTANCE).args(ArrayType.of(BooleanType.INSTANCE)) ); - private ArrayMatchAll(List expressions) { - super("array_match_all", expressions); - } - /** * constructor with arguments. * array_match_all(lambda, a1, ...) = array_match(a1, array_map(lambda, a1, ...)) */ public ArrayMatchAll(Expression arg) { - super("array_match_all", arg instanceof Lambda ? arg.child(1).child(0) : arg, new ArrayMap(arg)); - if (!(arg instanceof Lambda)) { - throw new AnalysisException( - String.format("The 1st arg of %s must be lambda but is %s", getName(), arg)); - } + super("array_match_all", arg instanceof Lambda ? new ArrayMap(arg) : arg); } @Override public ArrayMatchAll withChildren(List children) { - return new ArrayMatchAll(children); + if (children.size() != 1) { + throw new AnalysisException( + String.format("The number of args of %s must be 1 but is %d", getName(), children.size())); + } + return new ArrayMatchAll(children.get(0)); } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMatchAny.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMatchAny.java index 3d593687007abf..bd42bbb3f8c6ce 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMatchAny.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMatchAny.java @@ -20,7 +20,7 @@ import org.apache.doris.catalog.FunctionSignature; import org.apache.doris.nereids.exceptions.AnalysisException; import org.apache.doris.nereids.trees.expressions.Expression; -import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable; +import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable; import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; import org.apache.doris.nereids.types.ArrayType; import org.apache.doris.nereids.types.BooleanType; @@ -33,31 +33,27 @@ * ScalarFunction 'array_match_any'. */ public class ArrayMatchAny extends ScalarFunction - implements HighOrderFunction, PropagateNullable { + implements HighOrderFunction, AlwaysNullable { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(BooleanType.INSTANCE).args(ArrayType.of(BooleanType.INSTANCE)) ); - private ArrayMatchAny(List expressions) { - super("array_match_any", expressions); - } - /** * constructor with arguments. * array_match_any(lambda, a1, ...) = array_match_any(a1, array_map(lambda, a1, ...)) */ public ArrayMatchAny(Expression arg) { - super("array_match_any", arg instanceof Lambda ? arg.child(1).child(0) : arg, new ArrayMap(arg)); - if (!(arg instanceof Lambda)) { - throw new AnalysisException( - String.format("The 1st arg of %s must be lambda but is %s", getName(), arg)); - } + super("array_match_any", arg instanceof Lambda ? new ArrayMap(arg) : arg); } @Override public ArrayMatchAny withChildren(List children) { - return new ArrayMatchAny(children); + if (children.size() != 1) { + throw new AnalysisException( + String.format("The number of args of %s must be 1 but is %d", getName(), children.size())); + } + return new ArrayMatchAny(children.get(0)); } @Override 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 c5161f2db60b9d..dc519c96ad3ae3 100644 --- a/regression-test/data/nereids_function_p0/scalar_function/Array.out +++ b/regression-test/data/nereids_function_p0/scalar_function/Array.out @@ -14663,420 +14663,420 @@ true ["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true -- !sql_array_match_any_2 -- -["a", "b", "c"] false +["a", "b", "c"] \N ["a", null, "c"] \N [] false \N \N [null, null] \N \N \N -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false -\N \N -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false -["a", "b", "c"] false -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["a", "b", "c"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N [] false [null, null] \N -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N ["a", null, "c"] \N \N \N -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false -\N \N -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false -["a", "b", "c"] false -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false -\N \N -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["a", "b", "c"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +\N \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N [] false [null, null] \N -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false -["a", "b", "c"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["a", "b", "c"] \N [] false -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N ["a", null, "c"] \N ["a", null, "c"] \N \N \N -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N [null, null] \N \N \N \N \N -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N \N \N -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N \N \N [] false -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N [] false \N \N [null, null] \N ["a", null, "c"] \N \N \N -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] false -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N [null, null] \N \N \N -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] false -["a", "b", "c"] false -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] false +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["a", "b", "c"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N -- !sql_array_match_all_2 -- -["a", "b", "c"] true +["a", "b", "c"] \N ["a", null, "c"] \N [] true \N \N [null, null] \N \N \N -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true -\N \N -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true -["a", "b", "c"] true -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["a", "b", "c"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N [] true [null, null] \N -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N ["a", null, "c"] \N \N \N -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true -\N \N -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true -["a", "b", "c"] true -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true -\N \N -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +\N \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["a", "b", "c"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +\N \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N [] true [null, null] \N -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true -["a", "b", "c"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["a", "b", "c"] \N [] true -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N ["a", null, "c"] \N ["a", null, "c"] \N \N \N -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N [null, null] \N \N \N \N \N -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N \N \N -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N \N \N [] true -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N [] true \N \N [null, null] \N ["a", null, "c"] \N \N \N -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true -["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] true -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char21", "char31", "varchar11", "varchar21", "varchar31", "string1"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N [null, null] \N \N \N -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true -["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] true -["a", "b", "c"] true -["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] true +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["char23", "char33", "varchar13", "varchar23", "varchar33", "string3"] \N +["a", "b", "c"] \N +["char22", "char32", "varchar12", "varchar22", "varchar32", "string2"] \N -- !sql_array_match_any_3 -- [] false -[1, 2, 3] false +[1, 2, 3] \N [] false [1, null, 3] \N \N \N \N \N -[1] false -[7] false -[11] false -[2] false -[8] false -[12] false -[3] false -[5] false -[9] false -[4] false -[6] false -[10] false -\N \N -[2] false -[12] false -[10] false +[1] \N +[7] \N +[11] \N +[2] \N +[8] \N +[12] \N +[3] \N +[5] \N +[9] \N +[4] \N +[6] \N +[10] \N +\N \N +[2] \N +[12] \N +[10] \N [] false -[1] false -[8] false -[3] false +[1] \N +[8] \N +[3] \N [] false \N \N -[11] false -[9] false -[6] false -[1, 2, 3] false +[11] \N +[9] \N +[6] \N +[1, 2, 3] \N [1, null, 3] \N -[7] false -[5] false -[4] false -\N \N -[2] false -[12] false -[10] false -[2] false -[1] false -[9] false -[5] false +[7] \N +[5] \N +[4] \N +\N \N +[2] \N +[12] \N +[10] \N +[2] \N +[1] \N +[9] \N +[5] \N [] false -[1] false -[8] false -[3] false -\N \N -[12] false -[8] false -[6] false -[7] false -[4] false +[1] \N +[8] \N +[3] \N +\N \N +[12] \N +[8] \N +[6] \N +[7] \N +[4] \N [] false \N \N -[11] false -[9] false -[6] false +[11] \N +[9] \N +[6] \N [] false [] false -[11] false -[1, 2, 3] false -[1, 2, 3] false +[11] \N +[1, 2, 3] \N +[1, 2, 3] \N [1, null, 3] \N -[7] false -[5] false -[4] false -[10] false -[3] false +[7] \N +[5] \N +[4] \N +[10] \N +[3] \N \N \N [1, null, 3] \N \N \N -[2] false -[12] false -[10] false -[2] false -[1] false -[9] false -[5] false +[2] \N +[12] \N +[10] \N +[2] \N +[1] \N +[9] \N +[5] \N \N \N -[2] false -[8] false +[2] \N +[8] \N \N \N [] false -[6] false +[6] \N [] false [1, null, 3] \N \N \N -[1, 2, 3] false +[1, 2, 3] \N [1, null, 3] \N -[7] false -[5] false -[4] false -[10] false -[3] false +[7] \N +[5] \N +[4] \N +[10] \N +[3] \N \N \N [1, null, 3] \N -[12] false -[9] false +[12] \N +[9] \N [] false -[8] false +[8] \N -- !sql_array_match_all_3 -- [] true -[1, 2, 3] true +[1, 2, 3] \N [] true [1, null, 3] \N \N \N \N \N -[1] true -[7] true -[11] true -[2] true -[8] true -[12] true -[3] true -[5] true -[9] true -[4] true -[6] true -[10] true -\N \N -[2] true -[12] true -[10] true +[1] \N +[7] \N +[11] \N +[2] \N +[8] \N +[12] \N +[3] \N +[5] \N +[9] \N +[4] \N +[6] \N +[10] \N +\N \N +[2] \N +[12] \N +[10] \N [] true -[1] true -[8] true -[3] true +[1] \N +[8] \N +[3] \N [] true \N \N -[11] true -[9] true -[6] true -[1, 2, 3] true +[11] \N +[9] \N +[6] \N +[1, 2, 3] \N [1, null, 3] \N -[7] true -[5] true -[4] true -\N \N -[2] true -[12] true -[10] true -[2] true -[1] true -[9] true -[5] true +[7] \N +[5] \N +[4] \N +\N \N +[2] \N +[12] \N +[10] \N +[2] \N +[1] \N +[9] \N +[5] \N [] true -[1] true -[8] true -[3] true -\N \N -[12] true -[8] true -[6] true -[7] true -[4] true +[1] \N +[8] \N +[3] \N +\N \N +[12] \N +[8] \N +[6] \N +[7] \N +[4] \N [] true \N \N -[11] true -[9] true -[6] true +[11] \N +[9] \N +[6] \N [] true [] true -[11] true -[1, 2, 3] true -[1, 2, 3] true +[11] \N +[1, 2, 3] \N +[1, 2, 3] \N [1, null, 3] \N -[7] true -[5] true -[4] true -[10] true -[3] true +[7] \N +[5] \N +[4] \N +[10] \N +[3] \N \N \N [1, null, 3] \N \N \N -[2] true -[12] true -[10] true -[2] true -[1] true -[9] true -[5] true +[2] \N +[12] \N +[10] \N +[2] \N +[1] \N +[9] \N +[5] \N \N \N -[2] true -[8] true +[2] \N +[8] \N \N \N [] true -[6] true +[6] \N [] true [1, null, 3] \N \N \N -[1, 2, 3] true +[1, 2, 3] \N [1, null, 3] \N -[7] true -[5] true -[4] true -[10] true -[3] true +[7] \N +[5] \N +[4] \N +[10] \N +[3] \N \N \N [1, null, 3] \N -[12] true -[9] true +[12] \N +[9] \N [] true -[8] true +[8] \N -- !sql_array_match_any_4 -- ["a", "b", "c"] true @@ -15703,16 +15703,16 @@ true [8] true -- !sql_array_match_any_7 -- -false +\N -- !sql_array_match_all_7 -- -true +\N -- !sql_array_match_any_8 -- -false +\N -- !sql_array_match_all_8 -- -true +\N -- !sql_array_match_any_9 -- false @@ -15721,10 +15721,10 @@ false true -- !sql_array_match_any_10 -- -false +\N -- !sql_array_match_all_10 -- -true +\N -- !sql_array_match_any_11 -- true @@ -15739,7 +15739,7 @@ true false -- !sql_array_match_any_13 -- -false +\N -- !sql_array_match_all_13 -- false @@ -15751,10 +15751,10 @@ false true -- !sql_array_match_any_15 -- -false +\N -- !sql_array_match_all_15 -- -true +\N -- !sql_array_match_any_16 -- true @@ -15763,7 +15763,7 @@ true false -- !sql_array_match_any_17 -- -false +\N -- !sql_array_match_all_17 -- false From e87b481e3c42c6d71eb092bf129860d5dcdd423f Mon Sep 17 00:00:00 2001 From: amorynan Date: Thu, 12 Sep 2024 10:09:45 +0800 Subject: [PATCH 5/5] fix all --- .../doris/catalog/BuiltinScalarFunctions.java | 4 ++-- .../visitor/ScalarFunctionVisitor.java | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java index 07989d337cad8d..5ea2247314ca3f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java @@ -508,10 +508,10 @@ public class BuiltinScalarFunctions implements FunctionHelper { scalar(ArrayLast.class, "array_last"), scalar(ArrayLastIndex.class, "array_last_index"), scalar(ArrayMap.class, "array_map"), + scalar(ArrayMatchAll.class, "array_match_all"), + scalar(ArrayMatchAny.class, "array_match_any"), scalar(ArrayMax.class, "array_max"), scalar(ArrayMin.class, "array_min"), - scalar(ArrayMatchAny.class, "array_match_any"), - scalar(ArrayMatchAll.class, "array_match_all"), scalar(ArrayPopBack.class, "array_popback"), scalar(ArrayPopFront.class, "array_popfront"), scalar(ArrayPosition.class, "array_position"), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java index e1be3b80d73ecc..c4342e4088cccc 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java @@ -562,14 +562,6 @@ default R visitArrayFilter(ArrayFilter arrayFilter, C context) { return visitScalarFunction(arrayFilter, context); } - default R visitArrayMatchAny(ArrayMatchAny arrayMatchAny, C context) { - return visitScalarFunction(arrayMatchAny, context); - } - - default R visitArrayMatchAll(ArrayMatchAll arrayMatchAll, C context) { - return visitScalarFunction(arrayMatchAll, context); - } - default R visitArrayFirstIndex(ArrayFirstIndex arrayFirstIndex, C context) { return visitScalarFunction(arrayFirstIndex, context); } @@ -682,6 +674,14 @@ default R visitArrayMap(ArrayMap arraySort, C context) { return visitScalarFunction(arraySort, context); } + default R visitArrayMatchAll(ArrayMatchAll arrayMatchAll, C context) { + return visitScalarFunction(arrayMatchAll, context); + } + + default R visitArrayMatchAny(ArrayMatchAny arrayMatchAny, C context) { + return visitScalarFunction(arrayMatchAny, context); + } + default R visitArrayRepeat(ArrayRepeat arrayRepeat, C context) { return visitScalarFunction(arrayRepeat, context); }