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 <37725793+luozeng...@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-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org