Re: Removing unneeded self joins - Mailing list pgsql-hackers

From Andrey V. Lepikhov
Subject Re: Removing unneeded self joins
Date
Msg-id 3c4906d2-2825-ae88-6368-bce8f3975269@postgrespro.ru
Whole thread Raw
In response to Re: Removing unneeded self joins  (Heikki Linnakangas <hlinnaka@iki.fi>)
Responses Re: Removing unneeded self joins  (Masahiko Sawada <sawada.mshk@gmail.com>)
List pgsql-hackers
On 11/29/20 10:10 PM, Heikki Linnakangas wrote:
> On 28/11/2020 19:21, Andrey Lepikhov wrote:
>> On 27.11.2020 21:49, Heikki Linnakangas wrote:
>> CREATE TABLE a(x int, y int);
>> CREATE UNIQUE INDEX ON a(x);
>> SELECT a1.* FROM a a1, a a2 WHERE a1.x = a2.x;  -- self-join
>> CREATE UNIQUE INDEX ON a(y);
>> SELECT a1.* FROM a a1, a a2 WHERE a1.x = a2.y;  -- self-join too
> 
> The latter join is not "useless". The patch is returning incorrect 
> result for that query:
> 
>> postgres=# insert into a values (1, 2);
>> INSERT 0 1
>> postgres=# insert into a values (2, 1);
>> INSERT 0 1
>> postgres=# SELECT a1.* FROM a a1, a a2 WHERE a1.x = a2.y; -- WRONG RESULT
>>  x | y ---+---
>> (0 rows)
>>
>> postgres=# set enable_self_join_removal=off;
>> SET
>> postgres=# SELECT a1.* FROM a a1, a a2 WHERE a1.x = a2.y; -- CORRECT 
>> RESULT
>>  x | y ---+---
>>  1 | 2
>>  2 | 1
>> (2 rows)

Thanks, it is my fault. I tried to extend this patch with foreign key 
references and made a mistake.
Currently I rollback this new option (see patch in attachment), but will 
be working for a while to simplify this patch.

-- 
regards,
Andrey Lepikhov
Postgres Professional

Attachment

pgsql-hackers by date:

Previous
From: Craig Ringer
Date:
Subject: Re: Printing backtrace of postgres processes
Next
From: Craig Ringer
Date:
Subject: Re: proposal: function pg_setting_value_split() to parse shared_preload_libraries etc.