Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit74dae41

Browse files
committed
Fix two latent(?) bugs in equivclass.c.
get_eclass_for_sort_expr() computes expr_relids and nullable_relidsearly on, even though they won't be needed unless we make a newEquivalenceClass, which we often don't. Aside from the probably-minorinefficiency, there's a memory management problem: these bitmapsets willbe built in the caller's context, leading to dangling pointers if thatis shorter-lived than root->planner_cxt. This would be a live bug ifget_eclass_for_sort_expr() could be called with create_it = true duringGEQO join planning. So far as I can find, the core code never doesthat, but it's hard to be sure that no extensions do, especially sincethe comments make it clear that that's supposed to be a supported case.Fix by not computing these values until we've switched into planner_cxtto build the new EquivalenceClass.generate_join_implied_equalities() uses inner_rel->relids to look uprelevant eclasses, but it ought to be using nominal_inner_relids.This is presently harmless because a child RelOptInfo will always haveexactly the same eclass_indexes as its topmost parent; but that mightnot be true forever, and anyway it makes the code confusing.The first of these is old (introduced by me inf3b3b8d), so back-patchto all supported branches. The second only dates to v13, but we mightas well back-patch it to keep the code looking similar across branches.Discussion:https://postgr.es/m/1508010.1601832581@sss.pgh.pa.us
1 parentdb7c7b8 commit74dae41

File tree

1 file changed

+6
-6
lines changed

1 file changed

+6
-6
lines changed

‎src/backend/optimizer/path/equivclass.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -600,12 +600,6 @@ get_eclass_for_sort_expr(PlannerInfo *root,
600600
*/
601601
expr=canonicalize_ec_expression(expr,opcintype,collation);
602602

603-
/*
604-
* Get the precise set of nullable relids appearing in the expression.
605-
*/
606-
expr_relids=pull_varnos((Node*)expr);
607-
nullable_relids=bms_intersect(nullable_relids,expr_relids);
608-
609603
/*
610604
* Scan through the existing EquivalenceClasses for a match
611605
*/
@@ -682,6 +676,12 @@ get_eclass_for_sort_expr(PlannerInfo *root,
682676
if (newec->ec_has_volatile&&sortref==0)/* should not happen */
683677
elog(ERROR,"volatile EquivalenceClass has no sortref");
684678

679+
/*
680+
* Get the precise set of nullable relids appearing in the expression.
681+
*/
682+
expr_relids=pull_varnos((Node*)expr);
683+
nullable_relids=bms_intersect(nullable_relids,expr_relids);
684+
685685
newem=add_eq_member(newec,copyObject(expr),expr_relids,
686686
nullable_relids, false,opcintype);
687687

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp