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]

Reply via email to