From 6f570326bfa6e08d9cfbea2a8defd213549343c4 Mon Sep 17 00:00:00 2001 From: morrySnow Date: Thu, 16 Nov 2023 20:25:30 +0800 Subject: [PATCH] [fix](Nereids) result type of add precision is 1 more than expected --- .../apache/doris/nereids/trees/expressions/Add.java | 2 +- .../nereids/trees/expressions/BinaryArithmetic.java | 6 +++++- .../doris/nereids/trees/expressions/Subtract.java | 2 +- .../suites/nereids_arith_p0/decimal.groovy | 12 ++++++++++++ 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Add.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Add.java index 2be8a3c2c0cb42..bf19192ff5c6fb 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Add.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Add.java @@ -50,7 +50,7 @@ public Expression withChildren(List children) { @Override public DecimalV3Type getDataTypeForDecimalV3(DecimalV3Type t1, DecimalV3Type t2) { DecimalV3Type decimalV3Type = (DecimalV3Type) DecimalV3Type.widerDecimalV3Type(t1, t2, false); - return (DecimalV3Type) DecimalV3Type.createDecimalV3Type(decimalV3Type.getPrecision() + 1, + return DecimalV3Type.createDecimalV3Type(decimalV3Type.getPrecision() + 1, decimalV3Type.getScale()); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BinaryArithmetic.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BinaryArithmetic.java index 8fe86c98c034ec..84eb08eb5810dd 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BinaryArithmetic.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/BinaryArithmetic.java @@ -59,7 +59,11 @@ public DataType getDataType() throws UnboundException { return getDataTypeForDecimalV2((DecimalV2Type) t1, (DecimalV2Type) t2); } if (t1.isDecimalV3Type() && t2.isDecimalV3Type()) { - return getDataTypeForDecimalV3((DecimalV3Type) t1, (DecimalV3Type) t2); + if (this instanceof Add || this instanceof Subtract || this instanceof Mod) { + return t1; + } else { + return getDataTypeForDecimalV3((DecimalV3Type) t1, (DecimalV3Type) t2); + } } return getDataTypeForOthers(t1, t2); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Subtract.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Subtract.java index 1536d88d0284d9..0b38694769b777 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Subtract.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Subtract.java @@ -50,7 +50,7 @@ public Expression withChildren(List children) { @Override public DecimalV3Type getDataTypeForDecimalV3(DecimalV3Type t1, DecimalV3Type t2) { DecimalV3Type decimalV3Type = (DecimalV3Type) DecimalV3Type.widerDecimalV3Type(t1, t2, false); - return (DecimalV3Type) DecimalV3Type.createDecimalV3Type(decimalV3Type.getPrecision() + 1, + return DecimalV3Type.createDecimalV3Type(decimalV3Type.getPrecision() + 1, decimalV3Type.getScale()); } diff --git a/regression-test/suites/nereids_arith_p0/decimal.groovy b/regression-test/suites/nereids_arith_p0/decimal.groovy index a7f18705f2137d..12665ce86da816 100644 --- a/regression-test/suites/nereids_arith_p0/decimal.groovy +++ b/regression-test/suites/nereids_arith_p0/decimal.groovy @@ -2299,4 +2299,16 @@ suite('nereids_arith_p0_decimal') { // select id, BITAND(kdcml128v3, kbool), BITOR(kdcml128v3, kbool), BITXOR(kdcml128v3, kbool) from expr_test order by id""" // qt_sql_test_Decimal128V3_Boolean_notn_4 """ // select id, BITAND(kdcml128v3, kbool), BITOR(kdcml128v3, kbool), BITXOR(kdcml128v3, kbool) from expr_test_not_nullable order by id""" + + + // decimal add precision + sql """drop table if exists test_arithmetic_expressions""" + sql """ + CREATE TABLE IF NOT EXISTS test_arithmetic_expressions ( + `a` DECIMALV3(9, 3) NOT NULL, + `b` DECIMALV3(9, 3) NOT NULL + ) DISTRIBUTED BY HASH(a) PROPERTIES("replication_num" = "1"); + """ + sql "select a + b from test_arithmetic_expressions" + sql """drop table if exists test_arithmetic_expressions""" } \ No newline at end of file