mirror of
https://github.com/postgres/postgres.git
synced 2025-06-14 18:42:34 +03:00
postgres_fdw: Avoid pulling up restrict infos from subqueries
Semi-join joins below left/right join are deparsed as subqueries. Thus, we can't refer to subqueries vars from upper relations. This commit avoids pulling conditions from them. Reported-by: Robins Tharakan <tharakan@gmail.com> Bug: #18852 Discussion: https://postgr.es/m/CAEP4nAzryLd3gwcUpFBAG9MWyDfMRX8ZjuyY2XXjyC_C6k%2B_Zw%40mail.gmail.com Author: Alexander Pyhalov <a.pyhalov@postgrespro.ru> Reviewed-by: Alexander Korotkov <aekorotkov@gmail.com> Backpatch-through: 17
This commit is contained in:
@ -5963,17 +5963,33 @@ foreign_join_ok(PlannerInfo *root, RelOptInfo *joinrel, JoinType jointype,
|
||||
break;
|
||||
|
||||
case JOIN_LEFT:
|
||||
fpinfo->joinclauses = list_concat(fpinfo->joinclauses,
|
||||
fpinfo_i->remote_conds);
|
||||
fpinfo->remote_conds = list_concat(fpinfo->remote_conds,
|
||||
fpinfo_o->remote_conds);
|
||||
|
||||
/*
|
||||
* When semi-join is involved in the inner or outer part of the
|
||||
* left join, it's deparsed as a subquery, and we can't refer to
|
||||
* its vars on the upper level.
|
||||
*/
|
||||
if (bms_is_empty(fpinfo_i->hidden_subquery_rels))
|
||||
fpinfo->joinclauses = list_concat(fpinfo->joinclauses,
|
||||
fpinfo_i->remote_conds);
|
||||
if (bms_is_empty(fpinfo_o->hidden_subquery_rels))
|
||||
fpinfo->remote_conds = list_concat(fpinfo->remote_conds,
|
||||
fpinfo_o->remote_conds);
|
||||
break;
|
||||
|
||||
case JOIN_RIGHT:
|
||||
fpinfo->joinclauses = list_concat(fpinfo->joinclauses,
|
||||
fpinfo_o->remote_conds);
|
||||
fpinfo->remote_conds = list_concat(fpinfo->remote_conds,
|
||||
fpinfo_i->remote_conds);
|
||||
|
||||
/*
|
||||
* When semi-join is involved in the inner or outer part of the
|
||||
* right join, it's deparsed as a subquery, and we can't refer to
|
||||
* its vars on the upper level.
|
||||
*/
|
||||
if (bms_is_empty(fpinfo_o->hidden_subquery_rels))
|
||||
fpinfo->joinclauses = list_concat(fpinfo->joinclauses,
|
||||
fpinfo_o->remote_conds);
|
||||
if (bms_is_empty(fpinfo_i->hidden_subquery_rels))
|
||||
fpinfo->remote_conds = list_concat(fpinfo->remote_conds,
|
||||
fpinfo_i->remote_conds);
|
||||
break;
|
||||
|
||||
case JOIN_SEMI:
|
||||
|
Reference in New Issue
Block a user