aboutsummaryrefslogtreecommitdiff
path: root/sql/catalyst
diff options
context:
space:
mode:
authorTakuya UESHIN <ueshin@happy-camper.st>2014-11-17 16:26:48 -0800
committerMichael Armbrust <michael@databricks.com>2014-11-17 16:27:06 -0800
commit1ca39b723fa1d9c3d3525f1e32e0a19770563d4e (patch)
tree6031b5c0f8d0bec917b570978234ba70db62ecc9 /sql/catalyst
parenteb9c5bae78e4123cd7d1dfa3758d0880df90ed14 (diff)
downloadspark-1ca39b723fa1d9c3d3525f1e32e0a19770563d4e.tar.gz
spark-1ca39b723fa1d9c3d3525f1e32e0a19770563d4e.tar.bz2
spark-1ca39b723fa1d9c3d3525f1e32e0a19770563d4e.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. (cherry picked from commit 3a81a1c9e0963173534d96850f3c0b7a16350838) Signed-off-by: Michael Armbrust <michael@databricks.com>
Diffstat (limited to 'sql/catalyst')
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/Cast.scala2
-rw-r--r--sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/ExpressionEvaluationSuite.scala14
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") {