{"kind": "hook", "major": "18", "item": {"slug": "create_upper_paths_hook", "name": "create_upper_paths_hook", "name_zh": "create_upper_paths_hook", "category": "Query planning", "summary": "Hook for plugins to get control when grouping_planner() plans upper rels", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "create_upper_paths_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/10/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/optimizer/planner.h#L28", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "38335a1fe8bdf73232384fc8b5113e17aed43e0902fcf77b8cd41cc01b6d76ee"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/optimizer/plan/planner.c#L70", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "aee8c494facfb92d69ab66efc6f3a119b8796f488174eb07d2ef08346709dab6"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/optimizer/plan/planner.c#L2111", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "aee8c494facfb92d69ab66efc6f3a119b8796f488174eb07d2ef08346709dab6"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/optimizer/prep/prepunion.c#L214", "path": "src/backend/optimizer/prep/prepunion.c", "label": "Call sites", "sha256": "1d6e1235c5e811dc7593af3fd123398284ef715ce0fcef072b6ba3bae523e203"}], "sections": [{"title": "Core source comments", "paragraphs": ["Let extensions possibly add some more paths"]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:2111", "src/backend/optimizer/plan/planner.c:4172", "src/backend/optimizer/plan/planner.c:4629", "src/backend/optimizer/plan/planner.c:4933", "src/backend/optimizer/plan/planner.c:5075", "src/backend/optimizer/prep/prepunion.c:214"]}, {"code": "\t\tfinal_rel->fdwroutine->GetForeignUpperPaths)\n\t\tfinal_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel);\n\n\t/* Note: currently, we leave it to callers to do set_cheapest() */\n}\n\n/*\n * Do preprocessing for groupingSets clause and related data.  This handles the\n * preliminary steps of expanding the grouping sets, organizing them into lists", "title": "Core call context: src/backend/optimizer/plan/planner.c:2105\u20132119", "paragraphs": []}, {"code": "\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths)\n\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  input_rel, grouped_rel);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\tinput_rel, grouped_rel);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(grouped_rel);\n\n\t/*\n\t * We've been using the partial pathlist for the grouped relation to hold\n\t * partially aggregated paths, but that's actually a little bit bogus", "title": "Core call context: src/backend/optimizer/plan/planner.c:4166\u20134180", "paragraphs": []}, {"code": "\t\twindow_rel->fdwroutine->GetForeignUpperPaths)\n\t\twindow_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\t\t\t\t\t input_rel, window_rel);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\tinput_rel, window_rel);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(window_rel);\n\n\treturn window_rel;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:4623\u20134637", "paragraphs": []}], "signature": "typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel);\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;", "description": ["Hook for plugins to get control when grouping_planner() plans upper rels"]}, "11": {"facts": [{"label": "Interface type", "value": "create_upper_paths_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/11/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/optimizer/planner.h#L28", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "51eeb8cf86be4935e89ed182a0802dcabd69b5f8c6705c23349daf7f35ebdca6"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/optimizer/plan/planner.c#L72", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "2759e867f1d3350da408571eeafd5a0eb2137d0c02e52579d726140aa31bcab7"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/optimizer/plan/planner.c#L2288", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "2759e867f1d3350da408571eeafd5a0eb2137d0c02e52579d726140aa31bcab7"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/optimizer/prep/prepunion.c#L1040", "path": "src/backend/optimizer/prep/prepunion.c", "label": "Call sites", "sha256": "58938eaa70baa5b8d83476cae7c83efa97bb677915262e200c72d65bbec58ad3"}], "sections": [{"title": "Core source comments", "paragraphs": ["Let extensions possibly add some more paths", "We don't currently worry about allowing FDWs to contribute paths to this relation, but give extensions a chance."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:2288", "src/backend/optimizer/plan/planner.c:4111", "src/backend/optimizer/plan/planner.c:4550", "src/backend/optimizer/plan/planner.c:4854", "src/backend/optimizer/plan/planner.c:4998", "src/backend/optimizer/prep/prepunion.c:1040"]}, {"code": "\t\tfinal_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\tNULL);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel, NULL);\n\n\t/* Note: currently, we leave it to callers to do set_cheapest() */\n}\n\n/*\n * Do preprocessing for groupingSets clause and related data.  This handles the\n * preliminary steps of expanding the grouping sets, organizing them into lists", "title": "Core call context: src/backend/optimizer/plan/planner.c:2282\u20132296", "paragraphs": []}, {"code": "\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  input_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\tinput_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\textra);\n}\n\n/*\n * For a given input path, consider the possible ways of doing grouping sets on\n * it, by combinations of hashing and sorting.  This can be called multiple\n * times, so it's important that it not scribble on input.  No result is", "title": "Core call context: src/backend/optimizer/plan/planner.c:4105\u20134119", "paragraphs": []}, {"code": "\t\twindow_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\t\t\t\t\t input_rel, window_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t NULL);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\tinput_rel, window_rel, NULL);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(window_rel);\n\n\treturn window_rel;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:4544\u20134558", "paragraphs": []}], "signature": "typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra);\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;", "description": ["Hook for plugins to get control when grouping_planner() plans upper rels"]}, "12": {"facts": [{"label": "Interface type", "value": "create_upper_paths_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/12/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/optimizer/planner.h#L32", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "8d4820190535b8e59c659c3c237e2018d2bfe5a8b000ffb048fe1eebccb7073c"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/optimizer/plan/planner.c#L78", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "a27e680979f187ec5264f5675cc44a9a5aa67b85c9b69a207f4f7d3a791adedb"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/optimizer/plan/planner.c#L2412", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "a27e680979f187ec5264f5675cc44a9a5aa67b85c9b69a207f4f7d3a791adedb"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/optimizer/prep/prepunion.c#L1002", "path": "src/backend/optimizer/prep/prepunion.c", "label": "Call sites", "sha256": "bd70bfa97ef5d4ce797c0ce66f8e119517e9ad541f4988f088401e412599d221"}], "sections": [{"title": "Core source comments", "paragraphs": ["Let extensions possibly add some more paths", "We don't currently worry about allowing FDWs to contribute paths to this relation, but give extensions a chance."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:2412", "src/backend/optimizer/plan/planner.c:4171", "src/backend/optimizer/plan/planner.c:4607", "src/backend/optimizer/plan/planner.c:4909", "src/backend/optimizer/plan/planner.c:5053", "src/backend/optimizer/prep/prepunion.c:1002"]}, {"code": "\t\tfinal_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel, &extra);\n\n\t/* Note: currently, we leave it to callers to do set_cheapest() */\n}\n\n/*\n * Do preprocessing for groupingSets clause and related data.  This handles the\n * preliminary steps of expanding the grouping sets, organizing them into lists", "title": "Core call context: src/backend/optimizer/plan/planner.c:2406\u20132420", "paragraphs": []}, {"code": "\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  input_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\tinput_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\textra);\n}\n\n/*\n * For a given input path, consider the possible ways of doing grouping sets on\n * it, by combinations of hashing and sorting.  This can be called multiple\n * times, so it's important that it not scribble on input.  No result is", "title": "Core call context: src/backend/optimizer/plan/planner.c:4165\u20134179", "paragraphs": []}, {"code": "\t\twindow_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\t\t\t\t\t input_rel, window_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t NULL);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\tinput_rel, window_rel, NULL);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(window_rel);\n\n\treturn window_rel;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:4601\u20134615", "paragraphs": []}], "signature": "typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra);\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;", "description": ["Hook for plugins to get control when grouping_planner() plans upper rels"]}, "13": {"facts": [{"label": "Interface type", "value": "create_upper_paths_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/13/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/optimizer/planner.h#L33", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "06cb8f28d3a2810d58006b1a91d01481d8cd05dccb4132d2c7b439fdc2f4e344"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/optimizer/plan/planner.c#L78", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "9f9d4c68be0349980cfefe9109df2415756fd04fa45a6f7176381eba8c32ccef"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/optimizer/plan/planner.c#L2466", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "9f9d4c68be0349980cfefe9109df2415756fd04fa45a6f7176381eba8c32ccef"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/optimizer/prep/prepunion.c#L1003", "path": "src/backend/optimizer/prep/prepunion.c", "label": "Call sites", "sha256": "38daf59286bda423df34fc76d94acbe88bda0510eada6305495663a71a99e7ab"}], "sections": [{"title": "Core source comments", "paragraphs": ["Let extensions possibly add some more paths", "We don't currently worry about allowing FDWs to contribute paths to this relation, but give extensions a chance."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:2466", "src/backend/optimizer/plan/planner.c:4219", "src/backend/optimizer/plan/planner.c:4656", "src/backend/optimizer/plan/planner.c:4946", "src/backend/optimizer/plan/planner.c:5203", "src/backend/optimizer/prep/prepunion.c:1003"]}, {"code": "\t\tfinal_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel, &extra);\n\n\t/* Note: currently, we leave it to callers to do set_cheapest() */\n}\n\n/*\n * Do preprocessing for groupingSets clause and related data.  This handles the\n * preliminary steps of expanding the grouping sets, organizing them into lists", "title": "Core call context: src/backend/optimizer/plan/planner.c:2460\u20132474", "paragraphs": []}, {"code": "\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  input_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\tinput_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\textra);\n}\n\n/*\n * For a given input path, consider the possible ways of doing grouping sets on\n * it, by combinations of hashing and sorting.  This can be called multiple\n * times, so it's important that it not scribble on input.  No result is", "title": "Core call context: src/backend/optimizer/plan/planner.c:4213\u20134227", "paragraphs": []}, {"code": "\t\twindow_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\t\t\t\t\t input_rel, window_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t NULL);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\tinput_rel, window_rel, NULL);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(window_rel);\n\n\treturn window_rel;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:4650\u20134664", "paragraphs": []}], "signature": "typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra);\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;", "description": ["Hook for plugins to get control when grouping_planner() plans upper rels"]}, "14": {"facts": [{"label": "Interface type", "value": "create_upper_paths_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/14/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/optimizer/planner.h#L33", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "90fa62aaa319c5a7c0990ee37e386e09543bf84e2b615ba82bb36fee401f186e"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/optimizer/plan/planner.c#L78", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "567c6f13b08a1bfd8089c7b02203a43ef0627305b184087ee3296bed0502d680"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/optimizer/plan/planner.c#L1919", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "567c6f13b08a1bfd8089c7b02203a43ef0627305b184087ee3296bed0502d680"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/optimizer/prep/prepunion.c#L1004", "path": "src/backend/optimizer/prep/prepunion.c", "label": "Call sites", "sha256": "5c7129c920e9d286f781cc9d44b4f3ad22263f8da2438c760c1d9693dd996095"}], "sections": [{"title": "Core source comments", "paragraphs": ["Let extensions possibly add some more paths", "We don't currently worry about allowing FDWs to contribute paths to this relation, but give extensions a chance."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:1919", "src/backend/optimizer/plan/planner.c:3675", "src/backend/optimizer/plan/planner.c:4118", "src/backend/optimizer/plan/planner.c:4432", "src/backend/optimizer/plan/planner.c:4689", "src/backend/optimizer/prep/prepunion.c:1004"]}, {"code": "\t\tfinal_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel, &extra);\n\n\t/* Note: currently, we leave it to callers to do set_cheapest() */\n}\n\n/*\n * Do preprocessing for groupingSets clause and related data.  This handles the\n * preliminary steps of expanding the grouping sets, organizing them into lists", "title": "Core call context: src/backend/optimizer/plan/planner.c:1913\u20131927", "paragraphs": []}, {"code": "\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  input_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\tinput_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\textra);\n}\n\n/*\n * For a given input path, consider the possible ways of doing grouping sets on\n * it, by combinations of hashing and sorting.  This can be called multiple\n * times, so it's important that it not scribble on input.  No result is", "title": "Core call context: src/backend/optimizer/plan/planner.c:3669\u20133683", "paragraphs": []}, {"code": "\t\twindow_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\t\t\t\t\t input_rel, window_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t NULL);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\tinput_rel, window_rel, NULL);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(window_rel);\n\n\treturn window_rel;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:4112\u20134126", "paragraphs": []}], "signature": "typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra);\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;", "description": ["Hook for plugins to get control when grouping_planner() plans upper rels"]}, "15": {"facts": [{"label": "Interface type", "value": "create_upper_paths_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/15/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/optimizer/planner.h#L33", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "d08a1626954ade22b46ed1e5b585c365765cb3f4aeb19b6b6d220a953f9f9f11"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/optimizer/plan/planner.c#L78", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "3312bdb7dc77f49e01a7a4afd110f3414c03ce755e7e5fb00deca3b5c2ebd6ee"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/optimizer/plan/planner.c#L1991", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "3312bdb7dc77f49e01a7a4afd110f3414c03ce755e7e5fb00deca3b5c2ebd6ee"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/optimizer/prep/prepunion.c#L1004", "path": "src/backend/optimizer/prep/prepunion.c", "label": "Call sites", "sha256": "66f47ad4d3b6f95bfea95843f21b27cbf68eef7fbc905161ef989b91abe09ffb"}], "sections": [{"title": "Core source comments", "paragraphs": ["Let extensions possibly add some more paths", "Let extensions possibly add some more partial paths", "We don't currently worry about allowing FDWs to contribute paths to this relation, but give extensions a chance."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:1991", "src/backend/optimizer/plan/planner.c:3748", "src/backend/optimizer/plan/planner.c:4191", "src/backend/optimizer/plan/planner.c:4393", "src/backend/optimizer/plan/planner.c:4508", "src/backend/optimizer/plan/planner.c:4921", "src/backend/optimizer/prep/prepunion.c:1004"]}, {"code": "\t\tfinal_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel, &extra);\n\n\t/* Note: currently, we leave it to callers to do set_cheapest() */\n}\n\n/*\n * Do preprocessing for groupingSets clause and related data.  This handles the\n * preliminary steps of expanding the grouping sets, organizing them into lists", "title": "Core call context: src/backend/optimizer/plan/planner.c:1985\u20131999", "paragraphs": []}, {"code": "\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  input_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\tinput_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\textra);\n}\n\n/*\n * For a given input path, consider the possible ways of doing grouping sets on\n * it, by combinations of hashing and sorting.  This can be called multiple\n * times, so it's important that it not scribble on input.  No result is", "title": "Core call context: src/backend/optimizer/plan/planner.c:3742\u20133756", "paragraphs": []}, {"code": "\t\twindow_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\t\t\t\t\t input_rel, window_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t NULL);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\tinput_rel, window_rel, NULL);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(window_rel);\n\n\treturn window_rel;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:4185\u20134199", "paragraphs": []}], "signature": "typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra);\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;", "description": ["Hook for plugins to get control when grouping_planner() plans upper rels"]}, "16": {"facts": [{"label": "Interface type", "value": "create_upper_paths_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/16/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/optimizer/planner.h#L33", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "57fcc2e58b25f30a1bcc75c39b40077df4a27c2c4d6f9f618f99d86921f7e361"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/optimizer/plan/planner.c#L81", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "07f42ef50710179096fb328be88393d58865a39ca8e6020789718cbc78ce355e"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/optimizer/plan/planner.c#L2106", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "07f42ef50710179096fb328be88393d58865a39ca8e6020789718cbc78ce355e"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/optimizer/prep/prepunion.c#L1011", "path": "src/backend/optimizer/prep/prepunion.c", "label": "Call sites", "sha256": "b870ed158a0f745b60446cb47641a0b82ae65625d7885f294804a6c6ecc6d15e"}], "sections": [{"title": "Core source comments", "paragraphs": ["Let extensions possibly add some more paths", "Let extensions possibly add some more partial paths", "We don't currently worry about allowing FDWs to contribute paths to this relation, but give extensions a chance."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:2106", "src/backend/optimizer/plan/planner.c:4214", "src/backend/optimizer/plan/planner.c:4654", "src/backend/optimizer/plan/planner.c:4856", "src/backend/optimizer/plan/planner.c:5012", "src/backend/optimizer/plan/planner.c:5450", "src/backend/optimizer/prep/prepunion.c:1011"]}, {"code": "\t\tfinal_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel, &extra);\n\n\t/* Note: currently, we leave it to callers to do set_cheapest() */\n}\n\n/*\n * Do preprocessing for groupingSets clause and related data.  This handles the\n * preliminary steps of expanding the grouping sets, organizing them into lists", "title": "Core call context: src/backend/optimizer/plan/planner.c:2100\u20132114", "paragraphs": []}, {"code": "\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  input_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\tinput_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\textra);\n}\n\n/*\n * For a given input path, consider the possible ways of doing grouping sets on\n * it, by combinations of hashing and sorting.  This can be called multiple\n * times, so it's important that it not scribble on input.  No result is", "title": "Core call context: src/backend/optimizer/plan/planner.c:4208\u20134222", "paragraphs": []}, {"code": "\t\twindow_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\t\t\t\t\t input_rel, window_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t NULL);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\tinput_rel, window_rel, NULL);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(window_rel);\n\n\treturn window_rel;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:4648\u20134662", "paragraphs": []}], "signature": "typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra);\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;", "description": ["Hook for plugins to get control when grouping_planner() plans upper rels"]}, "17": {"facts": [{"label": "Interface type", "value": "create_upper_paths_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/17/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/optimizer/planner.h#L33", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "09bba5b6f72173dab2a34129916f97d1f39819d417cba80aa5d73a64bf9e8bbc"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/optimizer/plan/planner.c#L76", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "d542e814c23cebd3dce7f9c958a376c10c4b1921ba0cb966e67d5ce2c0afb421"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/optimizer/plan/planner.c#L2152", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "d542e814c23cebd3dce7f9c958a376c10c4b1921ba0cb966e67d5ce2c0afb421"}], "sections": [{"title": "Core source comments", "paragraphs": ["Let extensions possibly add some more paths", "Let extensions possibly add some more partial paths"]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:2152", "src/backend/optimizer/plan/planner.c:4287", "src/backend/optimizer/plan/planner.c:4727", "src/backend/optimizer/plan/planner.c:4970", "src/backend/optimizer/plan/planner.c:5161", "src/backend/optimizer/plan/planner.c:5568"]}, {"code": "\t\tfinal_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel, &extra);\n\n\t/* Note: currently, we leave it to callers to do set_cheapest() */\n}\n\n/*\n * Do preprocessing for groupingSets clause and related data.  This handles the\n * preliminary steps of expanding the grouping sets, organizing them into lists", "title": "Core call context: src/backend/optimizer/plan/planner.c:2146\u20132160", "paragraphs": []}, {"code": "\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  input_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\tinput_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\textra);\n}\n\n/*\n * For a given input path, consider the possible ways of doing grouping sets on\n * it, by combinations of hashing and sorting.  This can be called multiple\n * times, so it's important that it not scribble on input.  No result is", "title": "Core call context: src/backend/optimizer/plan/planner.c:4281\u20134295", "paragraphs": []}, {"code": "\t\twindow_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\t\t\t\t\t input_rel, window_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t NULL);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\tinput_rel, window_rel, NULL);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(window_rel);\n\n\treturn window_rel;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:4721\u20134735", "paragraphs": []}], "signature": "typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra);\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;", "description": ["Hook for plugins to get control when grouping_planner() plans upper rels"]}, "18": {"facts": [{"label": "Interface type", "value": "create_upper_paths_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/18/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/optimizer/planner.h#L33", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "2b48e2afeff0e27570bc5bf536f3d5cdaab6111beb0b98bef9e5ce069598d08b"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/plan/planner.c#L77", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "70faebbc45551e477e5d75000911b029ea648e8cc616725f3b0032480cf16878"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/plan/planner.c#L2386", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "70faebbc45551e477e5d75000911b029ea648e8cc616725f3b0032480cf16878"}], "sections": [{"title": "Core source comments", "paragraphs": ["Let extensions possibly add some more paths", "Let extensions possibly add some more partial paths"]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:2386", "src/backend/optimizer/plan/planner.c:4379", "src/backend/optimizer/plan/planner.c:4819", "src/backend/optimizer/plan/planner.c:5062", "src/backend/optimizer/plan/planner.c:5237", "src/backend/optimizer/plan/planner.c:5707"]}, {"code": "\t\tfinal_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel, &extra);\n\n\t/* Note: currently, we leave it to callers to do set_cheapest() */\n}\n\n/*\n * Do preprocessing for groupingSets clause and related data.\n *", "title": "Core call context: src/backend/optimizer/plan/planner.c:2380\u20132394", "paragraphs": []}, {"code": "\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  input_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\tinput_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\textra);\n}\n\n/*\n * For a given input path, consider the possible ways of doing grouping sets on\n * it, by combinations of hashing and sorting.  This can be called multiple\n * times, so it's important that it not scribble on input.  No result is", "title": "Core call context: src/backend/optimizer/plan/planner.c:4373\u20134387", "paragraphs": []}, {"code": "\t\twindow_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\t\t\t\t\t input_rel, window_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t NULL);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\tinput_rel, window_rel, NULL);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(window_rel);\n\n\treturn window_rel;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:4813\u20134827", "paragraphs": []}], "signature": "typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra);\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;", "description": ["Hook for plugins to get control when grouping_planner() plans upper rels"]}, "19": {"facts": [{"label": "Interface type", "value": "create_upper_paths_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/19/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/optimizer/planner.h#L50", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "4d38d7e4dd9956ef015711e8bf3262ea52631558a0eea290d4fa14ac517c5407"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/optimizer/plan/planner.c#L83", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "f71d959162a35db9df0f7b54c0fb7980fd61d80e8da24b1adae7c0dafb33b1c4"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/optimizer/plan/planner.c#L2467", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "f71d959162a35db9df0f7b54c0fb7980fd61d80e8da24b1adae7c0dafb33b1c4"}], "sections": [{"title": "Core source comments", "paragraphs": ["Let extensions possibly add some more paths", "Let extensions possibly add some more partial paths"]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:2467", "src/backend/optimizer/plan/planner.c:4453", "src/backend/optimizer/plan/planner.c:4893", "src/backend/optimizer/plan/planner.c:5136", "src/backend/optimizer/plan/planner.c:5311", "src/backend/optimizer/plan/planner.c:5784"]}, {"code": "\t\tfinal_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel, &extra);\n\n\t/* Note: currently, we leave it to callers to do set_cheapest() */\n}\n\n/*\n * Do preprocessing for groupingSets clause and related data.\n *", "title": "Core call context: src/backend/optimizer/plan/planner.c:2461\u20132475", "paragraphs": []}, {"code": "\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  input_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\tinput_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\textra);\n}\n\n/*\n * For a given input path, consider the possible ways of doing grouping sets on\n * it, by combinations of hashing and sorting.  This can be called multiple\n * times, so it's important that it not scribble on input.  No result is", "title": "Core call context: src/backend/optimizer/plan/planner.c:4447\u20134461", "paragraphs": []}, {"code": "\t\twindow_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\t\t\t\t\t input_rel, window_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t NULL);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\tinput_rel, window_rel, NULL);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(window_rel);\n\n\treturn window_rel;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:4887\u20134901", "paragraphs": []}], "signature": "typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra);\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;", "description": ["Hook for plugins to get control when grouping_planner() plans upper rels"]}, "20": {"facts": [{"label": "Interface type", "value": "create_upper_paths_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/devel/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/optimizer/planner.h#L50", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "4d38d7e4dd9956ef015711e8bf3262ea52631558a0eea290d4fa14ac517c5407"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/optimizer/plan/planner.c#L83", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "fbcf53dca02672e0d1757d98942126dd22a4bcadf5a2323710f76d854fe84395"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/optimizer/plan/planner.c#L2467", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "fbcf53dca02672e0d1757d98942126dd22a4bcadf5a2323710f76d854fe84395"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/optimizer/prep/prepunion.c#L1462", "path": "src/backend/optimizer/prep/prepunion.c", "label": "Call sites", "sha256": "41510a088180f32c660eaa12c2371c6bcd7debc6b6ae90836d4cc7cc2e7a8fc7"}], "sections": [{"title": "Core source comments", "paragraphs": ["Let extensions possibly add some more paths", "Let extensions possibly add some more partial paths", "We don't currently worry about allowing FDWs to contribute paths to this relation, but give extensions a chance."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:2467", "src/backend/optimizer/plan/planner.c:4453", "src/backend/optimizer/plan/planner.c:4893", "src/backend/optimizer/plan/planner.c:5136", "src/backend/optimizer/plan/planner.c:5311", "src/backend/optimizer/plan/planner.c:5784", "src/backend/optimizer/prep/prepunion.c:1462"]}, {"code": "\t\tfinal_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel, &extra);\n\n\t/* Note: currently, we leave it to callers to do set_cheapest() */\n}\n\n/*\n * Do preprocessing for groupingSets clause and related data.\n *", "title": "Core call context: src/backend/optimizer/plan/planner.c:2461\u20132475", "paragraphs": []}, {"code": "\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  input_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\tinput_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\textra);\n}\n\n/*\n * For a given input path, consider the possible ways of doing grouping sets on\n * it, by combinations of hashing and sorting.  This can be called multiple\n * times, so it's important that it not scribble on input.  No result is", "title": "Core call context: src/backend/optimizer/plan/planner.c:4447\u20134461", "paragraphs": []}, {"code": "\t\twindow_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\t\t\t\t\t input_rel, window_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t NULL);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\tinput_rel, window_rel, NULL);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(window_rel);\n\n\treturn window_rel;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:4887\u20134901", "paragraphs": []}], "signature": "typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra);\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;", "description": ["Hook for plugins to get control when grouping_planner() plans upper rels"]}}, "content_hash": "1d435494e0bf82c277ed8669b2175e587cb0828724930a64328f85bbef51bfc2", "imported_at": "2026-09-27T09:57:58.870"}, "snapshot": {"facts": [{"label": "Interface type", "value": "create_upper_paths_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/18/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/optimizer/planner.h#L33", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "2b48e2afeff0e27570bc5bf536f3d5cdaab6111beb0b98bef9e5ce069598d08b"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/plan/planner.c#L77", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "70faebbc45551e477e5d75000911b029ea648e8cc616725f3b0032480cf16878"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/plan/planner.c#L2386", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "70faebbc45551e477e5d75000911b029ea648e8cc616725f3b0032480cf16878"}], "sections": [{"title": "Core source comments", "paragraphs": ["Let extensions possibly add some more paths", "Let extensions possibly add some more partial paths"]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:2386", "src/backend/optimizer/plan/planner.c:4379", "src/backend/optimizer/plan/planner.c:4819", "src/backend/optimizer/plan/planner.c:5062", "src/backend/optimizer/plan/planner.c:5237", "src/backend/optimizer/plan/planner.c:5707"]}, {"code": "\t\tfinal_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel, &extra);\n\n\t/* Note: currently, we leave it to callers to do set_cheapest() */\n}\n\n/*\n * Do preprocessing for groupingSets clause and related data.\n *", "title": "Core call context: src/backend/optimizer/plan/planner.c:2380\u20132394", "paragraphs": []}, {"code": "\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  input_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\tinput_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\textra);\n}\n\n/*\n * For a given input path, consider the possible ways of doing grouping sets on\n * it, by combinations of hashing and sorting.  This can be called multiple\n * times, so it's important that it not scribble on input.  No result is", "title": "Core call context: src/backend/optimizer/plan/planner.c:4373\u20134387", "paragraphs": []}, {"code": "\t\twindow_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\t\t\t\t\t input_rel, window_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t NULL);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\tinput_rel, window_rel, NULL);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(window_rel);\n\n\treturn window_rel;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:4813\u20134827", "paragraphs": []}], "signature": "typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra);\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;", "description": ["Hook for plugins to get control when grouping_planner() plans upper rels"]}, "comparison": {"left": "10", "right": "11", "status": "changed", "diff": "--- PostgreSQL 10\n+++ PostgreSQL 11\n@@ -17,6 +17,6 @@\n       \"value\": \"NULL (no hook installed)\"\n     }\n   ],\n-  \"signature\": \"typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel);\\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;\",\n+  \"signature\": \"typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra);\\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;\",\n   \"tables\": null\n }"}}