{"kind": "hook", "major": "18", "item": {"slug": "planner_hook", "name": "planner_hook", "name_zh": "planner_hook", "category": "Query planning", "summary": "Hook for plugins to get control in planner()", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "planner_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#L22", "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#L67", "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#L208", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "aee8c494facfb92d69ab66efc6f3a119b8796f488174eb07d2ef08346709dab6"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:208"]}, {"code": "PlannedStmt *\nplanner(Query *parse, int cursorOptions, ParamListInfo boundParams)\n{\n\tPlannedStmt *result;\n\n\tif (planner_hook)\n\t\tresult = (*planner_hook) (parse, cursorOptions, boundParams);\n\telse\n\t\tresult = standard_planner(parse, cursorOptions, boundParams);\n\treturn result;\n}\n\nPlannedStmt *\nstandard_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)\n{", "title": "Core call context: src/backend/optimizer/plan/planner.c:202\u2013216", "paragraphs": []}], "signature": "typedef PlannedStmt *(*planner_hook_type) (Query *parse, int cursorOptions, ParamListInfo boundParams);\nextern PGDLLIMPORT planner_hook_type planner_hook;", "description": ["Hook for plugins to get control in planner()"]}, "11": {"facts": [{"label": "Interface type", "value": "planner_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#L22", "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#L69", "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#L261", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "2759e867f1d3350da408571eeafd5a0eb2137d0c02e52579d726140aa31bcab7"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:261"]}, {"code": "PlannedStmt *\nplanner(Query *parse, int cursorOptions, ParamListInfo boundParams)\n{\n\tPlannedStmt *result;\n\n\tif (planner_hook)\n\t\tresult = (*planner_hook) (parse, cursorOptions, boundParams);\n\telse\n\t\tresult = standard_planner(parse, cursorOptions, boundParams);\n\treturn result;\n}\n\nPlannedStmt *\nstandard_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)\n{", "title": "Core call context: src/backend/optimizer/plan/planner.c:255\u2013269", "paragraphs": []}], "signature": "typedef PlannedStmt *(*planner_hook_type) (Query *parse, int cursorOptions, ParamListInfo boundParams);\nextern PGDLLIMPORT planner_hook_type planner_hook;", "description": ["Hook for plugins to get control in planner()"]}, "12": {"facts": [{"label": "Interface type", "value": "planner_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#L26", "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#L75", "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#L273", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "a27e680979f187ec5264f5675cc44a9a5aa67b85c9b69a207f4f7d3a791adedb"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:273"]}, {"code": "PlannedStmt *\nplanner(Query *parse, int cursorOptions, ParamListInfo boundParams)\n{\n\tPlannedStmt *result;\n\n\tif (planner_hook)\n\t\tresult = (*planner_hook) (parse, cursorOptions, boundParams);\n\telse\n\t\tresult = standard_planner(parse, cursorOptions, boundParams);\n\treturn result;\n}\n\nPlannedStmt *\nstandard_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)\n{", "title": "Core call context: src/backend/optimizer/plan/planner.c:267\u2013281", "paragraphs": []}], "signature": "typedef PlannedStmt *(*planner_hook_type) (Query *parse, int cursorOptions, ParamListInfo boundParams);\nextern PGDLLIMPORT planner_hook_type planner_hook;", "description": ["Hook for plugins to get control in planner()"]}, "13": {"facts": [{"label": "Interface type", "value": "planner_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#L26", "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#L75", "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#L274", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "9f9d4c68be0349980cfefe9109df2415756fd04fa45a6f7176381eba8c32ccef"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:274"]}, {"code": "planner(Query *parse, const char *query_string, int cursorOptions,\n\t\tParamListInfo boundParams)\n{\n\tPlannedStmt *result;\n\n\tif (planner_hook)\n\t\tresult = (*planner_hook) (parse, query_string, cursorOptions, boundParams);\n\telse\n\t\tresult = standard_planner(parse, query_string, cursorOptions, boundParams);\n\treturn result;\n}\n\nPlannedStmt *\nstandard_planner(Query *parse, const char *query_string, int cursorOptions,\n\t\t\t\t ParamListInfo boundParams)", "title": "Core call context: src/backend/optimizer/plan/planner.c:268\u2013282", "paragraphs": []}], "signature": "typedef PlannedStmt *(*planner_hook_type) (Query *parse, const char *query_string, int cursorOptions, ParamListInfo boundParams);\nextern PGDLLIMPORT planner_hook_type planner_hook;", "description": ["Hook for plugins to get control in planner()"]}, "14": {"facts": [{"label": "Interface type", "value": "planner_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#L26", "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#L75", "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#L270", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "567c6f13b08a1bfd8089c7b02203a43ef0627305b184087ee3296bed0502d680"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:270"]}, {"code": "planner(Query *parse, const char *query_string, int cursorOptions,\n\t\tParamListInfo boundParams)\n{\n\tPlannedStmt *result;\n\n\tif (planner_hook)\n\t\tresult = (*planner_hook) (parse, query_string, cursorOptions, boundParams);\n\telse\n\t\tresult = standard_planner(parse, query_string, cursorOptions, boundParams);\n\treturn result;\n}\n\nPlannedStmt *\nstandard_planner(Query *parse, const char *query_string, int cursorOptions,\n\t\t\t\t ParamListInfo boundParams)", "title": "Core call context: src/backend/optimizer/plan/planner.c:264\u2013278", "paragraphs": []}], "signature": "typedef PlannedStmt *(*planner_hook_type) (Query *parse, const char *query_string, int cursorOptions, ParamListInfo boundParams);\nextern PGDLLIMPORT planner_hook_type planner_hook;", "description": ["Hook for plugins to get control in planner()"]}, "15": {"facts": [{"label": "Interface type", "value": "planner_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#L26", "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#L75", "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#L276", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "3312bdb7dc77f49e01a7a4afd110f3414c03ce755e7e5fb00deca3b5c2ebd6ee"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:276"]}, {"code": "planner(Query *parse, const char *query_string, int cursorOptions,\n\t\tParamListInfo boundParams)\n{\n\tPlannedStmt *result;\n\n\tif (planner_hook)\n\t\tresult = (*planner_hook) (parse, query_string, cursorOptions, boundParams);\n\telse\n\t\tresult = standard_planner(parse, query_string, cursorOptions, boundParams);\n\treturn result;\n}\n\nPlannedStmt *\nstandard_planner(Query *parse, const char *query_string, int cursorOptions,\n\t\t\t\t ParamListInfo boundParams)", "title": "Core call context: src/backend/optimizer/plan/planner.c:270\u2013284", "paragraphs": []}], "signature": "typedef PlannedStmt *(*planner_hook_type) (Query *parse, const char *query_string, int cursorOptions, ParamListInfo boundParams);\nextern PGDLLIMPORT planner_hook_type planner_hook;", "description": ["Hook for plugins to get control in planner()"]}, "16": {"facts": [{"label": "Interface type", "value": "planner_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#L26", "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#L78", "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#L290", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "07f42ef50710179096fb328be88393d58865a39ca8e6020789718cbc78ce355e"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:290"]}, {"code": "planner(Query *parse, const char *query_string, int cursorOptions,\n\t\tParamListInfo boundParams)\n{\n\tPlannedStmt *result;\n\n\tif (planner_hook)\n\t\tresult = (*planner_hook) (parse, query_string, cursorOptions, boundParams);\n\telse\n\t\tresult = standard_planner(parse, query_string, cursorOptions, boundParams);\n\treturn result;\n}\n\nPlannedStmt *\nstandard_planner(Query *parse, const char *query_string, int cursorOptions,\n\t\t\t\t ParamListInfo boundParams)", "title": "Core call context: src/backend/optimizer/plan/planner.c:284\u2013298", "paragraphs": []}], "signature": "typedef PlannedStmt *(*planner_hook_type) (Query *parse, const char *query_string, int cursorOptions, ParamListInfo boundParams);\nextern PGDLLIMPORT planner_hook_type planner_hook;", "description": ["Hook for plugins to get control in planner()"]}, "17": {"facts": [{"label": "Interface type", "value": "planner_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#L26", "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#L73", "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#L292", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "d542e814c23cebd3dce7f9c958a376c10c4b1921ba0cb966e67d5ce2c0afb421"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:292"]}, {"code": "planner(Query *parse, const char *query_string, int cursorOptions,\n\t\tParamListInfo boundParams)\n{\n\tPlannedStmt *result;\n\n\tif (planner_hook)\n\t\tresult = (*planner_hook) (parse, query_string, cursorOptions, boundParams);\n\telse\n\t\tresult = standard_planner(parse, query_string, cursorOptions, boundParams);\n\treturn result;\n}\n\nPlannedStmt *\nstandard_planner(Query *parse, const char *query_string, int cursorOptions,\n\t\t\t\t ParamListInfo boundParams)", "title": "Core call context: src/backend/optimizer/plan/planner.c:286\u2013300", "paragraphs": []}], "signature": "typedef PlannedStmt *(*planner_hook_type) (Query *parse, const char *query_string, int cursorOptions, ParamListInfo boundParams);\nextern PGDLLIMPORT planner_hook_type planner_hook;", "description": ["Hook for plugins to get control in planner()"]}, "18": {"facts": [{"label": "Interface type", "value": "planner_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#L26", "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#L74", "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#L316", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "70faebbc45551e477e5d75000911b029ea648e8cc616725f3b0032480cf16878"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:316"]}, {"code": "planner(Query *parse, const char *query_string, int cursorOptions,\n\t\tParamListInfo boundParams)\n{\n\tPlannedStmt *result;\n\n\tif (planner_hook)\n\t\tresult = (*planner_hook) (parse, query_string, cursorOptions, boundParams);\n\telse\n\t\tresult = standard_planner(parse, query_string, cursorOptions, boundParams);\n\n\tpgstat_report_plan_id(result->planId, false);\n\n\treturn result;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:310\u2013324", "paragraphs": []}], "signature": "typedef PlannedStmt *(*planner_hook_type) (Query *parse, const char *query_string, int cursorOptions, ParamListInfo boundParams);\nextern PGDLLIMPORT planner_hook_type planner_hook;", "description": ["Hook for plugins to get control in planner()"]}, "19": {"facts": [{"label": "Interface type", "value": "planner_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#L28", "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#L74", "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#L344", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "f71d959162a35db9df0f7b54c0fb7980fd61d80e8da24b1adae7c0dafb33b1c4"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:344"]}, {"code": "planner(Query *parse, const char *query_string, int cursorOptions,\n\t\tParamListInfo boundParams, ExplainState *es)\n{\n\tPlannedStmt *result;\n\n\tif (planner_hook)\n\t\tresult = (*planner_hook) (parse, query_string, cursorOptions,\n\t\t\t\t\t\t\t\t  boundParams, es);\n\telse\n\t\tresult = standard_planner(parse, query_string, cursorOptions,\n\t\t\t\t\t\t\t\t  boundParams, es);\n\n\tpgstat_report_plan_id(result->planId, false);\n\n\treturn result;", "title": "Core call context: src/backend/optimizer/plan/planner.c:338\u2013352", "paragraphs": []}], "signature": "typedef PlannedStmt *(*planner_hook_type) (Query *parse, const char *query_string, int cursorOptions, ParamListInfo boundParams, ExplainState *es);\nextern PGDLLIMPORT planner_hook_type planner_hook;", "description": ["Hook for plugins to get control in planner()"]}, "20": {"facts": [{"label": "Interface type", "value": "planner_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#L28", "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#L74", "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#L344", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "fbcf53dca02672e0d1757d98942126dd22a4bcadf5a2323710f76d854fe84395"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:344"]}, {"code": "planner(Query *parse, const char *query_string, int cursorOptions,\n\t\tParamListInfo boundParams, ExplainState *es)\n{\n\tPlannedStmt *result;\n\n\tif (planner_hook)\n\t\tresult = (*planner_hook) (parse, query_string, cursorOptions,\n\t\t\t\t\t\t\t\t  boundParams, es);\n\telse\n\t\tresult = standard_planner(parse, query_string, cursorOptions,\n\t\t\t\t\t\t\t\t  boundParams, es);\n\n\tpgstat_report_plan_id(result->planId, false);\n\n\treturn result;", "title": "Core call context: src/backend/optimizer/plan/planner.c:338\u2013352", "paragraphs": []}], "signature": "typedef PlannedStmt *(*planner_hook_type) (Query *parse, const char *query_string, int cursorOptions, ParamListInfo boundParams, ExplainState *es);\nextern PGDLLIMPORT planner_hook_type planner_hook;", "description": ["Hook for plugins to get control in planner()"]}}, "content_hash": "8074b5fa8dfb063fe3df9e4e704a6ff0cd13951bef893e0284bda3063fd4b9eb", "imported_at": "2026-09-27T09:57:58.880"}, "snapshot": {"facts": [{"label": "Interface type", "value": "planner_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#L26", "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#L74", "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#L316", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "70faebbc45551e477e5d75000911b029ea648e8cc616725f3b0032480cf16878"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:316"]}, {"code": "planner(Query *parse, const char *query_string, int cursorOptions,\n\t\tParamListInfo boundParams)\n{\n\tPlannedStmt *result;\n\n\tif (planner_hook)\n\t\tresult = (*planner_hook) (parse, query_string, cursorOptions, boundParams);\n\telse\n\t\tresult = standard_planner(parse, query_string, cursorOptions, boundParams);\n\n\tpgstat_report_plan_id(result->planId, false);\n\n\treturn result;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:310\u2013324", "paragraphs": []}], "signature": "typedef PlannedStmt *(*planner_hook_type) (Query *parse, const char *query_string, int cursorOptions, ParamListInfo boundParams);\nextern PGDLLIMPORT planner_hook_type planner_hook;", "description": ["Hook for plugins to get control in planner()"]}, "comparison": {"left": "18", "right": "19", "status": "changed", "diff": "--- PostgreSQL 18\n+++ PostgreSQL 19\n@@ -17,6 +17,6 @@\n       \"value\": \"NULL (no hook installed)\"\n     }\n   ],\n-  \"signature\": \"typedef PlannedStmt *(*planner_hook_type) (Query *parse, const char *query_string, int cursorOptions, ParamListInfo boundParams);\\nextern PGDLLIMPORT planner_hook_type planner_hook;\",\n+  \"signature\": \"typedef PlannedStmt *(*planner_hook_type) (Query *parse, const char *query_string, int cursorOptions, ParamListInfo boundParams, ExplainState *es);\\nextern PGDLLIMPORT planner_hook_type planner_hook;\",\n   \"tables\": null\n }"}}