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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]