This is an automated email from the ASF dual-hosted git repository.

wenchen pushed a commit to branch branch-3.1
in repository https://gitbox.apache.org/repos/asf/spark.git


The following commit(s) were added to refs/heads/branch-3.1 by this push:
     new c306de5  [SPARK-34737][SQL][3.1] Cast input float to double in 
`TIMESTAMP_SECONDS`
c306de5 is described below

commit c306de52752351a40caa8a6926ba13cae56529c3
Author: Max Gekk <max.g...@gmail.com>
AuthorDate: Thu Mar 18 03:17:41 2021 +0000

    [SPARK-34737][SQL][3.1] Cast input float to double in `TIMESTAMP_SECONDS`
    
    ### What changes were proposed in this pull request?
    In the PR, I propose to cast the input float to double in the 
`SecondsToTimestamp` expression in the same way as in the `Cast` expression.
    
    ### Why are the changes needed?
    To have the same results from `CAST(<float> AS TIMESTAMP)` and from 
`TIMESTAMP_SECONDS`:
    ```sql
    spark-sql> SELECT CAST(16777215.0f AS TIMESTAMP);
    1970-07-14 07:20:15
    spark-sql> SELECT TIMESTAMP_SECONDS(16777215.0f);
    1970-07-14 07:20:14.951424
    ```
    
    ### Does this PR introduce _any_ user-facing change?
    Yes. After the changes:
    ```sql
    spark-sql> SELECT TIMESTAMP_SECONDS(16777215.0f);
    1970-07-14 07:20:15
    ```
    
    ### How was this patch tested?
    By running new test:
    ```
    $ build/sbt "test:testOnly *DateExpressionsSuite"
    ```
    
    Authored-by: Max Gekk <max.gekkgmail.com>
    Signed-off-by: HyukjinKwon <gurwls223apache.org>
    (cherry picked from commit 7aaed76125c82aff8683fe319f8047c2cb87afdd)
    Signed-off-by: Max Gekk <max.gekkgmail.com>
    
    Closes #31872 from MaxGekk/adjust-SecondsToTimestamp-3.1.
    
    Authored-by: Max Gekk <max.g...@gmail.com>
    Signed-off-by: Wenchen Fan <wenc...@databricks.com>
---
 .../apache/spark/sql/catalyst/expressions/datetimeExpressions.scala  | 5 +++--
 .../apache/spark/sql/catalyst/expressions/DateExpressionsSuite.scala | 1 +
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/datetimeExpressions.scala
 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/datetimeExpressions.scala
index c20dd61..4a27b2a 100644
--- 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/datetimeExpressions.scala
+++ 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/datetimeExpressions.scala
@@ -502,7 +502,7 @@ case class SecondsToTimestamp(child: Expression) extends 
UnaryExpression
       
input.asInstanceOf[Decimal].toJavaBigDecimal.multiply(operand).longValueExact()
     case _: FloatType => input =>
       val f = input.asInstanceOf[Float]
-      if (f.isNaN || f.isInfinite) null else (f * MICROS_PER_SECOND).toLong
+      if (f.isNaN || f.isInfinite) null else (f.toDouble * 
MICROS_PER_SECOND).toLong
     case _: DoubleType => input =>
       val d = input.asInstanceOf[Double]
       if (d.isNaN || d.isInfinite) null else (d * MICROS_PER_SECOND).toLong
@@ -517,13 +517,14 @@ case class SecondsToTimestamp(child: Expression) extends 
UnaryExpression
       val operand = s"new java.math.BigDecimal($MICROS_PER_SECOND)"
       defineCodeGen(ctx, ev, c => 
s"$c.toJavaBigDecimal().multiply($operand).longValueExact()")
     case other =>
+      val castToDouble = if (other.isInstanceOf[FloatType]) "(double)" else ""
       nullSafeCodeGen(ctx, ev, c => {
         val typeStr = CodeGenerator.boxedType(other)
         s"""
            |if ($typeStr.isNaN($c) || $typeStr.isInfinite($c)) {
            |  ${ev.isNull} = true;
            |} else {
-           |  ${ev.value} = (long)($c * $MICROS_PER_SECOND);
+           |  ${ev.value} = (long)($castToDouble$c * $MICROS_PER_SECOND);
            |}
            |""".stripMargin
       })
diff --git 
a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/DateExpressionsSuite.scala
 
b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/DateExpressionsSuite.scala
index 7977050..763ecba 100644
--- 
a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/DateExpressionsSuite.scala
+++ 
b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/DateExpressionsSuite.scala
@@ -1365,6 +1365,7 @@ class DateExpressionsSuite extends SparkFunSuite with 
ExpressionEvalHelper {
     checkEvaluation(
       SecondsToTimestamp(Literal(123.456789123)),
       Instant.ofEpochSecond(123, 456789000))
+    checkEvaluation(SecondsToTimestamp(Literal(16777215.0f)), 
Instant.ofEpochSecond(16777215))
   }
 
   test("TIMESTAMP_MILLIS") {


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

Reply via email to