From 3efcb493edceba26253abc32a39b00938cda7345 Mon Sep 17 00:00:00 2001 From: Natea Beshada Date: Tue, 2 Jun 2020 15:51:38 -0500 Subject: [PATCH 1/5] fix zero decimal bug --- .../java/io/confluent/ksql/util/DecimalUtil.java | 4 ++++ .../rest-query-validation-tests/insert-values.json | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/ksqldb-common/src/main/java/io/confluent/ksql/util/DecimalUtil.java b/ksqldb-common/src/main/java/io/confluent/ksql/util/DecimalUtil.java index b329737cf18c..50d0471909f9 100644 --- a/ksqldb-common/src/main/java/io/confluent/ksql/util/DecimalUtil.java +++ b/ksqldb-common/src/main/java/io/confluent/ksql/util/DecimalUtil.java @@ -234,6 +234,10 @@ private static void ensureMax(final BigDecimal value, final int precision, final } public static SqlType fromValue(final BigDecimal value) { + final BigDecimal bigDecimalZero = new BigDecimal("0"); + if (value.compareTo(bigDecimalZero) == 0) { + return SqlTypes.decimal(value.scale() + 1, value.scale()); + } return SqlTypes.decimal(value.precision(), value.scale()); } } diff --git a/ksqldb-functional-tests/src/test/resources/rest-query-validation-tests/insert-values.json b/ksqldb-functional-tests/src/test/resources/rest-query-validation-tests/insert-values.json index 247040af7033..154acf22b0cb 100644 --- a/ksqldb-functional-tests/src/test/resources/rest-query-validation-tests/insert-values.json +++ b/ksqldb-functional-tests/src/test/resources/rest-query-validation-tests/insert-values.json @@ -332,6 +332,18 @@ "outputs": [ {"topic": "test_topic", "key": 1, "value": {"V0": {"F0": null}}} ] + }, + { + "name": "should insert decimals that equal zero", + "statements": [ + "CREATE STREAM S (ID INT KEY, V0 DECIMAL(12, 2)) WITH (kafka_topic='test_topic',partitions = 1, value_format='JSON');", + "INSERT INTO S (ID,V0) VALUES (1,0.00);" + ], + "inputs": [ + ], + "outputs": [ + {"topic": "test_topic", "key": 1, "value": {"V0": 0.00}} + ] } ] } \ No newline at end of file From 9ed6b7a1d8255b7505a91a5c3ced2af8a6e29b7a Mon Sep 17 00:00:00 2001 From: Natea Beshada Date: Tue, 2 Jun 2020 15:51:38 -0500 Subject: [PATCH 2/5] fix zero decimal bug --- .../java/io/confluent/ksql/util/DecimalUtil.java | 4 ++++ .../rest-query-validation-tests/insert-values.json | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/ksqldb-common/src/main/java/io/confluent/ksql/util/DecimalUtil.java b/ksqldb-common/src/main/java/io/confluent/ksql/util/DecimalUtil.java index b329737cf18c..50d0471909f9 100644 --- a/ksqldb-common/src/main/java/io/confluent/ksql/util/DecimalUtil.java +++ b/ksqldb-common/src/main/java/io/confluent/ksql/util/DecimalUtil.java @@ -234,6 +234,10 @@ private static void ensureMax(final BigDecimal value, final int precision, final } public static SqlType fromValue(final BigDecimal value) { + final BigDecimal bigDecimalZero = new BigDecimal("0"); + if (value.compareTo(bigDecimalZero) == 0) { + return SqlTypes.decimal(value.scale() + 1, value.scale()); + } return SqlTypes.decimal(value.precision(), value.scale()); } } diff --git a/ksqldb-functional-tests/src/test/resources/rest-query-validation-tests/insert-values.json b/ksqldb-functional-tests/src/test/resources/rest-query-validation-tests/insert-values.json index 247040af7033..154acf22b0cb 100644 --- a/ksqldb-functional-tests/src/test/resources/rest-query-validation-tests/insert-values.json +++ b/ksqldb-functional-tests/src/test/resources/rest-query-validation-tests/insert-values.json @@ -332,6 +332,18 @@ "outputs": [ {"topic": "test_topic", "key": 1, "value": {"V0": {"F0": null}}} ] + }, + { + "name": "should insert decimals that equal zero", + "statements": [ + "CREATE STREAM S (ID INT KEY, V0 DECIMAL(12, 2)) WITH (kafka_topic='test_topic',partitions = 1, value_format='JSON');", + "INSERT INTO S (ID,V0) VALUES (1,0.00);" + ], + "inputs": [ + ], + "outputs": [ + {"topic": "test_topic", "key": 1, "value": {"V0": 0.00}} + ] } ] } \ No newline at end of file From 952ee70f7ce100bc0f376c4c6e887abafa40e304 Mon Sep 17 00:00:00 2001 From: Natea Eshetu Beshada Date: Wed, 3 Jun 2020 12:46:41 -0500 Subject: [PATCH 3/5] fix zero decimal bug --- .../src/main/java/io/confluent/ksql/util/DecimalUtil.java | 6 +++++- .../test/java/io/confluent/ksql/util/DecimalUtilTest.java | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/ksqldb-common/src/main/java/io/confluent/ksql/util/DecimalUtil.java b/ksqldb-common/src/main/java/io/confluent/ksql/util/DecimalUtil.java index 50d0471909f9..a9553913d0ef 100644 --- a/ksqldb-common/src/main/java/io/confluent/ksql/util/DecimalUtil.java +++ b/ksqldb-common/src/main/java/io/confluent/ksql/util/DecimalUtil.java @@ -234,7 +234,11 @@ private static void ensureMax(final BigDecimal value, final int precision, final } public static SqlType fromValue(final BigDecimal value) { - final BigDecimal bigDecimalZero = new BigDecimal("0"); + final BigDecimal bigDecimalZero = BigDecimal.ZERO; + + /* When a BigDecimal has value 0, the built-in method precision() always returns 1. To account + for this edge case, we just take the scale and add one and use that for the precision instead. + */ if (value.compareTo(bigDecimalZero) == 0) { return SqlTypes.decimal(value.scale() + 1, value.scale()); } diff --git a/ksqldb-common/src/test/java/io/confluent/ksql/util/DecimalUtilTest.java b/ksqldb-common/src/test/java/io/confluent/ksql/util/DecimalUtilTest.java index 614cb23e7e6a..ec66802911c7 100644 --- a/ksqldb-common/src/test/java/io/confluent/ksql/util/DecimalUtilTest.java +++ b/ksqldb-common/src/test/java/io/confluent/ksql/util/DecimalUtilTest.java @@ -85,6 +85,14 @@ public void shouldExtractPrecisionFromDecimalSchema() { assertThat(scale, is(2)); } + @Test + public void shouldExtractPrecisionFromZeroValue() { + // When: + final SqlType precision = DecimalUtil.fromValue(BigDecimal.ZERO.setScale(2)); + + // Then: + assertThat(precision, is(3)); + } @Test public void shouldCastDecimal() { // When: From 8d65350c3456cff77219afc69ba350f291408592 Mon Sep 17 00:00:00 2001 From: Natea Eshetu Beshada Date: Wed, 3 Jun 2020 15:59:56 -0500 Subject: [PATCH 4/5] fix zero decimal bug and add test --- .../src/test/java/io/confluent/ksql/util/DecimalUtilTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ksqldb-common/src/test/java/io/confluent/ksql/util/DecimalUtilTest.java b/ksqldb-common/src/test/java/io/confluent/ksql/util/DecimalUtilTest.java index ec66802911c7..c4666376c9b4 100644 --- a/ksqldb-common/src/test/java/io/confluent/ksql/util/DecimalUtilTest.java +++ b/ksqldb-common/src/test/java/io/confluent/ksql/util/DecimalUtilTest.java @@ -88,10 +88,10 @@ public void shouldExtractPrecisionFromDecimalSchema() { @Test public void shouldExtractPrecisionFromZeroValue() { // When: - final SqlType precision = DecimalUtil.fromValue(BigDecimal.ZERO.setScale(2)); + final SqlType zeroDecimal = DecimalUtil.fromValue(BigDecimal.ZERO.setScale(2)); // Then: - assertThat(precision, is(3)); + assertThat(zeroDecimal, is(SqlTypes.decimal(3,2))); } @Test public void shouldCastDecimal() { From 44da38dfcb9a625fa57293c9b21799b437038d93 Mon Sep 17 00:00:00 2001 From: Natea Eshetu Beshada Date: Wed, 3 Jun 2020 16:15:16 -0500 Subject: [PATCH 5/5] fix zero decimal bug add tests --- .../rest-query-validation-tests/insert-values.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ksqldb-functional-tests/src/test/resources/rest-query-validation-tests/insert-values.json b/ksqldb-functional-tests/src/test/resources/rest-query-validation-tests/insert-values.json index 1a71b8a1870e..314b8d32f475 100644 --- a/ksqldb-functional-tests/src/test/resources/rest-query-validation-tests/insert-values.json +++ b/ksqldb-functional-tests/src/test/resources/rest-query-validation-tests/insert-values.json @@ -344,6 +344,18 @@ "outputs": [ {"topic": "test_topic", "key": null, "value": {"ID": 1}} ] + }, + { + "name": "should insert decimals that equal zero", + "statements": [ + "CREATE STREAM S (ID INT KEY, V0 DECIMAL(12, 2)) WITH (kafka_topic='test_topic',partitions = 1, value_format='JSON');", + "INSERT INTO S (ID,V0) VALUES (1,0.00);" + ], + "inputs": [ + ], + "outputs": [ + {"topic": "test_topic", "key": 1, "value": {"V0": 0.00}} + ] } ] } \ No newline at end of file