pgsql: Suppress unnecessary explicit sorting for EPQ mergejoin path

From: Richard Guo <rguo(at)postgresql(dot)org>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Suppress unnecessary explicit sorting for EPQ mergejoin path
Date: 2025-05-08 09:22:39
Message-ID: E1uCxSg-000kln-2T@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Suppress unnecessary explicit sorting for EPQ mergejoin path

When building a ForeignPath for a joinrel, if there's a possibility
that EvalPlanQual will be executed, we must identify a suitable path
for EPQ checks. If the outer or inner path of the chosen path is a
ForeignPath representing a pushed-down join, we replace it with its
fdw_outerpath to ensure that the EPQ check path consists entirely of
local joins.

If the chosen path is a MergePath, and its outer or inner path is a
ForeignPath that is not already well enough ordered, the MergePath
will have non-NIL outersortkeys or innersortkeys indicating the
desired ordering to be created by an explicit Sort node. If we then
replace the outer or inner path with its corresponding fdw_outerpath,
and that path is already sufficiently ordered, we end up in an
inconsistent state: the MergePath has non-NIL outersortkeys or
innersortkeys, and its input path is already properly ordered. This
inconsistency can result in an Assert failure or the addition of a
redundant Sort node.

To fix, check if the new outer or inner path of a MergePath is already
properly sorted, and set its outersortkeys or innersortkeys to NIL if
so.

Bug: #18902
Reported-by: Nikita Kalinin <n(dot)kalinin(at)postgrespro(dot)ru>
Author: Richard Guo <guofenglinux(at)gmail(dot)com>
Reviewed-by: Tender Wang <tndrwang(at)gmail(dot)com>
Discussion: https://postgr.es/m/18902-71c1bed2b9f7c46f@postgresql.org

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/773db22269d474fab46d25e9e15b1e55252cf92c

Modified Files
--------------
contrib/postgres_fdw/expected/postgres_fdw.out | 64 ++++++++++++++++++++++++++
contrib/postgres_fdw/sql/postgres_fdw.sql | 5 ++
src/backend/foreign/foreign.c | 33 +++++++++++++
3 files changed, 102 insertions(+)

Browse pgsql-committers by date

  From Date Subject
Next Message Daniel Gustafsson 2025-05-08 12:01:42 pgsql: doc: Fix title markup for AT TIME ZONE and AT LOCAL
Previous Message Bruce Momjian 2025-05-08 01:11:42 pgsql: doc PG 18 relnotes: adjust pg_log_backend_memory_contexts()