{"Entry":{"collection":"hook","key":"planner_hook","name":"planner_hook","aliases":[],"metadata":{"aliases":[],"category":"Query planning","content_hash":"8074b5fa8dfb063fe3df9e4e704a6ff0cd13951bef893e0284bda3063fd4b9eb","derived_content_hash":"a3693b90f4f423b31bfc0a3968aaf98075f7f0c9fe09768bd5be3b13f7be10fe","imported_at":"2026-09-27T17:57:58.88085+08:00","name":"planner_hook","name_zh":"planner_hook","repair_provenance":{"original_source_revision":"","receipt_sha256":"9a0af0ab9b55c4913683d9771ec93f0b209ed6a5538291580e5f09037631fb3f","repair":"wiki-repair-20261023"},"slug":"planner_hook","source_rev":"wiki-repair-20261023:eed5d7285c980701aba54dbcd9be881b39b83301cfbb839c7ca006136d0fb604","summary":"Hook for plugins to get control in planner()"}},"Definition":{"Collection":"hook","Key":"planner_hook","SourceDatabase":"center","Version":"18","SourceTable":"hook","SourceKey":"planner_hook","SourceRevision":"753057e340da8f22e57c9a409ea7a235fd6a46bd","Facts":{"description":["Hook for plugins to get control in planner()"],"description_zh":"供插件在 planner() 中接管处理的钩子。","description_zh_html":"\u003cp\u003e供插件在 planner() 中接管处理的钩子。\u003c/p\u003e\u003cp\u003e以下中文为本站依据所列 PostgreSQL 源码注释编译的说明。\u003c/p\u003e\u003ch3\u003e接口声明\u003c/h3\u003e\u003cpre\u003etypedef PlannedStmt *(*planner_hook_type) (Query *parse, const char *query_string, int cursorOptions, ParamListInfo boundParams);\nextern PGDLLIMPORT planner_hook_type planner_hook;\u003c/pre\u003e\u003ch3\u003e调用位置\u003c/h3\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003esrc/backend/optimizer/plan/planner.c:316\u003c/code\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3\u003e核心调用上下文：src/backend/optimizer/plan/planner.c:310–324\u003c/h3\u003e\u003cpre\u003eplanner(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-\u0026gt;planId, false);\n\n\treturn result;\n}\n\u003c/pre\u003e","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":[{"label":"The Planner/Optimizer","url":"/docs/18/planner-optimizer.html"}],"release":{"channel":"stable","label":"18","major":"18","ref":"REL_18_STABLE","revision":"753057e340da8f22e57c9a409ea7a235fd6a46bd"},"sections":[{"paragraphs":["src/backend/optimizer/plan/planner.c:316"],"title":"Call sites"},{"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-\u003eplanId, false);\n\n\treturn result;\n}\n","paragraphs":[],"title":"Core call context: src/backend/optimizer/plan/planner.c:310–324"}],"signature":"typedef PlannedStmt *(*planner_hook_type) (Query *parse, const char *query_string, int cursorOptions, ParamListInfo boundParams);\nextern PGDLLIMPORT planner_hook_type planner_hook;","sources":[{"label":"Interface declaration","path":"src/include/optimizer/planner.h","sha256":"2b48e2afeff0e27570bc5bf536f3d5cdaab6111beb0b98bef9e5ce069598d08b","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/optimizer/planner.h#L26"},{"label":"Core definition","path":"src/backend/optimizer/plan/planner.c","sha256":"70faebbc45551e477e5d75000911b029ea648e8cc616725f3b0032480cf16878","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/plan/planner.c#L74"},{"label":"Call sites","path":"src/backend/optimizer/plan/planner.c","sha256":"70faebbc45551e477e5d75000911b029ea648e8cc616725f3b0032480cf16878","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/plan/planner.c#L316"}],"translation_provenance":{"inputs":[{"label":"Interface declaration","path":"src/include/optimizer/planner.h","sha256":"2b48e2afeff0e27570bc5bf536f3d5cdaab6111beb0b98bef9e5ce069598d08b","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/optimizer/planner.h#L26"},{"label":"Core definition","path":"src/backend/optimizer/plan/planner.c","sha256":"70faebbc45551e477e5d75000911b029ea648e8cc616725f3b0032480cf16878","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/plan/planner.c#L74"},{"label":"Call sites","path":"src/backend/optimizer/plan/planner.c","sha256":"70faebbc45551e477e5d75000911b029ea648e8cc616725f3b0032480cf16878","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/plan/planner.c#L316"}],"kind":"authored-source-translation","locale":"zh-Hans","source_revision":"753057e340da8f22e57c9a409ea7a235fd6a46bd","translated_source_sha256":"ce2d60b3981c844b532573418893bd2d7b76669f88f6be3cd8443d17d29351b3","version":"18"},"zh_from":"authored-source-translation"},"ManualEvidence":{"release":{"channel":"stable","label":"18","major":"18","ref":"REL_18_STABLE","revision":"753057e340da8f22e57c9a409ea7a235fd6a46bd"},"sources":[{"label":"Interface declaration","path":"src/include/optimizer/planner.h","sha256":"2b48e2afeff0e27570bc5bf536f3d5cdaab6111beb0b98bef9e5ce069598d08b","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/optimizer/planner.h#L26"},{"label":"Core definition","path":"src/backend/optimizer/plan/planner.c","sha256":"70faebbc45551e477e5d75000911b029ea648e8cc616725f3b0032480cf16878","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/plan/planner.c#L74"},{"label":"Call sites","path":"src/backend/optimizer/plan/planner.c","sha256":"70faebbc45551e477e5d75000911b029ea648e8cc616725f3b0032480cf16878","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/plan/planner.c#L316"}]},"MeasuredEvidence":{}},"Text":{"Collection":"hook","Key":"planner_hook","SourceDatabase":"center","Version":"18","Locale":"en","Title":"planner_hook","Summary":"Hook for plugins to get control in planner()","BodyHTML":"\u003cp\u003eHook for plugins to get control in planner()\u003c/p\u003e","SourceRevision":"753057e340da8f22e57c9a409ea7a235fd6a46bd","ContentHash":"4187ffe7078670475828001f297708566afa710095909e63d80aa3abc71e8850","Payload":{"description":["Hook for plugins to get control in planner()"],"related":[{"label":"The Planner/Optimizer","url":"/docs/18/planner-optimizer.html"}],"sections":[{"paragraphs":["src/backend/optimizer/plan/planner.c:316"],"title":"Call sites"},{"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-\u003eplanId, false);\n\n\treturn result;\n}\n","paragraphs":[],"title":"Core call context: src/backend/optimizer/plan/planner.c:310–324"}]}},"RequestedLocale":"en","Fallback":false,"Versions":["10","11","12","13","14","15","16","17","18","19","20"],"Locales":["en","zh-Hans"],"Signatures":null,"Spellings":null,"SQLState":null,"Evidence":null}
