diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/xml/xpath.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/xml/xpath.scala index f65061e8d0ea9..5b06741a2f54e 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/xml/xpath.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/xml/xpath.scala @@ -242,13 +242,15 @@ case class XPathString(xml: Expression, path: Expression) extends XPathExtract { Examples: > SELECT _FUNC_('b1b2b3c1c2','a/b/text()'); ["b1","b2","b3"] + > SELECT _FUNC_('b1b2b3c1c2','a/b'); + [null,null,null] """, since = "2.0.0", group = "xml_funcs") // scalastyle:on line.size.limit case class XPathList(xml: Expression, path: Expression) extends XPathExtract { override def prettyName: String = "xpath" - override def dataType: DataType = ArrayType(SQLConf.get.defaultStringType, containsNull = false) + override def dataType: DataType = ArrayType(SQLConf.get.defaultStringType) override def nullSafeEval(xml: Any, path: Any): Any = { val nodeList = xpathUtil.evalNodeList(xml.asInstanceOf[UTF8String].toString, pathString) diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/xml/XPathExpressionSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/xml/XPathExpressionSuite.scala index 9e4e7bee28ae1..252bcea76007a 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/xml/XPathExpressionSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/xml/XPathExpressionSuite.scala @@ -185,6 +185,11 @@ class XPathExpressionSuite extends SparkFunSuite with ExpressionEvalHelper { testExpr("b1b2b3c1c2", "a/*[@class='bb']/text()", Seq("b1", "c1")) + checkEvaluation( + Coalesce(Seq( + GetArrayItem(XPathList(Literal(""), Literal("a")), Literal(0)), + Literal("nul"))), "nul") + testNullAndErrorBehavior(testExpr) }