You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spark.apache.org by do...@apache.org on 2020/07/16 18:12:38 UTC
[spark] branch branch-3.0 updated: [SPARK-32018][SQL][3.0]
UnsafeRow.setDecimal should set null with overflowed value
This is an automated email from the ASF dual-hosted git repository.
dongjoon pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/branch-3.0 by this push:
new 9b6bea5 [SPARK-32018][SQL][3.0] UnsafeRow.setDecimal should set null with overflowed value
9b6bea5 is described below
commit 9b6bea5d5ab4bd3a69ca6eaf7811eb54f9562ee6
Author: Wenchen Fan <we...@databricks.com>
AuthorDate: Thu Jul 16 11:09:27 2020 -0700
[SPARK-32018][SQL][3.0] UnsafeRow.setDecimal should set null with overflowed value
partially backport https://github.com/apache/spark/pull/29026
Closes #29125 from cloud-fan/backport.
Authored-by: Wenchen Fan <we...@databricks.com>
Signed-off-by: Dongjoon Hyun <do...@apache.org>
---
.../org/apache/spark/sql/catalyst/expressions/UnsafeRow.java | 2 +-
.../src/test/scala/org/apache/spark/sql/UnsafeRowSuite.scala | 10 ++++++++++
2 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/sql/catalyst/src/main/java/org/apache/spark/sql/catalyst/expressions/UnsafeRow.java b/sql/catalyst/src/main/java/org/apache/spark/sql/catalyst/expressions/UnsafeRow.java
index 034894b..4dc5ce1 100644
--- a/sql/catalyst/src/main/java/org/apache/spark/sql/catalyst/expressions/UnsafeRow.java
+++ b/sql/catalyst/src/main/java/org/apache/spark/sql/catalyst/expressions/UnsafeRow.java
@@ -288,7 +288,7 @@ public final class UnsafeRow extends InternalRow implements Externalizable, Kryo
Platform.putLong(baseObject, baseOffset + cursor, 0L);
Platform.putLong(baseObject, baseOffset + cursor + 8, 0L);
- if (value == null) {
+ if (value == null || !value.changePrecision(precision, value.scale())) {
setNullAt(ordinal);
// keep the offset for future update
Platform.putLong(baseObject, getFieldOffset(ordinal), cursor << 32);
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/UnsafeRowSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/UnsafeRowSuite.scala
index a5f904c..9daa69c 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/UnsafeRowSuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/UnsafeRowSuite.scala
@@ -178,4 +178,14 @@ class UnsafeRowSuite extends SparkFunSuite {
// Makes sure hashCode on unsafe array won't crash
unsafeRow.getArray(0).hashCode()
}
+
+ test("SPARK-32018: setDecimal with overflowed value") {
+ val d1 = new Decimal().set(BigDecimal("10000000000000000000")).toPrecision(38, 18)
+ val row = InternalRow.apply(d1)
+ val unsafeRow = UnsafeProjection.create(Array[DataType](DecimalType(38, 18))).apply(row)
+ assert(unsafeRow.getDecimal(0, 38, 18) === d1)
+ val d2 = (d1 * Decimal(10)).toPrecision(39, 18)
+ unsafeRow.setDecimal(0, d2, 38)
+ assert(unsafeRow.getDecimal(0, 38, 18) === null)
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@spark.apache.org
For additional commands, e-mail: commits-help@spark.apache.org