From 30b4955a4668887044568743debef804b14418ca Mon Sep 17 00:00:00 2001 From: Alexander Korotkov Date: Tue, 9 Jan 2024 00:08:35 +0200 Subject: Fix misuse of RelOptInfo.unique_for_rels cache by SJE When SJE uses RelOptInfo.unique_for_rels cache, it passes filtered quals to innerrel_is_unique_ext(). That might lead to an invalid match to cache entries made by previous non self-join checking calls. Add UniqueRelInfo.self_join flag to prevent such cases. Also, fix that SJE should require a strict match of outerrelids to make sure UniqueRelInfo.extra_clauses are valid. Reported-by: Alexander Lakhin Discussion: https://postgr.es/m/4788f781-31bd-9796-d7d6-588a751c8787%40gmail.com --- src/include/nodes/pathnodes.h | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/include/nodes') diff --git a/src/include/nodes/pathnodes.h b/src/include/nodes/pathnodes.h index bb34cfb843f..b9713ec9aa6 100644 --- a/src/include/nodes/pathnodes.h +++ b/src/include/nodes/pathnodes.h @@ -3407,6 +3407,12 @@ typedef struct UniqueRelInfo */ Relids outerrelids; + /* + * The relation in consideration is unique when considering only clauses + * suitable for self-join (passed split_selfjoin_quals()). + */ + bool self_join; + /* * Additional clauses from a baserestrictinfo list that were used to prove * the uniqueness. We cache it for the self-join checking procedure: a -- cgit v1.2.3