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

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


The following commit(s) were added to refs/heads/master by this push:
     new 2c6d2255c3d [fix](Nereids) nested type literal type coercion and 
insert values with map (#26669)
2c6d2255c3d is described below

commit 2c6d2255c3d8d7872ef1cea941302e0cc4719bbb
Author: morrySnow <101034200+morrys...@users.noreply.github.com>
AuthorDate: Wed Nov 15 11:13:26 2023 +0800

    [fix](Nereids) nested type literal type coercion and insert values with map 
(#26669)
---
 .../doris/nereids/rules/analysis/BindSink.java     |  13 -
 .../trees/expressions/ExpressionEvaluator.java     |  32 +-
 .../functions/ComputeSignatureHelper.java          | 141 ++++---
 .../trees/expressions/functions/scalar/Array.java  |  21 +-
 .../trees/expressions/functions/scalar/If.java     |  16 +-
 .../doris/nereids/util/TypeCoercionUtils.java      |  64 ++-
 .../functions/ComputeSignatureHelperTest.java      | 447 +++++++++++++++++++++
 .../data/javaudf_p0/test_javaudf_all_types.out     |  12 +-
 .../nereids_function_p0/scalar_function/Array.out  |   4 +-
 .../aggregate/map_agg_nested_insert_doris.out      |  28 +-
 .../array_functions/test_array_with_scale_type.out |   8 +-
 .../javaudf_p0/test_javaudf_all_types.groovy       |   4 +-
 .../aggregate/map_agg_nested_insert_doris.groovy   |  20 +-
 13 files changed, 669 insertions(+), 141 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSink.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSink.java
index 6aee5ddb9bd..f3c27f6c9b2 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSink.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSink.java
@@ -52,7 +52,6 @@ import org.apache.doris.nereids.types.StringType;
 import org.apache.doris.nereids.types.coercion.CharacterType;
 import org.apache.doris.nereids.util.RelationUtil;
 import org.apache.doris.nereids.util.TypeCoercionUtils;
-import org.apache.doris.qe.ConnectContext;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -226,7 +225,6 @@ public class BindSink implements AnalysisRuleFactory {
                             // we skip it.
                             continue;
                         }
-                        maybeFallbackCastUnsupportedType(expr, 
ctx.connectContext);
                         DataType inputType = expr.getDataType();
                         DataType targetType = 
DataType.fromCatalogType(table.getFullSchema().get(i).getType());
                         Expression castExpr = expr;
@@ -309,17 +307,6 @@ public class BindSink implements AnalysisRuleFactory {
                 }).collect(ImmutableList.toImmutableList());
     }
 
-    private void maybeFallbackCastUnsupportedType(Expression expression, 
ConnectContext ctx) {
-        if (expression.getDataType().isMapType()) {
-            try {
-                ctx.getSessionVariable().enableFallbackToOriginalPlannerOnce();
-            } catch (Exception e) {
-                throw new AnalysisException("failed to try to fall back to 
original planner");
-            }
-            throw new AnalysisException("failed to cast type when binding 
sink, type is: " + expression.getDataType());
-        }
-    }
-
     private boolean isSourceAndTargetStringLikeType(DataType input, DataType 
target) {
         return input.isStringLikeType() && target.isStringLikeType();
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ExpressionEvaluator.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ExpressionEvaluator.java
index f17489d8a6a..adced61c7b7 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ExpressionEvaluator.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ExpressionEvaluator.java
@@ -31,11 +31,8 @@ import 
org.apache.doris.nereids.trees.expressions.functions.executable.TimeRound
 import org.apache.doris.nereids.trees.expressions.literal.DateLiteral;
 import org.apache.doris.nereids.trees.expressions.literal.Literal;
 import org.apache.doris.nereids.trees.expressions.literal.NullLiteral;
-import org.apache.doris.nereids.types.ArrayType;
 import org.apache.doris.nereids.types.DataType;
-import org.apache.doris.nereids.types.DecimalV3Type;
-import org.apache.doris.nereids.types.MapType;
-import org.apache.doris.nereids.types.StructType;
+import org.apache.doris.nereids.util.TypeCoercionUtils;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMultimap;
@@ -167,7 +164,7 @@ public enum ExpressionEvaluator {
             DataType returnType = 
DataType.convertFromString(annotation.returnType());
             List<DataType> argTypes = new ArrayList<>();
             for (String type : annotation.argTypes()) {
-                
argTypes.add(replaceDecimalV3WithWildcard(DataType.convertFromString(type)));
+                
argTypes.add(TypeCoercionUtils.replaceDecimalV3WithWildcard(DataType.convertFromString(type)));
             }
             FunctionSignature signature = new FunctionSignature(name,
                     argTypes.toArray(new DataType[0]), returnType);
@@ -175,31 +172,6 @@ public enum ExpressionEvaluator {
         }
     }
 
-    private DataType replaceDecimalV3WithWildcard(DataType input) {
-        if (input instanceof ArrayType) {
-            DataType item = replaceDecimalV3WithWildcard(((ArrayType) 
input).getItemType());
-            if (item == ((ArrayType) input).getItemType()) {
-                return input;
-            }
-            return ArrayType.of(item);
-        } else if (input instanceof MapType) {
-            DataType keyType = replaceDecimalV3WithWildcard(((MapType) 
input).getKeyType());
-            DataType valueType = replaceDecimalV3WithWildcard(((MapType) 
input).getValueType());
-            if (keyType == ((MapType) input).getKeyType() && valueType == 
((MapType) input).getValueType()) {
-                return input;
-            }
-            return MapType.of(keyType, valueType);
-        } else if (input instanceof StructType) {
-            // TODO: support struct type
-            return input;
-        } else {
-            if (input instanceof DecimalV3Type) {
-                return DecimalV3Type.WILDCARD;
-            }
-            return input;
-        }
-    }
-
     /**
      * function invoker.
      */
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/ComputeSignatureHelper.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/ComputeSignatureHelper.java
index e105320083d..3f4ff6ab76a 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/ComputeSignatureHelper.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/ComputeSignatureHelper.java
@@ -57,11 +57,27 @@ public class ComputeSignatureHelper {
     /** implementAbstractReturnType */
     public static FunctionSignature implementFollowToArgumentReturnType(
             FunctionSignature signature, List<Expression> arguments) {
-        if (signature.returnType instanceof FollowToArgumentType) {
-            int argumentIndex = ((FollowToArgumentType) 
signature.returnType).argumentIndex;
-            return 
signature.withReturnType(arguments.get(argumentIndex).getDataType());
+        return signature.withReturnType(replaceFollowToArgumentReturnType(
+                signature.returnType, signature.argumentsTypes));
+    }
+
+    private static DataType replaceFollowToArgumentReturnType(DataType 
returnType, List<DataType> argumentTypes) {
+        if (returnType instanceof ArrayType) {
+            return ArrayType.of(replaceFollowToArgumentReturnType(
+                    ((ArrayType) returnType).getItemType(), argumentTypes));
+        } else if (returnType instanceof MapType) {
+            return MapType.of(replaceFollowToArgumentReturnType(((MapType) 
returnType).getKeyType(), argumentTypes),
+                    replaceFollowToArgumentReturnType(((MapType) 
returnType).getValueType(), argumentTypes));
+        } else if (returnType instanceof StructType) {
+            // TODO: do not support struct type now
+            // throw new AnalysisException("do not support struct type now");
+            return returnType;
+        } else if (returnType instanceof FollowToArgumentType) {
+            int argumentIndex = ((FollowToArgumentType) 
returnType).argumentIndex;
+            return argumentTypes.get(argumentIndex);
+        } else {
+            return returnType;
         }
-        return signature;
     }
 
     private static DataType replaceAnyDataTypeWithOutIndex(DataType sigType, 
DataType expressionType) {
@@ -308,10 +324,10 @@ public class ComputeSignatureHelper {
         if (computeSignature instanceof ComputePrecision) {
             return ((ComputePrecision) 
computeSignature).computePrecision(signature);
         }
-        if 
(signature.argumentsTypes.stream().anyMatch(DateTimeV2Type.class::isInstance)) {
+        if 
(signature.argumentsTypes.stream().anyMatch(TypeCoercionUtils::hasDateTimeV2Type))
 {
             signature = defaultDateTimeV2PrecisionPromotion(signature, 
arguments);
         }
-        if 
(signature.argumentsTypes.stream().anyMatch(DecimalV3Type.class::isInstance)) {
+        if 
(signature.argumentsTypes.stream().anyMatch(TypeCoercionUtils::hasDecimalV3Type))
 {
             // do decimal v3 precision
             signature = defaultDecimalV3PrecisionPromotion(signature, 
arguments);
         }
@@ -354,30 +370,34 @@ public class ComputeSignatureHelper {
             } else {
                 targetType = signature.getArgType(i);
             }
-            if (!(targetType instanceof DateTimeV2Type)) {
+            List<DataType> argTypes = extractArgumentType(DateTimeV2Type.class,
+                    targetType, arguments.get(i).getDataType());
+            if (argTypes.isEmpty()) {
                 continue;
             }
-            if (finalType == null) {
-                if (arguments.get(i) instanceof StringLikeLiteral) {
-                    // We need to determine the scale based on the string 
literal.
+
+            for (DataType argType : argTypes) {
+                Expression arg = arguments.get(i);
+                DateTimeV2Type dateTimeV2Type;
+                if (arg instanceof StringLikeLiteral) {
                     StringLikeLiteral str = (StringLikeLiteral) 
arguments.get(i);
-                    finalType = 
DateTimeV2Type.forTypeFromString(str.getStringValue());
+                    dateTimeV2Type = 
DateTimeV2Type.forTypeFromString(str.getStringValue());
                 } else {
-                    finalType = 
DateTimeV2Type.forType(arguments.get(i).getDataType());
+                    dateTimeV2Type = DateTimeV2Type.forType(argType);
+                }
+                if (finalType == null) {
+                    finalType = dateTimeV2Type;
+                } else {
+                    finalType = 
DateTimeV2Type.getWiderDatetimeV2Type(finalType,
+                            
DateTimeV2Type.forType(arguments.get(i).getDataType()));
                 }
-            } else {
-                finalType = DateTimeV2Type.getWiderDatetimeV2Type(finalType,
-                        
DateTimeV2Type.forType(arguments.get(i).getDataType()));
             }
         }
         DateTimeV2Type argType = finalType;
-        List<DataType> newArgTypes = signature.argumentsTypes.stream().map(t 
-> {
-            if (t instanceof DateTimeV2Type) {
-                return argType;
-            } else {
-                return t;
-            }
-        }).collect(Collectors.toList());
+        List<DataType> newArgTypes = signature.argumentsTypes.stream()
+                .map(at -> TypeCoercionUtils.replaceDateTimeV2WithTarget(at, 
argType))
+                .collect(Collectors.toList());
+        signature = signature.withArgumentTypes(signature.hasVarArgs, 
newArgTypes);
         signature = signature.withArgumentTypes(signature.hasVarArgs, 
newArgTypes);
         if (signature.returnType instanceof DateTimeV2Type) {
             signature = signature.withReturnType(argType);
@@ -387,7 +407,7 @@ public class ComputeSignatureHelper {
 
     private static FunctionSignature defaultDecimalV3PrecisionPromotion(
             FunctionSignature signature, List<Expression> arguments) {
-        DataType finalType = null;
+        DecimalV3Type finalType = null;
         for (int i = 0; i < arguments.size(); i++) {
             DataType targetType;
             if (i >= signature.argumentsTypes.size()) {
@@ -397,37 +417,32 @@ public class ComputeSignatureHelper {
             } else {
                 targetType = signature.getArgType(i);
             }
-            if (!(targetType instanceof DecimalV3Type)) {
-                continue;
-            }
-            // only process wildcard decimalv3
-            if (((DecimalV3Type) targetType).getPrecision() > 0) {
+            List<DataType> argTypes = extractArgumentType(DecimalV3Type.class,
+                    targetType, arguments.get(i).getDataType());
+            if (argTypes.isEmpty()) {
                 continue;
             }
-            if (finalType == null) {
-                finalType = 
DecimalV3Type.forType(arguments.get(i).getDataType());
-            } else {
+
+            for (DataType argType : argTypes) {
                 Expression arg = arguments.get(i);
-                DecimalV3Type argType;
+                DecimalV3Type decimalV3Type;
                 if (arg.isLiteral() && arg.getDataType().isIntegralType()) {
                     // create decimalV3 with minimum scale enough to hold the 
integral literal
-                    argType = DecimalV3Type.createDecimalV3Type(new 
BigDecimal(((Literal) arg).getStringValue()));
+                    decimalV3Type = DecimalV3Type.createDecimalV3Type(new 
BigDecimal(((Literal) arg).getStringValue()));
+                } else {
+                    decimalV3Type = DecimalV3Type.forType(argType);
+                }
+                if (finalType == null) {
+                    finalType = decimalV3Type;
                 } else {
-                    argType = DecimalV3Type.forType(arg.getDataType());
+                    finalType = (DecimalV3Type) 
DecimalV3Type.widerDecimalV3Type(finalType, decimalV3Type, false);
                 }
-                finalType = DecimalV3Type.widerDecimalV3Type((DecimalV3Type) 
finalType, argType, true);
             }
-            Preconditions.checkState(finalType.isDecimalV3Type(), "decimalv3 
precision promotion failed.");
         }
-        DataType argType = finalType;
-        List<DataType> newArgTypes = signature.argumentsTypes.stream().map(t 
-> {
-            // only process wildcard decimalv3
-            if (t instanceof DecimalV3Type && ((DecimalV3Type) 
t).getPrecision() <= 0) {
-                return argType;
-            } else {
-                return t;
-            }
-        }).collect(Collectors.toList());
+        DecimalV3Type argType = finalType;
+        List<DataType> newArgTypes = signature.argumentsTypes.stream()
+                .map(at -> TypeCoercionUtils.replaceDecimalV3WithTarget(at, 
argType))
+                .collect(Collectors.toList());
         signature = signature.withArgumentTypes(signature.hasVarArgs, 
newArgTypes);
         if (signature.returnType instanceof DecimalV3Type
                 && ((DecimalV3Type) signature.returnType).getPrecision() <= 0) 
{
@@ -436,6 +451,42 @@ public class ComputeSignatureHelper {
         return signature;
     }
 
+    private static List<DataType> extractArgumentType(Class<? extends 
DataType> targetType,
+            DataType signatureType, DataType argumentType) {
+        if (targetType.isAssignableFrom(signatureType.getClass())) {
+            return Lists.newArrayList(argumentType);
+        } else if (signatureType instanceof ArrayType) {
+            if (argumentType instanceof NullType) {
+                return extractArgumentType(targetType, ((ArrayType) 
signatureType).getItemType(), argumentType);
+            } else if (argumentType instanceof ArrayType) {
+                return extractArgumentType(targetType,
+                        ((ArrayType) signatureType).getItemType(), 
((ArrayType) argumentType).getItemType());
+            } else {
+                return Lists.newArrayList();
+            }
+        } else if (signatureType instanceof MapType) {
+            if (argumentType instanceof NullType) {
+                List<DataType> ret = extractArgumentType(targetType,
+                        ((MapType) signatureType).getKeyType(), argumentType);
+                ret.addAll(extractArgumentType(targetType, ((MapType) 
signatureType).getValueType(), argumentType));
+                return ret;
+            } else if (argumentType instanceof MapType) {
+                List<DataType> ret = extractArgumentType(targetType,
+                        ((MapType) signatureType).getKeyType(), ((MapType) 
argumentType).getKeyType());
+                ret.addAll(extractArgumentType(targetType,
+                        ((MapType) signatureType).getValueType(), ((MapType) 
argumentType).getValueType()));
+                return ret;
+            } else {
+                return Lists.newArrayList();
+            }
+        } else if (signatureType instanceof StructType) {
+            // TODO: do not support struct type now
+            return Lists.newArrayList();
+        } else {
+            return Lists.newArrayList();
+        }
+    }
+
     static class ComputeSignatureChain {
         private final ResponsibilityChain<SignatureContext> computeChain;
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Array.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Array.java
index ea74eaefdf5..0b7523a2d5c 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Array.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Array.java
@@ -25,6 +25,7 @@ import 
org.apache.doris.nereids.trees.expressions.functions.ExpressionTrait;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.ArrayType;
 import org.apache.doris.nereids.types.DataType;
+import org.apache.doris.nereids.types.coercion.FollowToArgumentType;
 import org.apache.doris.nereids.util.TypeCoercionUtils;
 
 import com.google.common.collect.ImmutableList;
@@ -79,9 +80,27 @@ public class Array extends ScalarFunction
                         .map(TypeCoercionUtils::replaceCharacterToString)
                         .collect(Collectors.toList());
             }
+            partitioned = partitioned.get(false).stream()
+                    
.collect(Collectors.partitioningBy(TypeCoercionUtils::hasDecimalV2Type));
+            if (!partitioned.get(true).isEmpty()) {
+                needTypeCoercion.addAll(partitioned.get(true).stream()
+                        
.map(TypeCoercionUtils::replaceDecimalV2WithDefault).collect(Collectors.toList()));
+            }
+            partitioned = partitioned.get(false).stream()
+                    
.collect(Collectors.partitioningBy(TypeCoercionUtils::hasDecimalV3Type));
+            if (!partitioned.get(true).isEmpty()) {
+                needTypeCoercion.addAll(partitioned.get(true).stream()
+                        
.map(TypeCoercionUtils::replaceDecimalV3WithWildcard).collect(Collectors.toList()));
+            }
+            partitioned = partitioned.get(false).stream()
+                    
.collect(Collectors.partitioningBy(TypeCoercionUtils::hasDateTimeV2Type));
+            if (!partitioned.get(true).isEmpty()) {
+                needTypeCoercion.addAll(partitioned.get(true).stream()
+                        
.map(TypeCoercionUtils::replaceDateTimeV2WithMax).collect(Collectors.toList()));
+            }
             needTypeCoercion.addAll(partitioned.get(false));
             return needTypeCoercion.stream()
-                    .map(dataType -> 
FunctionSignature.ret(ArrayType.of(dataType)).varArgs(dataType))
+                    .map(dataType -> FunctionSignature.ret(ArrayType.of(new 
FollowToArgumentType(0))).varArgs(dataType))
                     .collect(ImmutableList.toImmutableList());
         }
     }
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 0d695515a85..8f98e7641b1 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
@@ -37,6 +37,8 @@ import org.apache.doris.nereids.types.FloatType;
 import org.apache.doris.nereids.types.HllType;
 import org.apache.doris.nereids.types.IntegerType;
 import org.apache.doris.nereids.types.LargeIntType;
+import org.apache.doris.nereids.types.MapType;
+import org.apache.doris.nereids.types.NullType;
 import org.apache.doris.nereids.types.SmallIntType;
 import org.apache.doris.nereids.types.StringType;
 import org.apache.doris.nereids.types.TinyIntType;
@@ -55,9 +57,8 @@ public class If extends ScalarFunction
         implements TernaryExpression, ExplicitlyCastableSignature {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
-            FunctionSignature.retArgType(1)
-                    .args(BooleanType.INSTANCE, ArrayType.of(new 
AnyDataType(0)),
-                            ArrayType.of(new AnyDataType(0))),
+            FunctionSignature.ret(NullType.INSTANCE)
+                    .args(BooleanType.INSTANCE, NullType.INSTANCE, 
NullType.INSTANCE),
             FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT)
                     .args(BooleanType.INSTANCE, DateTimeV2Type.SYSTEM_DEFAULT, 
DateTimeV2Type.SYSTEM_DEFAULT),
             FunctionSignature.ret(DateV2Type.INSTANCE)
@@ -88,6 +89,15 @@ public class If extends ScalarFunction
             FunctionSignature.ret(BitmapType.INSTANCE)
                     .args(BooleanType.INSTANCE, BitmapType.INSTANCE, 
BitmapType.INSTANCE),
             FunctionSignature.ret(HllType.INSTANCE).args(BooleanType.INSTANCE, 
HllType.INSTANCE, HllType.INSTANCE),
+            FunctionSignature.retArgType(1)
+                    .args(BooleanType.INSTANCE, ArrayType.of(new 
AnyDataType(0)),
+                            ArrayType.of(new AnyDataType(0))),
+            FunctionSignature.retArgType(1)
+                    .args(BooleanType.INSTANCE, MapType.of(new AnyDataType(0), 
new AnyDataType(1)),
+                            MapType.of(new AnyDataType(0), new 
AnyDataType(1))),
+            FunctionSignature.retArgType(1)
+                    .args(BooleanType.INSTANCE, new AnyDataType(0), new 
AnyDataType(0)),
+            // NOTICE string must at least of signature list, because all 
complex type could implicit cast to string
             FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT)
                     .args(BooleanType.INSTANCE, VarcharType.SYSTEM_DEFAULT, 
VarcharType.SYSTEM_DEFAULT),
             FunctionSignature.ret(StringType.INSTANCE)
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 490c97a47fc..2a6ba2f2ee8 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
@@ -274,33 +274,75 @@ public class TypeCoercionUtils {
      * return ture if datatype has character type in it, cannot use instance 
of CharacterType because of complex type.
      */
     public static boolean hasCharacterType(DataType dataType) {
+        return hasSpecifiedType(dataType, CharacterType.class);
+    }
+
+    public static boolean hasDecimalV2Type(DataType dataType) {
+        return hasSpecifiedType(dataType, DecimalV2Type.class);
+    }
+
+    public static boolean hasDecimalV3Type(DataType dataType) {
+        return hasSpecifiedType(dataType, DecimalV3Type.class);
+    }
+
+    public static boolean hasDateTimeV2Type(DataType dataType) {
+        return hasSpecifiedType(dataType, DateTimeV2Type.class);
+    }
+
+    private static boolean hasSpecifiedType(DataType dataType, Class<? extends 
DataType> specifiedType) {
         if (dataType instanceof ArrayType) {
-            return hasCharacterType(((ArrayType) dataType).getItemType());
+            return hasSpecifiedType(((ArrayType) dataType).getItemType(), 
specifiedType);
         } else if (dataType instanceof MapType) {
-            return hasCharacterType(((MapType) dataType).getKeyType())
-                    || hasCharacterType(((MapType) dataType).getValueType());
+            return hasSpecifiedType(((MapType) dataType).getKeyType(), 
specifiedType)
+                    || hasSpecifiedType(((MapType) dataType).getValueType(), 
specifiedType);
         } else if (dataType instanceof StructType) {
-            return ((StructType) dataType).getFields().stream().anyMatch(f -> 
hasCharacterType(f.getDataType()));
+            return ((StructType) dataType).getFields().stream()
+                    .anyMatch(f -> hasSpecifiedType(f.getDataType(), 
specifiedType));
         }
-        return dataType instanceof CharacterType;
+        return specifiedType.isAssignableFrom(dataType.getClass());
     }
 
     /**
      * replace all character types to string for correct type coercion
      */
     public static DataType replaceCharacterToString(DataType dataType) {
+        return replaceSpecifiedType(dataType, CharacterType.class, 
StringType.INSTANCE);
+    }
+
+    public static DataType replaceDecimalV2WithDefault(DataType dataType) {
+        return replaceSpecifiedType(dataType, DecimalV2Type.class, 
DecimalV2Type.SYSTEM_DEFAULT);
+    }
+
+    public static DataType replaceDecimalV3WithTarget(DataType dataType, 
DecimalV3Type target) {
+        return replaceSpecifiedType(dataType, DecimalV3Type.class, target);
+    }
+
+    public static DataType replaceDecimalV3WithWildcard(DataType dataType) {
+        return replaceSpecifiedType(dataType, DecimalV3Type.class, 
DecimalV3Type.WILDCARD);
+    }
+
+    public static DataType replaceDateTimeV2WithTarget(DataType dataType, 
DateTimeV2Type target) {
+        return replaceSpecifiedType(dataType, DateTimeV2Type.class, target);
+    }
+
+    public static DataType replaceDateTimeV2WithMax(DataType dataType) {
+        return replaceSpecifiedType(dataType, DateTimeV2Type.class, 
DateTimeV2Type.MAX);
+    }
+
+    private static DataType replaceSpecifiedType(DataType dataType,
+            Class<? extends DataType> specifiedType, DataType newType) {
         if (dataType instanceof ArrayType) {
-            return ArrayType.of(replaceCharacterToString(((ArrayType) 
dataType).getItemType()));
+            return ArrayType.of(replaceSpecifiedType(((ArrayType) 
dataType).getItemType(), specifiedType, newType));
         } else if (dataType instanceof MapType) {
-            return MapType.of(replaceCharacterToString(((MapType) 
dataType).getKeyType()),
-                    replaceCharacterToString(((MapType) 
dataType).getValueType()));
+            return MapType.of(replaceSpecifiedType(((MapType) 
dataType).getKeyType(), specifiedType, newType),
+                    replaceSpecifiedType(((MapType) dataType).getValueType(), 
specifiedType, newType));
         } else if (dataType instanceof StructType) {
             List<StructField> newFields = ((StructType) 
dataType).getFields().stream()
-                    .map(f -> 
f.withDataType(replaceCharacterToString(f.getDataType())))
+                    .map(f -> 
f.withDataType(replaceSpecifiedType(f.getDataType(), specifiedType, newType)))
                     .collect(ImmutableList.toImmutableList());
             return new StructType(newFields);
-        } else if (dataType instanceof CharacterType) {
-            return StringType.INSTANCE;
+        } else if (specifiedType.isAssignableFrom(dataType.getClass())) {
+            return newType;
         } else {
             return dataType;
         }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/ComputeSignatureHelperTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/ComputeSignatureHelperTest.java
new file mode 100644
index 00000000000..63a26b80a4e
--- /dev/null
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/ComputeSignatureHelperTest.java
@@ -0,0 +1,447 @@
+// 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.
+
+package org.apache.doris.nereids.trees.expressions.functions;
+
+import org.apache.doris.catalog.FunctionSignature;
+import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.literal.ArrayLiteral;
+import org.apache.doris.nereids.trees.expressions.literal.BigIntLiteral;
+import org.apache.doris.nereids.trees.expressions.literal.DateTimeV2Literal;
+import org.apache.doris.nereids.trees.expressions.literal.DecimalV3Literal;
+import org.apache.doris.nereids.trees.expressions.literal.IntegerLiteral;
+import org.apache.doris.nereids.trees.expressions.literal.MapLiteral;
+import org.apache.doris.nereids.trees.expressions.literal.NullLiteral;
+import org.apache.doris.nereids.trees.expressions.literal.SmallIntLiteral;
+import org.apache.doris.nereids.types.ArrayType;
+import org.apache.doris.nereids.types.BigIntType;
+import org.apache.doris.nereids.types.BooleanType;
+import org.apache.doris.nereids.types.DateTimeV2Type;
+import org.apache.doris.nereids.types.DecimalV2Type;
+import org.apache.doris.nereids.types.DecimalV3Type;
+import org.apache.doris.nereids.types.DoubleType;
+import org.apache.doris.nereids.types.IntegerType;
+import org.apache.doris.nereids.types.MapType;
+import org.apache.doris.nereids.types.NullType;
+import org.apache.doris.nereids.types.SmallIntType;
+import org.apache.doris.nereids.types.coercion.AnyDataType;
+import org.apache.doris.nereids.types.coercion.FollowToAnyDataType;
+import org.apache.doris.nereids.types.coercion.FollowToArgumentType;
+
+import com.google.common.collect.Lists;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.math.BigDecimal;
+import java.util.Collections;
+import java.util.List;
+
+public class ComputeSignatureHelperTest {
+
+    /////////////////////////////////////////
+    // implementFollowToArgumentReturnType
+    /////////////////////////////////////////
+
+    @Test
+    void testNoImplementFollowToArgumentReturnType() {
+        FunctionSignature signature = 
FunctionSignature.ret(DoubleType.INSTANCE).args(IntegerType.INSTANCE);
+        signature = 
ComputeSignatureHelper.implementFollowToArgumentReturnType(signature, 
Collections.emptyList());
+        Assertions.assertTrue(signature.returnType instanceof DoubleType);
+    }
+
+    @Test
+    void testArrayImplementFollowToArgumentReturnType() {
+        FunctionSignature signature = FunctionSignature.ret(ArrayType.of(new 
FollowToArgumentType(0)))
+                .args(IntegerType.INSTANCE);
+        signature = 
ComputeSignatureHelper.implementFollowToArgumentReturnType(signature, 
Collections.emptyList());
+        Assertions.assertTrue(signature.returnType instanceof ArrayType);
+        Assertions.assertTrue(((ArrayType) signature.returnType).getItemType() 
instanceof IntegerType);
+    }
+
+    @Test
+    void testMapImplementFollowToArgumentReturnType() {
+        FunctionSignature signature = FunctionSignature.ret(MapType.of(
+                new FollowToArgumentType(0), new FollowToArgumentType(1)))
+                .args(IntegerType.INSTANCE, DoubleType.INSTANCE);
+        signature = 
ComputeSignatureHelper.implementFollowToArgumentReturnType(signature, 
Collections.emptyList());
+        Assertions.assertTrue(signature.returnType instanceof MapType);
+        Assertions.assertTrue(((MapType) signature.returnType).getKeyType() 
instanceof IntegerType);
+        Assertions.assertTrue(((MapType) signature.returnType).getValueType() 
instanceof DoubleType);
+    }
+
+    /////////////////////////////////////////
+    // implementAnyDataTypeWithOutIndex
+    /////////////////////////////////////////
+
+    @Test
+    void testNoImplementAnyDataTypeWithOutIndex() {
+        FunctionSignature signature = 
FunctionSignature.ret(DoubleType.INSTANCE).args(IntegerType.INSTANCE);
+        signature = 
ComputeSignatureHelper.implementAnyDataTypeWithOutIndex(signature, 
Collections.emptyList());
+        Assertions.assertTrue(signature.returnType instanceof DoubleType);
+    }
+
+    @Test
+    void testArraySigWithNullArgImplementAnyDataTypeWithOutIndex() {
+        FunctionSignature signature = 
FunctionSignature.ret(IntegerType.INSTANCE)
+                .args(ArrayType.of(AnyDataType.INSTANCE_WITHOUT_INDEX));
+        List<Expression> arguments = Lists.newArrayList(new NullLiteral());
+        signature = 
ComputeSignatureHelper.implementAnyDataTypeWithOutIndex(signature, arguments);
+        Assertions.assertTrue(signature.getArgType(0) instanceof ArrayType);
+        Assertions.assertTrue(((ArrayType) 
signature.getArgType(0)).getItemType() instanceof NullType);
+    }
+
+    @Test
+    void testMapSigWithNullArgImplementAnyDataTypeWithOutIndex() {
+        FunctionSignature signature = 
FunctionSignature.ret(IntegerType.INSTANCE)
+                .args(MapType.of(AnyDataType.INSTANCE_WITHOUT_INDEX, 
AnyDataType.INSTANCE_WITHOUT_INDEX));
+        List<Expression> arguments = Lists.newArrayList(new NullLiteral());
+        signature = 
ComputeSignatureHelper.implementAnyDataTypeWithOutIndex(signature, arguments);
+        Assertions.assertTrue(signature.getArgType(0) instanceof MapType);
+        Assertions.assertTrue(((MapType) signature.getArgType(0)).getKeyType() 
instanceof NullType);
+        Assertions.assertTrue(((MapType) 
signature.getArgType(0)).getValueType() instanceof NullType);
+    }
+
+    @Test
+    void testArrayImplementAnyDataTypeWithOutIndex() {
+        FunctionSignature signature = 
FunctionSignature.ret(IntegerType.INSTANCE)
+                .args(ArrayType.of(AnyDataType.INSTANCE_WITHOUT_INDEX));
+        List<Expression> arguments = Lists.newArrayList(new 
ArrayLiteral(Lists.newArrayList(new IntegerLiteral(0))));
+        signature = 
ComputeSignatureHelper.implementAnyDataTypeWithOutIndex(signature, arguments);
+        Assertions.assertTrue(signature.getArgType(0) instanceof ArrayType);
+        Assertions.assertTrue(((ArrayType) 
signature.getArgType(0)).getItemType() instanceof IntegerType);
+    }
+
+    @Test
+    void testMapImplementAnyDataTypeWithOutIndex() {
+        FunctionSignature signature = 
FunctionSignature.ret(IntegerType.INSTANCE)
+                .args(MapType.of(AnyDataType.INSTANCE_WITHOUT_INDEX, 
AnyDataType.INSTANCE_WITHOUT_INDEX));
+        List<Expression> arguments = Lists.newArrayList(new 
MapLiteral(Lists.newArrayList(new IntegerLiteral(0)),
+                Lists.newArrayList(new BigIntLiteral(0))));
+        signature = 
ComputeSignatureHelper.implementAnyDataTypeWithOutIndex(signature, arguments);
+        Assertions.assertTrue(signature.getArgType(0) instanceof MapType);
+        Assertions.assertTrue(((MapType) signature.getArgType(0)).getKeyType() 
instanceof IntegerType);
+        Assertions.assertTrue(((MapType) 
signature.getArgType(0)).getValueType() instanceof BigIntType);
+    }
+
+    /////////////////////////////////////////
+    // implementAnyDataTypeWithIndex
+    /////////////////////////////////////////
+
+    @Test
+    void testNoImplementAnyDataTypeWithIndex() {
+        FunctionSignature signature = 
FunctionSignature.ret(DoubleType.INSTANCE).args(IntegerType.INSTANCE);
+        signature = 
ComputeSignatureHelper.implementAnyDataTypeWithIndex(signature, 
Collections.emptyList());
+        Assertions.assertTrue(signature.returnType instanceof DoubleType);
+    }
+
+    @Test
+    void testArraySigWithNullArgImplementAnyDataTypeWithIndex() {
+        FunctionSignature signature = 
FunctionSignature.ret(IntegerType.INSTANCE)
+                .args(ArrayType.of(new AnyDataType(0)), new AnyDataType(0));
+        List<Expression> arguments = Lists.newArrayList(
+                new NullLiteral(),
+                new BigIntLiteral(0));
+        signature = 
ComputeSignatureHelper.implementAnyDataTypeWithIndex(signature, arguments);
+        Assertions.assertTrue(signature.getArgType(0) instanceof ArrayType);
+        Assertions.assertTrue(((ArrayType) 
signature.getArgType(0)).getItemType() instanceof BigIntType);
+        Assertions.assertTrue(signature.getArgType(1) instanceof BigIntType);
+    }
+
+    @Test
+    void testMapSigWithNullArgImplementAnyDataTypeWithIndex() {
+        FunctionSignature signature = 
FunctionSignature.ret(IntegerType.INSTANCE)
+                .args(MapType.of(new AnyDataType(0), new AnyDataType(1)),
+                        new AnyDataType(0), new AnyDataType(1));
+        List<Expression> arguments = Lists.newArrayList(
+                new NullLiteral(), new BigIntLiteral(0), new 
IntegerLiteral(0));
+        signature = 
ComputeSignatureHelper.implementAnyDataTypeWithIndex(signature, arguments);
+        Assertions.assertTrue(signature.getArgType(0) instanceof MapType);
+        Assertions.assertTrue(((MapType) signature.getArgType(0)).getKeyType() 
instanceof BigIntType);
+        Assertions.assertTrue(((MapType) 
signature.getArgType(0)).getValueType() instanceof IntegerType);
+        Assertions.assertTrue(signature.getArgType(1) instanceof BigIntType);
+        Assertions.assertTrue(signature.getArgType(2) instanceof IntegerType);
+    }
+
+    @Test
+    void testArrayImplementAnyDataTypeWithIndex() {
+        FunctionSignature signature = 
FunctionSignature.ret(IntegerType.INSTANCE)
+                .args(ArrayType.of(new AnyDataType(0)), new AnyDataType(0));
+        List<Expression> arguments = Lists.newArrayList(
+                new ArrayLiteral(Lists.newArrayList(new IntegerLiteral(0))),
+                new BigIntLiteral(0));
+        signature = 
ComputeSignatureHelper.implementAnyDataTypeWithIndex(signature, arguments);
+        Assertions.assertTrue(signature.getArgType(0) instanceof ArrayType);
+        Assertions.assertTrue(((ArrayType) 
signature.getArgType(0)).getItemType() instanceof BigIntType);
+        Assertions.assertTrue(signature.getArgType(1) instanceof BigIntType);
+    }
+
+    @Test
+    void testMapImplementAnyDataTypeWithIndex() {
+        FunctionSignature signature = 
FunctionSignature.ret(IntegerType.INSTANCE)
+                .args(MapType.of(new AnyDataType(0), new AnyDataType(1)),
+                        new AnyDataType(0), new AnyDataType(1));
+        List<Expression> arguments = Lists.newArrayList(
+                new MapLiteral(Lists.newArrayList(new IntegerLiteral(0)), 
Lists.newArrayList(new BigIntLiteral(0))),
+                new BigIntLiteral(0), new IntegerLiteral(0));
+        signature = 
ComputeSignatureHelper.implementAnyDataTypeWithIndex(signature, arguments);
+        Assertions.assertTrue(signature.getArgType(0) instanceof MapType);
+        Assertions.assertTrue(((MapType) signature.getArgType(0)).getKeyType() 
instanceof BigIntType);
+        Assertions.assertTrue(((MapType) 
signature.getArgType(0)).getValueType() instanceof BigIntType);
+        Assertions.assertTrue(signature.getArgType(1) instanceof BigIntType);
+        Assertions.assertTrue(signature.getArgType(2) instanceof BigIntType);
+    }
+
+    @Test
+    void testArraySigWithNullArgWithFollowToAnyImplementAnyDataTypeWithIndex() 
{
+        FunctionSignature signature = 
FunctionSignature.ret(IntegerType.INSTANCE)
+                .args(ArrayType.of(new AnyDataType(0)), new AnyDataType(0),
+                        ArrayType.of(new FollowToAnyDataType(0)));
+        List<Expression> arguments = Lists.newArrayList(
+                new NullLiteral(),
+                new NullLiteral(),
+                new ArrayLiteral(Lists.newArrayList(new SmallIntLiteral((byte) 
0))));
+        signature = 
ComputeSignatureHelper.implementAnyDataTypeWithIndex(signature, arguments);
+        Assertions.assertTrue(signature.getArgType(0) instanceof ArrayType);
+        Assertions.assertTrue(((ArrayType) 
signature.getArgType(0)).getItemType() instanceof SmallIntType);
+        Assertions.assertTrue(signature.getArgType(1) instanceof SmallIntType);
+        Assertions.assertTrue(signature.getArgType(2) instanceof ArrayType);
+        Assertions.assertTrue(((ArrayType) 
signature.getArgType(2)).getItemType() instanceof SmallIntType);
+    }
+
+    @Test
+    void testMapSigWithNullArgWithFollowToAnyImplementAnyDataTypeWithIndex() {
+        FunctionSignature signature = 
FunctionSignature.ret(IntegerType.INSTANCE)
+                .args(MapType.of(new AnyDataType(0), new AnyDataType(1)),
+                        new AnyDataType(0), new AnyDataType(1),
+                        MapType.of(new FollowToAnyDataType(0), new 
FollowToAnyDataType(1)));
+        List<Expression> arguments = Lists.newArrayList(
+                new NullLiteral(), new NullLiteral(), new NullLiteral(),
+                new MapLiteral(Lists.newArrayList(new BigIntLiteral(0)),
+                        Lists.newArrayList(new IntegerLiteral(0))));
+        signature = 
ComputeSignatureHelper.implementAnyDataTypeWithIndex(signature, arguments);
+        Assertions.assertTrue(signature.getArgType(0) instanceof MapType);
+        Assertions.assertTrue(((MapType) signature.getArgType(0)).getKeyType() 
instanceof BigIntType);
+        Assertions.assertTrue(((MapType) 
signature.getArgType(0)).getValueType() instanceof IntegerType);
+        Assertions.assertTrue(signature.getArgType(1) instanceof BigIntType);
+        Assertions.assertTrue(signature.getArgType(2) instanceof IntegerType);
+        Assertions.assertTrue(signature.getArgType(3) instanceof MapType);
+        Assertions.assertTrue(((MapType) signature.getArgType(3)).getKeyType() 
instanceof BigIntType);
+        Assertions.assertTrue(((MapType) 
signature.getArgType(3)).getValueType() instanceof IntegerType);
+    }
+
+    @Test
+    void testArrayWithFollowToAnyImplementAnyDataTypeWithIndex() {
+        FunctionSignature signature = 
FunctionSignature.ret(IntegerType.INSTANCE)
+                .args(ArrayType.of(new AnyDataType(0)), new AnyDataType(0),
+                        ArrayType.of(new FollowToAnyDataType(0)));
+        List<Expression> arguments = Lists.newArrayList(
+                new ArrayLiteral(Lists.newArrayList(new IntegerLiteral(0))),
+                new BigIntLiteral(0),
+                new ArrayLiteral(Lists.newArrayList(new IntegerLiteral(0))));
+        signature = 
ComputeSignatureHelper.implementAnyDataTypeWithIndex(signature, arguments);
+        Assertions.assertTrue(signature.getArgType(0) instanceof ArrayType);
+        Assertions.assertTrue(((ArrayType) 
signature.getArgType(0)).getItemType() instanceof BigIntType);
+        Assertions.assertTrue(signature.getArgType(1) instanceof BigIntType);
+        Assertions.assertTrue(signature.getArgType(2) instanceof ArrayType);
+        Assertions.assertTrue(((ArrayType) 
signature.getArgType(2)).getItemType() instanceof BigIntType);
+    }
+
+    @Test
+    void testMapWithFollowToAnyImplementAnyDataTypeWithIndex() {
+        FunctionSignature signature = 
FunctionSignature.ret(IntegerType.INSTANCE)
+                .args(MapType.of(new AnyDataType(0), new AnyDataType(1)),
+                        new AnyDataType(0), new AnyDataType(1),
+                        MapType.of(new FollowToAnyDataType(0), new 
FollowToAnyDataType(1)));
+        List<Expression> arguments = Lists.newArrayList(
+                new MapLiteral(Lists.newArrayList(new IntegerLiteral(0)), 
Lists.newArrayList(new BigIntLiteral(0))),
+                new BigIntLiteral(0), new IntegerLiteral(0),
+                new MapLiteral(Lists.newArrayList(new IntegerLiteral(0)), 
Lists.newArrayList(new BigIntLiteral(0))));
+        signature = 
ComputeSignatureHelper.implementAnyDataTypeWithIndex(signature, arguments);
+        Assertions.assertTrue(signature.getArgType(0) instanceof MapType);
+        Assertions.assertTrue(((MapType) signature.getArgType(0)).getKeyType() 
instanceof BigIntType);
+        Assertions.assertTrue(((MapType) 
signature.getArgType(0)).getValueType() instanceof BigIntType);
+        Assertions.assertTrue(signature.getArgType(1) instanceof BigIntType);
+        Assertions.assertTrue(signature.getArgType(2) instanceof BigIntType);
+        Assertions.assertTrue(signature.getArgType(3) instanceof MapType);
+        Assertions.assertTrue(((MapType) signature.getArgType(3)).getKeyType() 
instanceof BigIntType);
+        Assertions.assertTrue(((MapType) 
signature.getArgType(3)).getValueType() instanceof BigIntType);
+    }
+
+    @Test
+    void testNoNormalizeDecimalV2() {
+        FunctionSignature signature = 
FunctionSignature.ret(IntegerType.INSTANCE).args();
+        signature = ComputeSignatureHelper.normalizeDecimalV2(signature, 
Collections.emptyList());
+        Assertions.assertEquals(IntegerType.INSTANCE, signature.returnType);
+    }
+
+    @Test
+    void testNormalizeDecimalV2() {
+        FunctionSignature signature = 
FunctionSignature.ret(DecimalV2Type.createDecimalV2Type(15, 3)).args();
+        signature = ComputeSignatureHelper.normalizeDecimalV2(signature, 
Collections.emptyList());
+        Assertions.assertEquals(DecimalV2Type.SYSTEM_DEFAULT, 
signature.returnType);
+    }
+
+    @Test
+    void testArrayDecimalV3ComputePrecision() {
+        FunctionSignature signature = 
FunctionSignature.ret(BooleanType.INSTANCE)
+                .args(ArrayType.of(DecimalV3Type.WILDCARD),
+                        ArrayType.of(DecimalV3Type.WILDCARD),
+                        DecimalV3Type.WILDCARD,
+                        IntegerType.INSTANCE,
+                        ArrayType.of(IntegerType.INSTANCE));
+        List<Expression> arguments = Lists.newArrayList(
+                new ArrayLiteral(Lists.newArrayList(new DecimalV3Literal(new 
BigDecimal("1.1234")))),
+                new NullLiteral(),
+                new DecimalV3Literal(new BigDecimal("123.123")),
+                new IntegerLiteral(0),
+                new ArrayLiteral(Lists.newArrayList(new IntegerLiteral(0))));
+        signature = ComputeSignatureHelper.computePrecision(new 
FakeComputeSignature(), signature, arguments);
+        Assertions.assertTrue(signature.getArgType(0) instanceof ArrayType);
+        Assertions.assertEquals(DecimalV3Type.createDecimalV3Type(7, 4),
+                ((ArrayType) signature.getArgType(0)).getItemType());
+        Assertions.assertTrue(signature.getArgType(1) instanceof ArrayType);
+        Assertions.assertEquals(DecimalV3Type.createDecimalV3Type(7, 4),
+                ((ArrayType) signature.getArgType(1)).getItemType());
+        Assertions.assertEquals(DecimalV3Type.createDecimalV3Type(7, 4),
+                signature.getArgType(2));
+        Assertions.assertTrue(signature.getArgType(4) instanceof ArrayType);
+        Assertions.assertEquals(IntegerType.INSTANCE,
+                ((ArrayType) signature.getArgType(4)).getItemType());
+    }
+
+    @Test
+    void testMapDecimalV3ComputePrecision() {
+        FunctionSignature signature = 
FunctionSignature.ret(BooleanType.INSTANCE)
+                .args(MapType.of(DecimalV3Type.WILDCARD, 
DecimalV3Type.WILDCARD),
+                        MapType.of(DecimalV3Type.WILDCARD, 
DecimalV3Type.WILDCARD),
+                        DecimalV3Type.WILDCARD);
+        List<Expression> arguments = Lists.newArrayList(
+                new MapLiteral(Lists.newArrayList(new DecimalV3Literal(new 
BigDecimal("1.1234"))),
+                        Lists.newArrayList(new DecimalV3Literal(new 
BigDecimal("12.12345")))),
+                new NullLiteral(),
+                new DecimalV3Literal(new BigDecimal("123.123")));
+        signature = ComputeSignatureHelper.computePrecision(new 
FakeComputeSignature(), signature, arguments);
+        Assertions.assertTrue(signature.getArgType(0) instanceof MapType);
+        Assertions.assertEquals(DecimalV3Type.createDecimalV3Type(8, 5),
+                ((MapType) signature.getArgType(0)).getKeyType());
+        Assertions.assertEquals(DecimalV3Type.createDecimalV3Type(8, 5),
+                ((MapType) signature.getArgType(0)).getValueType());
+        Assertions.assertTrue(signature.getArgType(1) instanceof MapType);
+        Assertions.assertEquals(DecimalV3Type.createDecimalV3Type(8, 5),
+                ((MapType) signature.getArgType(1)).getKeyType());
+        Assertions.assertEquals(DecimalV3Type.createDecimalV3Type(8, 5),
+                ((MapType) signature.getArgType(1)).getValueType());
+        Assertions.assertEquals(DecimalV3Type.createDecimalV3Type(8, 5),
+                signature.getArgType(2));
+    }
+
+    @Test
+    void testArrayDateTimeV2ComputePrecision() {
+        FunctionSignature signature = 
FunctionSignature.ret(BooleanType.INSTANCE)
+                .args(ArrayType.of(DateTimeV2Type.SYSTEM_DEFAULT),
+                        ArrayType.of(DateTimeV2Type.SYSTEM_DEFAULT),
+                        DateTimeV2Type.SYSTEM_DEFAULT,
+                        IntegerType.INSTANCE,
+                        ArrayType.of(IntegerType.INSTANCE));
+        List<Expression> arguments = Lists.newArrayList(
+                new ArrayLiteral(Lists.newArrayList(new 
DateTimeV2Literal("2020-02-02 00:00:00.123"))),
+                new NullLiteral(),
+                new DateTimeV2Literal("2020-02-02 00:00:00.12"),
+                new IntegerLiteral(0),
+                new ArrayLiteral(Lists.newArrayList(new IntegerLiteral(0))));
+        signature = ComputeSignatureHelper.computePrecision(new 
FakeComputeSignature(), signature, arguments);
+        Assertions.assertTrue(signature.getArgType(0) instanceof ArrayType);
+        Assertions.assertEquals(DateTimeV2Type.of(3),
+                ((ArrayType) signature.getArgType(0)).getItemType());
+        Assertions.assertTrue(signature.getArgType(1) instanceof ArrayType);
+        Assertions.assertEquals(DateTimeV2Type.of(3),
+                ((ArrayType) signature.getArgType(1)).getItemType());
+        Assertions.assertEquals(DateTimeV2Type.of(3),
+                signature.getArgType(2));
+        Assertions.assertTrue(signature.getArgType(4) instanceof ArrayType);
+        Assertions.assertEquals(IntegerType.INSTANCE,
+                ((ArrayType) signature.getArgType(4)).getItemType());
+    }
+
+    @Test
+    void testMapDateTimeV2ComputePrecision() {
+        FunctionSignature signature = 
FunctionSignature.ret(BooleanType.INSTANCE)
+                .args(MapType.of(DateTimeV2Type.SYSTEM_DEFAULT, 
DateTimeV2Type.SYSTEM_DEFAULT),
+                        MapType.of(DateTimeV2Type.SYSTEM_DEFAULT, 
DateTimeV2Type.SYSTEM_DEFAULT),
+                        DateTimeV2Type.SYSTEM_DEFAULT);
+        List<Expression> arguments = Lists.newArrayList(
+                new MapLiteral(Lists.newArrayList(new 
DateTimeV2Literal("2020-02-02 00:00:00.123")),
+                        Lists.newArrayList(new DateTimeV2Literal("2020-02-02 
00:00:00.12"))),
+                new NullLiteral(),
+                new DateTimeV2Literal("2020-02-02 00:00:00.1234"));
+        signature = ComputeSignatureHelper.computePrecision(new 
FakeComputeSignature(), signature, arguments);
+        Assertions.assertTrue(signature.getArgType(0) instanceof MapType);
+        Assertions.assertEquals(DateTimeV2Type.of(6),
+                ((MapType) signature.getArgType(0)).getKeyType());
+        Assertions.assertEquals(DateTimeV2Type.of(6),
+                ((MapType) signature.getArgType(0)).getValueType());
+        Assertions.assertTrue(signature.getArgType(1) instanceof MapType);
+        Assertions.assertEquals(DateTimeV2Type.of(6),
+                ((MapType) signature.getArgType(1)).getKeyType());
+        Assertions.assertEquals(DateTimeV2Type.of(6),
+                ((MapType) signature.getArgType(1)).getValueType());
+        Assertions.assertEquals(DateTimeV2Type.of(6),
+                signature.getArgType(2));
+    }
+
+    private static class FakeComputeSignature implements ComputeSignature {
+        @Override
+        public List<Expression> children() {
+            return null;
+        }
+
+        @Override
+        public Expression child(int index) {
+            return null;
+        }
+
+        @Override
+        public int arity() {
+            return 0;
+        }
+
+        @Override
+        public Expression withChildren(List<Expression> children) {
+            return null;
+        }
+
+        @Override
+        public List<FunctionSignature> getSignatures() {
+            return null;
+        }
+
+        @Override
+        public FunctionSignature getSignature() {
+            return null;
+        }
+
+        @Override
+        public FunctionSignature searchSignature(List<FunctionSignature> 
signatures) {
+            return null;
+        }
+
+        @Override
+        public boolean nullable() {
+            return false;
+        }
+    }
+}
diff --git a/regression-test/data/javaudf_p0/test_javaudf_all_types.out 
b/regression-test/data/javaudf_p0/test_javaudf_all_types.out
index e18e1bf1e1b..66c069a699c 100644
--- a/regression-test/data/javaudf_p0/test_javaudf_all_types.out
+++ b/regression-test/data/javaudf_p0/test_javaudf_all_types.out
@@ -2,12 +2,12 @@
 -- !java_udf_all_types --
 1      true    1       2       1       3       4       3.3300  7.77    3.1415  
2023-10-18      2023-10-18      2023-10-18      2023-10-11T10:11:11.234 
2023-10-11T10:11:11.234 2023-10-11T10:11:11.234 row1    [null, "nested1"]       
{"k1":null, "k2":1}
 2      false   2       4       2       6       8       1.6650  3.885   1.57075 
2023-10-19      2023-10-19      2023-10-19      2023-10-12T10:12:11.234 
2023-10-12T10:12:11.234 2023-10-12T10:12:11.234 row2    [null, "nested2"]       
{"k3":2, "k2":null}
-3      true    3       6       3       9       12      1.1100  2.59    
1.0471666667    2023-10-20      2023-10-20      2023-10-20      
2023-10-13T10:13:11.234 2023-10-13T10:13:11.234 2023-10-13T10:13:11.234 row3    
[null, "nested3"]       {"k3":null, "k4":3}
-4      false   4       8       4       12      16      0.8325  1.9425  
0.785375        2023-10-21      2023-10-21      2023-10-21      
2023-10-14T10:14:11.234 2023-10-14T10:14:11.234 2023-10-14T10:14:11.234 row4    
[null, "nested4"]       {"k4":null, "k5":4}
+3      true    3       6       3       9       12      1.1100  2.59    1.04717 
2023-10-20      2023-10-20      2023-10-20      2023-10-13T10:13:11.234 
2023-10-13T10:13:11.234 2023-10-13T10:13:11.234 row3    [null, "nested3"]       
{"k3":null, "k4":3}
+4      false   4       8       4       12      16      0.8325  1.943   0.78538 
2023-10-21      2023-10-21      2023-10-21      2023-10-14T10:14:11.234 
2023-10-14T10:14:11.234 2023-10-14T10:14:11.234 row4    [null, "nested4"]       
{"k4":null, "k5":4}
 5      true    5       10      5       15      20      0.6660  1.554   0.6283  
2023-10-22      2023-10-22      2023-10-22      2023-10-15T10:15:11.234 
2023-10-15T10:15:11.234 2023-10-15T10:15:11.234 row5    [null, "nested5"]       
{"k5":null, "k6":5}
-6      false   6       12      6       18      24      0.5550  1.295   
0.5235833333    2023-10-23      2023-10-23      2023-10-23      
2023-10-16T10:16:11.234 2023-10-16T10:16:11.234 2023-10-16T10:16:11.234 row6    
[null, "nested6"]       {"k7":6, "k6":null}
-7      true    7       14      7       21      28      0.4757  1.11    
0.4487857143    2023-10-24      2023-10-24      2023-10-24      
2023-10-17T10:17:11.234 2023-10-17T10:17:11.234 2023-10-17T10:17:11.234 row7    
[null, "nested7"]       {"k7":null, "k8":7}
-8      false   8       16      8       24      32      0.4163  0.97125 
0.3926875       2023-10-25      2023-10-25      2023-10-25      
2023-10-18T10:18:11.234 2023-10-18T10:18:11.234 2023-10-18T10:18:11.234 row8    
[null, "nested8"]       {"k8":null, "k9":8}
-9      true    9       18      9       27      36      0.3700  0.86333334      
0.3490555556    2023-10-26      2023-10-26      2023-10-26      
2023-10-19T10:19:11.234 2023-10-19T10:19:11.234 2023-10-19T10:19:11.234 row9    
[null, "nested9"]       {"k9":null, "k10":9}
+6      false   6       12      6       18      24      0.5550  1.295   0.52358 
2023-10-23      2023-10-23      2023-10-23      2023-10-16T10:16:11.234 
2023-10-16T10:16:11.234 2023-10-16T10:16:11.234 row6    [null, "nested6"]       
{"k7":6, "k6":null}
+7      true    7       14      7       21      28      0.4757  1.11    0.44879 
2023-10-24      2023-10-24      2023-10-24      2023-10-17T10:17:11.234 
2023-10-17T10:17:11.234 2023-10-17T10:17:11.234 row7    [null, "nested7"]       
{"k7":null, "k8":7}
+8      false   8       16      8       24      32      0.4163  0.971   0.39269 
2023-10-25      2023-10-25      2023-10-25      2023-10-18T10:18:11.234 
2023-10-18T10:18:11.234 2023-10-18T10:18:11.234 row8    [null, "nested8"]       
{"k8":null, "k9":8}
+9      true    9       18      9       27      36      0.3700  0.863   0.34906 
2023-10-26      2023-10-26      2023-10-26      2023-10-19T10:19:11.234 
2023-10-19T10:19:11.234 2023-10-19T10:19:11.234 row9    [null, "nested9"]       
{"k9":null, "k10":9}
 10     false   \N      20      10      30      40      \N      0.777   0.31415 
\N      \N      \N      2023-10-20T10:10:11.234 2023-10-20T10:10:11.234 
2023-10-20T10:10:11.234 \N      [null, "nested10"]      {"k11":10, "k10":null}
 
diff --git a/regression-test/data/nereids_function_p0/scalar_function/Array.out 
b/regression-test/data/nereids_function_p0/scalar_function/Array.out
index 9b359ad3e0f..92cb7a24e66 100644
--- a/regression-test/data/nereids_function_p0/scalar_function/Array.out
+++ b/regression-test/data/nereids_function_p0/scalar_function/Array.out
@@ -14204,8 +14204,8 @@ true
 []
 
 -- !array_apply2 --
-["2022-12-01 22:23:25.000", "2022-12-01 23:23:25.000"]
-["2022-12-02 22:23:25.000", "2022-12-02 23:23:25.000"]
+["2022-12-01 22:23:25.000000", "2022-12-01 23:23:25.000000"]
+["2022-12-02 22:23:25.000000", "2022-12-02 23:23:25.000000"]
 
 -- !array_apply3 --
 \N
diff --git 
a/regression-test/data/query_p0/aggregate/map_agg_nested_insert_doris.out 
b/regression-test/data/query_p0/aggregate/map_agg_nested_insert_doris.out
index 670124a07a9..53b23a1d965 100644
--- a/regression-test/data/query_p0/aggregate/map_agg_nested_insert_doris.out
+++ b/regression-test/data/query_p0/aggregate/map_agg_nested_insert_doris.out
@@ -1,25 +1,25 @@
 -- This file is automatically generated. You should know what you did if you 
want to edit this
 -- !sql --
-1      LC      [0.20961408068486054, 0.67796351365684493, 
0.088745389947127551, 0.12660368488966578, 0.50555432]       
{"RelKZ3-etM12wN-uP4-XR7Z":0.28928123482977663, 
"FEpfM2-MGtIq1y-Ily-hqLN":0.75982378533995065}
-1      LB      [0.25076205844319044, 0.54003619330849928, 0.70661164863002113, 
0.99472899095144263, 0.07831494]        
{"UsPMIs-ipxhEnU-1EG-RJpe":0.22741640776012562, 
"gcn7fm-ILbMhQ6-fcz-TndT":0.36370276228098763, 
"o8dgBn-1bM26Wz-8SJ-xW6u":0.55671646501523719, 
"wav6ZA-780SwLJ-Vj3-KCv5":0.8665187582647581}
-1      LA      [0.35815922932906263, 0.0011899152357573994, 
0.28749219850167373, 0.93512930168283781, 0.1552584991620739, 0.733089]    
{"UsPMIs-ipxhEnU-1EG-RJpe":0.22741640776012562, 
"gcn7fm-ILbMhQ6-fcz-TndT":0.36370276228098763, 
"o8dgBn-1bM26Wz-8SJ-xW6u":0.55671646501523719, 
"wav6ZA-780SwLJ-Vj3-KCv5":0.8665187582647581}
+1      LC      [0.209614, 0.6779635, 0.0887453, 0.1266036, 0.50555432] 
{"RelKZ3-etM12wN-uP4-XR7Z":0.289281, "FEpfM2-MGtIq1y-Ily-hqLN":0.759823}
+1      LB      [0.250762, 0.5400361, 0.7066116, 0.9947289, 0.07831494] 
{"UsPMIs-ipxhEnU-1EG-RJpe":0.227416, "gcn7fm-ILbMhQ6-fcz-TndT":0.363702, 
"o8dgBn-1bM26Wz-8SJ-xW6u":0.55671, "wav6ZA-780SwLJ-Vj3-KCv5":0.86651}
+1      LA      [0.3581592, 0.0011899, 0.2874921, 0.9351293, 0.15525849, 
0.733089]      {"UsPMIs-ipxhEnU-1EG-RJpe":0.227416, 
"gcn7fm-ILbMhQ6-fcz-TndT":0.3637, "o8dgBn-1bM26Wz-8SJ-xW6u":0.556716, 
"wav6ZA-780SwLJ-Vj3-KCv5":0.866518}
 2      LC      [222, null]     {"sUMCB1-rKPSp71-F9O-PyDS":null}
-2      LB      [null, 1.22344] {null:0.69249939434627483}
-2      LA      []      {"iK1yJB-yuEElEZ-li4-vxAT":0.43894802430489277, 
"4kF6cZ-Cwlf33s-eYD-92Dy":0.97378869646008837}
-3      LC      [1]     {"":0.69249939434627483, "sUMCB1-rKPSp71-F9O-S":null}
-3      LB      [0.20961408068486054, 0]        
{"4kF6cZ-Cwlf33s-eYD-92Dy":0.97378869646008837, 
"AyE8nj-ecfHXG1-XuB-ye3B":0.69671634023926254, 
"CwYJPz-oSaS398-CfV-MOLZ":0.9422562276573786, 
"xMk5Ob-lCuzA3R-yXs-NLnc":0.31773598018625049}
-3      LA      [0.20961408068486054, 0.67796351365684493]      {null:null, 
"FEpfM2-MGtIq1y-Ily-hqLN":0.75982378533995065, 
"Dy4lap-sNXoyV3-LBz-ikjw":0.3353160677758501}
+2      LB      [null, 1.22344] {null:0.6924}
+2      LA      []      {"iK1yJB-yuEElEZ-li4-vxAT":0.438948, 
"4kF6cZ-Cwlf33s-eYD-92Dy":0.97378}
+3      LC      [1]     {"":0.69249, "sUMCB1-rKPSp71-F9O-S":null}
+3      LB      [0.209614, 0]   {"4kF6cZ-Cwlf33s-eYD-92Dy":0.97378, 
"AyE8nj-ecfHXG1-XuB-ye3B":0.696716, "CwYJPz-oSaS398-CfV-MOLZ":0.94225, 
"xMk5Ob-lCuzA3R-yXs-NLnc":0.31773}
+3      LA      [0.209614, 0.6779635]   {null:null, 
"FEpfM2-MGtIq1y-Ily-hqLN":0.7598, "Dy4lap-sNXoyV3-LBz-ikjw":0.33531}
 4      LC      [4.44, 5.55, 6.66, 7.77]        {"a":77, "d":66}
 4      LB      [1.11, 2.22, 3.33]      {"amory":7, "doris":6}
-4      LA      [0.39467746014773986, 0.68089927382163351, 0.17672102367531073, 
0.075743536456418625]   {"kduA0V-rqJ4ga1-mvG-p3OK":0.0980960662977799, 
"xpDNOl-iTcYRWk-6Ak-9smj":0.81335421914074846}
+4      LA      [0.39464, 0.68089, 0.17672, 0.0757435]  
{"kduA0V-rqJ4ga1-mvG-p3OK":0.098096, "xpDNOl-iTcYRWk-6Ak-9smj":0.813354}
 5      LC      [1, 3, 7]       {"a":3, "up":7}
-5      LB      [0.68817051068356083, 0.58866705765486893, 0.9770647663621238]  
{"CDuRMK-JH8MfuY-ogq-QiQS":0.061575881523062148, 
"3WYdO0-XltW1HK-hjM-LNlz":0.86164972492374081, 
"SxBfEK-pIiMQV6-qwZ-B2rj":0.80341434305286941}
+5      LB      [0.68817, 0.588667, 0.97706]    
{"CDuRMK-JH8MfuY-ogq-QiQS":0.0615758, "3WYdO0-XltW1HK-hjM-LNlz":0.8616, 
"SxBfEK-pIiMQV6-qwZ-B2rj":0.80341}
 5      LA      [1234.3456, 345.3453456]        {"":null}
 
 -- !sql --
-1      {"LC":[0.20961408068486054, 0.67796351365684493, 0.088745389947127551, 
0.12660368488966578, 0.50555432], "LB":[0.25076205844319044, 
0.54003619330849928, 0.70661164863002113, 0.99472899095144263, 0.07831494], 
"LA":[0.35815922932906263, 0.0011899152357573994, 0.28749219850167373, 
0.93512930168283781, 0.1552584991620739, 0.733089]}
+1      {"LC":[0.209614, 0.6779635, 0.0887453, 0.1266036, 0.50555432], 
"LB":[0.250762, 0.5400361, 0.7066116, 0.9947289, 0.07831494], "LA":[0.3581592, 
0.0011899, 0.2874921, 0.9351293, 0.15525849, 0.733089]}
 2      {"LC":[222, null], "LB":[null, 1.22344], "LA":[]}
-3      {"LC":[1], "LB":[0.20961408068486054, 0], "LA":[0.20961408068486054, 
0.67796351365684493]}
-4      {"LC":[4.44, 5.55, 6.66, 7.77], "LB":[1.11, 2.22, 3.33], 
"LA":[0.39467746014773986, 0.68089927382163351, 0.17672102367531073, 
0.075743536456418625]}
-5      {"LC":[1, 3, 7], "LB":[0.68817051068356083, 0.58866705765486893, 
0.9770647663621238], "LA":[1234.3456, 345.3453456]}
+3      {"LC":[1], "LB":[0.209614, 0], "LA":[0.209614, 0.6779635]}
+4      {"LC":[4.44, 5.55, 6.66, 7.77], "LB":[1.11, 2.22, 3.33], "LA":[0.39464, 
0.68089, 0.17672, 0.0757435]}
+5      {"LC":[1, 3, 7], "LB":[0.68817, 0.588667, 0.97706], "LA":[1234.3456, 
345.3453456]}
 
diff --git 
a/regression-test/data/query_p0/sql_functions/array_functions/test_array_with_scale_type.out
 
b/regression-test/data/query_p0/sql_functions/array_functions/test_array_with_scale_type.out
index cb0adda716a..811aba2040c 100644
--- 
a/regression-test/data/query_p0/sql_functions/array_functions/test_array_with_scale_type.out
+++ 
b/regression-test/data/query_p0/sql_functions/array_functions/test_array_with_scale_type.out
@@ -91,8 +91,8 @@
 []
 
 -- !select --
-["2022-12-01 22:23:25.000", "2022-12-01 23:23:25.000"]
-["2022-12-02 22:23:25.000", "2022-12-02 23:23:25.000"]
+["2022-12-01 22:23:25.000000", "2022-12-01 23:23:25.000000"]
+["2022-12-02 22:23:25.000000", "2022-12-02 23:23:25.000000"]
 
 -- !select --
 \N
@@ -119,8 +119,8 @@
 ["2022-12-02 22:23:25.000", "2022-12-02 23:23:25.000"]
 
 -- !select --
-["2022-12-01 22:23:25.000", "2022-12-01 23:23:25.000", "2022-12-02 
22:23:24.123", "2022-12-02 22:23:23.123"]
-["2022-12-02 22:23:25.000", "2022-12-02 23:23:25.000", "2022-12-02 
22:23:24.123", "2022-12-02 22:23:23.123"]
+["2022-12-01 22:23:25.000000", "2022-12-01 23:23:25.000000", "2022-12-02 
22:23:24.123000", "2022-12-02 22:23:23.123000"]
+["2022-12-02 22:23:25.000000", "2022-12-02 23:23:25.000000", "2022-12-02 
22:23:24.123000", "2022-12-02 22:23:23.123000"]
 
 -- !select --
 [22.679, 33.679, 22.679, 33.679, 22.679, 33.679]
diff --git a/regression-test/suites/javaudf_p0/test_javaudf_all_types.groovy 
b/regression-test/suites/javaudf_p0/test_javaudf_all_types.groovy
index 46823eb2767..736f52d5c37 100644
--- a/regression-test/suites/javaudf_p0/test_javaudf_all_types.groovy
+++ b/regression-test/suites/javaudf_p0/test_javaudf_all_types.groovy
@@ -51,11 +51,11 @@ suite("test_javaudf_all_types") {
         int i = 1
         for (; i < 10; i++) {
             sb.append("""
-                
(${i},${i%2},${i},${i}*2,${i}*3,${i}*4,${3.33/i},${7.77/i},${3.1415/i},"2023-10-${i+17}","2023-10-${i+10}
 10:1${i}:11.234","row${i}",array(null, 
"nested${i}"),{"k${i}":null,"k${i+1}":${i}}),
+                
(${i},${i%2},${i},${i}*2,${i}*3,${i}*4,${3.33/i},${(7.77/i).round(3)},${(3.1415/i).round(5)},"2023-10-${i+17}","2023-10-${i+10}
 10:1${i}:11.234","row${i}",array(null, 
"nested${i}"),{"k${i}":null,"k${i+1}":${i}}),
             """)
         }
         sb.append("""
-                
(${i},${i%2},null,${i}*2,${i}*3,${i}*4,null,${7.77/i},${3.1415/i},null,"2023-10-${i+10}
 10:${i}:11.234",null,array(null, "nested${i}"),{"k${i}":null,"k${i+1}":${i}})
+                
(${i},${i%2},null,${i}*2,${i}*3,${i}*4,null,${(7.77/i).round(3)},${(3.1415/i).round(5)},null,"2023-10-${i+10}
 10:${i}:11.234",null,array(null, "nested${i}"),{"k${i}":null,"k${i+1}":${i}})
             """)
         sql """ INSERT INTO ${tableName} VALUES
              ${sb.toString()}
diff --git 
a/regression-test/suites/query_p0/aggregate/map_agg_nested_insert_doris.groovy 
b/regression-test/suites/query_p0/aggregate/map_agg_nested_insert_doris.groovy
index dc0de44257e..a4b0410cba3 100644
--- 
a/regression-test/suites/query_p0/aggregate/map_agg_nested_insert_doris.groovy
+++ 
b/regression-test/suites/query_p0/aggregate/map_agg_nested_insert_doris.groovy
@@ -60,20 +60,20 @@ suite("map_agg_nested_insert_doris", "p0") {
 
     sql """
         insert into `${tb_base}` values
-            (1, "LA", [0.35815922932906263, 0.0011899152357573994, 
0.28749219850167373, 0.93512930168283781, 0.1552584991620739, 0.733089], 
{"UsPMIs-ipxhEnU-1EG-RJpe":0.22741640776012562, 
"gcn7fm-ILbMhQ6-fcz-TndT":0.36370276228098763, 
"o8dgBn-1bM26Wz-8SJ-xW6u":0.55671646501523719, 
"wav6ZA-780SwLJ-Vj3-KCv5":0.8665187582647581}),
-            (1, "LB", [0.25076205844319044, 0.54003619330849928, 
0.70661164863002113, 0.99472899095144263, 0.07831494], 
{"UsPMIs-ipxhEnU-1EG-RJpe":0.22741640776012562, 
"gcn7fm-ILbMhQ6-fcz-TndT":0.36370276228098763, 
"o8dgBn-1bM26Wz-8SJ-xW6u":0.55671646501523719, 
"wav6ZA-780SwLJ-Vj3-KCv5":0.8665187582647581}),
-            (1, "LC", [0.20961408068486054, 0.67796351365684493, 
0.088745389947127551, 0.12660368488966578, 0.50555432], 
{"RelKZ3-etM12wN-uP4-XR7Z":0.28928123482977663, 
"FEpfM2-MGtIq1y-Ily-hqLN":0.75982378533995065}),
-            (2, "LA", [], {"iK1yJB-yuEElEZ-li4-vxAT":0.43894802430489277, 
"4kF6cZ-Cwlf33s-eYD-92Dy":0.97378869646008837}),
-            (2, "LB", [NULL, 1.22344], {NULL: 0.69249939434627483}),
+            (1, "LA", [0.3581592, 0.0011899, 0.2874921, 0.9351293, 0.15525849, 
0.733089], {"UsPMIs-ipxhEnU-1EG-RJpe":0.227416, 
"gcn7fm-ILbMhQ6-fcz-TndT":0.36370, "o8dgBn-1bM26Wz-8SJ-xW6u":0.556716, 
"wav6ZA-780SwLJ-Vj3-KCv5":0.866518}),
+            (1, "LB", [0.2507620, 0.5400361, 0.7066116, 0.9947289, 
0.07831494], {"UsPMIs-ipxhEnU-1EG-RJpe":0.227416, 
"gcn7fm-ILbMhQ6-fcz-TndT":0.363702, "o8dgBn-1bM26Wz-8SJ-xW6u":0.55671, 
"wav6ZA-780SwLJ-Vj3-KCv5":0.86651}),
+            (1, "LC", [0.2096140, 0.6779635, 0.0887453, 0.1266036, 
0.50555432], {"RelKZ3-etM12wN-uP4-XR7Z":0.289281, 
"FEpfM2-MGtIq1y-Ily-hqLN":0.759823}),
+            (2, "LA", [], {"iK1yJB-yuEElEZ-li4-vxAT":0.4389480, 
"4kF6cZ-Cwlf33s-eYD-92Dy":0.97378}),
+            (2, "LB", [NULL, 1.22344], {NULL: 0.6924}),
             (2, "LC", [222,NULL], {"sUMCB1-rKPSp71-F9O-PyDS": NULL}),
-            (3, "LA", [0.20961408068486054, 0.67796351365684493], {NULL:NULL, 
"FEpfM2-MGtIq1y-Ily-hqLN":0.75982378533995065, 
"Dy4lap-sNXoyV3-LBz-ikjw":0.3353160677758501}),
-            (3, "LB", [0.20961408068486054,0], 
{"4kF6cZ-Cwlf33s-eYD-92Dy":0.97378869646008837, 
"AyE8nj-ecfHXG1-XuB-ye3B":0.69671634023926254, 
"CwYJPz-oSaS398-CfV-MOLZ":0.9422562276573786, 
"xMk5Ob-lCuzA3R-yXs-NLnc":0.31773598018625049}),
-            (3, "LC", [1.], {"" : 0.69249939434627483, 
"sUMCB1-rKPSp71-F9O-S":NULL}),
-            (4, "LA", [0.39467746014773986, 0.68089927382163351, 
0.17672102367531073, 0.075743536456418625], 
{"kduA0V-rqJ4ga1-mvG-p3OK":0.0980960662977799, 
"xpDNOl-iTcYRWk-6Ak-9smj":0.81335421914074846}),
+            (3, "LA", [0.2096140, 0.6779635], {NULL:NULL, 
"FEpfM2-MGtIq1y-Ily-hqLN":0.7598, "Dy4lap-sNXoyV3-LBz-ikjw":0.33531}),
+            (3, "LB", [0.2096140,0], {"4kF6cZ-Cwlf33s-eYD-92Dy":0.97378, 
"AyE8nj-ecfHXG1-XuB-ye3B":0.696716, "CwYJPz-oSaS398-CfV-MOLZ":0.94225, 
"xMk5Ob-lCuzA3R-yXs-NLnc":0.31773}),
+            (3, "LC", [1.], {"" : 0.69249, "sUMCB1-rKPSp71-F9O-S":NULL}),
+            (4, "LA", [0.39464, 0.68089, 0.17672, 0.0757435], 
{"kduA0V-rqJ4ga1-mvG-p3OK":0.0980960, "xpDNOl-iTcYRWk-6Ak-9smj":0.813354}),
             (4, "LB", [1.11, 2.22, 3.33], {"amory": 7, "doris": 6}),
             (4, "LC", [4.44, 5.55, 6.66, 7.77], {"a": 77, "d": 66}),
             (5, "LA", [1234.3456, 345.3453456], {"":NULL}),
-            (5, "LB", [0.68817051068356083, 0.58866705765486893, 
0.9770647663621238], {"CDuRMK-JH8MfuY-ogq-QiQS":0.061575881523062148, 
"3WYdO0-XltW1HK-hjM-LNlz":0.86164972492374081, 
"SxBfEK-pIiMQV6-qwZ-B2rj":0.80341434305286941}),
+            (5, "LB", [0.688170, 0.5886670, 0.97706], 
{"CDuRMK-JH8MfuY-ogq-QiQS":0.0615758, "3WYdO0-XltW1HK-hjM-LNlz":0.8616, 
"SxBfEK-pIiMQV6-qwZ-B2rj":0.80341}),
             (5, "LC", [1, 3, 7], {"a": 3, "up": 7});
     """
 


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

Reply via email to