pg.ddx.io  pgsql-committers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Alexander Korotkov <akorotkov@postgresql.org>
To: pgsql-committers@lists.postgresql.org
Subject: pgsql: postgres_fdw: push down FUNCTION RTE into foreign joins
Date: Wed, 19 Aug 2026 10:49:25 +0000
Message-ID: <E1wwdrI-00000001CbA-30di@gemulon.postgresql.org> (raw)

postgres_fdw: push down FUNCTION RTE into foreign joins

A foreign join planning hook now considers a (foreign-table x function-RTE)
INNER join as a push-down candidate when the function expression is
IMMUTABLE and otherwise shippable.  The remote query absorbs the function
call as a FROM-list item (e.g. unnest(...) AS f<rti>(c1, c2, ...)), so the
foreign side returns only rows that match the function-produced set and the
join executes entirely on the remote.

An IMMUTABLE function gives the same result on any server, so the same
function RTE can be a push-down candidate for several distinct foreign
servers without semantic risk.  To keep the planner state consistent
across those independent attempts, the per-call stub fpinfo for the
function side lives on the joinrel's PgFdwRelationInfo (new
outer_func_fpinfo / inner_func_fpinfo), never on the function rel itself,
and the function side is detected via rtekind rather than fdw_private.

set_foreign_rel_properties() propagates fdwroutine onto a joinrel that
pairs a foreign rel with an RTE_FUNCTION rel so GetForeignJoinPaths gets
called; the FDW retains full control over whether to actually generate a
path.  deparseRangeTblRef and deparseColumnRef gain a FUNCTION-RTE branch
that emits the function expression and resolves Vars to the generated
column aliases.

Discussion: https://postgr.es/m/e3af56f9b2f1bd9fdf12aff6ca25b18d%40postgrespro.ru
Author: Alexander Pyhalov <a.pyhalov@postgrespro.ru>
Reviewed-by: Solaimurugan Vellaipandiyan <drsolaimurugan.v@gmail.com>
Reviewed-by: Alexander Korotkov <aekorotkov@gmail.com>

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/0ee83dd4a9940883b5241fc9c80fd27f63f2e47f

Modified Files
--------------
contrib/postgres_fdw/deparse.c                 | 157 +++++-
contrib/postgres_fdw/expected/postgres_fdw.out | 627 ++++++++++++++++++++++++
contrib/postgres_fdw/postgres_fdw.c            | 642 +++++++++++++++++++++++--
contrib/postgres_fdw/postgres_fdw.h            |  12 +
contrib/postgres_fdw/sql/postgres_fdw.sql      | 274 +++++++++++
doc/src/sgml/postgres-fdw.sgml                 |  18 +
src/backend/optimizer/util/relnode.c           |  25 +
7 files changed, 1698 insertions(+), 57 deletions(-)



Message-ID: <E1wwdrI-00000001CbA-30di@gemulon.postgresql.org>
Permalink:  ../E1wwdrI-00000001CbA-30di@gemulon.postgresql.org/
Also on:    postgresql.org/message-id/E1wwdrI-00000001CbA-30di@gemulon.postgresql.org

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-committers@postgresql.org
  Cc: akorotkov@postgresql.org, pgsql-committers@lists.postgresql.org
  Subject: Re: pgsql: postgres_fdw: push down FUNCTION RTE into foreign joins
  In-Reply-To: <E1wwdrI-00000001CbA-30di@gemulon.postgresql.org>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox