From 1c0cc097c5ee6f35da6fab732d7e7408d6306d1e Mon Sep 17 00:00:00 2001 From: Ryan Blue Date: Thu, 1 Dec 2016 12:24:58 -0800 Subject: [PATCH] SPARK-18677: Fix parsing ['key'] in JSON path expressions. --- .../expressions/jsonExpressions.scala | 2 +- .../expressions/JsonExpressionsSuite.scala | 24 +++++++++++++++++++ 2 files changed, 25 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 b61583d0dafb6..667ff649d1297 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 @@ -69,7 +69,7 @@ private[this] object JsonPathParser extends RegexParsers { // parse `.name` or `['name']` child expressions def named: Parser[List[PathInstruction]] = for { - name <- '.' ~> "[^\\.\\[]+".r | "[\\'" ~> "[^\\'\\?]+" <~ "\\']" + name <- '.' ~> "[^\\.\\[]+".r | "['" ~> "[^\\'\\?]+".r <~ "']" } yield { Key :: Named(name) :: Nil } 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 3b0e90824b766..618b8b29e8ee5 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 @@ -43,6 +43,30 @@ class JsonExpressionsSuite extends SparkFunSuite with ExpressionEvalHelper { """{"price":19.95,"color":"red"}""") } + test("$['store'].bicycle") { + checkEvaluation( + GetJsonObject(Literal(json), Literal("$['store'].bicycle")), + """{"price":19.95,"color":"red"}""") + } + + test("$.store['bicycle']") { + checkEvaluation( + GetJsonObject(Literal(json), Literal("$.store['bicycle']")), + """{"price":19.95,"color":"red"}""") + } + + test("$['store']['bicycle']") { + checkEvaluation( + GetJsonObject(Literal(json), Literal("$['store']['bicycle']")), + """{"price":19.95,"color":"red"}""") + } + + test("$['key with spaces']") { + checkEvaluation(GetJsonObject( + Literal("""{ "key with spaces": "it works" }"""), Literal("$['key with spaces']")), + "it works") + } + test("$.store.book") { checkEvaluation( GetJsonObject(Literal(json), Literal("$.store.book")),