I came across $subject on master and here is the query I'm running.
create table t (a int unique, b int);
explain (costs off)
select 1 from t t1
left join t t2 on true
inner join t t3 on true
left join t t4 on t2.a = t4.a and t2.a = t3.a;
ERROR: no relation entry for relid 6
I looked into it and it should be caused by some problem in outer-join
removal. After we've decided that the join to t4 is removable, which is
no problem, one of the things we need to do is to remove any joinquals
referencing t4 from the joininfo lists. In this query, there are two
such quals, 't2.a = t4.a' and 't2.a = t3.a'. And both quals have two
versions, one with t1/t2 join in their nulling bitmap and one without.
The former version would be treated as being "pushed down" because its
required_relids exceed the scope of joinrelids, due to the t1/t2 join
included in the qual's nulling bitmap but not included in joinrelids.
And as a result this version of quals would be put back. I think this
is where the problem is. Ideally we should not put them back.
This issue seems to have existed for a while, and is revealed by the
change in c8b881d2 recently. I'm not sure how to fix it yet. What I'm
thinking is that maybe this has something to do with the loose ends we
have in make_outerjoininfo. Actually in this query the t1/t2 join
cannot commute with the join to t4. If we can know that in
make_outerjoininfo, we'd have added t1/t2 join to the min_lefthand of
the join to t4, and that would avoid this issue.
Thanks
Richard