Skip to content

Commit 541b9ed

Browse files
committed
fix
1 parent 925f80e commit 541b9ed

File tree

1 file changed

+19
-13
lines changed
  • sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer

1 file changed

+19
-13
lines changed

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/Optimizer.scala

+19-13
Original file line numberDiff line numberDiff line change
@@ -1998,16 +1998,19 @@ object PushPredicateThroughNonJoin extends Rule[LogicalPlan] with PredicateHelpe
19981998
cond: Seq[Expression],
19991999
aliasMap: AttributeMap[Alias]): Seq[Expression] = {
20002000
if (!SQLConf.get.getConf(SQLConf.ALWAYS_INLINE_COMMON_EXPR)) {
2001-
val replaceWithMap = cond
2002-
.flatMap(_.collect {case a: Attribute => a })
2003-
.groupBy(identity)
2004-
.transform((_, v) => v.size)
2005-
.filter(m => aliasMap.contains(m._1) && m._2 > 1)
2006-
.map(m => m._1 -> trimAliases(aliasMap.getOrElse(m._1, m._1)))
2007-
.filter(m => needRewriteByWith(m._2))
2008-
val defsMap = AttributeMap(replaceWithMap.map(m => m._1 -> CommonExpressionDef(m._2)))
2009-
val refsMap = AttributeMap(defsMap.map(m => m._1 -> new CommonExpressionRef(m._2)))
2010-
cond.map(rewriteByWith(_, defsMap, refsMap))
2001+
val canRewriteConf = cond.filter(canRewriteByWith)
2002+
if (canRewriteConf.nonEmpty) {
2003+
val replaceWithMap = canRewriteConf.reduce(And)
2004+
.collect { case a: Attribute => a }
2005+
.groupBy(identity)
2006+
.transform((_, v) => v.size)
2007+
.filter(m => aliasMap.contains(m._1) && m._2 > 1)
2008+
.map(m => m._1 -> trimAliases(aliasMap.getOrElse(m._1, m._1)))
2009+
.filter(m => !CollapseProject.isCheap(m._2))
2010+
val defsMap = AttributeMap(replaceWithMap.map(m => m._1 -> CommonExpressionDef(m._2)))
2011+
val refsMap = AttributeMap(defsMap.map(m => m._1 -> new CommonExpressionRef(m._2)))
2012+
cond.map(rewriteByWith(_, defsMap, refsMap))
2013+
} else cond
20112014
} else cond
20122015
}
20132016

@@ -2019,15 +2022,18 @@ object PushPredicateThroughNonJoin extends Rule[LogicalPlan] with PredicateHelpe
20192022
} else cond
20202023
}
20212024

2022-
// With does not support common expression inline subquery.
2023-
private def needRewriteByWith(commonExpr: Expression): Boolean = {
2024-
!(commonExpr.containsPattern(PLAN_EXPRESSION) || CollapseProject.isCheap(commonExpr))
2025+
// With does not support inline subquery
2026+
private def canRewriteByWith(expr: Expression): Boolean = {
2027+
!expr.containsPattern(PLAN_EXPRESSION)
20252028
}
20262029

20272030
private def rewriteByWith(
20282031
expr: Expression,
20292032
defsMap: AttributeMap[CommonExpressionDef],
20302033
refsMap: AttributeMap[CommonExpressionRef]): Expression = {
2034+
if (!canRewriteByWith(expr)) {
2035+
return expr
2036+
}
20312037
val defs = mutable.HashSet.empty[CommonExpressionDef]
20322038
val replaced = expr.transform {
20332039
case a: Attribute if refsMap.contains(a) =>

0 commit comments

Comments
 (0)