aboutsummaryrefslogtreecommitdiff
path: root/sql/catalyst
diff options
context:
space:
mode:
authorprigarg <prigarg@adobe.com>2016-10-12 10:14:45 -0700
committerReynold Xin <rxin@databricks.com>2016-10-12 10:14:45 -0700
commitd5580ebaa086b9feb72d5428f24c5b60cd7da745 (patch)
tree95ee60a9d2347fff5e10e6e7c56bcf034035f92a /sql/catalyst
parent8880fd13ef2b581f9c7190e7e3e6d24bc11b4ef7 (diff)
downloadspark-d5580ebaa086b9feb72d5428f24c5b60cd7da745.tar.gz
spark-d5580ebaa086b9feb72d5428f24c5b60cd7da745.tar.bz2
spark-d5580ebaa086b9feb72d5428f24c5b60cd7da745.zip
[SPARK-17884][SQL] To resolve Null pointer exception when casting from empty string to interval type.
## What changes were proposed in this pull request? This change adds a check in castToInterval method of Cast expression , such that if converted value is null , then isNull variable should be set to true. Earlier, the expression Cast(Literal(), CalendarIntervalType) was throwing NullPointerException because of the above mentioned reason. ## How was this patch tested? Added test case in CastSuite.scala jira entry for detail: https://issues.apache.org/jira/browse/SPARK-17884 Author: prigarg <prigarg@adobe.com> Closes #15449 from priyankagargnitk/SPARK-17884.
Diffstat (limited to 'sql/catalyst')
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/Cast.scala7
-rw-r--r--sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CastSuite.scala1
2 files changed, 7 insertions, 1 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 1314c41651..58fd65f62f 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
@@ -657,7 +657,12 @@ case class Cast(child: Expression, dataType: DataType) extends UnaryExpression w
private[this] def castToIntervalCode(from: DataType): CastFunction = from match {
case StringType =>
(c, evPrim, evNull) =>
- s"$evPrim = CalendarInterval.fromString($c.toString());"
+ s"""$evPrim = CalendarInterval.fromString($c.toString());
+ if(${evPrim} == null) {
+ ${evNull} = true;
+ }
+ """.stripMargin
+
}
private[this] def decimalToTimestampCode(d: String): String =
diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CastSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CastSuite.scala
index 5c35baacef..b748595fc4 100644
--- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CastSuite.scala
+++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CastSuite.scala
@@ -767,6 +767,7 @@ class CastSuite extends SparkFunSuite with ExpressionEvalHelper {
test("cast between string and interval") {
import org.apache.spark.unsafe.types.CalendarInterval
+ checkEvaluation(Cast(Literal(""), CalendarIntervalType), null)
checkEvaluation(Cast(Literal("interval -3 month 7 hours"), CalendarIntervalType),
new CalendarInterval(-3, 7 * CalendarInterval.MICROS_PER_HOUR))
checkEvaluation(Cast(Literal.create(