aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/arithmetic.scala6
-rw-r--r--sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/ArithmeticExpressionSuite.scala11
2 files changed, 16 insertions, 1 deletions
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/arithmetic.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/arithmetic.scala
index 13e539a223..6f3db79622 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/arithmetic.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/arithmetic.scala
@@ -310,7 +310,11 @@ case class Remainder(left: Expression, right: Expression)
if (input1 == null) {
null
} else {
- integral.rem(input1, input2)
+ input1 match {
+ case d: Double => d % input2.asInstanceOf[java.lang.Double]
+ case f: Float => f % input2.asInstanceOf[java.lang.Float]
+ case _ => integral.rem(input1, input2)
+ }
}
}
}
diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/ArithmeticExpressionSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/ArithmeticExpressionSuite.scala
index 5c9824289b..0d86efda7e 100644
--- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/ArithmeticExpressionSuite.scala
+++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/ArithmeticExpressionSuite.scala
@@ -175,6 +175,17 @@ class ArithmeticExpressionSuite extends SparkFunSuite with ExpressionEvalHelper
}
}
+ test("SPARK-17617: % (Remainder) double % double on super big double") {
+ val leftDouble = Literal(-5083676433652386516D)
+ val rightDouble = Literal(10D)
+ checkEvaluation(Remainder(leftDouble, rightDouble), -6.0D)
+
+ // Float has smaller precision
+ val leftFloat = Literal(-5083676433652386516F)
+ val rightFloat = Literal(10F)
+ checkEvaluation(Remainder(leftFloat, rightFloat), -2.0F)
+ }
+
test("Abs") {
testNumericDataTypes { convert =>
val input = Literal(convert(1))