Jacob Brazeal <[email protected]> writes:
> Self-join elimination can drop an equality qual in a three-way self-join,
> producing wrong results.
> ...
> The two qualifications t1.a = t2.b and t3.c = t2.b form an EquivalenceClass
> containing a, b, and c. It appears that, after the self-joined relations
> are collapsed, two distinct single-relation equality clauses sharing the
> same parent EquivalenceClass are incorrectly treated as redundant.

I think this is the same as, or closely related to, bug #19560.
The patchset I posted at [1] seems to have the desired behavior:

regression=# explain SELECT t3.id, t3.a, t3.b, t3.c
FROM t t1
JOIN t t2 ON t2.id = t1.id
JOIN t t3 ON t3.id = t2.id
WHERE t1.a = t2.b
  AND t3.c = t2.b
ORDER BY t3.id;
                         QUERY PLAN                         
------------------------------------------------------------
 Sort  (cost=37.76..37.77 rows=1 width=16)
   Sort Key: t3.id
   ->  Seq Scan on t t3  (cost=0.00..37.75 rows=1 width=16)
         Filter: ((a = b) AND (b = c))
(4 rows)

regression=# SELECT t3.id, t3.a, t3.b, t3.c
FROM t t1
JOIN t t2 ON t2.id = t1.id
JOIN t t3 ON t3.id = t2.id
WHERE t1.a = t2.b
  AND t3.c = t2.b
ORDER BY t3.id;
 id | a | b | c 
----+---+---+---
  1 | 1 | 1 | 1
  2 | 2 | 2 | 2
(2 rows)


                        regards, tom lane

[1] https://www.postgresql.org/message-id/2727652.1784997994%40sss.pgh.pa.us


Reply via email to