Re: A very quick observation of dangling pointers in Postgres pathlists
Andrei Lepikhov <lepihov@gmail.com>
From: Andrei Lepikhov <lepihov@gmail.com>
To: David Rowley <dgrowleyml@gmail.com>
Cc: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>,
Tom Lane <tgl@sss.pgh.pa.us>
Date: 2026-04-27T08:19:46Z
Lists: pgsql-hackers
Attachments
- 0001-Fix-dangling-Path-pointer-in-create_ordered_paths.patch (text/plain) patch 0001
On 21/04/2026 10:35, David Rowley wrote: > On Tue, 21 Apr 2026 at 19:29, Andrei Lepikhov <lepihov@gmail.com> wrote: >> I've attached a patch that shows how to fix the issue. Some regression tests >> change because of a hidden rule where a projection and its subpath have >> different target lists. Right now, the patch always enforces a projection, even >> if the target lists are the same. This is still open for discussion on whether >> there's a better way to handle it. > > IMO, we should write a function like copy_path() or reparent_path(), > which creates a copy of the given Path, or the latter also would copy > then set the ->parent to the given RelOptInfo. Any time we use a path > directly from the pathlist of another RelOptInfo, we should reparent > or copy it. We could add an Assert in add_path() to check the new path > has the correct parent to help us find the places where we forget to > do this. I've attached the patch so we can keep the discussion going. I used a shallow copy since re-parenting is not that obvious. As I see it, the parent pointer does not indicate ownership. Instead, it points to the source operator (RelOptInfo). For instance, createplan.c uses it to get the relid of the scan operation. Should the parent point to the pathlist's owner? Possibly, but right now I am not sure how introducing such an explicit contract would affect the optimiser. This issue can't be explicitly reproduced with the current optimiser without deep code intervention. So, if tests are needed, I propose a minor debug-only check inside the plan-building code: with best_path, we can scan RelOptInfo's pathlist and partial_pathlist to detect dangling pointers. It seems not stable enough, so I just left the patch without a test infrastructure. -- regards, Andrei Lepikhov, pgEdge
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Let Parallel Append over simple UNION ALL have partial subpaths.
- 0927d2f46ddd 11.0 cited