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

kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 773d118f4f8 [fix](planner)strip trailing zeros for decimal literal if 
the precision larger than max decimal precision in doris (#29761)
773d118f4f8 is described below

commit 773d118f4f801f10a9be781374c0458540c54da7
Author: starocean999 <[email protected]>
AuthorDate: Wed Jan 10 21:32:16 2024 +0800

    [fix](planner)strip trailing zeros for decimal literal if the precision 
larger than max decimal precision in doris (#29761)
---
 .../main/java/org/apache/doris/analysis/DecimalLiteral.java   | 11 +++++++++++
 .../java/org/apache/doris/analysis/DecimalLiteralTest.java    |  7 +++++++
 2 files changed, 18 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 1fb14027a5c..ae0a31c2f43 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
@@ -126,6 +126,17 @@ public class DecimalLiteral extends LiteralExpr {
         this.value = value;
         int precision = getBigDecimalPrecision(this.value);
         int scale = getBigDecimalScale(this.value);
+        int maxPrecision = 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 11cccf25bf6..a4ba959cf87 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
@@ -82,5 +82,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);
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to