Repository: spark
Updated Branches:
  refs/heads/master a133057ce -> 3e4c7db4d


[SPARK-17205] Literal.sql should handle Infinity and NaN

This patch updates `Literal.sql` to properly generate SQL for `NaN` and 
`Infinity` float and double literals: these special values need to be handled 
differently from regular values, since simply appending a suffix to the value's 
`toString()` representation will not work for these values.

Author: Josh Rosen <[email protected]>

Closes #14777 from JoshRosen/SPARK-17205.


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

Branch: refs/heads/master
Commit: 3e4c7db4d11c474457e7886a5501108ebab0cf6d
Parents: a133057
Author: Josh Rosen <[email protected]>
Authored: Fri Aug 26 00:15:01 2016 +0200
Committer: Herman van Hovell <[email protected]>
Committed: Fri Aug 26 00:15:01 2016 +0200

----------------------------------------------------------------------
 .../spark/sql/catalyst/expressions/literals.scala  | 17 +++++++++++++++--
 .../sql/catalyst/ExpressionSQLBuilderSuite.scala   |  6 ++++++
 2 files changed, 21 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/spark/blob/3e4c7db4/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/literals.scala
----------------------------------------------------------------------
diff --git 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/literals.scala
 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/literals.scala
index 55fd9c0..730a7f6 100644
--- 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/literals.scala
+++ 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/literals.scala
@@ -251,8 +251,21 @@ case class Literal (value: Any, dataType: DataType) 
extends LeafExpression with
     case (v: Short, ShortType) => v + "S"
     case (v: Long, LongType) => v + "L"
     // Float type doesn't have a suffix
-    case (v: Float, FloatType) => s"CAST($v AS ${FloatType.sql})"
-    case (v: Double, DoubleType) => v + "D"
+    case (v: Float, FloatType) =>
+      val castedValue = v match {
+        case _ if v.isNaN => "'NaN'"
+        case Float.PositiveInfinity => "'Infinity'"
+        case Float.NegativeInfinity => "'-Infinity'"
+        case _ => v
+      }
+      s"CAST($castedValue AS ${FloatType.sql})"
+    case (v: Double, DoubleType) =>
+      v match {
+        case _ if v.isNaN => s"CAST('NaN' AS ${DoubleType.sql})"
+        case Double.PositiveInfinity => s"CAST('Infinity' AS 
${DoubleType.sql})"
+        case Double.NegativeInfinity => s"CAST('-Infinity' AS 
${DoubleType.sql})"
+        case _ => v + "D"
+      }
     case (v: Decimal, t: DecimalType) => s"CAST($v AS ${t.sql})"
     case (v: Int, DateType) => s"DATE '${DateTimeUtils.toJavaDate(v)}'"
     case (v: Long, TimestampType) => 
s"TIMESTAMP('${DateTimeUtils.toJavaTimestamp(v)}')"

http://git-wip-us.apache.org/repos/asf/spark/blob/3e4c7db4/sql/hive/src/test/scala/org/apache/spark/sql/catalyst/ExpressionSQLBuilderSuite.scala
----------------------------------------------------------------------
diff --git 
a/sql/hive/src/test/scala/org/apache/spark/sql/catalyst/ExpressionSQLBuilderSuite.scala
 
b/sql/hive/src/test/scala/org/apache/spark/sql/catalyst/ExpressionSQLBuilderSuite.scala
index 93dc0f4..86724cb 100644
--- 
a/sql/hive/src/test/scala/org/apache/spark/sql/catalyst/ExpressionSQLBuilderSuite.scala
+++ 
b/sql/hive/src/test/scala/org/apache/spark/sql/catalyst/ExpressionSQLBuilderSuite.scala
@@ -32,7 +32,13 @@ class ExpressionSQLBuilderSuite extends SQLBuilderTest {
     checkSQL(Literal(4: Int), "4")
     checkSQL(Literal(8: Long), "8L")
     checkSQL(Literal(1.5F), "CAST(1.5 AS FLOAT)")
+    checkSQL(Literal(Float.PositiveInfinity), "CAST('Infinity' AS FLOAT)")
+    checkSQL(Literal(Float.NegativeInfinity), "CAST('-Infinity' AS FLOAT)")
+    checkSQL(Literal(Float.NaN), "CAST('NaN' AS FLOAT)")
     checkSQL(Literal(2.5D), "2.5D")
+    checkSQL(Literal(Double.PositiveInfinity), "CAST('Infinity' AS DOUBLE)")
+    checkSQL(Literal(Double.NegativeInfinity), "CAST('-Infinity' AS DOUBLE)")
+    checkSQL(Literal(Double.NaN), "CAST('NaN' AS DOUBLE)")
     checkSQL(
       Literal(Timestamp.valueOf("2016-01-01 00:00:00")), 
"TIMESTAMP('2016-01-01 00:00:00.0')")
     // TODO tests for decimals


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to