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)
}