Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qqQG0-00A1WF-S0 for pgsql-hackers@arkaria.postgresql.org; Wed, 11 Oct 2023 03:51:37 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1qqQFy-00CWg7-Kq for pgsql-hackers@arkaria.postgresql.org; Wed, 11 Oct 2023 03:51:35 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qqQFy-00CWfz-5N for pgsql-hackers@lists.postgresql.org; Wed, 11 Oct 2023 03:51:35 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by magus.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1qqQFw-001OiP-J3 for pgsql-hackers@lists.postgresql.org; Wed, 11 Oct 2023 03:51:34 +0000 Received: from [10.10.20.28] (node-flg.pool-101-109.dynamic.totinternet.net [101.109.78.244]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) (Authenticated sender: a.lepikhov@postgrespro.ru) by mail.postgrespro.ru (Postfix/587) with ESMTPSA id 25FCFE203E9; Wed, 11 Oct 2023 06:51:29 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1696996291; bh=Kfb4DoTf+z04Sn3xV+Vc8TzH9Fcmlb8EmC+f08K8dgQ=; h=Message-ID:Date:User-Agent:Subject:To:Cc:References:From: In-Reply-To:From; b=fX0dRpqrJAa1ATNGnFU1UC7nWPgDOp7Qw4gy74YBWyCp8he52Mn+p03k9YbTkLVY+ 2n3ee0PLNTClZrIS5GRCo3X2rYjm2BZZ7NRGPdvjGoOV30YXf3imJF2UbBcg8+qkpA 9a1bK6DQoNnwn8e6wh4YL0Ks4WLpGAkn1UMDO2wLC7EvxDm3ESdFBjM0jNKbmrABcb cPrYAqgKsmz+/cRGCuwTBCEyULOYTyoFo/wuk8cv6XBmQ0lwF3mZeaIbRgGSNTxgkT ylJ4w+FKHvuyvqf7XbKPTca2NpLXUsasA4o+GgltU5wGerJVyfZme3X8Xaab04Eb/G yAmTXUU6qacaA== Message-ID: Date: Wed, 11 Oct 2023 10:51:26 +0700 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Removing unneeded self joins To: Alena Rybakina Cc: "Gregory Stark (as CFM)" , =?UTF-8?Q?Micha=C5=82_K=C5=82eczek?= , PostgreSQL Hackers , Alexander Korotkov References: <64486b0b-0404-e39e-322d-0801154901f3@postgrespro.ru> <0fd15c10-eaa5-51bd-b5c7-e635fe03a94d@postgrespro.ru> <20221206184643.zya44h5auv6f45zp@awork3.anarazel.de> <36579124-f9d9-a51e-38b3-af3511921c7e@postgrespro.ru> <88079CBD-B5BB-4C61-A68B-A8C67599E1C7@kleczek.org> <05469e80-454b-41d7-d04f-421f42bbd4a9@postgrespro.ru> <48c11b23-9c23-440e-9a3c-020e05196449@postgrespro.ru> <96f66ae3-df10-4060-9844-4c9633062cd3@yandex.ru> Content-Language: en-US From: Andrei Lepikhov Organization: Postgres Professional In-Reply-To: <96f66ae3-df10-4060-9844-4c9633062cd3@yandex.ru> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On 11/10/2023 02:29, Alena Rybakina wrote: > I have reviewed your patch and I noticed a few things. Thanks for your efforts, > I have looked at the latest version of the code, I assume that the error > lies in the replace_varno_walker function, especially in the place where > we check the node by type Var, and does not form any NullTest node. It's not a bug, it's an optimization we discussed with Alexander above. > Secondly, I added some code in some places to catch erroneous cases and > added a condition when we should not try to apply the self-join-removal > transformation due to the absence of an empty self-join list after > searching for it and in general if there are no joins in the query. > Besides, I added a query for testing and wrote about it above. I have > attached my diff file. Ok, I will look at this > In addition, I found a comment for myself that was not clear to me. I > would be glad if you could explain it to me. > > You mentioned superior outer join in the comment, unfortunately, I > didn't find anything about it in the PostgreSQL code, and this > explanation remained unclear to me. Could you explain in more detail > what you meant? I meant here that only clauses pushed by reconsider_outer_join_clauses() can be found in the joininfo list, and they are not relevant, as you can understand. Having written that, I realized that it was a false statement. ;) - joininfo can also contain results of previous SJE iterations, look: CREATE TABLE test (oid int PRIMARY KEY); CREATE UNIQUE INDEX ON test((oid*oid)); explain SELECT count(*) FROM test c1, test c2, test c3 WHERE c1.oid=c2.oid AND c1.oid*c2.oid=c3.oid*c3.oid; explain SELECT count(*) FROM test c1, test c2, test c3 WHERE c1.oid=c3.oid AND c1.oid*c3.oid=c2.oid*c2.oid; explain SELECT count(*) FROM test c1, test c2, test c3 WHERE c3.oid=c2.oid AND c3.oid*c2.oid=c1.oid*c1.oid; Having executed this SQL code, you could see that in the last query, the SJE feature didn't delete one of the JOINs because of the reason I had written above. It's not an one-minute fix - I will try to propose solution a bit later. -- regards, Andrey Lepikhov Postgres Professional