You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flink.apache.org by ja...@apache.org on 2022/12/06 07:53:12 UTC

[flink] branch master updated: [FLINK-30245][table-runtime] Fix the NPE thrown when filtering decimal(18, x) values after calling DecimalDataUtils.subtract method

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

jark pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git


The following commit(s) were added to refs/heads/master by this push:
     new bca57b7a222 [FLINK-30245][table-runtime] Fix the NPE thrown when filtering decimal(18, x) values after calling DecimalDataUtils.subtract method
bca57b7a222 is described below

commit bca57b7a222615869ddc38acdeb46c436b1bc0b3
Author: Wei Zhong <we...@gmail.com>
AuthorDate: Tue Dec 6 15:53:03 2022 +0800

    [FLINK-30245][table-runtime] Fix the NPE thrown when filtering decimal(18, x) values after calling DecimalDataUtils.subtract method
    
    This closes #21429
---
 .../java/org/apache/flink/table/data/DecimalDataUtils.java     | 10 ++++++++--
 .../test/java/org/apache/flink/table/data/DecimalDataTest.java |  5 +++++
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/flink-table/flink-table-runtime/src/main/java/org/apache/flink/table/data/DecimalDataUtils.java b/flink-table/flink-table-runtime/src/main/java/org/apache/flink/table/data/DecimalDataUtils.java
index 320d9a3bcc9..d88848ab311 100644
--- a/flink-table/flink-table-runtime/src/main/java/org/apache/flink/table/data/DecimalDataUtils.java
+++ b/flink-table/flink-table-runtime/src/main/java/org/apache/flink/table/data/DecimalDataUtils.java
@@ -104,7 +104,10 @@ public final class DecimalDataUtils {
     }
 
     public static DecimalData add(DecimalData v1, DecimalData v2, int precision, int scale) {
-        if (v1.isCompact() && v2.isCompact() && v1.scale == v2.scale) {
+        if (v1.isCompact()
+                && v2.isCompact()
+                && v1.scale == v2.scale
+                && DecimalData.isCompact(precision)) {
             assert scale == v1.scale; // no need to rescale
             try {
                 long ls = Math.addExact(v1.longVal, v2.longVal); // checks overflow
@@ -118,7 +121,10 @@ public final class DecimalDataUtils {
     }
 
     public static DecimalData subtract(DecimalData v1, DecimalData v2, int precision, int scale) {
-        if (v1.isCompact() && v2.isCompact() && v1.scale == v2.scale) {
+        if (v1.isCompact()
+                && v2.isCompact()
+                && v1.scale == v2.scale
+                && DecimalData.isCompact(precision)) {
             assert scale == v1.scale; // no need to rescale
             try {
                 long ls = Math.subtractExact(v1.longVal, v2.longVal); // checks overflow
diff --git a/flink-table/flink-table-runtime/src/test/java/org/apache/flink/table/data/DecimalDataTest.java b/flink-table/flink-table-runtime/src/test/java/org/apache/flink/table/data/DecimalDataTest.java
index 1596630840f..4fbe9290e0d 100644
--- a/flink-table/flink-table-runtime/src/test/java/org/apache/flink/table/data/DecimalDataTest.java
+++ b/flink-table/flink-table-runtime/src/test/java/org/apache/flink/table/data/DecimalDataTest.java
@@ -167,6 +167,11 @@ public class DecimalDataTest {
         assertThat(DecimalData.fromBigDecimal(new BigDecimal(Long.MAX_VALUE), 5, 0)).isNull();
         assertThat(DecimalData.zero(20, 2).toBigDecimal().intValue()).isEqualTo(0);
         assertThat(DecimalData.zero(20, 2).toBigDecimal().intValue()).isEqualTo(0);
+
+        DecimalData decimal3 = DecimalData.fromBigDecimal(new BigDecimal(10), 18, 0);
+        DecimalData decimal4 = DecimalData.fromBigDecimal(new BigDecimal(15), 18, 0);
+        assertThat(DecimalDataUtils.compare(subtract(decimal3, decimal4, 19, 0), -5)).isEqualTo(0);
+        assertThat(DecimalDataUtils.compare(add(decimal3, decimal4, 19, 0), 25)).isEqualTo(0);
     }
 
     @Test