@@ -1998,16 +1998,19 @@ object PushPredicateThroughNonJoin extends Rule[LogicalPlan] with PredicateHelpe
1998
1998
cond : Seq [Expression ],
1999
1999
aliasMap : AttributeMap [Alias ]): Seq [Expression ] = {
2000
2000
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
2011
2014
} else cond
2012
2015
}
2013
2016
@@ -2019,15 +2022,18 @@ object PushPredicateThroughNonJoin extends Rule[LogicalPlan] with PredicateHelpe
2019
2022
} else cond
2020
2023
}
2021
2024
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 )
2025
2028
}
2026
2029
2027
2030
private def rewriteByWith (
2028
2031
expr : Expression ,
2029
2032
defsMap : AttributeMap [CommonExpressionDef ],
2030
2033
refsMap : AttributeMap [CommonExpressionRef ]): Expression = {
2034
+ if (! canRewriteByWith(expr)) {
2035
+ return expr
2036
+ }
2031
2037
val defs = mutable.HashSet .empty[CommonExpressionDef ]
2032
2038
val replaced = expr.transform {
2033
2039
case a : Attribute if refsMap.contains(a) =>
0 commit comments