This is an automated email from the ASF dual-hosted git repository.
eldenmoon pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 3ab85f3f4e4 [fix](arrayfuncs) fix array min/max func (#39307)
3ab85f3f4e4 is described below
commit 3ab85f3f4e4c83dba34223bdbc2582870719bcf8
Author: amory <[email protected]>
AuthorDate: Fri Aug 16 15:28:36 2024 +0800
[fix](arrayfuncs) fix array min/max func (#39307)
in fe we will check the params same with be
in be we throw exception if params is not support
otherwise we will meet coredump like this
```
start BE in local mode
/mnt/disk1/wangqiannan/amory/doris/be/src/vec/functions/array/function_array_aggregation.cpp:150:26:
runtime error: member call on null pointer of type
'doris::vectorized::IAggregateFunction'
#0 0x55dc04c6b409 in
doris::vectorized::ArrayAggregateImpl<(doris::vectorized::AggregateOperation)1>::get_return_type(std::vector<std::shared_ptr<doris::vectorized::IDataType
const>, std::allocator<std::shared_ptr<doris::vectorized::IDataType const>>>
const&)
/mnt/disk1/wangqiannan/amory/doris/be/src/vec/functions/array/function_array_aggregation.cpp:150:26
#1 0x55dc04c6a41f in
doris::vectorized::FunctionArrayMapped<doris::vectorized::ArrayAggregateImpl<(doris::vectorized::AggregateOperation)1>,
doris::vectorized::NameArrayMax>::get_return_type_impl(std::vector<std::shared_ptr<doris::vectorized::IDataType
const>, std::allocator<std::shared_ptr<doris::vectorized::IDataType const>>>
const&) const
/mnt/disk1/wangqiannan/amory/doris/be/src/vec/functions/array/function_array_mapped.h:71:16
#2 0x55dc049b06cb in
doris::vectorized::FunctionBuilderImpl::get_return_type_impl(std::vector<doris::vectorized::ColumnWithTypeAndName,
std::allocator<doris::vectorized::ColumnWithTypeAndName>> const&) const
/mnt/disk1/wangqiannan/amory/doris/be/src/vec/functions/function.h:339:16
#3 0x55dc049c1385 in
doris::vectorized::DefaultFunctionBuilder::get_return_type_impl(std::vector<doris::vectorized::ColumnWithTypeAndName,
std::allocator<doris::vectorized::ColumnWithTypeAndName>> const&) const
/mnt/disk1/wangqiannan/amory/doris/be/src/vec/functions/function.h:579:26
#4 0x55dc0b0a5652 in
doris::vectorized::FunctionBuilderImpl::get_return_type_without_low_cardinality(std::vector<doris::vectorized::ColumnWithTypeAndName,
std::allocator<doris::vectorized::ColumnWithTypeAndName>> const&) const
/mnt/disk1/wangqiannan/amory/doris/be/src/vec/functions/function.cpp:283:12
#5 0x55dc0b0a5fd4 in
doris::vectorized::FunctionBuilderImpl::get_return_type(std::vector<doris::vectorized::ColumnWithTypeAndName,
std::allocator<doris::vectorized::ColumnWithTypeAndName>> const&) const
/mnt/disk1/wangqiannan/amory/doris/be/src/vec/functions/function.cpp:298:17
#6 0x55dc04997050 in
doris::vectorized::FunctionBuilderImpl::build(std::vector<doris::vectorized::ColumnWithTypeAndName,
std::allocator<doris::vectorized::ColumnWithTypeAndName>> const&,
std::shared_ptr<doris::vectorized::IDataType const> const&) const
/mnt/disk1/wangqiannan/amory/doris/be/src/vec/functions/function.h:296:47
#7 0x55dbde3d727f in
doris::vectorized::SimpleFunctionFactory::get_function(std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char>> const&,
std::vector<doris::vectorized::ColumnWithTypeAndName,
std::allocator<doris::vectorized::ColumnWithTypeAndName>> const&,
std::shared_ptr<doris::vectorized::IDataType const> const&, int)
/mnt/disk1/wangqiannan/amory/doris/be/src/vec/functions/simple_function_factory.h:193:32
#8 0x55dc04984b4d in
doris::vectorized::VectorizedFnCall::prepare(doris::RuntimeState*,
doris::RowDescriptor const&, doris::vectorized::VExprContext*)
/mnt/disk1/wangqiannan/amory/doris/be/src/vec/exprs/vectorized_fn_call.cpp:111:55
#9 0x55dc04ab9b7a in
doris::vectorized::VExprContext::prepare(doris::RuntimeState*,
doris::RowDescriptor const&)
/mnt/disk1/wangqiannan/amory/doris/be/src/vec/exprs/vexpr_context.cpp:64:5
#10 0x55dbdf625845 in doris::Status
doris::FoldConstantExecutor::_prepare_and_open<doris::vectorized::VExprContext>(doris::vectorized::VExprContext*)
/mnt/disk1/wangqiannan/amory/doris/be/src/runtime/fold_constant_executor.cpp:185:5
#11 0x55dbdf60db76 in
doris::FoldConstantExecutor::fold_constant_vexpr(doris::TFoldConstantParams
const&, doris::PConstantExprResult*)
/mnt/disk1/wangqiannan/amory/doris/be/src/runtime/fold_constant_executor.cpp:94:13
#12 0x55dbdf4f58d6 in
doris::PInternalService::_fold_constant_expr(std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char>> const&,
doris::PConstantExprResult*)
/mnt/disk1/wangqiannan/amory/doris/be/src/service/internal_service.cpp:1498:5
#13 0x55dbdf544e3e in
doris::PInternalService::fold_constant_expr(google::protobuf::RpcController*,
doris::PConstantExprRequest const*, doris::PConstantExprResult*,
google::protobuf::Closure*)::$_0::operator()() const
/mnt/disk1/wangqiannan/amory/doris/be/src/service/internal_service.cpp:1476:14
#14 0x55dbdf54431e in void std::__invoke_impl<void,
doris::PInternalService::fold_constant_expr(google::protobuf::RpcController*,
doris::PConstantExprRequest const*, doris::PConstantExprResult*,
google::protobuf::Closure*)::$_0&>(std::__invoke_other,
doris::PInternalService::fold_constant_expr(google::protobuf::RpcController*,
doris::PConstantExprRequest const*, doris::PConstantExprResult*,
google::protobuf::Closure*)::$_0&)
/mnt/disk1/wangqiannan/tool/ldb_toolchain_16/bin/../lib/ [...]
#15 0x55dbdf54425e in std::enable_if<is_invocable_r_v<void,
doris::PInternalService::fold_constant_expr(google::protobuf::RpcController*,
doris::PConstantExprRequest const*, doris::PConstantExprResult*,
google::protobuf::Closure*)::$_0&>, void>::type std::__invoke_r<void,
doris::PInternalService::fold_constant_expr(google::protobuf::RpcController*,
doris::PConstantExprRequest const*, doris::PConstantExprResult*,
google::protobuf::Closure*)::$_0&>(doris::PInternalService::fold_cons [...]
#16 0x55dbdf543f35 in std::_Function_handler<void (),
doris::PInternalService::fold_constant_expr(google::protobuf::RpcController*,
doris::PConstantExprRequest const*, doris::PConstantExprResult*,
google::protobuf::Closure*)::$_0>::_M_invoke(std::_Any_data const&)
/mnt/disk1/wangqiannan/tool/ldb_toolchain_16/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/std_function.h:291:9
#17 0x55dbd8cd425a in std::function<void ()>::operator()() const
/mnt/disk1/wangqiannan/tool/ldb_toolchain_16/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/std_function.h:560:9
#18 0x55dbdf59ee14 in doris::WorkThreadPool<false>::work_thread(int)
/mnt/disk1/wangqiannan/amory/doris/be/src/util/work_thread_pool.hpp:158:17
@@@
```
---
.../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 | 30 +++++++++++++++++++++
.../test_array_functions_by_literal.groovy | 31 ++++++++++++++++++++++
7 files changed, 106 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 4ad14814490..61fe0e6e766 100644
--- a/regression-test/suites/nereids_function_p0/scalar_function/Array.groovy
+++ b/regression-test/suites/nereids_function_p0/scalar_function/Array.groovy
@@ -1311,6 +1311,36 @@ suite("nereids_scalar_fn_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)
+ }
+ }
// array_map with string is can be succeed
qt_sql_array_map """select array_map(x->x!='',
split_by_string('amory,is,better,committing', ','))"""
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 81689b63359..afc88acd651 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
@@ -411,6 +411,37 @@ suite("test_array_functions_by_literal") {
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)
+ }
+ }
+
// array_map with string is can be succeed
qt_sql_array_map """ select array_map(x->x!='',
split_by_string('amory,is,better,committing', ',')) """
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]