From 883d6dfc73328a00b8a56f61eaa327c37441a92f Mon Sep 17 00:00:00 2001 From: starocean999 <40539150+starocean999@users.noreply.github.com> Date: Wed, 10 Jan 2024 09:55:57 +0800 Subject: [PATCH] [fix](planner)strip trailing zeros for decimal literal if the precision larger than max decimal precision in doris (#29737) --- .../org/apache/doris/analysis/DecimalLiteral.java | 14 ++++++++++++++ .../apache/doris/analysis/DecimalLiteralTest.java | 7 +++++++ 2 files changed, 21 insertions(+) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/DecimalLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/DecimalLiteral.java index 250bee7e8e..50749b46c2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/DecimalLiteral.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DecimalLiteral.java @@ -24,6 +24,7 @@ import org.apache.doris.common.AnalysisException; import org.apache.doris.common.Config; import org.apache.doris.common.NotImplementedException; import org.apache.doris.common.io.Text; +import org.apache.doris.qe.SessionVariable; import org.apache.doris.thrift.TDecimalLiteral; import org.apache.doris.thrift.TExprNode; import org.apache.doris.thrift.TExprNodeType; @@ -126,6 +127,19 @@ public class DecimalLiteral extends LiteralExpr { this.value = value; int precision = getBigDecimalPrecision(this.value); int scale = getBigDecimalScale(this.value); + int maxPrecision = + SessionVariable.getEnableDecimal256() ? ScalarType.MAX_DECIMAL256_PRECISION + : ScalarType.MAX_DECIMAL128_PRECISION; + int integerPart = precision - scale; + if (precision > maxPrecision) { + BigDecimal stripedValue = value.stripTrailingZeros(); + int stripedPrecision = getBigDecimalPrecision(stripedValue); + if (stripedPrecision <= maxPrecision) { + this.value = stripedValue.setScale(maxPrecision - integerPart); + precision = getBigDecimalPrecision(this.value); + scale = getBigDecimalScale(this.value); + } + } if (enforceV3) { type = ScalarType.createDecimalV3Type(precision, scale); } else { diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/DecimalLiteralTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/DecimalLiteralTest.java index bd7ca08e34..bd93d118c4 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/analysis/DecimalLiteralTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/DecimalLiteralTest.java @@ -90,5 +90,12 @@ public class DecimalLiteralTest { scale = ((ScalarType) literal.getType()).getScalarScale(); Assert.assertEquals(3, precision); Assert.assertEquals(3, scale); + + decimal = new BigDecimal("197323961.520000000000000000000000000000"); + literal = new DecimalLiteral(decimal); + precision = ((ScalarType) literal.getType()).getScalarPrecision(); + scale = ((ScalarType) literal.getType()).getScalarScale(); + Assert.assertEquals(38, precision); + Assert.assertEquals(29, scale); } }