Re: Self-join elimination drops an equality qual

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Jacob Brazeal <jacob(dot)brazeal(at)gmail(dot)com>
Cc: PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>
Subject: Re: Self-join elimination drops an equality qual
Date: 2026-07-25 22:51:31
Message-ID: 2750915.1785019891@sss.pgh.pa.us
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Jacob Brazeal <jacob(dot)brazeal(at)gmail(dot)com> 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

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Scott Ray 2026-07-25 23:03:52 Recovery conflict resolution misses backends that import snapshots
Previous Message Tom Lane 2026-07-25 21:23:07 Re: remove_useless_joins vs. bug #19560