You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by ga...@apache.org on 2023/01/06 08:02:52 UTC
[doris] branch master updated: [fix](decimalv2) fix loss of precision when cast to decimalv2 literal (#15629)
This is an automated email from the ASF dual-hosted git repository.
gabriellee 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 53559e2bdc [fix](decimalv2) fix loss of precision when cast to decimalv2 literal (#15629)
53559e2bdc is described below
commit 53559e2bdc905a1a4d5ae31c0dd2dc8d74828590
Author: luozenglin <37...@users.noreply.github.com>
AuthorDate: Fri Jan 6 16:02:46 2023 +0800
[fix](decimalv2) fix loss of precision when cast to decimalv2 literal (#15629)
---
.../org/apache/doris/analysis/DecimalLiteral.java | 1 +
.../org/apache/doris/analysis/FloatLiteral.java | 4 ++-
.../java/org/apache/doris/analysis/IntLiteral.java | 4 +--
.../org/apache/doris/analysis/LargeIntLiteral.java | 4 +--
.../org/apache/doris/analysis/StringLiteral.java | 5 ++-
.../java/org/apache/doris/catalog/ScalarType.java | 5 ++-
regression-test/data/query_p0/union/test_union.out | 41 +++++++++++-----------
7 files changed, 35 insertions(+), 29 deletions(-)
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 e07d246b83..0a445857d2 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
@@ -335,6 +335,7 @@ public class DecimalLiteral extends LiteralExpr {
@Override
protected Expr uncheckedCastTo(Type targetType) throws AnalysisException {
if (targetType.isDecimalV2() && type.isDecimalV2()) {
+ setType(targetType);
return this;
} else if ((targetType.isDecimalV3() && type.isDecimalV3()
&& (((ScalarType) targetType).decimalPrecision() >= value.precision())
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/FloatLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/FloatLiteral.java
index e62964c2d1..e15a30824c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FloatLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FloatLiteral.java
@@ -191,7 +191,9 @@ public class FloatLiteral extends LiteralExpr {
return this;
} else if (targetType.isDecimalV2()) {
// the double constructor does an exact translation, use valueOf() instead.
- return new DecimalLiteral(BigDecimal.valueOf(value));
+ DecimalLiteral res = new DecimalLiteral(BigDecimal.valueOf(value));
+ res.setType(targetType);
+ return res;
} else if (targetType.isDecimalV3()) {
DecimalLiteral res = new DecimalLiteral(new BigDecimal(value));
res.setType(ScalarType.createDecimalV3Type(targetType.getPrecision(),
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/IntLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/IntLiteral.java
index ed90678bcc..0d3749fa86 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/IntLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/IntLiteral.java
@@ -310,9 +310,7 @@ public class IntLiteral extends LiteralExpr {
}
} else if (targetType.isFloatingPointType()) {
return new FloatLiteral(new Double(value), targetType);
- } else if (targetType.isDecimalV2()) {
- return new DecimalLiteral(new BigDecimal(value));
- } else if (targetType.isDecimalV3()) {
+ } else if (targetType.isDecimalV2() || targetType.isDecimalV3()) {
DecimalLiteral res = new DecimalLiteral(new BigDecimal(value));
res.setType(targetType);
return res;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/LargeIntLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/LargeIntLiteral.java
index 654ef89d9b..9d19179704 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/LargeIntLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/LargeIntLiteral.java
@@ -220,9 +220,7 @@ public class LargeIntLiteral extends LiteralExpr {
protected Expr uncheckedCastTo(Type targetType) throws AnalysisException {
if (targetType.isFloatingPointType()) {
return new FloatLiteral(new Double(value.doubleValue()), targetType);
- } else if (targetType.isDecimalV2()) {
- return new DecimalLiteral(new BigDecimal(value));
- } else if (targetType.isDecimalV3()) {
+ } else if (targetType.isDecimalV2() || targetType.isDecimalV3()) {
DecimalLiteral res = new DecimalLiteral(new BigDecimal(value));
res.setType(targetType);
return res;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/StringLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/StringLiteral.java
index 89e4de09f5..9fa1690e44 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/StringLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/StringLiteral.java
@@ -41,6 +41,7 @@ import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
+import java.math.BigDecimal;
import java.util.Objects;
public class StringLiteral extends LiteralExpr {
@@ -244,7 +245,9 @@ public class StringLiteral extends LiteralExpr {
case DECIMAL32:
case DECIMAL64:
case DECIMAL128:
- return new DecimalLiteral(value);
+ DecimalLiteral res = new DecimalLiteral(new BigDecimal(value));
+ res.setType(targetType);
+ return res;
default:
break;
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarType.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarType.java
index 248925d990..6510ecdff3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarType.java
@@ -1026,7 +1026,10 @@ public class ScalarType extends Type {
}
if (t1.isDecimalV2() || t2.isDecimalV2()) {
- return MAX_DECIMALV2_TYPE;
+ if (t1.isFloatingPointType() || t2.isFloatingPointType()) {
+ return MAX_DECIMALV2_TYPE;
+ }
+ return t1.isDecimalV2() ? t1 : t2;
}
if ((t1.isDecimalV3() && t2.isFixedPointType()) || (t2.isDecimalV3() && t1.isFixedPointType())) {
diff --git a/regression-test/data/query_p0/union/test_union.out b/regression-test/data/query_p0/union/test_union.out
index fc99e71054..fe0f9c1810 100644
--- a/regression-test/data/query_p0/union/test_union.out
+++ b/regression-test/data/query_p0/union/test_union.out
@@ -1,20 +1,20 @@
-- This file is automatically generated. You should know what you did if you want to edit this
-- !union1 --
-123.123000000 0.1 true
+123.123 0.1 true
-- !union2 --
-123.123000000 0.1 true world
+123.123 0.1 true world
-- !union3 --
-- !union4 --
--654.654000000 0.0
--0.123000000 987456.123
-0E-9 3.141592653
-0.666000000 -987.001
-123.123000000 0.1
-243.325000000 -0.0
-604587.000000000 0.1
+-654.654 0.0
+-0.123 987456.123
+0.000 3.141592653
+0.666 -987.001
+123.123 0.1
+243.325 -0.0
+604587.000 0.1
-- !union5 --
false 1 1989 1001 11011902 123.123 true 1989-03-21 1989-03-21T13:00 wangjuoo4 0.1 6.333 string12345 170141183460469231731687303715884105727
@@ -229,31 +229,31 @@ false 3 1989 1002 11011905 24453.325 false 2012-03-14 2000-01-01T00:00 yunlj8@nk
15 1992 3021 11011920 0.000 true 3.141592653 20.455999488 9999-12-12 2015-04-02T00:00
-- !union26 --
-0 1E-7
-1 2.0000000
-1 2.0000000
+0.0001 1E-7
+1.0000 2.0000000
+1.0100 2.0000000
-- !union27 --
1 2
hell0
-- !union28 --
-1 2.00000
+1.00000000 2.00000
-- !union29 --
-1 2.00000
+1.00000000 2.00000
-- !union30 --
-1 2.00000
-1 2.00000
-1 2.00000
+1.00000000 2.00000
+1.00000000 2.00000
+1.00000000 2.00000
-- !union31 --
-1 2.00000
-1 2.00000
+1.00000000 2.00000
+1.00000000 2.00000
-- !union32 --
-1 2.00000
+1.00000000 2.00000
-- !union33 --
2016-07-01
@@ -363,3 +363,4 @@ hell0
-- !union35 --
2016-07-01
2016-07-02
+
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org