Re: BUG #18902: TRAP:: failed Assert("!is_sorted") in File: "createplan.c"
Richard Guo <guofenglinux@gmail.com>
From: Richard Guo <guofenglinux@gmail.com>
To: David Rowley <dgrowleyml@gmail.com>
Cc: Tender Wang <tndrwang@gmail.com>, n.kalinin@postgrespro.ru, pgsql-bugs@lists.postgresql.org
Date: 2025-05-02T07:03:38Z
Lists: pgsql-bugs
Attachments
- v1-0001-Suppress-unnecessary-explicit-sorting-for-EPQ-mer.patch (application/octet-stream) patch v1-0001
- v1-0002-Track-the-number-of-presorted-outer-pathkeys-in-M.patch (application/octet-stream) patch v1-0002
On Sun, Apr 27, 2025 at 9:14 AM David Rowley <dgrowleyml@gmail.com> wrote: > On Fri, 25 Apr 2025 at 14:16, Richard Guo <guofenglinux@gmail.com> wrote: > > Maybe we could cache the number of presorted keys for the outer and > > inner paths in MergePath to save some pathkeys_count_contained_in > > calls. But I'm not too sure it's worthwhile. The pathkeys are > > canonical, and can be checked for equality by simple pointer > > comparison. So it does not seem to cost too much. Besides, the > > "redundant" pathkey checks actually helped uncover the bug we're > > discussing here — didn't they? > I don't see any reason why we couldn't keep an Assert to ensure the > sorted-ness of the Path matches our expectations. Calculating the > whole thing again in non-assert builds seems a bit silly. The > previous code took care to avoid recalculations by nullifying the > Lists when no sort was required, you've not followed that with the > incremental sort changes, and to me, that makes it feel a little > half-done. Fair point. Here is the patchset doing that. 0001 fixes this bug by setting outersortkeys/innersortkeys to NIL in GetExistingLocalJoinPath if we detect that the new outer/inner path of the MergePath is already sorted properly. 0002 caches the number of presorted keys of the outer path in MergePath, allowing us to save several calls to pathkeys_count_contained_in. (I'm a bit hesitant about whether we should apply the same caching to the inner path of a mergejoin. I chose not to do that in this patch, since incremental sort is not used for the inner path of a mergejoin.) Thanks Richard
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Track the number of presorted outer pathkeys in MergePath
- c06e909c26f0 18.0 landed
-
Suppress unnecessary explicit sorting for EPQ mergejoin path
- 773db22269d4 18.0 landed
-
Re-enable SSL connect_fails tests, and fix related race conditions.
- e0f373ee42a4 18.0 cited
-
Consider explicit incremental sort for mergejoins
- 828e94c9d2fd 18.0 cited