From d7e65bf7c277c3dd3afbd1b7a152b86d24bd6904 Mon Sep 17 00:00:00 2001 From: Ashutosh Bapat Date: Wed, 27 Sep 2023 16:29:11 +0530 Subject: [PATCH 3/3] Address Amit's comments --- src/backend/optimizer/path/joinrels.c | 24 +++++++++++++----------- src/include/nodes/pathnodes.h | 4 ++++ 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/backend/optimizer/path/joinrels.c b/src/backend/optimizer/path/joinrels.c index 540eda612f..1bcc60d62b 100644 --- a/src/backend/optimizer/path/joinrels.c +++ b/src/backend/optimizer/path/joinrels.c @@ -1733,8 +1733,19 @@ build_child_join_sjinfo(PlannerInfo *root, SpecialJoinInfo *parent_sjinfo, } /* - * free_child_sjinfo_members - * Free memory consumed by members of a child SpecialJoinInfo. + * free_child_sjinfo_members Free memory consumed by members of a child + * SpecialJoinInfo. + * + * The candidate members are the ones which are obtained by translating the + * corresponding parent members. However the members which may be potentially + * referenced elsewhere should not be freed. + * + * For example, all the Relids are freed since that are used only for comparison + * and are not referenced elsewhere. But semi_rhs_exprs are not freed, even if + * they are translated, since they may be referenced in paths or other objects. + * + * semi_operators is not freed as well since it's copied as is from parent + * SpecialJoinInfo and is not a translation. */ static void free_child_sjinfo_members(SpecialJoinInfo *child_sjinfo) @@ -1746,19 +1757,10 @@ free_child_sjinfo_members(SpecialJoinInfo *child_sjinfo) if (child_sjinfo->jointype == JOIN_INNER) return; - /* - * The relids are used only for comparison and their references are not - * stored anywhere. Free those. - */ bms_free(child_sjinfo->min_lefthand); bms_free(child_sjinfo->min_righthand); bms_free(child_sjinfo->syn_lefthand); bms_free(child_sjinfo->syn_righthand); - - /* - * But the list of operator OIDs and the list of expressions may be - * referenced somewhere else. Do not free those. - */ } /* diff --git a/src/include/nodes/pathnodes.h b/src/include/nodes/pathnodes.h index 5702fbba60..4ec007efa1 100644 --- a/src/include/nodes/pathnodes.h +++ b/src/include/nodes/pathnodes.h @@ -2839,6 +2839,10 @@ typedef struct PlaceHolderVar * cost estimation purposes it is sometimes useful to know the join size under * plain innerjoin semantics. Note that lhs_strict and the semi_xxx fields * are not set meaningfully within such structs. + * + * We also create transient SpecialJoinInfos for child joins by translating + * corresponding parent SpecialJoinInfos. These are also not part of + * PlannerInfo's join_info_list. */ #ifndef HAVE_SPECIALJOININFO_TYPEDEF typedef struct SpecialJoinInfo SpecialJoinInfo; -- 2.25.1