diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/v2/ShowPartitionsExec.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/v2/ShowPartitionsExec.scala index c4b6aa805d58f..416dce6fa28c6 100644 --- a/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/v2/ShowPartitionsExec.scala +++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/v2/ShowPartitionsExec.scala @@ -49,7 +49,7 @@ case class ShowPartitionsExec( val len = schema.length val partitions = new Array[String](len) val timeZoneId = SQLConf.get.sessionLocalTimeZone - partitionIdentifiers.map { row => + val output = partitionIdentifiers.map { row => var i = 0 while (i < len) { val dataType = schema(i).dataType @@ -59,7 +59,8 @@ case class ShowPartitionsExec( partitions(i) = escapePathName(schema(i).name) + "=" + escapePathName(partValueStr) i += 1 } - InternalRow(UTF8String.fromString(partitions.mkString("/"))) + partitions.mkString("/") } + output.sorted.map(p => InternalRow(UTF8String.fromString(p))) } } 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 b695decdb3ec9..56c6e5a325745 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 @@ -173,4 +173,21 @@ trait ShowPartitionsSuiteBase extends QueryTest with SQLTestUtils { } } } + + test("SPARK-33777: sorted output") { + withNamespace(s"$catalog.ns") { + sql(s"CREATE NAMESPACE $catalog.ns") + val table = s"$catalog.ns.dateTable" + withTable(table) { + sql(s""" + |CREATE TABLE $table (id int, part string) + |$defaultUsing + |PARTITIONED BY (part)""".stripMargin) + sql(s"ALTER TABLE $table ADD PARTITION(part = 'b')") + sql(s"ALTER TABLE $table ADD PARTITION(part = 'a')") + val partitions = sql(s"show partitions $table") + assert(partitions.first().getString(0) === "part=a") + } + } + } }