This is an automated email from the ASF dual-hosted git repository. kxiao pushed a commit to branch branch-3.0 in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-3.0 by this push: new 22fc0bd526e [fix](array) fix array min/max #39307 (#39492) 22fc0bd526e is described below commit 22fc0bd526ef90b190a87c67a1bb4c4ea0b43293 Author: amory <wangqian...@selectdb.com> AuthorDate: Sat Aug 17 10:59:11 2024 +0800 [fix](array) fix array min/max #39307 (#39492) --- .../functions/array/function_array_aggregation.cpp | 8 +++++- .../expressions/functions/scalar/ArrayMax.java | 9 ++++++ .../expressions/functions/scalar/ArrayMin.java | 9 ++++++ .../functions/scalar/ArrayReverseSort.java | 10 +++++++ .../expressions/functions/scalar/ArraySort.java | 10 +++++++ .../scalar_function/Array.groovy | 31 +++++++++++++++++++++ .../test_array_functions_by_literal.groovy | 32 ++++++++++++++++++++++ 7 files changed, 108 insertions(+), 1 deletion(-) diff --git a/be/src/vec/functions/array/function_array_aggregation.cpp b/be/src/vec/functions/array/function_array_aggregation.cpp index e8a2fd9e952..d2edfe34fb6 100644 --- a/be/src/vec/functions/array/function_array_aggregation.cpp +++ b/be/src/vec/functions/array/function_array_aggregation.cpp @@ -147,7 +147,13 @@ struct ArrayAggregateImpl { const DataTypeArray* data_type_array = static_cast<const DataTypeArray*>(remove_nullable(arguments[0]).get()); auto function = Function::create(data_type_array->get_nested_type()); - return function->get_return_type(); + if (function) { + return function->get_return_type(); + } else { + throw doris::Exception(ErrorCode::INVALID_ARGUMENT, + "Unexpected type {} for aggregation {}", + data_type_array->get_nested_type()->get_name(), operation); + } } static Status execute(Block& block, const ColumnNumbers& arguments, size_t result, diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMax.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMax.java index c1d0eff1b27..f8a29205215 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMax.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMax.java @@ -18,6 +18,7 @@ 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.AlwaysNullable; import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature; @@ -50,6 +51,14 @@ public class ArrayMax extends ScalarFunction implements ExplicitlyCastableSignat super("array_max", arg); } + @Override + public void checkLegalityBeforeTypeCoercion() { + DataType argType = child().getDataType(); + if (((ArrayType) argType).getItemType().isComplexType()) { + throw new AnalysisException("array_max does not support complex types: " + toSql()); + } + } + @Override public DataType getDataType() { return ((ArrayType) (child().getDataType())).getItemType(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMin.java index dbfba39a2c4..642b86f5752 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayMin.java @@ -18,6 +18,7 @@ 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.AlwaysNullable; import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature; @@ -50,6 +51,14 @@ public class ArrayMin extends ScalarFunction implements ExplicitlyCastableSignat super("array_min", arg); } + @Override + public void checkLegalityBeforeTypeCoercion() { + DataType argType = child().getDataType(); + if (((ArrayType) argType).getItemType().isComplexType()) { + throw new AnalysisException("array_min does not support complex types: " + toSql()); + } + } + @Override public DataType getDataType() { return ((ArrayType) (child().getDataType())).getItemType(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayReverseSort.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayReverseSort.java index 38833ecc2b4..1fb920e0bd1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayReverseSort.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayReverseSort.java @@ -18,12 +18,14 @@ 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.ExplicitlyCastableSignature; import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable; import org.apache.doris.nereids.trees.expressions.shape.UnaryExpression; import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; import org.apache.doris.nereids.types.ArrayType; +import org.apache.doris.nereids.types.DataType; import org.apache.doris.nereids.types.coercion.AnyDataType; import com.google.common.base.Preconditions; @@ -48,6 +50,14 @@ public class ArrayReverseSort extends ScalarFunction super("array_reverse_sort", arg); } + @Override + public void checkLegalityBeforeTypeCoercion() { + DataType argType = child().getDataType(); + if (((ArrayType) argType).getItemType().isComplexType()) { + throw new AnalysisException("array_reverse_sort does not support complex types: " + toSql()); + } + } + /** * withChildren. */ diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArraySort.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArraySort.java index 5953d69b668..80f359b61f5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArraySort.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArraySort.java @@ -18,12 +18,14 @@ 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.ExplicitlyCastableSignature; import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable; import org.apache.doris.nereids.trees.expressions.shape.UnaryExpression; import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; import org.apache.doris.nereids.types.ArrayType; +import org.apache.doris.nereids.types.DataType; import org.apache.doris.nereids.types.coercion.AnyDataType; import com.google.common.base.Preconditions; @@ -48,6 +50,14 @@ public class ArraySort extends ScalarFunction super("array_sort", arg); } + @Override + public void checkLegalityBeforeTypeCoercion() { + DataType argType = child().getDataType(); + if (((ArrayType) argType).getItemType().isComplexType()) { + throw new AnalysisException("array_sort does not support complex types: " + toSql()); + } + } + /** * withChildren. */ 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 ef3813d6deb..e4e5b6eb7a2 100644 --- a/regression-test/suites/nereids_function_p0/scalar_function/Array.groovy +++ b/regression-test/suites/nereids_function_p0/scalar_function/Array.groovy @@ -1310,4 +1310,35 @@ suite("nereids_scalar_fn_Array") { qt_array_empty_fe """select array()""" sql """ set debug_skip_fold_constant=true; """ qt_array_empty_be """select array()""" + + // array_min/max with nested array for args + test { + sql "select array_min(array(1,2,3),array(4,5,6));" + check{result, exception, startTime, endTime -> + assertTrue(exception != null) + logger.info(exception.message) + } + } + test { + sql "select array_max(array(1,2,3),array(4,5,6));" + check{result, exception, startTime, endTime -> + assertTrue(exception != null) + logger.info(exception.message) + } + } + + test { + sql "select array_min(array(split_by_string('a,b,c',',')));" + check{result, exception, startTime, endTime -> + assertTrue(exception != null) + logger.info(exception.message) + } + } + test { + sql "select array_max(array(split_by_string('a,b,c',',')));" + check{result, exception, startTime, endTime -> + assertTrue(exception != null) + logger.info(exception.message) + } + } } diff --git a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions_by_literal.groovy b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions_by_literal.groovy index f335cd72115..fd372dfbd03 100644 --- a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions_by_literal.groovy +++ b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions_by_literal.groovy @@ -410,4 +410,36 @@ suite("test_array_functions_by_literal") { } catch (Exception ex) { assert("${ex}".contains("errCode = 2, detailMessage = No matching function with signature: array_intersect")) } + + // array_min/max with nested array for args + test { + sql "select array_min(array(1,2,3),array(4,5,6));" + check{result, exception, startTime, endTime -> + assertTrue(exception != null) + logger.info(exception.message) + } + } + test { + sql "select array_max(array(1,2,3),array(4,5,6));" + check{result, exception, startTime, endTime -> + assertTrue(exception != null) + logger.info(exception.message) + } + } + + test { + sql "select array_min(array(split_by_string('a,b,c',',')));" + check{result, exception, startTime, endTime -> + assertTrue(exception != null) + logger.info(exception.message) + } + } + test { + sql "select array_max(array(split_by_string('a,b,c',',')));" + check{result, exception, startTime, endTime -> + assertTrue(exception != null) + logger.info(exception.message) + } + } + } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org