From 824dbea3e41efa3b35094163c834988dea7eb139 Mon Sep 17 00:00:00 2001 From: Alexander Korotkov Date: Tue, 5 Dec 2023 22:53:12 +0200 Subject: Add support for deparsing semi-joins to contrib/postgres_fdw SEMI-JOIN is deparsed as the EXISTS subquery. It references outer and inner relations, so it should be evaluated as the condition in the upper-level WHERE clause. The signatures of deparseFromExprForRel() and deparseRangeTblRef() are revised so that they can add conditions to the upper level. PgFdwRelationInfo now has a hidden_subquery_rels field, referencing the relids used in the inner parts of semi-join. They can't be referred to from upper relations and should be used internally for equivalence member searches. The planner can create semi-join, which refers to inner rel vars in its target list. However, we deparse semi-join as an exists() subquery. So we skip the case when the target list references to inner rel of semi-join. Author: Alexander Pyhalov Reviewed-by: Ashutosh Bapat, Ian Lawrence Barwick, Yuuki Fujii, Tomas Vondra Discussion: https://postgr.es/m/c9e2a757cf3ac2333714eaf83a9cc184@postgrespro.ru --- contrib/postgres_fdw/postgres_fdw.h | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'contrib/postgres_fdw/postgres_fdw.h') diff --git a/contrib/postgres_fdw/postgres_fdw.h b/contrib/postgres_fdw/postgres_fdw.h index 47157ac887e..9a1a80aebb4 100644 --- a/contrib/postgres_fdw/postgres_fdw.h +++ b/contrib/postgres_fdw/postgres_fdw.h @@ -118,6 +118,10 @@ typedef struct PgFdwRelationInfo * subquery? */ Relids lower_subquery_rels; /* all relids appearing in lower * subqueries */ + Relids hidden_subquery_rels; /* relids, which can't be referred to + * from upper relations, used + * internally for equivalence member + * search */ /* * Index of the relation. It is used to create an alias to a subquery -- cgit v1.2.3