From daa4db097e3d5cd77f24f134a35b891ecbd18992 Mon Sep 17 00:00:00 2001 From: morrySnow <101034200+morrySnow@users.noreply.github.com> Date: Wed, 23 Aug 2023 20:38:09 +0800 Subject: [PATCH] [fix](Nereids) array_difference and array_position get wrong result (#23331) 1. change array_difference signature to let it return same type as arg 2. do not change precision when signature not use wildcard type --- .../functions/ComputeSignatureHelper.java | 13 +++-- .../functions/scalar/ArrayDifference.java | 6 +-- .../scalar_function/Array.out | 48 +++++++++---------- .../pipeline/p0/conf/regression-conf.groovy | 2 +- 4 files changed, 36 insertions(+), 33 deletions(-) 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 88cad494811c3d..a8e03153ae00fd 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 @@ -334,6 +334,10 @@ private static FunctionSignature defaultDecimalV3PrecisionPromotion( if (!(targetType instanceof DecimalV3Type)) { continue; } + // only process wildcard decimalv3 + if (((DecimalV3Type) targetType).getPrecision() > 0) { + continue; + } if (finalType == null) { finalType = DecimalV3Type.forType(arguments.get(i).getDataType()); } else { @@ -347,19 +351,20 @@ private static FunctionSignature defaultDecimalV3PrecisionPromotion( } finalType = DecimalV3Type.widerDecimalV3Type((DecimalV3Type) finalType, argType, true); } - Preconditions.checkState(finalType.isDecimalV3Type(), - "decimalv3 precision promotion failed."); + Preconditions.checkState(finalType.isDecimalV3Type(), "decimalv3 precision promotion failed."); } DataType argType = finalType; List newArgTypes = signature.argumentsTypes.stream().map(t -> { - if (t instanceof DecimalV3Type) { + // only process wildcard decimalv3 + if (t instanceof DecimalV3Type && ((DecimalV3Type) t).getPrecision() <= 0) { return argType; } else { return t; } }).collect(Collectors.toList()); signature = signature.withArgumentTypes(signature.hasVarArgs, newArgTypes); - if (signature.returnType instanceof DecimalV3Type) { + if (signature.returnType instanceof DecimalV3Type + && ((DecimalV3Type) signature.returnType).getPrecision() <= 0) { signature = signature.withReturnType(argType); } return signature; 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 c883852cd367b7..ce1aa70b0f1648 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 @@ -53,10 +53,8 @@ public class ArrayDifference extends ScalarFunction 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.ret(ArrayType.of(DecimalV2Type.SYSTEM_DEFAULT)) - .args(ArrayType.of(DecimalV2Type.SYSTEM_DEFAULT)), - FunctionSignature.ret(ArrayType.of(DecimalV3Type.WILDCARD)) - .args(ArrayType.of(DecimalV3Type.WILDCARD)) + FunctionSignature.retArgType(0).args(ArrayType.of(DecimalV2Type.SYSTEM_DEFAULT)), + FunctionSignature.retArgType(0).args(ArrayType.of(DecimalV3Type.WILDCARD)) ); /** 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 426c1ee1bda9c9..dad029a71b4b9e 100644 --- a/regression-test/data/nereids_function_p0/scalar_function/Array.out +++ b/regression-test/data/nereids_function_p0/scalar_function/Array.out @@ -8120,33 +8120,33 @@ true [9, 9, 9, 9, 9, 9, 9, 9, 9] -- !sql_array_with_constant_DecimalV3 -- -[0.100000000] -[0.200000000, 0.200000000] -[0.300000000, 0.300000000, 0.300000000] -[0.400000000, 0.400000000, 0.400000000, 0.400000000] -[0.500000000, 0.500000000, 0.500000000, 0.500000000, 0.500000000] -[0.600000000, 0.600000000, 0.600000000, 0.600000000, 0.600000000, 0.600000000] -[0.700000000, 0.700000000, 0.700000000, 0.700000000, 0.700000000, 0.700000000, 0.700000000] -[0.800000000, 0.800000000, 0.800000000, 0.800000000, 0.800000000, 0.800000000, 0.800000000, 0.800000000] -[0.900000000, 0.900000000, 0.900000000, 0.900000000, 0.900000000, 0.900000000, 0.900000000, 0.900000000, 0.900000000] -[1.000000000, 1.000000000, 1.000000000, 1.000000000, 1.000000000, 1.000000000, 1.000000000, 1.000000000, 1.000000000, 1.000000000] -[1.100000000, 1.100000000, 1.100000000, 1.100000000, 1.100000000, 1.100000000, 1.100000000, 1.100000000, 1.100000000, 1.100000000, 1.100000000] -[1.200000000, 1.200000000, 1.200000000, 1.200000000, 1.200000000, 1.200000000, 1.200000000, 1.200000000, 1.200000000, 1.200000000, 1.200000000, 1.200000000] +[0.100] +[0.200, 0.200] +[0.300, 0.300, 0.300] +[0.400, 0.400, 0.400, 0.400] +[0.500, 0.500, 0.500, 0.500, 0.500] +[0.600, 0.600, 0.600, 0.600, 0.600, 0.600] +[0.700, 0.700, 0.700, 0.700, 0.700, 0.700, 0.700] +[0.800, 0.800, 0.800, 0.800, 0.800, 0.800, 0.800, 0.800] +[0.900, 0.900, 0.900, 0.900, 0.900, 0.900, 0.900, 0.900, 0.900] +[1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000] +[1.100, 1.100, 1.100, 1.100, 1.100, 1.100, 1.100, 1.100, 1.100, 1.100, 1.100] +[1.200, 1.200, 1.200, 1.200, 1.200, 1.200, 1.200, 1.200, 1.200, 1.200, 1.200, 1.200] [] -- !sql_array_with_constant_DecimalV3_notnull -- -[0.100000000] -[0.200000000, 0.200000000] -[0.300000000, 0.300000000, 0.300000000] -[0.400000000, 0.400000000, 0.400000000, 0.400000000] -[0.500000000, 0.500000000, 0.500000000, 0.500000000, 0.500000000] -[0.600000000, 0.600000000, 0.600000000, 0.600000000, 0.600000000, 0.600000000] -[0.700000000, 0.700000000, 0.700000000, 0.700000000, 0.700000000, 0.700000000, 0.700000000] -[0.800000000, 0.800000000, 0.800000000, 0.800000000, 0.800000000, 0.800000000, 0.800000000, 0.800000000] -[0.900000000, 0.900000000, 0.900000000, 0.900000000, 0.900000000, 0.900000000, 0.900000000, 0.900000000, 0.900000000] -[1.000000000, 1.000000000, 1.000000000, 1.000000000, 1.000000000, 1.000000000, 1.000000000, 1.000000000, 1.000000000, 1.000000000] -[1.100000000, 1.100000000, 1.100000000, 1.100000000, 1.100000000, 1.100000000, 1.100000000, 1.100000000, 1.100000000, 1.100000000, 1.100000000] -[1.200000000, 1.200000000, 1.200000000, 1.200000000, 1.200000000, 1.200000000, 1.200000000, 1.200000000, 1.200000000, 1.200000000, 1.200000000, 1.200000000] +[0.100] +[0.200, 0.200] +[0.300, 0.300, 0.300] +[0.400, 0.400, 0.400, 0.400] +[0.500, 0.500, 0.500, 0.500, 0.500] +[0.600, 0.600, 0.600, 0.600, 0.600, 0.600] +[0.700, 0.700, 0.700, 0.700, 0.700, 0.700, 0.700] +[0.800, 0.800, 0.800, 0.800, 0.800, 0.800, 0.800, 0.800] +[0.900, 0.900, 0.900, 0.900, 0.900, 0.900, 0.900, 0.900, 0.900] +[1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000] +[1.100, 1.100, 1.100, 1.100, 1.100, 1.100, 1.100, 1.100, 1.100, 1.100, 1.100] +[1.200, 1.200, 1.200, 1.200, 1.200, 1.200, 1.200, 1.200, 1.200, 1.200, 1.200, 1.200] -- !sql_array_with_constant_Boolean -- [0, 0, 0, 0, 0, 0, 0] diff --git a/regression-test/pipeline/p0/conf/regression-conf.groovy b/regression-test/pipeline/p0/conf/regression-conf.groovy index c5847ecede6c28..12397d47088dad 100644 --- a/regression-test/pipeline/p0/conf/regression-conf.groovy +++ b/regression-test/pipeline/p0/conf/regression-conf.groovy @@ -54,7 +54,7 @@ testDirectories = "" // this groups will not be executed excludeGroups = "" // this suites will not be executed -excludeSuites = "nereids_scalar_fn_Array,test_pk_uk_index_change,test_pk_uk_case,test_default_limit,test_profile,test_broker_load,test_spark_load,test_refresh_mtmv,test_bitmap_filter,test_export_parquet,test_doris_jdbc_catalog,test_transactional_hive,nereids_delete_mow_partial_update" +excludeSuites = "test_pk_uk_index_change,test_pk_uk_case,test_default_limit,test_profile,test_broker_load,test_spark_load,test_refresh_mtmv,test_bitmap_filter,test_export_parquet,test_doris_jdbc_catalog,test_transactional_hive,nereids_delete_mow_partial_update" // this directories will not be executed excludeDirectories = "workload_manager_p1"