diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/OptimizeMetadataOnlyQuery.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/OptimizeMetadataOnlyQuery.scala index 47284f3448b7b..492d177c7c773 100644 --- a/sql/core/src/main/scala/org/apache/spark/sql/execution/OptimizeMetadataOnlyQuery.scala +++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/OptimizeMetadataOnlyQuery.scala @@ -117,7 +117,7 @@ case class OptimizeMetadataOnlyQuery(catalog: SessionCatalog) extends Rule[Logic case a: AttributeReference => a.withName(relation.output.find(_.semanticEquals(a)).get.name) } - } + }.filterNot(SubqueryExpression.hasSubquery) child transform { case plan if plan eq relation => diff --git a/sql/core/src/test/scala/org/apache/spark/sql/execution/OptimizeMetadataOnlyQuerySuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/execution/OptimizeMetadataOnlyQuerySuite.scala index afb438e0bbc72..68691e2f7fdac 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/execution/OptimizeMetadataOnlyQuerySuite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/execution/OptimizeMetadataOnlyQuerySuite.scala @@ -103,6 +103,20 @@ class OptimizeMetadataOnlyQuerySuite extends QueryTest with SharedSparkSession { "select partcol2, min(partcol1) from srcpart where partcol1 = 0 group by partcol2", "select max(c1) from (select partcol1 + 1 as c1 from srcpart where partcol1 = 0) t") + testMetadataOnly( + "SPARK-31590 Metadata-only queries should not include subquery in partition filters", + """ + |SELECT partcol1, MAX(partcol2) AS partcol2 + |FROM srcpart + |WHERE partcol1 = ( + | SELECT MAX(partcol1) + | FROM srcpart + |) + |AND partcol2 = 'even' + |GROUP BY partcol1 + |""".stripMargin + ) + testNotMetadataOnly( "Don't optimize metadata only query for non-partition columns", "select col1 from srcpart group by col1",