This is an automated email from the ASF dual-hosted git repository.
morrysnow 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 08db6b03ce9 [fix](Nereids) decimalv3 cast in fe produce wrong data
(#29808) (#30522)
08db6b03ce9 is described below
commit 08db6b03ce986cee884638eedc80d80d6e73c528
Author: morrySnow <[email protected]>
AuthorDate: Tue Jan 30 10:13:55 2024 +0800
[fix](Nereids) decimalv3 cast in fe produce wrong data (#29808) (#30522)
case:
```
MySQL [email protected]:test> select cast(12 as decimalv3(2,1))
+-----------------------------+
| cast(12 as DECIMALV3(2, 1)) |
+-----------------------------+
| 12.0 |
+-----------------------------+
```
decimalv2 literal will generate wrong result too. But it is not only
bugs in planner, but also have bugs in executor. So we need fix executor
bug in another PR.
pick from master #29808
commi id 88ef595e39a11be96c0b4338dcba1ed08c3a199e
---
.../doris/nereids/rules/expression/rules/SimplifyCastRule.java | 9 +++++----
.../doris/nereids/trees/expressions/literal/DecimalLiteral.java | 1 +
.../nereids/trees/expressions/literal/DecimalV3Literal.java | 2 +-
.../doris/nereids/rules/expression/ExpressionRewriteTest.java | 8 ++++----
regression-test/suites/nereids_syntax_p0/cast.groovy | 5 +++++
5 files changed, 16 insertions(+), 9 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyCastRule.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyCastRule.java
index d88489084df..34143043a07 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyCastRule.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyCastRule.java
@@ -82,14 +82,15 @@ public class SimplifyCastRule extends
AbstractExpressionRewriteRule {
((VarcharType) castType).getLen());
}
} else if (castType instanceof DecimalV2Type) {
+ DecimalV2Type decimalV2Type = (DecimalV2Type) castType;
if (child instanceof TinyIntLiteral) {
- return new DecimalLiteral(new
BigDecimal(((TinyIntLiteral) child).getValue()));
+ return new DecimalLiteral(decimalV2Type, new
BigDecimal(((TinyIntLiteral) child).getValue()));
} else if (child instanceof SmallIntLiteral) {
- return new DecimalLiteral(new
BigDecimal(((SmallIntLiteral) child).getValue()));
+ return new DecimalLiteral(decimalV2Type, new
BigDecimal(((SmallIntLiteral) child).getValue()));
} else if (child instanceof IntegerLiteral) {
- return new DecimalLiteral(new
BigDecimal(((IntegerLiteral) child).getValue()));
+ return new DecimalLiteral(decimalV2Type, new
BigDecimal(((IntegerLiteral) child).getValue()));
} else if (child instanceof BigIntLiteral) {
- return new DecimalLiteral(new
BigDecimal(((BigIntLiteral) child).getValue()));
+ return new DecimalLiteral(decimalV2Type, new
BigDecimal(((BigIntLiteral) child).getValue()));
}
} else if (castType instanceof DecimalV3Type) {
DecimalV3Type decimalV3Type = (DecimalV3Type) castType;
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalLiteral.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalLiteral.java
index 711673cc2ff..03973fe6b03 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalLiteral.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalLiteral.java
@@ -81,6 +81,7 @@ public class DecimalLiteral extends Literal {
boolean valid = true;
if (precision != -1 && scale != -1) {
if (precision < realPrecision || scale < realScale
+ || realPrecision - realScale > precision - scale
|| realPrecision - realScale > DecimalV2Type.MAX_PRECISION
- DecimalV2Type.MAX_SCALE) {
valid = false;
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalV3Literal.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalV3Literal.java
index a2b500cc08f..403eeba3904 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalV3Literal.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DecimalV3Literal.java
@@ -93,7 +93,7 @@ public class DecimalV3Literal extends Literal {
int realScale = value.scale();
boolean valid = true;
if (precision != -1 && scale != -1) {
- if (precision < realPrecision || scale < realScale) {
+ if (precision < realPrecision || scale < realScale || precision -
scale < realPrecision - realScale) {
valid = false;
}
} else {
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/ExpressionRewriteTest.java
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/ExpressionRewriteTest.java
index 646174c9eb7..de859058ecc 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/ExpressionRewriteTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/ExpressionRewriteTest.java
@@ -200,13 +200,13 @@ class ExpressionRewriteTest extends
ExpressionRewriteTestHelper {
// decimal literal
assertRewrite(new Cast(new TinyIntLiteral((byte) 1),
DecimalV2Type.createDecimalV2Type(15, 9)),
- new DecimalLiteral(new BigDecimal(1)));
+ new DecimalLiteral(new BigDecimal("1.000000000")));
assertRewrite(new Cast(new SmallIntLiteral((short) 1),
DecimalV2Type.createDecimalV2Type(15, 9)),
- new DecimalLiteral(new BigDecimal(1)));
+ new DecimalLiteral(new BigDecimal("1.000000000")));
assertRewrite(new Cast(new IntegerLiteral(1),
DecimalV2Type.createDecimalV2Type(15, 9)),
- new DecimalLiteral(new BigDecimal(1)));
+ new DecimalLiteral(new BigDecimal("1.000000000")));
assertRewrite(new Cast(new BigIntLiteral(1L),
DecimalV2Type.createDecimalV2Type(15, 9)),
- new DecimalLiteral(new BigDecimal(1)));
+ new DecimalLiteral(new BigDecimal("1.000000000")));
}
@Test
diff --git a/regression-test/suites/nereids_syntax_p0/cast.groovy
b/regression-test/suites/nereids_syntax_p0/cast.groovy
index 24dc63628d6..98f80be5036 100644
--- a/regression-test/suites/nereids_syntax_p0/cast.groovy
+++ b/regression-test/suites/nereids_syntax_p0/cast.groovy
@@ -229,6 +229,11 @@ suite("cast") {
sql """select cast(k5 as time) ct from test order by ct;"""
exception "cannot cast"
}
+ test {
+ sql "select cast(12 as decimalv3(2,1))"
+ exception "Arithmetic overflow"
+ }
+
// date
test {
sql """select cast(k10 as time) ct from test order by ct;"""
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]