Skip to content
Snippets Groups Projects
Commit 3a81a1c9 authored by Takuya UESHIN's avatar Takuya UESHIN Committed by Michael Armbrust
Browse files

[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.
parent 5ce7dae8
No related branches found
No related tags found
No related merge requests found
......@@ -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
}
......
......@@ -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") {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment