mirror of
https://github.com/postgres/postgres.git
synced 2025-12-18 05:01:01 +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:
@@ -1135,6 +1135,15 @@ GetForeignServerByName(const char *name, bool missing_ok);
|
||||
evaluation of the <structfield>fdw_exprs</> expression tree.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Any clauses removed from the plan node's qual list must instead be added
|
||||
to <literal>fdw_recheck_quals</> in order to ensure correct behavior
|
||||
at the <literal>READ COMMITTED</> isolation level. When a concurrent
|
||||
update occurs for some other table involved in the query, the executor
|
||||
may need to verify that all of the original quals are still satisfied for
|
||||
the tuple, possibly against a different set of parameter values.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Another <structname>ForeignScan</> field that can be filled by FDWs
|
||||
is <structfield>fdw_scan_tlist</>, which describes the tuples returned by
|
||||
|
||||
Reference in New Issue
Block a user