mirror of
https://github.com/postgres/postgres.git
synced 2025-06-11 20:28:21 +03:00
Allow FDWs to push down quals without breaking EvalPlanQual rechecks.
This fixes a long-standing bug which was discovered while investigating the interaction between the new join pushdown code and the EvalPlanQual machinery: if a ForeignScan appears on the inner side of a paramaterized nestloop, an EPQ recheck would re-return the original tuple even if it no longer satisfied the pushed-down quals due to changed parameter values. This fix adds a new member to ForeignScan and ForeignScanState and a new argument to make_foreignscan, and requires changes to FDWs which push down quals to populate that new argument with a list of quals they have chosen to push down. Therefore, I'm only back-patching to 9.5, even though the bug is not new in 9.5. Etsuro Fujita, reviewed by me and by Kyotaro Horiguchi.
This commit is contained in:
@ -748,6 +748,7 @@ postgresGetForeignPlan(PlannerInfo *root,
|
||||
Index scan_relid = baserel->relid;
|
||||
List *fdw_private;
|
||||
List *remote_conds = NIL;
|
||||
List *remote_exprs = NIL;
|
||||
List *local_exprs = NIL;
|
||||
List *params_list = NIL;
|
||||
List *retrieved_attrs;
|
||||
@ -769,8 +770,8 @@ postgresGetForeignPlan(PlannerInfo *root,
|
||||
*
|
||||
* This code must match "extract_actual_clauses(scan_clauses, false)"
|
||||
* except for the additional decision about remote versus local execution.
|
||||
* Note however that we only strip the RestrictInfo nodes from the
|
||||
* local_exprs list, since appendWhereClause expects a list of
|
||||
* Note however that we don't strip the RestrictInfo nodes from the
|
||||
* remote_conds list, since appendWhereClause expects a list of
|
||||
* RestrictInfos.
|
||||
*/
|
||||
foreach(lc, scan_clauses)
|
||||
@ -784,11 +785,17 @@ postgresGetForeignPlan(PlannerInfo *root,
|
||||
continue;
|
||||
|
||||
if (list_member_ptr(fpinfo->remote_conds, rinfo))
|
||||
{
|
||||
remote_conds = lappend(remote_conds, rinfo);
|
||||
remote_exprs = lappend(remote_exprs, rinfo->clause);
|
||||
}
|
||||
else if (list_member_ptr(fpinfo->local_conds, rinfo))
|
||||
local_exprs = lappend(local_exprs, rinfo->clause);
|
||||
else if (is_foreign_expr(root, baserel, rinfo->clause))
|
||||
{
|
||||
remote_conds = lappend(remote_conds, rinfo);
|
||||
remote_exprs = lappend(remote_exprs, rinfo->clause);
|
||||
}
|
||||
else
|
||||
local_exprs = lappend(local_exprs, rinfo->clause);
|
||||
}
|
||||
@ -874,7 +881,8 @@ postgresGetForeignPlan(PlannerInfo *root,
|
||||
scan_relid,
|
||||
params_list,
|
||||
fdw_private,
|
||||
NIL /* no custom tlist */ );
|
||||
NIL, /* no custom tlist */
|
||||
remote_exprs);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user