Back to the original issue, if a join has more than one quals, actually we treat them as a whole when we check if identity 3 applies as well as when we adjust them to be suitable for commutation according to identity 3. So when we check if a qual is computable at a given level, I think we should also consider the join's quals as a whole. I'm thinking that we use a 'group' notion for RestrictInfos and then use the clause_relids of the 'group' in clause_is_computable_at. Does this make sense?
I'm imagining something like attached (no comments and test cases yet).
Here is an updated patch with comments and test case. I also change the code to store 'group_clause_relids' directly in RestrictInfo.