Re: Incorrect result in certain expressions of anti-join - Mailing list pgsql-bugs

From Pantelis Theodosiou
Subject Re: Incorrect result in certain expressions of anti-join
Date
Msg-id CAE3TBxxWeJFc0Eckq2ze_4XNMnct=zQhy73R22LLuxp-2pjw-w@mail.gmail.com
Whole thread Raw
In response to Incorrect result in certain expressions of anti-join  (Torbjörn Gannholm <torbjorn.gannholm@gmail.com>)
List pgsql-bugs


On Tuesday, January 7, 2025, Torbjörn Gannholm <torbjorn.gannholm@gmail.com> wrote:
To reproduce:

create table foo (a text);
Insert into foo values ('foo');
create table bar (a text);
insert into bar values ('foo'), ('bar');

Now the following expression of anti-join gives the correct result:
select * from bar LEFT JOIN foo ON foo.a = bar.a WHERE foo.a IS NULL;
  a  | a
-----+---
 bar |
(1 row)

However, a slight change and the anti-condition is simply ignored and the unexpected (IMO incorrect) result is returned. I would expect it either to work or to cause an error:
select * from bar LEFT JOIN foo ON foo.a = bar.a AND foo.a IS NULL;
  a  | a
-----+---
 foo |
 bar |
(2 rows)


The result is correct. The two queries are not equivalent. The join condition on the second query evaluates to false for all combinations as foo.a has no null values.
 

pgsql-bugs by date:

Previous
From: Thomas Munro
Date:
Subject: Re: BUG #18146: Rows reappearing in Tables after Auto-Vacuum Failure in PostgreSQL on Windows
Next
From: "David G. Johnston"
Date:
Subject: Re: Incorrect result in certain expressions of anti-join