diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala index 87b8d52ac277..1c3aed455cb4 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala @@ -1885,6 +1885,15 @@ class Analyzer(override val catalogManager: CatalogManager) val newFilter = Filter(newCond.head, newChild) Project(child.output, newFilter) } + + case r @ RepartitionByExpression(partitionExprs, child, _) + if (!r.resolved || r.missingInput.nonEmpty) && child.resolved => + val (newPartitionExprs, newChild) = resolveExprsAndAddMissingAttrs(partitionExprs, child) + if (child.output == newChild.output) { + r.copy(newPartitionExprs, newChild) + } else { + Project(child.output, r.copy(newPartitionExprs, newChild)) + } } /** diff --git a/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala index 9add98c6ebf1..26af0b9f8112 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala @@ -4100,6 +4100,18 @@ class SQLQuerySuite extends QueryTest with SharedSparkSession with AdaptiveSpark } } } + + test("SPARK-35331: Fix resolving original expression in RepartitionByExpression after aliased") { + Seq("CLUSTER", "DISTRIBUTE").foreach { keyword => + Seq("a", "substr(a, 0, 3)").foreach { expr => + val clause = keyword + " by " + expr + withClue(clause) { + checkAnswer(sql(s"select a b from values('123') t(a) $clause"), Row("123")) + } + } + } + checkAnswer(sql(s"select /*+ REPARTITION(3, a) */ a b from values('123') t(a)"), Row("123")) + } } case class Foo(bar: Option[String])