cloud-fan commented on a change in pull request #35660:
URL: https://github.com/apache/spark/pull/35660#discussion_r814854252



##########
File path: 
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/QueryPlan.scala
##########
@@ -327,16 +323,7 @@ abstract class QueryPlan[PlanType <: QueryPlan[PlanType]]
           val existingAttrMappingSet = transferAttrMapping.map(_._2).toSet
           newValidAttrMapping.filterNot { case (_, a) => 
existingAttrMappingSet.contains(a) }
         }
-        val resultAttrMapping = if (canGetOutput(plan)) {
-          // We propagate the attributes mapping to the parent plan node to 
update attributes, so
-          // the `newAttr` must be part of this plan's output.

Review comment:
       This logic itself is correct. An operator can only refer to an attribute 
if it's present in its child's output. I'm not sure how we produce such a plan
   ```
   Filter (name#1 ...)
     Aggregate ([id#2], group by id#2)
       Scan [name#1, id#2]
   ```
   The filter refers to `name` attribute but `Aggregate` does not output it. 
Can we investigate it further?
   
   A safer fix can be: `DeduplicateRelations` should only dedup self-join if 
the two join children are resolved and have no missing attributes.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to