aboutsummaryrefslogtreecommitdiff
path: root/doc/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2019-02-09 11:41:09 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2019-02-09 11:41:09 -0500
commitdc0eb137fec20c4f2d168dfcb6bda001a27ad548 (patch)
tree669227970559256ad548c00d91c01b9e57386c88 /doc/src
parent0d7d71b64d70b2db51f6339d6fb86fc4e01f7335 (diff)
downloadpostgresql-dc0eb137fec20c4f2d168dfcb6bda001a27ad548.tar.gz
postgresql-dc0eb137fec20c4f2d168dfcb6bda001a27ad548.zip
Call set_rel_pathlist_hook before generate_gather_paths, not after.
The previous ordering of these steps satisfied the nominal requirement that set_rel_pathlist_hook could editorialize on the whole set of Paths constructed for a base relation. In practice, though, trying to change the set of partial paths was impossible. Adding one didn't work because (a) it was too late to be included in Gather paths made by the core code, and (b) calling add_partial_path after generate_gather_paths is unsafe, because it might try to delete a path it thinks is dominated, but that is already embedded in some Gather path(s). Nor could the hook safely remove partial paths, for the same reason that they might already be embedded in Gathers. Better to call extensions first, let them add partial paths as desired, and then gather. In v11 and up, we already doubled down on that ordering by postponing gathering even further for single-relation queries; so even if the hook wished to editorialize on Gather path construction, it could not. Report and patch by KaiGai Kohei. Back-patch to 9.6 where Gather paths were added. Discussion: https://postgr.es/m/CAOP8fzahwpKJRTVVTqo2AE=mDTz_efVzV6Get_0=U3SO+-ha1A@mail.gmail.com
Diffstat (limited to 'doc/src')
-rw-r--r--doc/src/sgml/custom-scan.sgml5
1 files changed, 3 insertions, 2 deletions
diff --git a/doc/src/sgml/custom-scan.sgml b/doc/src/sgml/custom-scan.sgml
index 9d1ca7bfe16..5e440d2d154 100644
--- a/doc/src/sgml/custom-scan.sgml
+++ b/doc/src/sgml/custom-scan.sgml
@@ -37,8 +37,9 @@
<para>
A custom scan provider will typically add paths for a base relation by
setting the following hook, which is called after the core code has
- generated what it believes to be the complete and correct set of access
- paths for the relation.
+ generated all the access paths it can for the relation (except for
+ Gather paths, which are made after this call so that they can use
+ partial paths added by the hook):
<programlisting>
typedef void (*set_rel_pathlist_hook_type) (PlannerInfo *root,
RelOptInfo *rel,