diff options
author | Takuya UESHIN <ueshin@happy-camper.st> | 2014-11-17 16:26:48 -0800 |
---|---|---|
committer | Michael Armbrust <michael@databricks.com> | 2014-11-17 16:26:48 -0800 |
commit | 3a81a1c9e0963173534d96850f3c0b7a16350838 (patch) | |
tree | 60eb1da4a8be6b4975414f3fe68b198f5a88b37d | |
parent | 5ce7dae859dc273b0fc532c9456b5960b1eca399 (diff) | |
download | spark-3a81a1c9e0963173534d96850f3c0b7a16350838.tar.gz spark-3a81a1c9e0963173534d96850f3c0b7a16350838.tar.bz2 spark-3a81a1c9e0963173534d96850f3c0b7a16350838.zip |
[SPARK-4420][SQL] Change nullability of Cast from DoubleType/FloatType to DecimalType.
This is follow-up of [SPARK-4390](https://issues.apache.org/jira/browse/SPARK-4390) (#3256).
Author: Takuya UESHIN <ueshin@happy-camper.st>
Closes #3278 from ueshin/issues/SPARK-4420 and squashes the following commits:
7fea558 [Takuya UESHIN] Add some tests.
cb2301a [Takuya UESHIN] Fix tests.
133bad5 [Takuya UESHIN] Change nullability of Cast from DoubleType/FloatType to DecimalType.
2 files changed, 14 insertions, 2 deletions
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/Cast.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/Cast.scala index 34697a1249..b401096ce1 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/Cast.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/Cast.scala @@ -37,6 +37,8 @@ case class Cast(child: Expression, dataType: DataType) extends UnaryExpression w case (BooleanType, DateType) => true case (DateType, _: NumericType) => true case (DateType, BooleanType) => true + case (DoubleType, _: DecimalType) => true + case (FloatType, _: DecimalType) => true case (_, DecimalType.Fixed(_, _)) => true // TODO: not all upcasts here can really give null case _ => child.nullable } diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/ExpressionEvaluationSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/ExpressionEvaluationSuite.scala index 2f57be94a8..3a6a0203af 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/ExpressionEvaluationSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/ExpressionEvaluationSuite.scala @@ -347,8 +347,8 @@ class ExpressionEvaluationSuite extends FunSuite { // - Because of this, casts to fixed-precision decimals should be nullable assert(Cast(Literal(123), DecimalType.Unlimited).nullable === false) - assert(Cast(Literal(10.03f), DecimalType.Unlimited).nullable === false) - assert(Cast(Literal(10.03), DecimalType.Unlimited).nullable === false) + assert(Cast(Literal(10.03f), DecimalType.Unlimited).nullable === true) + assert(Cast(Literal(10.03), DecimalType.Unlimited).nullable === true) assert(Cast(Literal(Decimal(10.03)), DecimalType.Unlimited).nullable === false) assert(Cast(Literal(123), DecimalType(2, 1)).nullable === true) @@ -396,6 +396,16 @@ class ExpressionEvaluationSuite extends FunSuite { checkEvaluation(Cast(Literal(-9.95), DecimalType(1, 0)), null) checkEvaluation(Cast(Literal(Decimal(-9.95)), DecimalType(3, 1)), Decimal(-10.0)) checkEvaluation(Cast(Literal(Decimal(-9.95)), DecimalType(1, 0)), null) + + checkEvaluation(Cast(Literal(Double.NaN), DecimalType.Unlimited), null) + checkEvaluation(Cast(Literal(1.0 / 0.0), DecimalType.Unlimited), null) + checkEvaluation(Cast(Literal(Float.NaN), DecimalType.Unlimited), null) + checkEvaluation(Cast(Literal(1.0f / 0.0f), DecimalType.Unlimited), null) + + checkEvaluation(Cast(Literal(Double.NaN), DecimalType(2, 1)), null) + checkEvaluation(Cast(Literal(1.0 / 0.0), DecimalType(2, 1)), null) + checkEvaluation(Cast(Literal(Float.NaN), DecimalType(2, 1)), null) + checkEvaluation(Cast(Literal(1.0f / 0.0f), DecimalType(2, 1)), null) } test("timestamp") { |