aboutsummaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorLiang-Chi Hsieh <viirya@gmail.com>2015-06-28 14:48:44 -0700
committerDavies Liu <davies@databricks.com>2015-06-28 14:48:44 -0700
commit24fda7381171738cbbbacb5965393b660763e562 (patch)
treec7baff391c0cc951a40117c0f89a7f47a24fc210 /sql
parent9ce78b4343febe87c4edd650c698cc20d38f615d (diff)
downloadspark-24fda7381171738cbbbacb5965393b660763e562.tar.gz
spark-24fda7381171738cbbbacb5965393b660763e562.tar.bz2
spark-24fda7381171738cbbbacb5965393b660763e562.zip
[SPARK-8677] [SQL] Fix non-terminating decimal expansion for decimal divide operation
JIRA: https://issues.apache.org/jira/browse/SPARK-8677 Author: Liang-Chi Hsieh <viirya@gmail.com> Closes #7056 from viirya/fix_decimal3 and squashes the following commits: 34d7419 [Liang-Chi Hsieh] Fix Non-terminating decimal expansion for decimal divide operation.
Diffstat (limited to 'sql')
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/types/Decimal.scala11
-rw-r--r--sql/catalyst/src/test/scala/org/apache/spark/sql/types/decimal/DecimalSuite.scala5
2 files changed, 14 insertions, 2 deletions
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/types/Decimal.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/types/Decimal.scala
index bd9823bc05..5a169488c9 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/types/Decimal.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/types/Decimal.scala
@@ -265,8 +265,15 @@ final class Decimal extends Ordered[Decimal] with Serializable {
def * (that: Decimal): Decimal = Decimal(toBigDecimal * that.toBigDecimal)
- def / (that: Decimal): Decimal =
- if (that.isZero) null else Decimal(toBigDecimal / that.toBigDecimal)
+ def / (that: Decimal): Decimal = {
+ if (that.isZero) {
+ null
+ } else {
+ // To avoid non-terminating decimal expansion problem, we turn to Java BigDecimal's divide
+ // with specified ROUNDING_MODE.
+ Decimal(toJavaBigDecimal.divide(that.toJavaBigDecimal, ROUNDING_MODE.id))
+ }
+ }
def % (that: Decimal): Decimal =
if (that.isZero) null else Decimal(toBigDecimal % that.toBigDecimal)
diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/types/decimal/DecimalSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/types/decimal/DecimalSuite.scala
index ccc29c0dc8..5f312964e5 100644
--- a/sql/catalyst/src/test/scala/org/apache/spark/sql/types/decimal/DecimalSuite.scala
+++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/types/decimal/DecimalSuite.scala
@@ -167,4 +167,9 @@ class DecimalSuite extends SparkFunSuite with PrivateMethodTester {
val decimal = (Decimal(Long.MaxValue, 38, 0) * Decimal(Long.MaxValue, 38, 0)).toJavaBigDecimal
assert(decimal.unscaledValue.toString === "85070591730234615847396907784232501249")
}
+
+ test("fix non-terminating decimal expansion problem") {
+ val decimal = Decimal(1.0, 10, 3) / Decimal(3.0, 10, 3)
+ assert(decimal.toString === "0.333")
+ }
}