From 42386e796f6519d22092fba88a8c42cba6511d7c Mon Sep 17 00:00:00 2001 From: Burak Yavuz <brkyvz@gmail.com> Date: Sat, 5 Nov 2016 00:07:51 -0700 Subject: [PATCH] [SPARK-18260] Make from_json null safe ## What changes were proposed in this pull request? `from_json` is currently not safe against `null` rows. This PR adds a fix and a regression test for it. ## How was this patch tested? Regression test Author: Burak Yavuz <brkyvz@gmail.com> Closes #15771 from brkyvz/json_fix. (cherry picked from commit 6e2701815761d5870111cb56300e30d3059b39ed) Signed-off-by: Reynold Xin <rxin@databricks.com> --- .../spark/sql/catalyst/expressions/jsonExpressions.scala | 4 +++- .../sql/catalyst/expressions/JsonExpressionsSuite.scala | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/jsonExpressions.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/jsonExpressions.scala index e034735375..89fe7c48c0 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/jsonExpressions.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/jsonExpressions.scala @@ -498,7 +498,9 @@ case class JsonToStruct(schema: StructType, options: Map[String, String], child: override def children: Seq[Expression] = child :: Nil override def eval(input: InternalRow): Any = { - try parser.parse(child.eval(input).toString).head catch { + val json = child.eval(input) + if (json == null) return null + try parser.parse(json.toString).head catch { case _: SparkSQLJsonProcessingException => null } } diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/JsonExpressionsSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/JsonExpressionsSuite.scala index f9db649bc2..3bfa0bfda6 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/JsonExpressionsSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/JsonExpressionsSuite.scala @@ -344,6 +344,14 @@ class JsonExpressionsSuite extends SparkFunSuite with ExpressionEvalHelper { ) } + test("from_json null input column") { + val schema = StructType(StructField("a", IntegerType) :: Nil) + checkEvaluation( + JsonToStruct(schema, Map.empty, Literal(null)), + null + ) + } + test("to_json") { val schema = StructType(StructField("a", IntegerType) :: Nil) val struct = Literal.create(create_row(1), schema) -- GitLab