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

morrysnow pushed a commit to branch 2.1_38497
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 13e2306c0a6b47d4517fe016830959fbe9e587d8
Author: morrySnow <101034200+morrys...@users.noreply.github.com>
AuthorDate: Tue Aug 13 19:42:46 2024 +0800

    [fix](Nereids) polish function signature search algorithm (#38497)
    
    pick from master #38497 and #39342
    
    use array<double> for array<string>
    - array_avg
    - array_cum_sum
    - array_difference
    - array_product
    
    use array<bigint> for array<string>
    - bitmap_from_array
    
    use double first
    - fmod
    - pmod
    
    let high order function throw friendly exception
    - array_filter
    - array_first
    - array_last
    - array_reverse_split
    - array_sort_by
    - array_split
    
    let return type same as parameter's type
    - array_push_back
    - array_push_front
    - array_with_constant
    - if
    
    let greatest / least work same as mysql's greatest
---
 fe/.idea/vcs.xml                                   | 22 ++--------
 .../nereids/rules/analysis/ExpressionAnalyzer.java |  4 +-
 .../expressions/functions/scalar/ArrayAvg.java     |  4 +-
 .../expressions/functions/scalar/ArrayCumSum.java  |  4 +-
 .../functions/scalar/ArrayDifference.java          |  2 +-
 .../functions/scalar/ArrayEnumerateUniq.java       |  3 +-
 .../expressions/functions/scalar/ArrayFilter.java  |  2 +-
 .../expressions/functions/scalar/ArrayFirst.java   |  5 ---
 .../expressions/functions/scalar/ArrayLast.java    |  5 ---
 .../expressions/functions/scalar/ArrayProduct.java |  4 +-
 .../functions/scalar/ArrayPushBack.java            |  4 +-
 .../functions/scalar/ArrayPushFront.java           |  4 +-
 .../expressions/functions/scalar/ArraySortBy.java  |  2 +-
 .../functions/scalar/ArrayWithConstant.java        |  4 +-
 .../functions/scalar/BitmapFromArray.java          |  6 +--
 .../expressions/functions/scalar/Coalesce.java     |  6 +--
 .../trees/expressions/functions/scalar/Fmod.java   |  4 +-
 .../expressions/functions/scalar/Greatest.java     | 47 +++++++++++++++-------
 .../trees/expressions/functions/scalar/If.java     | 11 ++++-
 .../expressions/functions/scalar/LastDay.java      |  6 +--
 .../trees/expressions/functions/scalar/Least.java  | 47 +++++++++++++++-------
 .../expressions/functions/scalar/MinutesDiff.java  |  2 +-
 .../trees/expressions/functions/scalar/Pmod.java   | 42 ++++++++++++++++---
 .../doris/nereids/util/TypeCoercionUtils.java      | 32 ++++++++++++++-
 .../data/nereids_function_p0/type_coercion.out     | 37 +++++++++++++++++
 .../nereids_function_p0/type_coercion.groovy       | 31 ++++++++++++++
 26 files changed, 249 insertions(+), 91 deletions(-)

diff --git a/fe/.idea/vcs.xml b/fe/.idea/vcs.xml
index 7b2cdb1cbbd..8c0f59e92e6 100644
--- a/fe/.idea/vcs.xml
+++ b/fe/.idea/vcs.xml
@@ -1,20 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!--
-   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.
-  -->
 <project version="4">
   <component name="IssueNavigationConfiguration">
     <option name="links">
@@ -27,6 +11,8 @@
     </option>
   </component>
   <component name="VcsDirectoryMappings">
-      <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/../be/src/apache-orc" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/../be/src/clucene" vcs="Git" />
   </component>
-</project>
+</project>
\ No newline at end of file
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 afec568545b..91b5bf671ca 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
@@ -811,9 +811,7 @@ public class ExpressionAnalyzer extends 
SubExprAnalyzer<ExpressionRewriteContext
         Lambda lambdaClosure = 
lambda.withLambdaFunctionArguments(lambdaFunction, arrayItemReferences);
 
         // We don't add the ArrayExpression in high order function at all
-        return unboundFunction.withChildren(ImmutableList.<Expression>builder()
-                .add(lambdaClosure)
-                .build());
+        return unboundFunction.withChildren(ImmutableList.of(lambdaClosure));
     }
 
     private boolean shouldBindSlotBy(int namePartSize, Slot boundSlot) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayAvg.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayAvg.java
index eac07935a38..e07351f2a5c 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayAvg.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayAvg.java
@@ -48,6 +48,7 @@ public class ArrayAvg extends ScalarFunction implements 
ExplicitlyCastableSignat
         ComputePrecisionForArrayItemAgg, UnaryExpression, AlwaysNullable {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
+            
FunctionSignature.ret(DoubleType.INSTANCE).args(ArrayType.of(DoubleType.INSTANCE)),
             
FunctionSignature.ret(DoubleType.INSTANCE).args(ArrayType.of(BooleanType.INSTANCE)),
             
FunctionSignature.ret(DoubleType.INSTANCE).args(ArrayType.of(TinyIntType.INSTANCE)),
             
FunctionSignature.ret(DoubleType.INSTANCE).args(ArrayType.of(SmallIntType.INSTANCE)),
@@ -56,8 +57,7 @@ public class ArrayAvg extends ScalarFunction implements 
ExplicitlyCastableSignat
             
FunctionSignature.ret(DoubleType.INSTANCE).args(ArrayType.of(LargeIntType.INSTANCE)),
             
FunctionSignature.ret(DecimalV3Type.WILDCARD).args(ArrayType.of(DecimalV3Type.WILDCARD)),
             
FunctionSignature.ret(DecimalV2Type.SYSTEM_DEFAULT).args(ArrayType.of(DecimalV2Type.SYSTEM_DEFAULT)),
-            
FunctionSignature.ret(DoubleType.INSTANCE).args(ArrayType.of(FloatType.INSTANCE)),
-            
FunctionSignature.ret(DoubleType.INSTANCE).args(ArrayType.of(DoubleType.INSTANCE))
+            
FunctionSignature.ret(DoubleType.INSTANCE).args(ArrayType.of(FloatType.INSTANCE))
     );
 
     /**
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayCumSum.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayCumSum.java
index f3f0e54e5c2..4b469b8cbdb 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayCumSum.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayCumSum.java
@@ -47,6 +47,7 @@ public class ArrayCumSum extends ScalarFunction
         implements ExplicitlyCastableSignature, 
ComputePrecisionForArrayItemAgg, UnaryExpression, PropagateNullable {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
+            
FunctionSignature.ret(ArrayType.of(DoubleType.INSTANCE)).args(ArrayType.of(DoubleType.INSTANCE)),
             
FunctionSignature.ret(ArrayType.of(BigIntType.INSTANCE)).args(ArrayType.of(TinyIntType.INSTANCE)),
             
FunctionSignature.ret(ArrayType.of(BigIntType.INSTANCE)).args(ArrayType.of(SmallIntType.INSTANCE)),
             
FunctionSignature.ret(ArrayType.of(BigIntType.INSTANCE)).args(ArrayType.of(IntegerType.INSTANCE)),
@@ -55,8 +56,7 @@ public class ArrayCumSum extends ScalarFunction
             
FunctionSignature.ret(ArrayType.of(DecimalV3Type.WILDCARD)).args(ArrayType.of(DecimalV3Type.WILDCARD)),
             FunctionSignature.ret(ArrayType.of(DecimalV2Type.SYSTEM_DEFAULT))
                     .args(ArrayType.of(DecimalV2Type.SYSTEM_DEFAULT)),
-            
FunctionSignature.ret(ArrayType.of(DoubleType.INSTANCE)).args(ArrayType.of(FloatType.INSTANCE)),
-            
FunctionSignature.ret(ArrayType.of(DoubleType.INSTANCE)).args(ArrayType.of(DoubleType.INSTANCE))
+            
FunctionSignature.ret(ArrayType.of(DoubleType.INSTANCE)).args(ArrayType.of(FloatType.INSTANCE))
     );
 
     /**
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayDifference.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayDifference.java
index ce1aa70b0f1..21245315e32 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayDifference.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayDifference.java
@@ -46,13 +46,13 @@ public class ArrayDifference extends ScalarFunction
         implements UnaryExpression, ExplicitlyCastableSignature, 
PropagateNullable {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
+            
FunctionSignature.ret(ArrayType.of(DoubleType.INSTANCE)).args(ArrayType.of(DoubleType.INSTANCE)),
             
FunctionSignature.ret(ArrayType.of(SmallIntType.INSTANCE)).args(ArrayType.of(TinyIntType.INSTANCE)),
             
FunctionSignature.ret(ArrayType.of(IntegerType.INSTANCE)).args(ArrayType.of(SmallIntType.INSTANCE)),
             
FunctionSignature.ret(ArrayType.of(BigIntType.INSTANCE)).args(ArrayType.of(IntegerType.INSTANCE)),
             
FunctionSignature.ret(ArrayType.of(LargeIntType.INSTANCE)).args(ArrayType.of(BigIntType.INSTANCE)),
             
FunctionSignature.ret(ArrayType.of(LargeIntType.INSTANCE)).args(ArrayType.of(LargeIntType.INSTANCE)),
             
FunctionSignature.ret(ArrayType.of(DoubleType.INSTANCE)).args(ArrayType.of(FloatType.INSTANCE)),
-            
FunctionSignature.ret(ArrayType.of(DoubleType.INSTANCE)).args(ArrayType.of(DoubleType.INSTANCE)),
             
FunctionSignature.retArgType(0).args(ArrayType.of(DecimalV2Type.SYSTEM_DEFAULT)),
             
FunctionSignature.retArgType(0).args(ArrayType.of(DecimalV3Type.WILDCARD))
     );
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayEnumerateUniq.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayEnumerateUniq.java
index 4743cf15516..99eba19e5dc 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayEnumerateUniq.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayEnumerateUniq.java
@@ -41,7 +41,8 @@ public class ArrayEnumerateUniq extends ScalarFunction
         implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullable {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
-            
FunctionSignature.ret(ArrayType.of(BigIntType.INSTANCE)).varArgs(ArrayType.of(new
 AnyDataType(0)))
+            FunctionSignature.ret(ArrayType.of(BigIntType.INSTANCE))
+                    .varArgs(ArrayType.of(AnyDataType.INSTANCE_WITHOUT_INDEX))
     );
 
     /**
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayFilter.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayFilter.java
index 386449116c0..a71ddbb4d4f 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayFilter.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayFilter.java
@@ -49,7 +49,7 @@ public class ArrayFilter extends ScalarFunction
      * array_filter(lambda, a1, ...) = array_filter(a1, array_map(lambda, a1, 
...))
      */
     public ArrayFilter(Expression arg) {
-        super("array_filter", arg.child(1).child(0), new ArrayMap(arg));
+        super("array_filter", arg instanceof Lambda ? arg.child(1).child(0) : 
arg, new ArrayMap(arg));
         if (!(arg instanceof Lambda)) {
             throw new AnalysisException(
                     String.format("The 1st arg of %s must be lambda but is 
%s", getName(), arg));
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayFirst.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayFirst.java
index 8563a3e455f..da5324f301d 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayFirst.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayFirst.java
@@ -18,7 +18,6 @@
 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.literal.BigIntLiteral;
 
@@ -36,10 +35,6 @@ public class ArrayFirst extends ElementAt
      */
     public ArrayFirst(Expression arg) {
         super(new ArrayFilter(arg), new BigIntLiteral(1));
-        if (!(arg instanceof Lambda)) {
-            throw new AnalysisException(
-                    String.format("The 1st arg of %s must be lambda but is 
%s", getName(), arg));
-        }
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayLast.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayLast.java
index 71466614e3e..d90dd6b30e6 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayLast.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayLast.java
@@ -18,7 +18,6 @@
 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.literal.BigIntLiteral;
 
@@ -36,10 +35,6 @@ public class ArrayLast extends ElementAt
      */
     public ArrayLast(Expression arg) {
         super(new ArrayFilter(arg), new BigIntLiteral(-1));
-        if (!(arg instanceof Lambda)) {
-            throw new AnalysisException(
-                    String.format("The 1st arg of %s must be lambda but is 
%s", getName(), arg));
-        }
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayProduct.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayProduct.java
index 16aaf27c148..ecc4eaac5eb 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayProduct.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayProduct.java
@@ -48,6 +48,7 @@ public class ArrayProduct extends ScalarFunction implements 
ExplicitlyCastableSi
         ComputePrecisionForArrayItemAgg, UnaryExpression, AlwaysNullable {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
+            
FunctionSignature.ret(DoubleType.INSTANCE).args(ArrayType.of(DoubleType.INSTANCE)),
             
FunctionSignature.ret(DoubleType.INSTANCE).args(ArrayType.of(BooleanType.INSTANCE)),
             
FunctionSignature.ret(DoubleType.INSTANCE).args(ArrayType.of(TinyIntType.INSTANCE)),
             
FunctionSignature.ret(DoubleType.INSTANCE).args(ArrayType.of(SmallIntType.INSTANCE)),
@@ -56,8 +57,7 @@ public class ArrayProduct extends ScalarFunction implements 
ExplicitlyCastableSi
             
FunctionSignature.ret(DoubleType.INSTANCE).args(ArrayType.of(LargeIntType.INSTANCE)),
             
FunctionSignature.ret(DecimalV3Type.WILDCARD).args(ArrayType.of(DecimalV3Type.WILDCARD)),
             
FunctionSignature.ret(DecimalV2Type.SYSTEM_DEFAULT).args(ArrayType.of(DecimalV2Type.SYSTEM_DEFAULT)),
-            
FunctionSignature.ret(DoubleType.INSTANCE).args(ArrayType.of(FloatType.INSTANCE)),
-            
FunctionSignature.ret(DoubleType.INSTANCE).args(ArrayType.of(DoubleType.INSTANCE))
+            
FunctionSignature.ret(DoubleType.INSTANCE).args(ArrayType.of(FloatType.INSTANCE))
     );
 
     /**
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayPushBack.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayPushBack.java
index c1791a66f07..932c2446132 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayPushBack.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayPushBack.java
@@ -25,6 +25,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.coercion.AnyDataType;
+import org.apache.doris.nereids.types.coercion.FollowToAnyDataType;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -38,7 +39,8 @@ public class ArrayPushBack extends ScalarFunction
         implements UnaryExpression, ExplicitlyCastableSignature, 
AlwaysNullable {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
-            FunctionSignature.retArgType(0).args(ArrayType.of(new 
AnyDataType(0)), new AnyDataType(0))
+            FunctionSignature.retArgType(0)
+                    .args(ArrayType.of(new AnyDataType(0)), new 
FollowToAnyDataType(0))
     );
 
     /**
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayPushFront.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayPushFront.java
index 458e062ba46..26e1cdd91e3 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayPushFront.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayPushFront.java
@@ -25,6 +25,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.coercion.AnyDataType;
+import org.apache.doris.nereids.types.coercion.FollowToAnyDataType;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -38,7 +39,8 @@ public class ArrayPushFront extends ScalarFunction
         implements UnaryExpression, ExplicitlyCastableSignature, 
AlwaysNullable {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
-            FunctionSignature.retArgType(0).args(ArrayType.of(new 
AnyDataType(0)), new AnyDataType(0))
+            FunctionSignature.retArgType(0)
+                    .args(ArrayType.of(new AnyDataType(0)), new 
FollowToAnyDataType(0))
     );
 
     /**
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArraySortBy.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArraySortBy.java
index c2c90717cdc..5271662ea95 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArraySortBy.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArraySortBy.java
@@ -48,7 +48,7 @@ public class ArraySortBy extends ScalarFunction
      * array_sortby(lambda, a1, ...) = array_sortby(a1, array_map(lambda, a1, 
...))
      */
     public ArraySortBy(Expression arg) {
-        super("array_sortby", arg.child(1).child(0), new ArrayMap(arg));
+        super("array_sortby", arg instanceof Lambda ? arg.child(1).child(0) : 
arg, new ArrayMap(arg));
         if (!(arg instanceof Lambda)) {
             throw new AnalysisException(
                     String.format("The 1st arg of %s must be lambda but is 
%s", getName(), arg));
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayWithConstant.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayWithConstant.java
index 49485e7a0fa..26d76ac9aad 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayWithConstant.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ArrayWithConstant.java
@@ -26,6 +26,7 @@ import 
org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.ArrayType;
 import org.apache.doris.nereids.types.BigIntType;
 import org.apache.doris.nereids.types.coercion.AnyDataType;
+import org.apache.doris.nereids.types.coercion.FollowToAnyDataType;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -39,7 +40,8 @@ public class ArrayWithConstant extends ScalarFunction
         implements BinaryExpression, ExplicitlyCastableSignature, 
AlwaysNotNullable {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
-            FunctionSignature.ret(ArrayType.of(new 
AnyDataType(0))).args(BigIntType.INSTANCE, new AnyDataType(0))
+            FunctionSignature.ret(ArrayType.of(new FollowToAnyDataType(0)))
+                    .args(BigIntType.INSTANCE, new AnyDataType(0))
     );
 
     /**
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/BitmapFromArray.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/BitmapFromArray.java
index 00f950d589b..8304e0684a5 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/BitmapFromArray.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/BitmapFromArray.java
@@ -42,10 +42,10 @@ public class BitmapFromArray extends ScalarFunction
         implements UnaryExpression, ExplicitlyCastableSignature, 
AlwaysNullable {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
-            
FunctionSignature.ret(BitmapType.INSTANCE).args(ArrayType.of(TinyIntType.INSTANCE)),
-            
FunctionSignature.ret(BitmapType.INSTANCE).args(ArrayType.of(SmallIntType.INSTANCE)),
+            
FunctionSignature.ret(BitmapType.INSTANCE).args(ArrayType.of(BigIntType.INSTANCE)),
             
FunctionSignature.ret(BitmapType.INSTANCE).args(ArrayType.of(IntegerType.INSTANCE)),
-            
FunctionSignature.ret(BitmapType.INSTANCE).args(ArrayType.of(BigIntType.INSTANCE))
+            
FunctionSignature.ret(BitmapType.INSTANCE).args(ArrayType.of(SmallIntType.INSTANCE)),
+            
FunctionSignature.ret(BitmapType.INSTANCE).args(ArrayType.of(TinyIntType.INSTANCE))
     );
 
     /**
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Coalesce.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Coalesce.java
index 7dca8a7f2ea..f1d122d0179 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Coalesce.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Coalesce.java
@@ -58,12 +58,12 @@ public class Coalesce extends ScalarFunction
             
FunctionSignature.ret(IntegerType.INSTANCE).varArgs(IntegerType.INSTANCE),
             
FunctionSignature.ret(BigIntType.INSTANCE).varArgs(BigIntType.INSTANCE),
             
FunctionSignature.ret(LargeIntType.INSTANCE).varArgs(LargeIntType.INSTANCE),
-            
FunctionSignature.ret(FloatType.INSTANCE).varArgs(FloatType.INSTANCE),
             
FunctionSignature.ret(DoubleType.INSTANCE).varArgs(DoubleType.INSTANCE),
-            
FunctionSignature.ret(DateTimeType.INSTANCE).varArgs(DateTimeType.INSTANCE),
-            
FunctionSignature.ret(DateType.INSTANCE).varArgs(DateType.INSTANCE),
+            
FunctionSignature.ret(FloatType.INSTANCE).varArgs(FloatType.INSTANCE),
             
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT).varArgs(DateTimeV2Type.SYSTEM_DEFAULT),
+            
FunctionSignature.ret(DateTimeType.INSTANCE).varArgs(DateTimeType.INSTANCE),
             
FunctionSignature.ret(DateV2Type.INSTANCE).varArgs(DateV2Type.INSTANCE),
+            
FunctionSignature.ret(DateType.INSTANCE).varArgs(DateType.INSTANCE),
             
FunctionSignature.ret(DecimalV3Type.WILDCARD).varArgs(DecimalV3Type.WILDCARD),
             
FunctionSignature.ret(DecimalV2Type.SYSTEM_DEFAULT).varArgs(DecimalV2Type.SYSTEM_DEFAULT),
             
FunctionSignature.ret(BitmapType.INSTANCE).varArgs(BitmapType.INSTANCE),
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Fmod.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Fmod.java
index 5173903147e..08ee2af55f8 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Fmod.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Fmod.java
@@ -38,8 +38,8 @@ public class Fmod extends ScalarFunction
         implements BinaryExpression, ExplicitlyCastableSignature, 
AlwaysNullable {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
-            FunctionSignature.ret(FloatType.INSTANCE).args(FloatType.INSTANCE, 
FloatType.INSTANCE),
-            
FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE, 
DoubleType.INSTANCE)
+            
FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE, 
DoubleType.INSTANCE),
+            FunctionSignature.ret(FloatType.INSTANCE).args(FloatType.INSTANCE, 
FloatType.INSTANCE)
     );
 
     /**
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Greatest.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Greatest.java
index 0cb415c287e..92028076701 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Greatest.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Greatest.java
@@ -23,6 +23,7 @@ import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSi
 import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.BigIntType;
+import org.apache.doris.nereids.types.DataType;
 import org.apache.doris.nereids.types.DateTimeType;
 import org.apache.doris.nereids.types.DateTimeV2Type;
 import org.apache.doris.nereids.types.DateType;
@@ -37,6 +38,7 @@ import org.apache.doris.nereids.types.SmallIntType;
 import org.apache.doris.nereids.types.StringType;
 import org.apache.doris.nereids.types.TinyIntType;
 import org.apache.doris.nereids.types.VarcharType;
+import org.apache.doris.nereids.types.coercion.CharacterType;
 import org.apache.doris.nereids.util.ExpressionUtils;
 
 import com.google.common.base.Preconditions;
@@ -51,21 +53,21 @@ public class Greatest extends ScalarFunction
         implements ExplicitlyCastableSignature, PropagateNullable {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
-            
FunctionSignature.ret(TinyIntType.INSTANCE).varArgs(TinyIntType.INSTANCE),
-            
FunctionSignature.ret(SmallIntType.INSTANCE).varArgs(SmallIntType.INSTANCE),
-            
FunctionSignature.ret(IntegerType.INSTANCE).varArgs(IntegerType.INSTANCE),
-            
FunctionSignature.ret(BigIntType.INSTANCE).varArgs(BigIntType.INSTANCE),
-            
FunctionSignature.ret(LargeIntType.INSTANCE).varArgs(LargeIntType.INSTANCE),
-            
FunctionSignature.ret(FloatType.INSTANCE).varArgs(FloatType.INSTANCE),
+            
FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT).varArgs(VarcharType.SYSTEM_DEFAULT),
+            
FunctionSignature.ret(StringType.INSTANCE).varArgs(StringType.INSTANCE),
+            
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT).varArgs(DateTimeV2Type.SYSTEM_DEFAULT),
+            
FunctionSignature.ret(DateTimeType.INSTANCE).varArgs(DateTimeType.INSTANCE),
+            
FunctionSignature.ret(DateV2Type.INSTANCE).varArgs(DateV2Type.INSTANCE),
+            
FunctionSignature.ret(DateType.INSTANCE).varArgs(DateType.INSTANCE),
             
FunctionSignature.ret(DoubleType.INSTANCE).varArgs(DoubleType.INSTANCE),
-            
FunctionSignature.ret(DecimalV2Type.SYSTEM_DEFAULT).varArgs(DecimalV2Type.SYSTEM_DEFAULT),
+            
FunctionSignature.ret(FloatType.INSTANCE).varArgs(FloatType.INSTANCE),
             
FunctionSignature.ret(DecimalV3Type.WILDCARD).varArgs(DecimalV3Type.WILDCARD),
-            
FunctionSignature.ret(DateType.INSTANCE).varArgs(DateType.INSTANCE),
-            
FunctionSignature.ret(DateV2Type.INSTANCE).varArgs(DateV2Type.INSTANCE),
-            
FunctionSignature.ret(DateTimeType.INSTANCE).varArgs(DateTimeType.INSTANCE),
-            
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT).varArgs(DateTimeV2Type.SYSTEM_DEFAULT),
-            
FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT).varArgs(VarcharType.SYSTEM_DEFAULT),
-            
FunctionSignature.ret(StringType.INSTANCE).varArgs(StringType.INSTANCE)
+            
FunctionSignature.ret(DecimalV2Type.SYSTEM_DEFAULT).varArgs(DecimalV2Type.SYSTEM_DEFAULT),
+            
FunctionSignature.ret(LargeIntType.INSTANCE).varArgs(LargeIntType.INSTANCE),
+            
FunctionSignature.ret(BigIntType.INSTANCE).varArgs(BigIntType.INSTANCE),
+            
FunctionSignature.ret(IntegerType.INSTANCE).varArgs(IntegerType.INSTANCE),
+            
FunctionSignature.ret(SmallIntType.INSTANCE).varArgs(SmallIntType.INSTANCE),
+            
FunctionSignature.ret(TinyIntType.INSTANCE).varArgs(TinyIntType.INSTANCE)
     );
 
     /**
@@ -80,11 +82,28 @@ public class Greatest extends ScalarFunction
      */
     @Override
     public Greatest withChildren(List<Expression> children) {
-        Preconditions.checkArgument(children.size() >= 1);
+        Preconditions.checkArgument(!children.isEmpty());
         return new Greatest(children.get(0),
                 children.subList(1, children.size()).toArray(new 
Expression[0]));
     }
 
+    @Override
+    public FunctionSignature searchSignature(List<FunctionSignature> 
signatures) {
+        List<DataType> argTypes = getArgumentsTypes();
+        if (argTypes.stream().anyMatch(CharacterType.class::isInstance)) {
+            return 
FunctionSignature.ret(StringType.INSTANCE).varArgs(StringType.INSTANCE);
+        } else if 
(argTypes.stream().anyMatch(DateTimeV2Type.class::isInstance)) {
+            return 
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT).varArgs(DateTimeV2Type.SYSTEM_DEFAULT);
+        } else if (argTypes.stream().anyMatch(DateTimeType.class::isInstance)) 
{
+            return 
FunctionSignature.ret(DateTimeType.INSTANCE).varArgs(DateTimeType.INSTANCE);
+        } else if (argTypes.stream().anyMatch(DateV2Type.class::isInstance)) {
+            return 
FunctionSignature.ret(DateV2Type.INSTANCE).varArgs(DateV2Type.INSTANCE);
+        } else if (argTypes.stream().anyMatch(DateType.class::isInstance)) {
+            return 
FunctionSignature.ret(DateType.INSTANCE).varArgs(DateType.INSTANCE);
+        }
+        return ExplicitlyCastableSignature.super.searchSignature(signatures);
+    }
+
     @Override
     public List<FunctionSignature> getSignatures() {
         return SIGNATURES;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/If.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/If.java
index e7ffcebdfe5..4b6f62f6bc8 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/If.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/If.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.analyzer.Unbound;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import org.apache.doris.nereids.trees.expressions.shape.TernaryExpression;
@@ -45,6 +46,7 @@ import org.apache.doris.nereids.types.StringType;
 import org.apache.doris.nereids.types.TinyIntType;
 import org.apache.doris.nereids.types.VarcharType;
 import org.apache.doris.nereids.types.coercion.AnyDataType;
+import org.apache.doris.nereids.util.TypeCoercionUtils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -111,7 +113,8 @@ public class If extends ScalarFunction
      * constructor with 3 arguments.
      */
     public If(Expression arg0, Expression arg1, Expression arg2) {
-        super("if", arg0, arg1, arg2);
+        super("if", arg0 instanceof Unbound ? arg0 : 
TypeCoercionUtils.castIfNotSameType(arg0, BooleanType.INSTANCE),
+                arg1, arg2);
     }
 
     /**
@@ -145,4 +148,10 @@ public class If extends ScalarFunction
     public List<FunctionSignature> getSignatures() {
         return SIGNATURES;
     }
+
+    @Override
+    public FunctionSignature searchSignature(List<FunctionSignature> 
signatures) {
+
+        return ExplicitlyCastableSignature.super.searchSignature(signatures);
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/LastDay.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/LastDay.java
index d372868a343..bd3783abd9a 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/LastDay.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/LastDay.java
@@ -40,10 +40,10 @@ public class LastDay extends ScalarFunction
         implements UnaryExpression, ExplicitlyCastableSignature, 
PropagateNullableOnDateLikeV2Args {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
-            
FunctionSignature.ret(DateType.INSTANCE).args(DateTimeType.INSTANCE),
-            FunctionSignature.ret(DateType.INSTANCE).args(DateType.INSTANCE),
+            
FunctionSignature.ret(DateV2Type.INSTANCE).args(DateV2Type.INSTANCE),
             
FunctionSignature.ret(DateV2Type.INSTANCE).args(DateTimeV2Type.SYSTEM_DEFAULT),
-            
FunctionSignature.ret(DateV2Type.INSTANCE).args(DateV2Type.INSTANCE)
+            FunctionSignature.ret(DateType.INSTANCE).args(DateType.INSTANCE),
+            
FunctionSignature.ret(DateType.INSTANCE).args(DateTimeType.INSTANCE)
     );
 
     /**
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Least.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Least.java
index 39af6626908..e22f9ea115f 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Least.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Least.java
@@ -23,6 +23,7 @@ import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSi
 import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.BigIntType;
+import org.apache.doris.nereids.types.DataType;
 import org.apache.doris.nereids.types.DateTimeType;
 import org.apache.doris.nereids.types.DateTimeV2Type;
 import org.apache.doris.nereids.types.DateType;
@@ -37,6 +38,7 @@ import org.apache.doris.nereids.types.SmallIntType;
 import org.apache.doris.nereids.types.StringType;
 import org.apache.doris.nereids.types.TinyIntType;
 import org.apache.doris.nereids.types.VarcharType;
+import org.apache.doris.nereids.types.coercion.CharacterType;
 import org.apache.doris.nereids.util.ExpressionUtils;
 
 import com.google.common.base.Preconditions;
@@ -51,21 +53,21 @@ public class Least extends ScalarFunction
         implements ExplicitlyCastableSignature, PropagateNullable {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
-            
FunctionSignature.ret(TinyIntType.INSTANCE).varArgs(TinyIntType.INSTANCE),
-            
FunctionSignature.ret(SmallIntType.INSTANCE).varArgs(SmallIntType.INSTANCE),
-            
FunctionSignature.ret(IntegerType.INSTANCE).varArgs(IntegerType.INSTANCE),
-            
FunctionSignature.ret(BigIntType.INSTANCE).varArgs(BigIntType.INSTANCE),
-            
FunctionSignature.ret(LargeIntType.INSTANCE).varArgs(LargeIntType.INSTANCE),
-            
FunctionSignature.ret(FloatType.INSTANCE).varArgs(FloatType.INSTANCE),
-            
FunctionSignature.ret(DoubleType.INSTANCE).varArgs(DoubleType.INSTANCE),
-            
FunctionSignature.ret(DateType.INSTANCE).varArgs(DateType.INSTANCE),
-            
FunctionSignature.ret(DateV2Type.INSTANCE).varArgs(DateV2Type.INSTANCE),
-            
FunctionSignature.ret(DateTimeType.INSTANCE).varArgs(DateTimeType.INSTANCE),
+            
FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT).varArgs(VarcharType.SYSTEM_DEFAULT),
+            
FunctionSignature.ret(StringType.INSTANCE).varArgs(StringType.INSTANCE),
             
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT).varArgs(DateTimeV2Type.SYSTEM_DEFAULT),
-            
FunctionSignature.ret(DecimalV2Type.SYSTEM_DEFAULT).varArgs(DecimalV2Type.SYSTEM_DEFAULT),
+            
FunctionSignature.ret(DateTimeType.INSTANCE).varArgs(DateTimeType.INSTANCE),
+            
FunctionSignature.ret(DateV2Type.INSTANCE).varArgs(DateV2Type.INSTANCE),
+            
FunctionSignature.ret(DateType.INSTANCE).varArgs(DateType.INSTANCE),
+            
FunctionSignature.ret(DoubleType.INSTANCE).varArgs(DoubleType.INSTANCE),
+            
FunctionSignature.ret(FloatType.INSTANCE).varArgs(FloatType.INSTANCE),
             
FunctionSignature.ret(DecimalV3Type.WILDCARD).varArgs(DecimalV3Type.WILDCARD),
-            
FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT).varArgs(VarcharType.SYSTEM_DEFAULT),
-            
FunctionSignature.ret(StringType.INSTANCE).varArgs(StringType.INSTANCE)
+            
FunctionSignature.ret(DecimalV2Type.SYSTEM_DEFAULT).varArgs(DecimalV2Type.SYSTEM_DEFAULT),
+            
FunctionSignature.ret(LargeIntType.INSTANCE).varArgs(LargeIntType.INSTANCE),
+            
FunctionSignature.ret(BigIntType.INSTANCE).varArgs(BigIntType.INSTANCE),
+            
FunctionSignature.ret(IntegerType.INSTANCE).varArgs(IntegerType.INSTANCE),
+            
FunctionSignature.ret(SmallIntType.INSTANCE).varArgs(SmallIntType.INSTANCE),
+            
FunctionSignature.ret(TinyIntType.INSTANCE).varArgs(TinyIntType.INSTANCE)
     );
 
     /**
@@ -80,11 +82,28 @@ public class Least extends ScalarFunction
      */
     @Override
     public Least withChildren(List<Expression> children) {
-        Preconditions.checkArgument(children.size() >= 1);
+        Preconditions.checkArgument(!children.isEmpty());
         return new Least(children.get(0),
                 children.subList(1, children.size()).toArray(new 
Expression[0]));
     }
 
+    @Override
+    public FunctionSignature searchSignature(List<FunctionSignature> 
signatures) {
+        List<DataType> argTypes = getArgumentsTypes();
+        if (argTypes.stream().anyMatch(CharacterType.class::isInstance)) {
+            return 
FunctionSignature.ret(StringType.INSTANCE).varArgs(StringType.INSTANCE);
+        } else if 
(argTypes.stream().anyMatch(DateTimeV2Type.class::isInstance)) {
+            return 
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT).varArgs(DateTimeV2Type.SYSTEM_DEFAULT);
+        } else if (argTypes.stream().anyMatch(DateTimeType.class::isInstance)) 
{
+            return 
FunctionSignature.ret(DateTimeType.INSTANCE).varArgs(DateTimeType.INSTANCE);
+        } else if (argTypes.stream().anyMatch(DateV2Type.class::isInstance)) {
+            return 
FunctionSignature.ret(DateV2Type.INSTANCE).varArgs(DateV2Type.INSTANCE);
+        } else if (argTypes.stream().anyMatch(DateType.class::isInstance)) {
+            return 
FunctionSignature.ret(DateType.INSTANCE).varArgs(DateType.INSTANCE);
+        }
+        return ExplicitlyCastableSignature.super.searchSignature(signatures);
+    }
+
     @Override
     public List<FunctionSignature> getSignatures() {
         return SIGNATURES;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MinutesDiff.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MinutesDiff.java
index 178b6a49331..4d011116334 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MinutesDiff.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MinutesDiff.java
@@ -42,9 +42,9 @@ public class MinutesDiff extends ScalarFunction
     private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(BigIntType.INSTANCE)
                     .args(DateTimeV2Type.SYSTEM_DEFAULT, 
DateTimeV2Type.SYSTEM_DEFAULT),
-            
FunctionSignature.ret(BigIntType.INSTANCE).args(DateTimeType.INSTANCE, 
DateTimeType.INSTANCE),
             
FunctionSignature.ret(BigIntType.INSTANCE).args(DateV2Type.INSTANCE, 
DateTimeV2Type.SYSTEM_DEFAULT),
             
FunctionSignature.ret(BigIntType.INSTANCE).args(DateTimeV2Type.SYSTEM_DEFAULT, 
DateV2Type.INSTANCE),
+            
FunctionSignature.ret(BigIntType.INSTANCE).args(DateTimeType.INSTANCE, 
DateTimeType.INSTANCE),
             
FunctionSignature.ret(BigIntType.INSTANCE).args(DateV2Type.INSTANCE, 
DateV2Type.INSTANCE)
     );
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Pmod.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Pmod.java
index 56ba753f1ff..808e84ea026 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Pmod.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Pmod.java
@@ -21,10 +21,12 @@ import org.apache.doris.catalog.FunctionSignature;
 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;
+import org.apache.doris.nereids.trees.expressions.literal.StringLikeLiteral;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.BigIntType;
 import org.apache.doris.nereids.types.DoubleType;
+import org.apache.doris.nereids.util.TypeCoercionUtils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -37,10 +39,10 @@ import java.util.List;
 public class Pmod extends ScalarFunction
         implements BinaryExpression, ExplicitlyCastableSignature, 
AlwaysNullable {
 
-    public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
-            
FunctionSignature.ret(BigIntType.INSTANCE).args(BigIntType.INSTANCE, 
BigIntType.INSTANCE),
-            
FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE, 
DoubleType.INSTANCE)
-    );
+    public static final FunctionSignature BIGINT_SIGNATURE = 
FunctionSignature.ret(BigIntType.INSTANCE)
+            .args(BigIntType.INSTANCE, BigIntType.INSTANCE);
+    public static final FunctionSignature DOUBLE_SIGNATURE = 
FunctionSignature.ret(DoubleType.INSTANCE)
+            .args(DoubleType.INSTANCE, DoubleType.INSTANCE);
 
     /**
      * constructor with 2 arguments.
@@ -58,9 +60,39 @@ public class Pmod extends ScalarFunction
         return new Pmod(children.get(0), children.get(1));
     }
 
+    /**
+     * already override searchSignature and computeSignature, so getSignatures 
is useless anymore.
+     *
+     * @return empty list
+     */
     @Override
     public List<FunctionSignature> getSignatures() {
-        return SIGNATURES;
+        return ImmutableList.of();
+    }
+
+    @Override
+    public FunctionSignature computeSignature(FunctionSignature signature) {
+        return signature;
+    }
+
+    @Override
+    public FunctionSignature searchSignature(List<FunctionSignature> 
signatures) {
+        boolean leftCouldBeBigInt = false;
+        boolean rightCouldBeBigInt = false;
+        if (getArgument(0) instanceof StringLikeLiteral) {
+            leftCouldBeBigInt = TypeCoercionUtils.characterLiteralTypeCoercion(
+                    ((StringLikeLiteral) getArgument(0)).getValue(), 
BigIntType.INSTANCE).isPresent();
+        }
+        if (getArgument(1) instanceof StringLikeLiteral) {
+            rightCouldBeBigInt = 
TypeCoercionUtils.characterLiteralTypeCoercion(
+                    ((StringLikeLiteral) getArgument(1)).getValue(), 
BigIntType.INSTANCE).isPresent();
+        }
+        if ((getArgument(0).getDataType().isIntegerLikeType() || 
leftCouldBeBigInt)
+                && (getArgument(1).getDataType().isIntegerLikeType() || 
rightCouldBeBigInt)) {
+            return BIGINT_SIGNATURE;
+        } else {
+            return DOUBLE_SIGNATURE;
+        }
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java
index 96cbcca642d..651e018c20e 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java
@@ -534,7 +534,7 @@ public class TypeCoercionUtils {
                 if ("false".equalsIgnoreCase(value)) {
                     ret = BooleanLiteral.FALSE;
                 }
-            } else if (dataType instanceof IntegralType) {
+            } else if (dataType instanceof TinyIntType) {
                 BigInteger bigInt = new BigInteger(value);
                 if (BigInteger.valueOf(bigInt.byteValue()).equals(bigInt)) {
                     ret = new TinyIntLiteral(bigInt.byteValue());
@@ -547,6 +547,36 @@ public class TypeCoercionUtils {
                 } else {
                     ret = new LargeIntLiteral(bigInt);
                 }
+            } else if (dataType instanceof SmallIntType) {
+                BigInteger bigInt = new BigInteger(value);
+                if (BigInteger.valueOf(bigInt.shortValue()).equals(bigInt)) {
+                    ret = new SmallIntLiteral(bigInt.shortValue());
+                } else if 
(BigInteger.valueOf(bigInt.intValue()).equals(bigInt)) {
+                    ret = new IntegerLiteral(bigInt.intValue());
+                } else if 
(BigInteger.valueOf(bigInt.longValue()).equals(bigInt)) {
+                    ret = new BigIntLiteral(bigInt.longValueExact());
+                } else {
+                    ret = new LargeIntLiteral(bigInt);
+                }
+            } else if (dataType instanceof IntegerType) {
+                BigInteger bigInt = new BigInteger(value);
+                if (BigInteger.valueOf(bigInt.intValue()).equals(bigInt)) {
+                    ret = new IntegerLiteral(bigInt.intValue());
+                } else if 
(BigInteger.valueOf(bigInt.longValue()).equals(bigInt)) {
+                    ret = new BigIntLiteral(bigInt.longValueExact());
+                } else {
+                    ret = new LargeIntLiteral(bigInt);
+                }
+            } else if (dataType instanceof BigIntType) {
+                BigInteger bigInt = new BigInteger(value);
+                if (BigInteger.valueOf(bigInt.longValue()).equals(bigInt)) {
+                    ret = new BigIntLiteral(bigInt.longValueExact());
+                } else {
+                    ret = new LargeIntLiteral(bigInt);
+                }
+            } else if (dataType instanceof LargeIntType) {
+                BigInteger bigInt = new BigInteger(value);
+                ret = new LargeIntLiteral(bigInt);
             } else if (dataType instanceof FloatType) {
                 ret = new FloatLiteral(Float.parseFloat(value));
             } else if (dataType instanceof DoubleType) {
diff --git a/regression-test/data/nereids_function_p0/type_coercion.out 
b/regression-test/data/nereids_function_p0/type_coercion.out
new file mode 100644
index 00000000000..b600040e8f6
--- /dev/null
+++ b/regression-test/data/nereids_function_p0/type_coercion.out
@@ -0,0 +1,37 @@
+-- This file is automatically generated. You should know what you did if you 
want to edit this
+-- !greatest --
+333
+
+-- !least --
+2000000
+
+-- !if --
+2222
+
+-- !array_product --
+6000.0
+
+-- !array_avg --
+1001.0
+
+-- !array_pushfront --
+[4444, 1, 2, 3, 555555]
+
+-- !array_pushback --
+[1, 2, 3, 555555, 4444]
+
+-- !array_difference --
+[0, 1, 198]
+
+-- !array_enumerate_uniq --
+[1, 2, 1]
+
+-- !array_cum_sum --
+[1, 3, 3003]
+
+-- !pmod --
+0.0
+
+-- !nullif --
+13
+
diff --git a/regression-test/suites/nereids_function_p0/type_coercion.groovy 
b/regression-test/suites/nereids_function_p0/type_coercion.groovy
new file mode 100644
index 00000000000..57b63030adb
--- /dev/null
+++ b/regression-test/suites/nereids_function_p0/type_coercion.groovy
@@ -0,0 +1,31 @@
+// 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("function_type_coercion") {
+    sql """set enable_fold_constant_by_be=false""" // remove this if 
array<double> BE return result be fixed.
+    qt_greatest """select greatest(1, 2222, '333')"""
+    qt_least """select least(5,2000000,'3.0023')"""
+    qt_if """select if (1, 2222, 33)"""
+    qt_array_product """select array_product(array(1, 2, '3000'))"""
+    qt_array_avg """select array_avg(array(1, 2, '3000'))"""
+    qt_array_pushfront """select array_pushfront(array(1,2,3,555555), 
'4444')"""
+    qt_array_pushback """select array_pushback(array(1,2,3,555555), '4444')"""
+    qt_array_difference """select array_difference(array(1,2,'200'))"""
+    qt_array_enumerate_uniq """select 
array_enumerate_uniq([1,1,1],['1','1','1.0'])"""
+    qt_array_cum_sum """select array_cum_sum(array('1', '2', '3000'))"""
+    qt_pmod """select pmod(2, '1.0')"""
+    qt_nullif """SELECT nullif(13, -4851)"""
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to