From 68b01812563c2af9ee42ed5fb63a2340fcf70749 Mon Sep 17 00:00:00 2001 From: Abhishek Jadhav Date: Thu, 25 Jun 2026 12:07:09 +0530 Subject: [PATCH 1/4] Added separate function for Show Partitions --- .../catalyst/analysis/FunctionRegistry.scala | 49 ++++++++++++++++++- .../command/ShowPartitionsSuiteBase.scala | 12 +++++ 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/FunctionRegistry.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/FunctionRegistry.scala index 415a842c9bf46..aeb4944030c0e 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/FunctionRegistry.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/FunctionRegistry.scala @@ -40,6 +40,9 @@ import org.apache.spark.sql.errors.QueryCompilationErrors import org.apache.spark.sql.internal.SQLConf import org.apache.spark.sql.types._ import org.apache.spark.util.ArrayImplicits._ +import org.apache.spark.sql.catalyst.parser.CatalystSqlParser +import org.apache.spark.sql.catalyst.plans.logical.ShowPartitions +import org.apache.spark.unsafe.types.UTF8String /** * A catalog for looking up user defined functions, used by an [[Analyzer]]. @@ -1317,6 +1320,49 @@ object TableFunctionRegistry { (name, (info, newBuilder)) } + private def partitions: (String, (ExpressionInfo, TableFunctionBuilder)) = { + val name = "partitions" + val info = new ExpressionInfo( + null, + null, + name, + "_FUNC_(table_name) - Returns the partition names of a partitioned table.", + "", + """ + Examples: + > SELECT * FROM _FUNC_('db.sales'); + year=2015/month=1 + """, + "", + "table_funcs", + "", + "", + "built-in") + val builder = (expressions: Seq[Expression]) => { + if (expressions.length != 1) { + throw QueryCompilationErrors.wrongNumArgsError(name, Seq(1), expressions.length) + } + + val tableNameExpr = expressions.head + if (tableNameExpr.dataType != StringType) { + throw QueryCompilationErrors.unexpectedInputDataTypeError( + name, 1, StringType, tableNameExpr) + } + + val tableName = tableNameExpr.eval() match { + case value: UTF8String => value.toString + case null => + throw QueryCompilationErrors.unexpectedInputDataTypeError( + name, 1, StringType, tableNameExpr) + } + + ShowPartitions( + UnresolvedTable(CatalystSqlParser.parseMultipartIdentifier(tableName), "SHOW PARTITIONS"), + None) + } + (name, (info, builder)) + } + val logicalPlans: Map[String, (ExpressionInfo, TableFunctionBuilder)] = Map( logicalPlan[Range]("range"), generatorBuilder("explode", ExplodeGeneratorBuilder), @@ -1331,7 +1377,8 @@ object TableFunctionRegistry { generator[SQLKeywords]("sql_keywords"), generatorBuilder("variant_explode", VariantExplodeGeneratorBuilder), generatorBuilder("variant_explode_outer", VariantExplodeOuterGeneratorBuilder), - PythonWorkerLogs.functionBuilder + PythonWorkerLogs.functionBuilder, + partitions ) // BuiltinRegistryMixin normalizes any name to the builtin 3-part key (system.builtin.name). diff --git a/sql/core/src/test/scala/org/apache/spark/sql/execution/command/ShowPartitionsSuiteBase.scala b/sql/core/src/test/scala/org/apache/spark/sql/execution/command/ShowPartitionsSuiteBase.scala index f7d41556b4e6b..7e7cf224e69ea 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/execution/command/ShowPartitionsSuiteBase.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/execution/command/ShowPartitionsSuiteBase.scala @@ -96,6 +96,18 @@ trait ShowPartitionsSuiteBase extends QueryTest with DDLCommandTestUtils { } } + test("partitions table-valued function") { + withNamespaceAndTable("ns", "dateTable") { t => + createDateTable(t) + runShowPartitionsSql( + s"SELECT * FROM partitions('$t')", + Row("year=2015/month=1") :: + Row("year=2015/month=2") :: + Row("year=2016/month=2") :: + Row("year=2016/month=3") :: Nil) + } + } + test("filter by partitions") { withNamespaceAndTable("ns", "dateTable") { t => createDateTable(t) From 9f87ab21b386a8c1971a46f73a2ed179d3b3a46f Mon Sep 17 00:00:00 2001 From: Abhishek Jadhav Date: Thu, 25 Jun 2026 12:15:47 +0530 Subject: [PATCH 2/4] Import sequence issue fixed --- .../spark/sql/catalyst/analysis/FunctionRegistry.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/FunctionRegistry.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/FunctionRegistry.scala index aeb4944030c0e..10a56f60803b3 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/FunctionRegistry.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/FunctionRegistry.scala @@ -33,16 +33,16 @@ import org.apache.spark.sql.catalyst.expressions.aggregate._ import org.apache.spark.sql.catalyst.expressions.st._ import org.apache.spark.sql.catalyst.expressions.variant._ import org.apache.spark.sql.catalyst.expressions.xml._ +import org.apache.spark.sql.catalyst.parser.CatalystSqlParser import org.apache.spark.sql.catalyst.plans.logical.{FunctionBuilderBase, Generate, LogicalPlan, OneRowRelation, PythonWorkerLogs, Range} +import org.apache.spark.sql.catalyst.plans.logical.ShowPartitions import org.apache.spark.sql.catalyst.trees.TreeNodeTag import org.apache.spark.sql.connector.catalog.CatalogManager import org.apache.spark.sql.errors.QueryCompilationErrors import org.apache.spark.sql.internal.SQLConf import org.apache.spark.sql.types._ -import org.apache.spark.util.ArrayImplicits._ -import org.apache.spark.sql.catalyst.parser.CatalystSqlParser -import org.apache.spark.sql.catalyst.plans.logical.ShowPartitions import org.apache.spark.unsafe.types.UTF8String +import org.apache.spark.util.ArrayImplicits._ /** * A catalog for looking up user defined functions, used by an [[Analyzer]]. From bc5614e861d0a0053e514237da5ea58a09955a5c Mon Sep 17 00:00:00 2001 From: Abhishek Jadhav Date: Sat, 27 Jun 2026 20:12:30 +0530 Subject: [PATCH 3/4] Import sequence issue fixed --- .../apache/spark/sql/catalyst/analysis/FunctionRegistry.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/FunctionRegistry.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/FunctionRegistry.scala index 278f84e22ea72..9a1cd1d5eba57 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/FunctionRegistry.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/FunctionRegistry.scala @@ -1419,4 +1419,4 @@ trait GeneratorBuilder extends FunctionBuilderBase[LogicalPlan] { def isOuter: Boolean def buildGenerator(funcName: String, expressions: Seq[Expression]) : Generator -} +} \ No newline at end of file From 13fb50778efa5326e0186c8b7659257a9ec5564e Mon Sep 17 00:00:00 2001 From: Abhishek Jadhav Date: Sat, 27 Jun 2026 22:20:17 +0530 Subject: [PATCH 4/4] Formatting File --- .../apache/spark/sql/catalyst/analysis/FunctionRegistry.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/FunctionRegistry.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/FunctionRegistry.scala index 9a1cd1d5eba57..278f84e22ea72 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/FunctionRegistry.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/FunctionRegistry.scala @@ -1419,4 +1419,4 @@ trait GeneratorBuilder extends FunctionBuilderBase[LogicalPlan] { def isOuter: Boolean def buildGenerator(funcName: String, expressions: Seq[Expression]) : Generator -} \ No newline at end of file +}