You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spark.apache.org by li...@apache.org on 2017/05/27 23:23:50 UTC

spark git commit: [SPARK-20876][SQL] If the input parameter is float type for ceil or floor, the result is not we expected

Repository: spark
Updated Branches:
  refs/heads/master 08ede46b8 -> 3969a8078


[SPARK-20876][SQL] If the input parameter is float type for ceil or floor,the result is not we expected

## What changes were proposed in this pull request?

spark-sql>SELECT ceil(cast(12345.1233 as float));
spark-sql>12345
For this case, the result we expected is `12346`
spark-sql>SELECT floor(cast(-12345.1233 as float));
spark-sql>-12345
For this case, the result we expected is `-12346`

Because in `Ceil` or `Floor`, `inputTypes` has no FloatType, so it is converted to LongType.
## How was this patch tested?

After the modification:
spark-sql>SELECT ceil(cast(12345.1233 as float));
spark-sql>12346
spark-sql>SELECT floor(cast(-12345.1233 as float));
spark-sql>-12346

Author: liuxian <li...@zte.com.cn>

Closes #18103 from 10110346/wip-lx-0525-1.


Project: http://git-wip-us.apache.org/repos/asf/spark/repo
Commit: http://git-wip-us.apache.org/repos/asf/spark/commit/3969a807
Tree: http://git-wip-us.apache.org/repos/asf/spark/tree/3969a807
Diff: http://git-wip-us.apache.org/repos/asf/spark/diff/3969a807

Branch: refs/heads/master
Commit: 3969a8078eef63c37a5ba52f9eb4b4666b67d78d
Parents: 08ede46
Author: liuxian <li...@zte.com.cn>
Authored: Sat May 27 16:23:45 2017 -0700
Committer: Xiao Li <ga...@gmail.com>
Committed: Sat May 27 16:23:45 2017 -0700

----------------------------------------------------------------------
 .../catalyst/expressions/mathExpressions.scala  | 14 +++---
 .../sql/catalyst/analysis/AnalysisSuite.scala   |  2 +-
 .../expressions/MathExpressionsSuite.scala      | 20 ++++++++
 .../resources/sql-tests/inputs/operators.sql    |  3 --
 .../sql-tests/results/operators.sql.out         | 52 ++++++--------------
 5 files changed, 43 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/spark/blob/3969a807/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/mathExpressions.scala
----------------------------------------------------------------------
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/mathExpressions.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/mathExpressions.scala
index 754b5c4..7b64568 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/mathExpressions.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/mathExpressions.scala
@@ -232,19 +232,20 @@ case class Ceil(child: Expression) extends UnaryMathExpression(math.ceil, "CEIL"
   }
 
   override def inputTypes: Seq[AbstractDataType] =
-    Seq(TypeCollection(LongType, DoubleType, DecimalType))
+    Seq(TypeCollection(DoubleType, DecimalType, LongType))
 
   protected override def nullSafeEval(input: Any): Any = child.dataType match {
     case LongType => input.asInstanceOf[Long]
     case DoubleType => f(input.asInstanceOf[Double]).toLong
-    case DecimalType.Fixed(precision, scale) => input.asInstanceOf[Decimal].ceil
+    case DecimalType.Fixed(_, _) => input.asInstanceOf[Decimal].ceil
   }
 
   override def doGenCode(ctx: CodegenContext, ev: ExprCode): ExprCode = {
     child.dataType match {
       case DecimalType.Fixed(_, 0) => defineCodeGen(ctx, ev, c => s"$c")
-      case DecimalType.Fixed(precision, scale) =>
+      case DecimalType.Fixed(_, _) =>
         defineCodeGen(ctx, ev, c => s"$c.ceil()")
+      case LongType => defineCodeGen(ctx, ev, c => s"$c")
       case _ => defineCodeGen(ctx, ev, c => s"(long)(java.lang.Math.${funcName}($c))")
     }
   }
@@ -348,19 +349,20 @@ case class Floor(child: Expression) extends UnaryMathExpression(math.floor, "FLO
   }
 
   override def inputTypes: Seq[AbstractDataType] =
-    Seq(TypeCollection(LongType, DoubleType, DecimalType))
+    Seq(TypeCollection(DoubleType, DecimalType, LongType))
 
   protected override def nullSafeEval(input: Any): Any = child.dataType match {
     case LongType => input.asInstanceOf[Long]
     case DoubleType => f(input.asInstanceOf[Double]).toLong
-    case DecimalType.Fixed(precision, scale) => input.asInstanceOf[Decimal].floor
+    case DecimalType.Fixed(_, _) => input.asInstanceOf[Decimal].floor
   }
 
   override def doGenCode(ctx: CodegenContext, ev: ExprCode): ExprCode = {
     child.dataType match {
       case DecimalType.Fixed(_, 0) => defineCodeGen(ctx, ev, c => s"$c")
-      case DecimalType.Fixed(precision, scale) =>
+      case DecimalType.Fixed(_, _) =>
         defineCodeGen(ctx, ev, c => s"$c.floor()")
+      case LongType => defineCodeGen(ctx, ev, c => s"$c")
       case _ => defineCodeGen(ctx, ev, c => s"(long)(java.lang.Math.${funcName}($c))")
     }
   }

http://git-wip-us.apache.org/repos/asf/spark/blob/3969a807/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/AnalysisSuite.scala
----------------------------------------------------------------------
diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/AnalysisSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/AnalysisSuite.scala
index 3b42897..7eccca2 100644
--- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/AnalysisSuite.scala
+++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/AnalysisSuite.scala
@@ -262,7 +262,7 @@ class AnalysisSuite extends AnalysisTest with ShouldMatchers {
 
     val plan = testRelation2.select('c).orderBy(Floor('a).asc)
     val expected = testRelation2.select(c, a)
-      .orderBy(Floor(Cast(a, LongType, Option(TimeZone.getDefault().getID))).asc).select(c)
+      .orderBy(Floor(Cast(a, DoubleType, Option(TimeZone.getDefault().getID))).asc).select(c)
 
     checkAnalysis(plan, expected)
   }

http://git-wip-us.apache.org/repos/asf/spark/blob/3969a807/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/MathExpressionsSuite.scala
----------------------------------------------------------------------
diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/MathExpressionsSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/MathExpressionsSuite.scala
index 8ed7a82..6af0cde 100644
--- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/MathExpressionsSuite.scala
+++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/MathExpressionsSuite.scala
@@ -258,6 +258,16 @@ class MathExpressionsSuite extends SparkFunSuite with ExpressionEvalHelper {
     checkConsistencyBetweenInterpretedAndCodegen(Ceil, DecimalType(25, 3))
     checkConsistencyBetweenInterpretedAndCodegen(Ceil, DecimalType(25, 0))
     checkConsistencyBetweenInterpretedAndCodegen(Ceil, DecimalType(5, 0))
+
+    val doublePi: Double = 3.1415
+    val floatPi: Float = 3.1415f
+    val longLit: Long = 12345678901234567L
+    checkEvaluation(Ceil(doublePi), 4L, EmptyRow)
+    checkEvaluation(Ceil(floatPi.toDouble), 4L, EmptyRow)
+    checkEvaluation(Ceil(longLit), longLit, EmptyRow)
+    checkEvaluation(Ceil(-doublePi), -3L, EmptyRow)
+    checkEvaluation(Ceil(-floatPi.toDouble), -3L, EmptyRow)
+    checkEvaluation(Ceil(-longLit), -longLit, EmptyRow)
   }
 
   test("floor") {
@@ -268,6 +278,16 @@ class MathExpressionsSuite extends SparkFunSuite with ExpressionEvalHelper {
     checkConsistencyBetweenInterpretedAndCodegen(Floor, DecimalType(25, 3))
     checkConsistencyBetweenInterpretedAndCodegen(Floor, DecimalType(25, 0))
     checkConsistencyBetweenInterpretedAndCodegen(Floor, DecimalType(5, 0))
+
+    val doublePi: Double = 3.1415
+    val floatPi: Float = 3.1415f
+    val longLit: Long = 12345678901234567L
+    checkEvaluation(Floor(doublePi), 3L, EmptyRow)
+    checkEvaluation(Floor(floatPi.toDouble), 3L, EmptyRow)
+    checkEvaluation(Floor(longLit), longLit, EmptyRow)
+    checkEvaluation(Floor(-doublePi), -4L, EmptyRow)
+    checkEvaluation(Floor(-floatPi.toDouble), -4L, EmptyRow)
+    checkEvaluation(Floor(-longLit), -longLit, EmptyRow)
   }
 
   test("factorial") {

http://git-wip-us.apache.org/repos/asf/spark/blob/3969a807/sql/core/src/test/resources/sql-tests/inputs/operators.sql
----------------------------------------------------------------------
diff --git a/sql/core/src/test/resources/sql-tests/inputs/operators.sql b/sql/core/src/test/resources/sql-tests/inputs/operators.sql
index f716747..7e3b86b 100644
--- a/sql/core/src/test/resources/sql-tests/inputs/operators.sql
+++ b/sql/core/src/test/resources/sql-tests/inputs/operators.sql
@@ -64,12 +64,9 @@ select cot(-1);
 select ceiling(0);
 select ceiling(1);
 select ceil(1234567890123456);
-select ceil(12345678901234567);
 select ceiling(1234567890123456);
-select ceiling(12345678901234567);
 
 -- floor
 select floor(0);
 select floor(1);
 select floor(1234567890123456);
-select floor(12345678901234567);

http://git-wip-us.apache.org/repos/asf/spark/blob/3969a807/sql/core/src/test/resources/sql-tests/results/operators.sql.out
----------------------------------------------------------------------
diff --git a/sql/core/src/test/resources/sql-tests/results/operators.sql.out b/sql/core/src/test/resources/sql-tests/results/operators.sql.out
index fe52005..28cfb74 100644
--- a/sql/core/src/test/resources/sql-tests/results/operators.sql.out
+++ b/sql/core/src/test/resources/sql-tests/results/operators.sql.out
@@ -1,5 +1,5 @@
 -- Automatically generated by SQLQueryTestSuite
--- Number of queries: 38
+-- Number of queries: 45
 
 
 -- !query 0
@@ -321,7 +321,7 @@ struct<COT(CAST(-1 AS DOUBLE)):double>
 -- !query 38
 select ceiling(0)
 -- !query 38 schema
-struct<CEIL(CAST(0 AS BIGINT)):bigint>
+struct<CEIL(CAST(0 AS DOUBLE)):bigint>
 -- !query 38 output
 0
 
@@ -329,7 +329,7 @@ struct<CEIL(CAST(0 AS BIGINT)):bigint>
 -- !query 39
 select ceiling(1)
 -- !query 39 schema
-struct<CEIL(CAST(1 AS BIGINT)):bigint>
+struct<CEIL(CAST(1 AS DOUBLE)):bigint>
 -- !query 39 output
 1
 
@@ -343,56 +343,32 @@ struct<CEIL(1234567890123456):bigint>
 
 
 -- !query 41
-select ceil(12345678901234567)
+select ceiling(1234567890123456)
 -- !query 41 schema
-struct<CEIL(12345678901234567):bigint>
+struct<CEIL(1234567890123456):bigint>
 -- !query 41 output
-12345678901234567
+1234567890123456
 
 
 -- !query 42
-select ceiling(1234567890123456)
+select floor(0)
 -- !query 42 schema
-struct<CEIL(1234567890123456):bigint>
+struct<FLOOR(CAST(0 AS DOUBLE)):bigint>
 -- !query 42 output
-1234567890123456
+0
 
 
 -- !query 43
-select ceiling(12345678901234567)
+select floor(1)
 -- !query 43 schema
-struct<CEIL(12345678901234567):bigint>
+struct<FLOOR(CAST(1 AS DOUBLE)):bigint>
 -- !query 43 output
-12345678901234567
-
-
--- !query 44
-select floor(0)
--- !query 44 schema
-struct<FLOOR(CAST(0 AS BIGINT)):bigint>
--- !query 44 output
-0
-
-
--- !query 45
-select floor(1)
--- !query 45 schema
-struct<FLOOR(CAST(1 AS BIGINT)):bigint>
--- !query 45 output
 1
 
 
--- !query 46
+-- !query 44
 select floor(1234567890123456)
--- !query 46 schema
+-- !query 44 schema
 struct<FLOOR(1234567890123456):bigint>
--- !query 46 output
+-- !query 44 output
 1234567890123456
-
-
--- !query 47
-select floor(12345678901234567)
--- !query 47 schema
-struct<FLOOR(12345678901234567):bigint>
--- !query 47 output
-12345678901234567


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@spark.apache.org
For additional commands, e-mail: commits-help@spark.apache.org