diff --git a/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/kyuubi/engine/spark/shim/Shim_v3_0.scala b/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/kyuubi/engine/spark/shim/Shim_v3_0.scala index 9dc75a6dd..a99e2b968 100644 --- a/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/kyuubi/engine/spark/shim/Shim_v3_0.scala +++ b/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/kyuubi/engine/spark/shim/Shim_v3_0.scala @@ -62,9 +62,20 @@ class Shim_v3_0 extends Shim_v2_4 { catalog.listNamespaces(ns) } if (children.isEmpty) { - namespaces + namespaces.map(_.map(quoteIfNeeded)) } else { - namespaces ++: listNamespaces(catalog, children) + namespaces.map(_.map(quoteIfNeeded)) ++: listNamespaces(catalog, children) + } + } + + /** + * Forked from Apache Spark's org.apache.spark.sql.connector.catalog.CatalogV2Implicits + */ + private def quoteIfNeeded(part: String): String = { + if (part.contains(".") || part.contains("`")) { + s"`${part.replace("`", "``")}`" + } else { + part } } diff --git a/kyuubi-common/src/test/scala/org/apache/kyuubi/operation/BasicIcebergJDBCTests.scala b/kyuubi-common/src/test/scala/org/apache/kyuubi/operation/BasicIcebergJDBCTests.scala index 87967a57c..a1e5210b4 100644 --- a/kyuubi-common/src/test/scala/org/apache/kyuubi/operation/BasicIcebergJDBCTests.scala +++ b/kyuubi-common/src/test/scala/org/apache/kyuubi/operation/BasicIcebergJDBCTests.scala @@ -91,7 +91,14 @@ trait BasicIcebergJDBCTests extends JDBCTestUtils { } test("get schemas with multipart namespaces") { - val dbs = Seq("db1", "db1.db2", "db1.db2.db3", "db4") + val dbs = Seq( + "`a.b`", + "`a.b`.c", + "a.`b.c`", + "`a.b.c`", + "`a.b``.c`", + "db1.db2.db3", + "db4") withDatabases(dbs: _*) { statement => dbs.foreach(db => statement.execute(s"CREATE NAMESPACE IF NOT EXISTS $db")) @@ -100,8 +107,8 @@ trait BasicIcebergJDBCTests extends JDBCTestUtils { val allPattern = Seq("", "*", "%", null, ".*", "_*", "_%", ".%") Seq(null, catalog).foreach { cg => allPattern foreach { pattern => - checkGetSchemas( - metaData.getSchemas(cg, pattern), dbs ++ Seq("global_temp"), catalog) + checkGetSchemas(metaData.getSchemas(cg, pattern), + dbs ++ Seq("global_temp", "a", "db1", "db1.db2"), catalog) } }