This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch branch-4.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-4.0 by this push:
     new 1bceac2fdd2 [branch-4.0](function) add a lambda functor version for 
array_sort (#57828) (#62829)
1bceac2fdd2 is described below

commit 1bceac2fdd26d291703d289c4ef97659348360bc
Author: Chenyang Sun <[email protected]>
AuthorDate: Thu May 7 16:57:46 2026 +0800

    [branch-4.0](function) add a lambda functor version for array_sort (#57828) 
(#62829)
    
    pick from master #57828
    
    Co-authored-by: admiring_xm <[email protected]>
---
 .../lambda_function/lambda_function_factory.h      |   2 +
 .../glue/translator/ExpressionTranslator.java      |  56 +++
 .../nereids/rules/analysis/ExpressionAnalyzer.java |   2 +-
 .../rewrite/AccessPathExpressionCollector.java     |  12 +
 .../expressions/functions/scalar/ArraySort.java    |  35 +-
 .../trees/expressions/functions/scalar/Lambda.java |  13 +-
 .../nereids_function_p0/scalar_function/Array2.out | 241 ++++++++++
 .../scalar_function/Array2.groovy                  | 499 +++++++++++++++++++++
 8 files changed, 856 insertions(+), 4 deletions(-)

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 ce607748732..d9db354fcb4 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_sort(LambdaFunctionFactory& factory);
 
 class LambdaFunctionFactory {
     using Creator = std::function<LambdaFunctionPtr()>;
@@ -62,6 +63,7 @@ public:
         std::call_once(oc, []() {
             register_function_array_map(instance);
             register_function_array_filter(instance);
+            register_function_array_sort(instance);
         });
         return instance;
     }
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 4d127077d4f..58c0ca9217d 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
@@ -95,6 +95,7 @@ import 
org.apache.doris.nereids.trees.expressions.functions.combinator.StateComb
 import 
org.apache.doris.nereids.trees.expressions.functions.combinator.UnionCombinator;
 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.ArraySort;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.DictGet;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.DictGetMany;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.ElementAt;
@@ -584,6 +585,61 @@ public class ExpressionTranslator extends 
DefaultExpressionVisitor<Expr, PlanTra
         return functionCallExpr;
     }
 
+    @Override
+    public Expr visitArraySort(ArraySort arraySort, PlanTranslatorContext 
context) {
+        if (!(arraySort.child(0) instanceof Lambda)) {
+            return visitScalarFunction(arraySort, context);
+        }
+        Lambda lambda = (Lambda) arraySort.child(0);
+        List<Expr> arguments = new ArrayList<>(arraySort.children().size());
+        arguments.add(null);
+
+        // Construct the first column
+        ArrayItemReference arrayItemReference = lambda.getLambdaArgument(0);
+        String argName = arrayItemReference.getName();
+        Expr expr = arrayItemReference.getArrayExpression().accept(this, 
context);
+        arguments.add(expr);
+        ColumnRefExpr column = new ColumnRefExpr();
+        column.setName(argName);
+        column.setColumnId(0);
+        column.setNullable(true);
+        column.setType(((ArrayType) expr.getType()).getItemType());
+        context.addExprIdColumnRefPair(arrayItemReference.getExprId(), column);
+
+        // the second column here will not be used; it's just a placeholder.
+        arrayItemReference = lambda.getLambdaArgument(1);
+        ColumnRefExpr column2 = new ColumnRefExpr(column);
+        column2.setColumnId(1);
+        context.addExprIdColumnRefPair(arrayItemReference.getExprId(), 
column2);
+
+        List<Type> argTypes = arraySort.getArguments().stream()
+                .map(Expression::getDataType)
+                .map(DataType::toCatalogDataType)
+                .collect(Collectors.toList());
+        // two slots are same, we only need one
+        lambda.getLambdaArguments().stream().skip(1)
+                .map(ArrayItemReference::getArrayExpression)
+                .map(Expression::getDataType)
+                .map(DataType::toCatalogDataType)
+                .forEach(argTypes::add);
+        NullableMode nullableMode = arraySort.nullable()
+                ? NullableMode.ALWAYS_NULLABLE
+                : NullableMode.ALWAYS_NOT_NULLABLE;
+        Type itemType = ((ArrayType) arguments.get(1).getType()).getItemType();
+        org.apache.doris.catalog.Function catalogFunction = new Function(
+                new FunctionName(arraySort.getName()), argTypes,
+                ArrayType.create(itemType, true),
+                true, true, nullableMode);
+
+        // create catalog FunctionCallExpr without analyze again
+        Expr lambdaBody = visitLambda(lambda, context);
+        arguments.set(0, lambdaBody);
+        LambdaFunctionCallExpr functionCallExpr = new 
LambdaFunctionCallExpr(catalogFunction,
+                new FunctionParams(false, arguments));
+        functionCallExpr.setNullableFromNereids(arraySort.nullable());
+        return functionCallExpr;
+    }
+
     @Override
     public Expr visitDictGet(DictGet dictGet, PlanTranslatorContext context) {
         List<Expr> arguments = dictGet.getArguments().stream()
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java
index 414affb39ac..acd2c82565e 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java
@@ -393,7 +393,7 @@ public class ExpressionAnalyzer extends 
SubExprAnalyzer<ExpressionRewriteContext
         // bindLambdaFunction
         Lambda lambda = (Lambda) unboundFunction.children().get(0);
         Expression lambdaFunction = lambda.getLambdaFunction();
-        List<ArrayItemReference> arrayItemReferences = 
lambda.makeArguments(subChildren);
+        List<ArrayItemReference> arrayItemReferences = 
lambda.makeArguments(unboundFunction.getName(), subChildren);
 
         List<Slot> boundedSlots = arrayItemReferences.stream()
                 .map(ArrayItemReference::toSlot)
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AccessPathExpressionCollector.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AccessPathExpressionCollector.java
index 9ff9bfe998e..dcfcce4cf4e 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AccessPathExpressionCollector.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AccessPathExpressionCollector.java
@@ -38,6 +38,7 @@ 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.ArrayReverseSplit;
+import org.apache.doris.nereids.trees.expressions.functions.scalar.ArraySort;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.ArraySortBy;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.ArraySplit;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.ElementAt;
@@ -252,6 +253,17 @@ public class AccessPathExpressionCollector extends 
DefaultExpressionVisitor<Void
         return visit(arrayMap, context);
     }
 
+    @Override
+    public Void visitArraySort(ArraySort arraySort, CollectorContext context) {
+        // ARRAY_SORT(lambda, <arr>)
+
+        Expression argument = arraySort.getArgument(0);
+        if ((argument instanceof Lambda)) {
+            return collectArrayPathInLambda((Lambda) argument, context);
+        }
+        return visit(arraySort, context);
+    }
+
     @Override
     public Void visitArrayCount(ArrayCount arrayCount, CollectorContext 
context) {
         // ARRAY_COUNT(<lambda>, <arr>[, ... ])
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 daf1330032c..2e8b738237a 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
@@ -19,6 +19,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.ArrayItemReference;
 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;
@@ -26,6 +27,7 @@ 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.LambdaType;
 import org.apache.doris.nereids.types.coercion.AnyDataType;
 
 import com.google.common.base.Preconditions;
@@ -40,7 +42,8 @@ public class ArraySort extends ScalarFunction
         implements UnaryExpression, ExplicitlyCastableSignature, 
PropagateNullable {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
-            
FunctionSignature.retArgType(0).args(ArrayType.of(AnyDataType.INSTANCE_WITHOUT_INDEX))
+            
FunctionSignature.retArgType(0).args(ArrayType.of(AnyDataType.INSTANCE_WITHOUT_INDEX)),
+            
FunctionSignature.ret(ArrayType.of(AnyDataType.INSTANCE_WITHOUT_INDEX)).args(LambdaType.INSTANCE)
     );
 
     /**
@@ -77,7 +80,35 @@ public class ArraySort extends ScalarFunction
     @Override
     public ArraySort withChildren(List<Expression> children) {
         Preconditions.checkArgument(children.size() == 1);
-        return new ArraySort(getFunctionParams(children));
+        return new ArraySort(children.get(0));
+    }
+
+    @Override
+    public DataType getDataType() {
+        if (children.get(0) instanceof Lambda) {
+            Lambda lambda = (Lambda) children.get(0);
+            ArrayItemReference argRef = lambda.getLambdaArguments().get(0);
+            Expression arrayExpr = argRef.getArrayExpression();
+            ArrayType arrayType = (ArrayType) arrayExpr.getDataType();
+            return ArrayType.of(arrayType.getItemType(), true);
+        } else if (children.get(0).getDataType() instanceof ArrayType) {
+            Expression arrayExpr = children.get(0);
+            ArrayType arrayType = (ArrayType) arrayExpr.getDataType();
+            return ArrayType.of(arrayType.getItemType(), true);
+        } else {
+            throw new AnalysisException("The first arg of array_sort must be 
lambda or array");
+        }
+    }
+
+    @Override
+    public boolean nullable() {
+        if (children.get(0) instanceof Lambda) {
+            return ((Lambda) children.get(0)).getLambdaArguments().stream()
+                    .map(ArrayItemReference::getArrayExpression)
+                    .anyMatch(Expression::nullable);
+        } else {
+            return child(0).nullable();
+        }
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Lambda.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Lambda.java
index 35463aa829b..192f04e5632 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Lambda.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Lambda.java
@@ -60,12 +60,23 @@ public class Lambda extends Expression {
 
     /**
      * make slot according array expression
+     * @param functionName function name
      * @param arrays array expression
      * @return item slots of array expression
      */
-    public ImmutableList<ArrayItemReference> makeArguments(List<Expression> 
arrays) {
+    public ImmutableList<ArrayItemReference> makeArguments(String 
functionName, List<Expression> arrays) {
         Builder<ArrayItemReference> builder = new ImmutableList.Builder<>();
         if (arrays.size() != argumentNames.size()) {
+            // In the lambda expression of array_sort, x and y point to the 
same slot.
+            if (functionName.equalsIgnoreCase("array_sort") && arrays.size() 
== 1 && argumentNames.size() == 2) {
+                Expression array = arrays.get(0);
+                if (!(array.getDataType() instanceof ArrayType)) {
+                    throw new AnalysisException(String.format("lambda argument 
must be array but is %s", array));
+                }
+                builder.add(new ArrayItemReference(argumentNames.get(0), 
array));
+                builder.add(new ArrayItemReference(argumentNames.get(1), 
array));
+                return builder.build();
+            }
             throw new AnalysisException(String.format("lambda %s arguments' 
size is not equal parameters' size",
                     toSql()));
         }
diff --git 
a/regression-test/data/nereids_function_p0/scalar_function/Array2.out 
b/regression-test/data/nereids_function_p0/scalar_function/Array2.out
new file mode 100644
index 00000000000..7767feb9c14
--- /dev/null
+++ b/regression-test/data/nereids_function_p0/scalar_function/Array2.out
@@ -0,0 +1,241 @@
+-- This file is automatically generated. You should know what you did if you 
want to edit this
+-- !sql_array_sort_1 --
+[null, null, 5, 3, 2, 2, 1]
+
+-- !sql_array_sort_2 --
+[5, 3, 2, 2, 1, null, null]
+
+-- !sql_array_sort_3 --
+[5, 3, 2, 2, 1]
+
+-- !sql_array_sort_4 --
+["dc", "bc", "ab"]
+
+-- !sql_array_sort_5 --
+["a", "abc", "abcd"]
+
+-- !sql_array_sort_6 --
+[[1, 2], [2, 3, 1], [4, 2, 1, 4]]
+
+-- !sql_array_sort_7 --
+["192.168.0.1", "192.168.0.2", "192.168.0.3"]
+
+-- !sql_array_sort_8 --
+[5.34, 3.00, 2.20, 1.20, -2.10]
+
+-- !sql_array_sort_Tinyint --
+[null, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
+
+-- !sql_array_sort_Tinyint_notnull --
+[12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
+
+-- !sql_array_sort_Smallint --
+[null, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
+
+-- !sql_array_sort_Smallint_notnull --
+[12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
+
+-- !sql_array_sort_Int --
+[null, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
+
+-- !sql_array_sort_Int_notnull --
+[12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
+
+-- !sql_array_sort_Bigint --
+[null, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
+
+-- !sql_array_sort_Bigint_notnull --
+[12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
+
+-- !sql_array_sort_Largeint --
+[null, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
+
+-- !sql_array_sort_LargeInt_notnull --
+[12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
+
+-- !sql_array_sort_Float --
+[null, 1.2, 1.1, 1, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1]
+
+-- !sql_array_sort_Float_notnull --
+[1.2, 1.1, 1, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1]
+
+-- !sql_array_sort_Double --
+[null, 1.2, 1.1, 1, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1]
+
+-- !sql_array_sort_Double_notnull --
+[1.2, 1.1, 1, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1]
+
+-- !sql_array_sort_Demical1 --
+[null, 1.200, 1.100, 1.000, 0.900, 0.800, 0.700, 0.600, 0.500, 0.400, 0.300, 
0.200, 0.100]
+
+-- !sql_array_sort_Demical1_notnull --
+[1.200, 1.100, 1.000, 0.900, 0.800, 0.700, 0.600, 0.500, 0.400, 0.300, 0.200, 
0.100]
+
+-- !sql_array_sort_Demical2 --
+[null, 1.20000, 1.10000, 1.00000, 0.90000, 0.80000, 0.70000, 0.60000, 0.50000, 
0.40000, 0.30000, 0.20000, 0.10000]
+
+-- !sql_array_sort_Demical2_notnull --
+[1.20000, 1.10000, 1.00000, 0.90000, 0.80000, 0.70000, 0.60000, 0.50000, 
0.40000, 0.30000, 0.20000, 0.10000]
+
+-- !sql_array_sort_Demical3 --
+[null, 1.200000000, 1.100000000, 1.000000000, 0.900000000, 0.800000000, 
0.700000000, 0.600000000, 0.500000000, 0.400000000, 0.300000000, 0.200000000, 
0.100000000]
+
+-- !sql_array_sort_Demical3_notnull --
+[1.200000000, 1.100000000, 1.000000000, 0.900000000, 0.800000000, 0.700000000, 
0.600000000, 0.500000000, 0.400000000, 0.300000000, 0.200000000, 0.100000000]
+
+-- !sql_array_sort_Demical4 --
+[null, 1.200, 1.100, 1.000, 0.900, 0.800, 0.700, 0.600, 0.500, 0.400, 0.300, 
0.200, 0.100]
+
+-- !sql_array_sort_Demical4_notnull --
+[1.200, 1.100, 1.000, 0.900, 0.800, 0.700, 0.600, 0.500, 0.400, 0.300, 0.200, 
0.100]
+
+-- !sql_array_sort_Demical5 --
+[null, 1.20000, 1.10000, 1.00000, 0.90000, 0.80000, 0.70000, 0.60000, 0.50000, 
0.40000, 0.30000, 0.20000, 0.10000]
+
+-- !sql_array_sort_Demical5_notnull --
+[1.20000, 1.10000, 1.00000, 0.90000, 0.80000, 0.70000, 0.60000, 0.50000, 
0.40000, 0.30000, 0.20000, 0.10000]
+
+-- !sql_array_sort_Demical6 --
+[null, 1.200000000, 1.100000000, 1.000000000, 0.900000000, 0.800000000, 
0.700000000, 0.600000000, 0.500000000, 0.400000000, 0.300000000, 0.200000000, 
0.100000000]
+
+-- !sql_array_sort_Demical6_notnull --
+[1.200000000, 1.100000000, 1.000000000, 0.900000000, 0.800000000, 0.700000000, 
0.600000000, 0.500000000, 0.400000000, 0.300000000, 0.200000000, 0.100000000]
+
+-- !sql_array_sort_Char --
+["null", "char33", "char33", "char33", "char33", "char32", "char32", "char32", 
"char32", "char31", "char31", "char31", "char31"]
+
+-- !sql_array_sort_Char_notnull --
+["char33", "char33", "char33", "char33", "char32", "char32", "char32", 
"char32", "char31", "char31", "char31", "char31"]
+
+-- !sql_array_sort_Varchar --
+["varchar33", "varchar33", "varchar33", "varchar33", "varchar32", "varchar32", 
"varchar32", "varchar32", "varchar31", "varchar31", "varchar31", "varchar31", 
"null"]
+
+-- !sql_array_sort_Varchar_notnull --
+["varchar33", "varchar33", "varchar33", "varchar33", "varchar32", "varchar32", 
"varchar32", "varchar32", "varchar31", "varchar31", "varchar31", "varchar31"]
+
+-- !sql_array_sort_String --
+["string3", "string3", "string3", "string3", "string2", "string2", "string2", 
"string2", "string1", "string1", "string1", "string1", "null"]
+
+-- !sql_array_sort_String_notnull --
+["string3", "string3", "string3", "string3", "string2", "string2", "string2", 
"string2", "string1", "string1", "string1", "string1"]
+
+-- !sql_array_sort_Date --
+[null, "2012-03-12", "2012-03-11", "2012-03-10", "2012-03-09", "2012-03-08", 
"2012-03-07", "2012-03-06", "2012-03-05", "2012-03-04", "2012-03-03", 
"2012-03-02", "2012-03-01"]
+
+-- !sql_array_sort_Date_notnull --
+["2012-03-12", "2012-03-11", "2012-03-10", "2012-03-09", "2012-03-08", 
"2012-03-07", "2012-03-06", "2012-03-05", "2012-03-04", "2012-03-03", 
"2012-03-02", "2012-03-01"]
+
+-- !sql_array_sort_DateV2 --
+[null, "2012-03-12", "2012-03-11", "2012-03-10", "2012-03-09", "2012-03-08", 
"2012-03-07", "2012-03-06", "2012-03-05", "2012-03-04", "2012-03-03", 
"2012-03-02", "2012-03-01"]
+
+-- !sql_array_sort_DateV2_notnull --
+["2012-03-12", "2012-03-11", "2012-03-10", "2012-03-09", "2012-03-08", 
"2012-03-07", "2012-03-06", "2012-03-05", "2012-03-04", "2012-03-03", 
"2012-03-02", "2012-03-01"]
+
+-- !sql_array_sort_Datetime --
+[null, "2012-03-12 12:11:12", "2012-03-11 11:10:11", "2012-03-10 10:09:10", 
"2012-03-09 09:08:09", "2012-03-08 08:07:08", "2012-03-07 07:06:07", 
"2012-03-06 06:05:06", "2012-03-05 05:04:05", "2012-03-04 04:03:04", 
"2012-03-03 03:02:03", "2012-03-02 02:01:02", "2012-03-01 01:00:01"]
+
+-- !sql_array_sort_Datetime_notnull --
+["2012-03-12 12:11:12", "2012-03-11 11:10:11", "2012-03-10 10:09:10", 
"2012-03-09 09:08:09", "2012-03-08 08:07:08", "2012-03-07 07:06:07", 
"2012-03-06 06:05:06", "2012-03-05 05:04:05", "2012-03-04 04:03:04", 
"2012-03-03 03:02:03", "2012-03-02 02:01:02", "2012-03-01 01:00:01"]
+
+-- !sql_array_sort_DatetimeV2 --
+[null, "2012-03-12 12:11:12.000000", "2012-03-11 11:10:11.000000", "2012-03-10 
10:09:10.000000", "2012-03-09 09:08:09.000000", "2012-03-08 08:07:08.000000", 
"2012-03-07 07:06:07.000000", "2012-03-06 06:05:06.000000", "2012-03-05 
05:04:05.000000", "2012-03-04 04:03:04.000000", "2012-03-03 03:02:03.000000", 
"2012-03-02 02:01:02.000000", "2012-03-01 01:00:01.000000"]
+
+-- !sql_array_sort_DatetimeV2_notnull --
+["2012-03-12 12:11:12.000000", "2012-03-11 11:10:11.000000", "2012-03-10 
10:09:10.000000", "2012-03-09 09:08:09.000000", "2012-03-08 08:07:08.000000", 
"2012-03-07 07:06:07.000000", "2012-03-06 06:05:06.000000", "2012-03-05 
05:04:05.000000", "2012-03-04 04:03:04.000000", "2012-03-03 03:02:03.000000", 
"2012-03-02 02:01:02.000000", "2012-03-01 01:00:01.000000"]
+
+-- !sql_array_sort_Boolean --
+[null, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]
+
+-- !sql_array_sort_Boolean_notnull --
+[1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]
+
+-- !sql_array_sort_lambda_multir_tinyint --
+1      [null, 5, 3, 2, 1]
+2      [null, 9, 8, 7, 6]
+3      [null, 4, 3, 2, 1]
+
+-- !sql_array_sort_lambda_multir_smallint --
+1      [null, 5, 3, 2, 1]
+2      [null, 9, 8, 7, 6]
+3      [null, 4, 3, 2, 1]
+
+-- !sql_array_sort_lambda_multir_int --
+1      [null, 5, 3, 2, 1]
+2      [null, 9, 8, 7, 6]
+3      [null, 4, 3, 2, 1]
+
+-- !sql_array_sort_lambda_multir_bigint --
+1      [null, 5, 3, 2, 1]
+2      [null, 9, 8, 7, 6]
+3      [null, 4, 3, 2, 1]
+
+-- !sql_array_sort_lambda_multir_largeint --
+1      [null, 5, 3, 2, 1]
+2      [null, 9, 8, 7, 6]
+3      [null, 4, 3, 2, 1]
+
+-- !sql_array_sort_lambda_multir_float --
+1      [null, 5.1, 3.1, 2.1, 1.1]
+2      [null, 9.1, 8.1, 7.1, 6.1]
+3      [null, 4.1, 3.1, 2.1, 1.1]
+
+-- !sql_array_sort_lambda_multir_double --
+1      [null, 5.1, 3.1, 2.1, 1.1]
+2      [null, 9.1, 8.1, 7.1, 6.1]
+3      [null, 4.1, 3.1, 2.1, 1.1]
+
+-- !sql_array_sort_lambda_multir_date --
+1      [null, "2024-01-05", "2024-01-03", "2024-01-02", "2024-01-01"]
+2      [null, "2024-02-09", "2024-02-08", "2024-02-07", "2024-02-06"]
+3      [null, "2024-03-04", "2024-03-03", "2024-03-02", "2024-03-01"]
+
+-- !sql_array_sort_lambda_multir_datetime --
+1      [null, "2024-01-05 10:00:00", "2024-01-03 10:00:00", "2024-01-02 
10:00:00", "2024-01-01 10:00:00"]
+2      [null, "2024-02-09 10:00:00", "2024-02-08 10:00:00", "2024-02-07 
10:00:00", "2024-02-06 10:00:00"]
+3      [null, "2024-03-04 10:00:00", "2024-03-03 10:00:00", "2024-03-02 
10:00:00", "2024-03-01 10:00:00"]
+
+-- !sql_array_sort_lambda_multir_datev2 --
+1      [null, "2024-01-05", "2024-01-03", "2024-01-02", "2024-01-01"]
+2      [null, "2024-02-09", "2024-02-08", "2024-02-07", "2024-02-06"]
+3      [null, "2024-03-04", "2024-03-03", "2024-03-02", "2024-03-01"]
+
+-- !sql_array_sort_lambda_multir_datetimev2_0 --
+1      [null, "2024-01-05 10:00:00", "2024-01-03 10:00:00", "2024-01-02 
10:00:00", "2024-01-01 10:00:00"]
+2      [null, "2024-02-09 10:00:00", "2024-02-08 10:00:00", "2024-02-07 
10:00:00", "2024-02-06 10:00:00"]
+3      [null, "2024-03-04 10:00:00", "2024-03-03 10:00:00", "2024-03-02 
10:00:00", "2024-03-01 10:00:00"]
+
+-- !sql_array_sort_lambda_multir_datetimev2_6 --
+1      [null, "2024-01-05 10:00:00.000000", "2024-01-03 10:00:00.000000", 
"2024-01-02 10:00:00.000000", "2024-01-01 10:00:00.000000"]
+2      [null, "2024-02-09 10:00:00.000000", "2024-02-08 10:00:00.000000", 
"2024-02-07 10:00:00.000000", "2024-02-06 10:00:00.000000"]
+3      [null, "2024-03-04 10:00:00.000000", "2024-03-03 10:00:00.000000", 
"2024-03-02 10:00:00.000000", "2024-03-01 10:00:00.000000"]
+
+-- !sql_array_sort_lambda_multir_char --
+1      [null, "e", "c", "b", "a"]
+2      [null, "i", "h", "g", "f"]
+3      [null, "d", "c", "b", "a"]
+
+-- !sql_array_sort_lambda_multir_varchar --
+1      [null, "eee", "ccc", "bbb", "aaa"]
+2      [null, "iii", "hhh", "ggg", "fff"]
+3      [null, "ddd", "ccc", "bbb", "aaa"]
+
+-- !sql_array_sort_lambda_multir_string --
+1      [null, "eee", "ccc", "bbb", "aaa"]
+2      [null, "iii", "hhh", "ggg", "fff"]
+3      [null, "ddd", "ccc", "bbb", "aaa"]
+
+-- !sql_array_sort_lambda_multir_decimal38_38 --
+1      [null, 0.00000000000000000000000000000000000005, 
0.00000000000000000000000000000000000003, 
0.00000000000000000000000000000000000002, 
0.00000000000000000000000000000000000001]
+2      [null, 0.00000000000000000000000000000000000009, 
0.00000000000000000000000000000000000008, 
0.00000000000000000000000000000000000007, 
0.00000000000000000000000000000000000006]
+3      [null, 0.00000000000000000000000000000000000004, 
0.00000000000000000000000000000000000003, 
0.00000000000000000000000000000000000002, 
0.00000000000000000000000000000000000001]
+
+-- !sql_array_sort_lambda_multir_ipv4 --
+1      [null, "127.0.0.5", "127.0.0.3", "127.0.0.2", "127.0.0.1"]
+2      [null, "127.0.0.9", "127.0.0.8", "127.0.0.7", "127.0.0.6"]
+3      [null, "127.0.0.4", "127.0.0.3", "127.0.0.2", "127.0.0.1"]
+
+-- !sql_array_sort_lambda_multir_ipv6 --
+1      [null, "::5", "::3", "::2", "::1"]
+2      [null, "::9", "::8", "::7", "::6"]
+3      [null, "::4", "::3", "::2", "::1"]
+
diff --git 
a/regression-test/suites/nereids_function_p0/scalar_function/Array2.groovy 
b/regression-test/suites/nereids_function_p0/scalar_function/Array2.groovy
new file mode 100644
index 00000000000..eaa648e6c45
--- /dev/null
+++ b/regression-test/suites/nereids_function_p0/scalar_function/Array2.groovy
@@ -0,0 +1,499 @@
+// 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.
+
+suite("nereids_scalar_fn_Array2") {
+    sql 'use regression_test_nereids_function_p0'
+    sql 'set enable_nereids_planner=true'
+    sql 'set enable_fallback_to_original_planner=false'
+    sql 'set enable_decimal256=true;'
+
+    order_qt_sql_array_sort_1 """SELECT array_sort((x, y) -> CASE WHEN x IS 
NULL THEN -1
+                                 WHEN y IS NULL THEN 1
+                                 WHEN x < y THEN 1
+                                 WHEN x = y THEN 0
+                                 ELSE -1 END,
+                                 [3, 2, null, 5, null, 1, 2])"""
+    order_qt_sql_array_sort_2 """SELECT array_sort((x, y) -> CASE WHEN x IS 
NULL THEN 1
+                                 WHEN y IS NULL THEN -1
+                                 WHEN x < y THEN 1
+                                 WHEN x = y THEN 0
+                                 ELSE -1 END,
+                                 [3, 2, null, 5, null, 1, 2])"""
+    order_qt_sql_array_sort_3 """SELECT array_sort((x, y) -> IF(x < y, 1, IF(x 
= y, 0, -1)), [3, 2, 5, 1, 2])"""
+    order_qt_sql_array_sort_4 """SELECT array_sort((x, y) -> IF(x < y, 1, IF(x 
= y, 0, -1)), ['bc', 'ab', 'dc'])"""
+    order_qt_sql_array_sort_5 """SELECT array_sort((x, y) -> IF(length(x) < 
length(y), -1,
+                               IF(length(x) = length(y), 0, 1)),
+                               ['a', 'abcd', 'abc'])"""
+    order_qt_sql_array_sort_6 """SELECT array_sort((x, y) -> IF(cardinality(x) 
< cardinality(y), -1,
+                               IF(cardinality(x) = cardinality(y), 0, 1)),
+                               [[2, 3, 1], [4, 2, 1, 4], [1, 2]])"""
+    order_qt_sql_array_sort_7 """SELECT array_sort((x, y) -> 
IF(IPV4_STRING_TO_NUM_OR_NULL(x) < IPV4_STRING_TO_NUM_OR_NULL(y), -1,
+                               IF(IPV4_STRING_TO_NUM_OR_NULL(x) = 
IPV4_STRING_TO_NUM_OR_NULL(y), 0, 1)),
+                               ['192.168.0.3', '192.168.0.1', 
'192.168.0.2'])"""
+    order_qt_sql_array_sort_8 """SELECT array_sort((x, y) -> IF(x < y, 1, IF(x 
= y, 0, -1)), [3, -2.1, 5.34, 1.2, 2.2])"""
+
+    order_qt_sql_array_sort_Tinyint """SELECT array_sort((x, y) -> CASE WHEN x 
IS NULL THEN -1
+                                 WHEN y IS NULL THEN 1
+                                 WHEN x < y THEN 1
+                                 WHEN x = y THEN 0
+                                 ELSE -1 END, arr) FROM (SELECT 
array_agg(ktint) AS arr FROM fn_test)t"""
+    order_qt_sql_array_sort_Tinyint_notnull """SELECT array_sort((x, y) -> 
IF(x < y, 1, IF(x = y, 0, -1)), arr) FROM (SELECT array_agg(ktint) AS arr FROM 
fn_test_not_nullable)t"""
+    order_qt_sql_array_sort_Smallint """SELECT array_sort((x, y) -> CASE WHEN 
x IS NULL THEN -1
+                                 WHEN y IS NULL THEN 1
+                                 WHEN x < y THEN 1
+                                 WHEN x = y THEN 0
+                                 ELSE -1 END, arr) FROM (SELECT 
array_agg(ksint) AS arr FROM fn_test)t"""
+    order_qt_sql_array_sort_Smallint_notnull """SELECT array_sort((x, y) -> 
IF(x < y, 1, IF(x = y, 0, -1)), arr) FROM (SELECT array_agg(ksint) AS arr FROM 
fn_test_not_nullable)t"""
+    order_qt_sql_array_sort_Int """SELECT array_sort((x, y) -> CASE WHEN x IS 
NULL THEN -1
+                                 WHEN y IS NULL THEN 1
+                                 WHEN x < y THEN 1
+                                 WHEN x = y THEN 0
+                                 ELSE -1 END, arr) FROM (SELECT 
array_agg(kint) AS arr FROM fn_test)t"""
+    order_qt_sql_array_sort_Int_notnull """SELECT array_sort((x, y) -> IF(x < 
y, 1, IF(x = y, 0, -1)), arr) FROM (SELECT array_agg(kint) AS arr FROM 
fn_test_not_nullable)t"""
+    order_qt_sql_array_sort_Bigint """SELECT array_sort((x, y) -> CASE WHEN x 
IS NULL THEN -1
+                                 WHEN y IS NULL THEN 1
+                                 WHEN x < y THEN 1
+                                 WHEN x = y THEN 0
+                                 ELSE -1 END, arr) FROM (SELECT 
array_agg(kbint) AS arr FROM fn_test)t"""
+    order_qt_sql_array_sort_Bigint_notnull """SELECT array_sort((x, y) -> IF(x 
< y, 1, IF(x = y, 0, -1)), arr) FROM (SELECT array_agg(kbint) AS arr FROM 
fn_test_not_nullable)t"""
+    order_qt_sql_array_sort_Largeint """SELECT array_sort((x, y) -> CASE WHEN 
x IS NULL THEN -1
+                                 WHEN y IS NULL THEN 1
+                                 WHEN x < y THEN 1
+                                 WHEN x = y THEN 0
+                                 ELSE -1 END, arr) FROM (SELECT 
array_agg(klint) AS arr FROM fn_test)t"""
+    order_qt_sql_array_sort_LargeInt_notnull """SELECT array_sort((x, y) -> 
IF(x < y, 1, IF(x = y, 0, -1)), arr) FROM (SELECT array_agg(klint) AS arr FROM 
fn_test_not_nullable)t"""
+    order_qt_sql_array_sort_Float """SELECT array_sort((x, y) -> CASE WHEN x 
IS NULL THEN -1
+                                 WHEN y IS NULL THEN 1
+                                 WHEN x < y THEN 1
+                                 WHEN x = y THEN 0
+                                 ELSE -1 END, arr) FROM (SELECT 
array_agg(kfloat) AS arr FROM fn_test)t"""
+    order_qt_sql_array_sort_Float_notnull """SELECT array_sort((x, y) -> IF(x 
< y, 1, IF(x = y, 0, -1)), arr) FROM (SELECT array_agg(kfloat) AS arr FROM 
fn_test_not_nullable)t"""
+    order_qt_sql_array_sort_Double """SELECT array_sort((x, y) -> CASE WHEN x 
IS NULL THEN -1
+                                 WHEN y IS NULL THEN 1
+                                 WHEN x < y THEN 1
+                                 WHEN x = y THEN 0
+                                 ELSE -1 END, arr) FROM (SELECT 
array_agg(kdbl) AS arr FROM fn_test)t"""
+    order_qt_sql_array_sort_Double_notnull """SELECT array_sort((x, y) -> IF(x 
< y, 1, IF(x = y, 0, -1)), arr) FROM (SELECT array_agg(kdbl) AS arr FROM 
fn_test_not_nullable)t"""
+    order_qt_sql_array_sort_Demical1 """SELECT array_sort((x, y) -> CASE WHEN 
x IS NULL THEN -1
+                                 WHEN y IS NULL THEN 1
+                                 WHEN x < y THEN 1
+                                 WHEN x = y THEN 0
+                                 ELSE -1 END, arr) FROM (SELECT 
array_agg(kdcmls1) AS arr FROM fn_test)t"""
+    order_qt_sql_array_sort_Demical1_notnull """SELECT array_sort((x, y) -> 
IF(x < y, 1, IF(x = y, 0, -1)), arr) FROM (SELECT array_agg(kdcmls1) AS arr 
FROM fn_test_not_nullable)t"""
+    order_qt_sql_array_sort_Demical2 """SELECT array_sort((x, y) -> CASE WHEN 
x IS NULL THEN -1
+                                 WHEN y IS NULL THEN 1
+                                 WHEN x < y THEN 1
+                                 WHEN x = y THEN 0
+                                 ELSE -1 END, arr) FROM (SELECT 
array_agg(kdcmls2) AS arr FROM fn_test)t"""
+    order_qt_sql_array_sort_Demical2_notnull """SELECT array_sort((x, y) -> 
IF(x < y, 1, IF(x = y, 0, -1)), arr) FROM (SELECT array_agg(kdcmls2) AS arr 
FROM fn_test_not_nullable)t"""
+    order_qt_sql_array_sort_Demical3 """SELECT array_sort((x, y) -> CASE WHEN 
x IS NULL THEN -1
+                                 WHEN y IS NULL THEN 1
+                                 WHEN x < y THEN 1
+                                 WHEN x = y THEN 0
+                                 ELSE -1 END, arr) FROM (SELECT 
array_agg(kdcmls3) AS arr FROM fn_test)t"""
+    order_qt_sql_array_sort_Demical3_notnull """SELECT array_sort((x, y) -> 
IF(x < y, 1, IF(x = y, 0, -1)), arr) FROM (SELECT array_agg(kdcmls3) AS arr 
FROM fn_test_not_nullable)t"""
+    order_qt_sql_array_sort_Demical4 """SELECT array_sort((x, y) -> CASE WHEN 
x IS NULL THEN -1
+                                 WHEN y IS NULL THEN 1
+                                 WHEN x < y THEN 1
+                                 WHEN x = y THEN 0
+                                 ELSE -1 END, arr) FROM (SELECT 
array_agg(kdcmlv3s1) AS arr FROM fn_test)t"""
+    order_qt_sql_array_sort_Demical4_notnull """SELECT array_sort((x, y) -> 
IF(x < y, 1, IF(x = y, 0, -1)), arr) FROM (SELECT array_agg(kdcmlv3s1) AS arr 
FROM fn_test_not_nullable)t"""
+    order_qt_sql_array_sort_Demical5 """SELECT array_sort((x, y) -> CASE WHEN 
x IS NULL THEN -1
+                                 WHEN y IS NULL THEN 1
+                                 WHEN x < y THEN 1
+                                 WHEN x = y THEN 0
+                                 ELSE -1 END, arr) FROM (SELECT 
array_agg(kdcmlv3s2) AS arr FROM fn_test)t"""
+    order_qt_sql_array_sort_Demical5_notnull """SELECT array_sort((x, y) -> 
IF(x < y, 1, IF(x = y, 0, -1)), arr) FROM (SELECT array_agg(kdcmlv3s2) AS arr 
FROM fn_test_not_nullable)t"""
+    order_qt_sql_array_sort_Demical6 """SELECT array_sort((x, y) -> CASE WHEN 
x IS NULL THEN -1
+                                 WHEN y IS NULL THEN 1
+                                 WHEN x < y THEN 1
+                                 WHEN x = y THEN 0
+                                 ELSE -1 END, arr) FROM (SELECT 
array_agg(kdcmlv3s3) AS arr FROM fn_test)t"""
+    order_qt_sql_array_sort_Demical6_notnull """SELECT array_sort((x, y) -> 
IF(x < y, 1, IF(x = y, 0, -1)), arr) FROM (SELECT array_agg(kdcmlv3s3) AS arr 
FROM fn_test_not_nullable)t"""
+    order_qt_sql_array_sort_Char """SELECT array_sort((x, y) -> CASE WHEN x IS 
NULL THEN -1
+                                 WHEN y IS NULL THEN 1
+                                 WHEN x < y THEN 1
+                                 WHEN x = y THEN 0
+                                 ELSE -1 END, arr) FROM (SELECT 
array_agg(kchrs3) AS arr FROM fn_test)t"""
+    order_qt_sql_array_sort_Char_notnull """SELECT array_sort((x, y) -> IF(x < 
y, 1, IF(x = y, 0, -1)), arr) FROM (SELECT array_agg(kchrs3) AS arr FROM 
fn_test_not_nullable)t"""
+    order_qt_sql_array_sort_Varchar """SELECT array_sort((x, y) -> CASE WHEN x 
IS NULL THEN -1
+                                 WHEN y IS NULL THEN 1
+                                 WHEN x < y THEN 1
+                                 WHEN x = y THEN 0
+                                 ELSE -1 END, arr) FROM (SELECT 
array_agg(kvchrs3) AS arr FROM fn_test)t"""
+    order_qt_sql_array_sort_Varchar_notnull """SELECT array_sort((x, y) -> 
IF(x < y, 1, IF(x = y, 0, -1)), arr) FROM (SELECT array_agg(kvchrs3) AS arr 
FROM fn_test_not_nullable)t"""
+    order_qt_sql_array_sort_String """SELECT array_sort((x, y) -> CASE WHEN x 
IS NULL THEN -1
+                                 WHEN y IS NULL THEN 1
+                                 WHEN x < y THEN 1
+                                 WHEN x = y THEN 0
+                                 ELSE -1 END, arr) FROM (SELECT 
array_agg(kstr) AS arr FROM fn_test)t"""
+    order_qt_sql_array_sort_String_notnull """SELECT array_sort((x, y) -> IF(x 
< y, 1, IF(x = y, 0, -1)), arr) FROM (SELECT array_agg(kstr) AS arr FROM 
fn_test_not_nullable)t"""
+    order_qt_sql_array_sort_Date """SELECT array_sort((x, y) -> CASE WHEN x IS 
NULL THEN -1
+                                 WHEN y IS NULL THEN 1
+                                 WHEN x < y THEN 1
+                                 WHEN x = y THEN 0
+                                 ELSE -1 END, arr) FROM (SELECT array_agg(kdt) 
AS arr FROM fn_test)t"""
+    order_qt_sql_array_sort_Date_notnull """SELECT array_sort((x, y) -> IF(x < 
y, 1, IF(x = y, 0, -1)), arr) FROM (SELECT array_agg(kdt) AS arr FROM 
fn_test_not_nullable)t"""
+    order_qt_sql_array_sort_DateV2 """SELECT array_sort((x, y) -> CASE WHEN x 
IS NULL THEN -1
+                                 WHEN y IS NULL THEN 1
+                                 WHEN x < y THEN 1
+                                 WHEN x = y THEN 0
+                                 ELSE -1 END, arr) FROM (SELECT 
array_agg(kdtv2) AS arr FROM fn_test)t"""
+    order_qt_sql_array_sort_DateV2_notnull """SELECT array_sort((x, y) -> IF(x 
< y, 1, IF(x = y, 0, -1)), arr) FROM (SELECT array_agg(kdtv2) AS arr FROM 
fn_test_not_nullable)t"""
+    order_qt_sql_array_sort_Datetime """SELECT array_sort((x, y) -> CASE WHEN 
x IS NULL THEN -1
+                                 WHEN y IS NULL THEN 1
+                                 WHEN x < y THEN 1
+                                 WHEN x = y THEN 0
+                                 ELSE -1 END, arr) FROM (SELECT 
array_agg(kdtm) AS arr FROM fn_test)t"""
+    order_qt_sql_array_sort_Datetime_notnull """SELECT array_sort((x, y) -> 
IF(x < y, 1, IF(x = y, 0, -1)), arr) FROM (SELECT array_agg(kdtm) AS arr FROM 
fn_test_not_nullable)t"""
+    order_qt_sql_array_sort_DatetimeV2 """SELECT array_sort((x, y) -> CASE 
WHEN x IS NULL THEN -1
+                                 WHEN y IS NULL THEN 1
+                                 WHEN x < y THEN 1
+                                 WHEN x = y THEN 0
+                                 ELSE -1 END, arr) FROM (SELECT 
array_agg(kdtmv2s3) AS arr FROM fn_test)t"""
+    order_qt_sql_array_sort_DatetimeV2_notnull """SELECT array_sort((x, y) -> 
IF(x < y, 1, IF(x = y, 0, -1)), arr) FROM (SELECT array_agg(kdtmv2s3) AS arr 
FROM fn_test_not_nullable)t"""
+    order_qt_sql_array_sort_Boolean """SELECT array_sort((x, y) -> CASE WHEN x 
IS NULL THEN -1
+                                 WHEN y IS NULL THEN 1
+                                 WHEN x < y THEN 1
+                                 WHEN x = y THEN 0
+                                 ELSE -1 END, arr) FROM (SELECT 
array_agg(kbool) AS arr FROM fn_test)t"""
+    order_qt_sql_array_sort_Boolean_notnull """SELECT array_sort((x, y) -> 
IF(x < y, 1, IF(x = y, 0, -1)), arr) FROM (SELECT array_agg(kbool) AS arr FROM 
fn_test_not_nullable)t"""
+
+    // Test multiple rows of data
+    sql """ DROP TABLE IF EXISTS fn_test_array_sort"""
+    sql """
+        CREATE TABLE IF NOT EXISTS `fn_test_array_sort` (
+            `id` int null,
+            `katint` array<tinyint(4)> null,
+            `kasint` array<smallint(6)> null,
+            `kaint` array<int> null,
+            `kabint` array<bigint(20)> null,
+            `kalint` array<largeint(40)> null,
+            `kafloat` array<float> null,
+            `kadbl` array<double> null,
+            `kadt` array<date> null,
+            `kadtm` array<datetime> null,
+            `kadtv2` array<datev2> null,
+            `kadtmv2_` array<datetimev2(0)> null,
+            `kadtmv2` array<datetimev2(6)> null,
+            `kachr` array<char(255)> null,
+            `kavchr` array<varchar(65533)> null,
+            `kastr` array<string> null,
+            `kadcml2` array<decimal(38, 38)> null,
+            `kaipv4` array<ipv4> null,
+            `kaipv6` array<ipv6> null
+        ) engine=olap
+        DISTRIBUTED BY HASH(`id`) BUCKETS 4
+        properties("replication_num" = "1","store_row_column" = "true")
+    """
+
+    sql """INSERT INTO fn_test_array_sort (
+            id, katint, kasint, kaint, kabint, kalint, kafloat, kadbl,
+            kadt, kadtm, kadtv2, kadtmv2_, kadtmv2,
+            kachr, kavchr, kastr,
+            kadcml2, kaipv4, kaipv6
+        ) VALUES
+        (
+            1,
+            [3, 1, NULL, 5, 2],
+            [3, 1, NULL, 5, 2],
+            [3, 1, NULL, 5, 2],
+            [3, 1, NULL, 5, 2],
+            [3, 1, NULL, 5, 2],
+            [3.1, 1.1, NULL, 5.1, 2.1],
+            [3.1, 1.1, NULL, 5.1, 2.1],
+            ['2024-01-03', '2024-01-01', NULL, '2024-01-05', '2024-01-02'],
+            ['2024-01-03 10:00:00','2024-01-01 10:00:00',NULL,'2024-01-05 
10:00:00','2024-01-02 10:00:00'],
+            ['2024-01-03','2024-01-01',NULL,'2024-01-05','2024-01-02'],
+            ['2024-01-03 10:00:00', '2024-01-01 10:00:00', NULL, '2024-01-05 
10:00:00', '2024-01-02 10:00:00'],
+            ['2024-01-03 10:00:00.000000','2024-01-01 
10:00:00.000000',NULL,'2024-01-05 10:00:00.000000','2024-01-02 
10:00:00.000000'],
+            ['c','a',NULL,'e','b'],
+            ['ccc','aaa',NULL,'eee','bbb'],
+            ['ccc','aaa',NULL,'eee','bbb'],
+            [0.00000000000000000000000000000000000003, NULL,
+            0.00000000000000000000000000000000000001,
+            0.00000000000000000000000000000000000005,
+            0.00000000000000000000000000000000000002],
+            ['127.0.0.3','127.0.0.1',NULL,'127.0.0.5','127.0.0.2'],
+            ['::3','::1',NULL,'::5','::2']
+        ),
+        (
+            2,
+            [9, 7, NULL, 8, 6],
+            [9, 7, NULL, 8, 6],
+            [9, 7, NULL, 8, 6],
+            [9, 7, NULL, 8, 6],
+            [9, 7, NULL, 8, 6],
+            [9.1, 7.1, NULL, 8.1, 6.1],
+            [9.1, 7.1, NULL, 8.1, 6.1],
+            ['2024-02-09','2024-02-07',NULL,'2024-02-08','2024-02-06'],
+            ['2024-02-09 10:00:00','2024-02-07 10:00:00',NULL,'2024-02-08 
10:00:00','2024-02-06 10:00:00'],
+            ['2024-02-09','2024-02-07',NULL,'2024-02-08','2024-02-06'],
+            ['2024-02-09 10:00:00','2024-02-07 10:00:00',NULL,'2024-02-08 
10:00:00','2024-02-06 10:00:00'],
+            ['2024-02-09 10:00:00.000000','2024-02-07 
10:00:00.000000',NULL,'2024-02-08 10:00:00.000000','2024-02-06 
10:00:00.000000'],
+            ['i','g',NULL,'h','f'],
+            ['iii','ggg',NULL,'hhh','fff'],
+            ['iii','ggg',NULL,'hhh','fff'],
+            [0.00000000000000000000000000000000000009, NULL,
+            0.00000000000000000000000000000000000007,
+            0.00000000000000000000000000000000000008,
+            0.00000000000000000000000000000000000006],
+            ['127.0.0.9','127.0.0.7',NULL,'127.0.0.8','127.0.0.6'],
+            ['::9','::7',NULL,'::8','::6']
+        ),
+        (
+            3,
+            [4, 3, NULL, 2, 1],
+            [4, 3, NULL, 2, 1],
+            [4, 3, NULL, 2, 1],
+            [4, 3, NULL, 2, 1],
+            [4, 3, NULL, 2, 1],
+            [4.1, 3.1, NULL, 2.1, 1.1],
+            [4.1, 3.1, NULL, 2.1, 1.1],
+            ['2024-03-04','2024-03-03',NULL,'2024-03-02','2024-03-01'],
+            ['2024-03-04 10:00:00','2024-03-03 10:00:00',NULL,'2024-03-02 
10:00:00','2024-03-01 10:00:00'],
+            ['2024-03-04','2024-03-03',NULL,'2024-03-02','2024-03-01'],
+            ['2024-03-04 10:00:00','2024-03-03 10:00:00',NULL,'2024-03-02 
10:00:00','2024-03-01 10:00:00'],
+            ['2024-03-04 10:00:00.000000','2024-03-03 
10:00:00.000000',NULL,'2024-03-02 10:00:00.000000','2024-03-01 
10:00:00.000000'],
+            ['d','c',NULL,'b','a'],
+            ['ddd','ccc',NULL,'bbb','aaa'],
+            ['ddd','ccc',NULL,'bbb','aaa'],
+            [0.00000000000000000000000000000000000004, NULL,
+            0.00000000000000000000000000000000000003,
+            0.00000000000000000000000000000000000002,
+            0.00000000000000000000000000000000000001],
+            ['127.0.0.4','127.0.0.3',NULL,'127.0.0.2','127.0.0.1'],
+            ['::4','::3',NULL,'::2','::1']
+        )
+    """
+
+    order_qt_sql_array_sort_lambda_multir_tinyint """
+        SELECT id, array_sort(
+                (x, y) -> CASE WHEN x IS NULL THEN -1 
+                            WHEN y IS NULL THEN 1
+                            WHEN x < y THEN 1
+                            WHEN x = y THEN 0
+                            ELSE -1 END,
+                katint)
+        FROM fn_test_array_sort
+        ORDER BY id
+    """
+
+    order_qt_sql_array_sort_lambda_multir_smallint """
+        SELECT id, array_sort(
+                (x, y) -> CASE WHEN x IS NULL THEN -1 
+                            WHEN y IS NULL THEN 1
+                            WHEN x < y THEN 1
+                            WHEN x = y THEN 0
+                            ELSE -1 END,
+                kasint)
+        FROM fn_test_array_sort
+        ORDER BY id
+    """
+
+    order_qt_sql_array_sort_lambda_multir_int """
+        SELECT id, array_sort(
+                (x, y) -> CASE WHEN x IS NULL THEN -1 
+                            WHEN y IS NULL THEN 1
+                            WHEN x < y THEN 1
+                            WHEN x = y THEN 0
+                            ELSE -1 END,
+                kaint)
+        FROM fn_test_array_sort
+        ORDER BY id
+    """
+
+    order_qt_sql_array_sort_lambda_multir_bigint """
+        SELECT id, array_sort(
+                (x, y) -> CASE WHEN x IS NULL THEN -1 
+                            WHEN y IS NULL THEN 1
+                            WHEN x < y THEN 1
+                            WHEN x = y THEN 0
+                            ELSE -1 END,
+                kabint)
+        FROM fn_test_array_sort
+        ORDER BY id
+    """
+
+    order_qt_sql_array_sort_lambda_multir_largeint """
+        SELECT id, array_sort(
+                (x, y) -> CASE WHEN x IS NULL THEN -1 
+                            WHEN y IS NULL THEN 1
+                            WHEN x < y THEN 1
+                            WHEN x = y THEN 0
+                            ELSE -1 END,
+                kalint)
+        FROM fn_test_array_sort
+        ORDER BY id
+    """
+
+    order_qt_sql_array_sort_lambda_multir_float """
+        SELECT id, array_sort(
+                (x, y) -> CASE WHEN x IS NULL THEN -1 
+                            WHEN y IS NULL THEN 1
+                            WHEN x < y THEN 1
+                            WHEN x = y THEN 0
+                            ELSE -1 END,
+                kafloat)
+        FROM fn_test_array_sort
+        ORDER BY id
+    """
+
+    order_qt_sql_array_sort_lambda_multir_double """
+        SELECT id, array_sort(
+                (x, y) -> CASE WHEN x IS NULL THEN -1 
+                            WHEN y IS NULL THEN 1
+                            WHEN x < y THEN 1
+                            WHEN x = y THEN 0
+                            ELSE -1 END,
+                kadbl)
+        FROM fn_test_array_sort
+        ORDER BY id
+    """
+
+    order_qt_sql_array_sort_lambda_multir_date """
+        SELECT id, array_sort(
+                (x, y) -> CASE WHEN x IS NULL THEN -1 
+                            WHEN y IS NULL THEN 1
+                            WHEN x < y THEN 1
+                            WHEN x = y THEN 0
+                            ELSE -1 END,
+                kadt)
+        FROM fn_test_array_sort
+        ORDER BY id
+    """
+
+    order_qt_sql_array_sort_lambda_multir_datetime """
+        SELECT id, array_sort(
+                (x, y) -> CASE WHEN x IS NULL THEN -1 
+                            WHEN y IS NULL THEN 1
+                            WHEN x < y THEN 1
+                            WHEN x = y THEN 0
+                            ELSE -1 END,
+                kadtm)
+        FROM fn_test_array_sort
+        ORDER BY id
+    """
+
+    order_qt_sql_array_sort_lambda_multir_datev2 """
+        SELECT id, array_sort(
+                (x, y) -> CASE WHEN x IS NULL THEN -1 
+                            WHEN y IS NULL THEN 1
+                            WHEN x < y THEN 1
+                            WHEN x = y THEN 0
+                            ELSE -1 END,
+                kadtv2)
+        FROM fn_test_array_sort
+        ORDER BY id
+    """
+
+    order_qt_sql_array_sort_lambda_multir_datetimev2_0 """
+        SELECT id, array_sort(
+                (x, y) -> CASE WHEN x IS NULL THEN -1 
+                            WHEN y IS NULL THEN 1
+                            WHEN x < y THEN 1
+                            WHEN x = y THEN 0
+                            ELSE -1 END,
+                kadtmv2_)
+        FROM fn_test_array_sort
+        ORDER BY id
+    """
+
+    order_qt_sql_array_sort_lambda_multir_datetimev2_6 """
+        SELECT id, array_sort(
+                (x, y) -> CASE WHEN x IS NULL THEN -1 
+                            WHEN y IS NULL THEN 1
+                            WHEN x < y THEN 1
+                            WHEN x = y THEN 0
+                            ELSE -1 END,
+                kadtmv2)
+        FROM fn_test_array_sort
+        ORDER BY id
+    """
+
+    order_qt_sql_array_sort_lambda_multir_char """
+        SELECT id, array_sort(
+                (x, y) -> CASE WHEN x IS NULL THEN -1 
+                            WHEN y IS NULL THEN 1
+                            WHEN x < y THEN 1
+                            WHEN x = y THEN 0
+                            ELSE -1 END,
+                kachr)
+        FROM fn_test_array_sort
+        ORDER BY id
+    """
+
+    order_qt_sql_array_sort_lambda_multir_varchar """
+        SELECT id, array_sort(
+                (x, y) -> CASE WHEN x IS NULL THEN -1 
+                            WHEN y IS NULL THEN 1
+                            WHEN x < y THEN 1
+                            WHEN x = y THEN 0
+                            ELSE -1 END,
+                kavchr)
+        FROM fn_test_array_sort
+        ORDER BY id
+    """
+
+    order_qt_sql_array_sort_lambda_multir_string """
+        SELECT id, array_sort(
+                (x, y) -> CASE WHEN x IS NULL THEN -1 
+                            WHEN y IS NULL THEN 1
+                            WHEN x < y THEN 1
+                            WHEN x = y THEN 0
+                            ELSE -1 END,
+                kastr)
+        FROM fn_test_array_sort
+        ORDER BY id
+    """
+
+    order_qt_sql_array_sort_lambda_multir_decimal38_38 """
+        SELECT id, array_sort(
+                (x, y) -> CASE WHEN x IS NULL THEN -1 
+                            WHEN y IS NULL THEN 1
+                            WHEN x < y THEN 1
+                            WHEN x = y THEN 0
+                            ELSE -1 END,
+                kadcml2)
+        FROM fn_test_array_sort
+        ORDER BY id
+    """
+
+    order_qt_sql_array_sort_lambda_multir_ipv4 """
+        SELECT id, array_sort(
+                (x, y) -> CASE WHEN x IS NULL THEN -1 
+                            WHEN y IS NULL THEN 1
+                            WHEN x < y THEN 1
+                            WHEN x = y THEN 0
+                            ELSE -1 END,
+                kaipv4)
+        FROM fn_test_array_sort
+        ORDER BY id
+    """
+
+    order_qt_sql_array_sort_lambda_multir_ipv6 """
+        SELECT id, array_sort(
+                (x, y) -> CASE WHEN x IS NULL THEN -1 
+                            WHEN y IS NULL THEN 1
+                            WHEN x < y THEN 1
+                            WHEN x = y THEN 0
+                            ELSE -1 END,
+                kaipv6)
+        FROM fn_test_array_sort
+        ORDER BY id
+    """
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to