{"Entry":{"collection":"hook","key":"post_parse_analyze_hook","name":"post_parse_analyze_hook","aliases":[],"metadata":{"aliases":[],"category":"Parsing and utility commands","content_hash":"c01640f35c773cc5a9ab5e31d37b64256b6be422994da2db8913fa4985dfd6cd","derived_content_hash":"1a827d4ec120f5468f923a6f092382a53d4ca0036f2aed12f96f2399144b7090","imported_at":"2026-09-27T17:57:58.846976+08:00","name":"post_parse_analyze_hook","name_zh":"post_parse_analyze_hook","repair_provenance":{"original_source_revision":"","receipt_sha256":"c221091eba73359e95363fa477e815e21284334fe3852070595427514d4ecaee","repair":"wiki-repair-20261023"},"slug":"post_parse_analyze_hook","source_rev":"wiki-repair-20261023:dcb3da8089158bce2da0844d5cb267409b2b9bc3f24ae6358bca1d99bcddb098","summary":"Hook for plugins to get control at end of parse analysis"}},"Definition":{"Collection":"hook","Key":"post_parse_analyze_hook","SourceDatabase":"center","Version":"18","SourceTable":"hook","SourceKey":"post_parse_analyze_hook","SourceRevision":"753057e340da8f22e57c9a409ea7a235fd6a46bd","Facts":{"description":["Hook for plugins to get control at end of parse analysis"],"description_zh":"供插件在语法分析后的语义分析结束时接管处理的钩子。","description_zh_html":"\u003cp\u003e供插件在语法分析后的语义分析结束时接管处理的钩子。\u003c/p\u003e\u003cp\u003e以下中文为本站依据所列 PostgreSQL 源码注释编译的说明。\u003c/p\u003e\u003ch3\u003e接口声明\u003c/h3\u003e\u003cpre\u003etypedef void (*post_parse_analyze_hook_type) (ParseState *pstate, Query *query, JumbleState *jstate);\nextern PGDLLIMPORT post_parse_analyze_hook_type post_parse_analyze_hook;\u003c/pre\u003e\u003ch3\u003e调用位置\u003c/h3\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003esrc/backend/commands/explain.c:194\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003esrc/backend/commands/explain.c:427\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003esrc/backend/commands/explain.c:453\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003esrc/backend/parser/analyze.c:128\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003esrc/backend/parser/analyze.c:170\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003esrc/backend/parser/analyze.c:207\u003c/code\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3\u003e核心调用上下文：src/backend/commands/explain.c:188–202\u003c/h3\u003e\u003cpre\u003e\t/* Extract the query and, if enabled, jumble it */\n\tquery = castNode(Query, stmt-\u0026gt;query);\n\tif (IsQueryIdEnabled())\n\t\tjstate = JumbleQuery(query);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query, jstate);\n\n\t/*\n\t * Parse analysis was done already, but we still have to run the rule\n\t * rewriter.  We do not do AcquireRewriteLocks: we assume the query either\n\t * came straight from the parser, or suitable locks were acquired by\n\t * plancache.c.\n\t */\n\trewritten = QueryRewrite(castNode(Query, stmt-\u0026gt;query));\u003c/pre\u003e\u003ch3\u003e核心调用上下文：src/backend/commands/explain.c:421–435\u003c/h3\u003e\u003cpre\u003e\t\t}\n\n\t\tctas_query = castNode(Query, copyObject(ctas-\u0026gt;query));\n\t\tif (IsQueryIdEnabled())\n\t\t\tjstate = JumbleQuery(ctas_query);\n\t\tif (post_parse_analyze_hook)\n\t\t\t(*post_parse_analyze_hook) (pstate, ctas_query, jstate);\n\t\trewritten = QueryRewrite(ctas_query);\n\t\tAssert(list_length(rewritten) == 1);\n\t\tExplainOneQuery(linitial_node(Query, rewritten),\n\t\t\t\t\t\tCURSOR_OPT_PARALLEL_OK, ctas-\u0026gt;into, es,\n\t\t\t\t\t\tpstate, params);\n\t}\n\telse if (IsA(utilityStmt, DeclareCursorStmt))\n\t{\u003c/pre\u003e\u003ch3\u003e核心调用上下文：src/backend/commands/explain.c:447–461\u003c/h3\u003e\u003cpre\u003e\t\tJumbleState *jstate = NULL;\n\n\t\tdcs_query = castNode(Query, copyObject(dcs-\u0026gt;query));\n\t\tif (IsQueryIdEnabled())\n\t\t\tjstate = JumbleQuery(dcs_query);\n\t\tif (post_parse_analyze_hook)\n\t\t\t(*post_parse_analyze_hook) (pstate, dcs_query, jstate);\n\n\t\trewritten = QueryRewrite(dcs_query);\n\t\tAssert(list_length(rewritten) == 1);\n\t\tExplainOneQuery(linitial_node(Query, rewritten),\n\t\t\t\t\t\tdcs-\u0026gt;options, NULL, es,\n\t\t\t\t\t\tpstate, params);\n\t}\n\telse if (IsA(utilityStmt, ExecuteStmt))\u003c/pre\u003e","facts":[{"label":"Interface type","value":"post_parse_analyze_hook_type"},{"label":"Header","value":"src/include/parser/analyze.h"},{"label":"Subsystem","value":"Parsing and utility commands"},{"label":"Initial value","value":"NULL (no hook installed)"}],"related":[],"release":{"channel":"stable","label":"18","major":"18","ref":"REL_18_STABLE","revision":"753057e340da8f22e57c9a409ea7a235fd6a46bd"},"sections":[{"paragraphs":["src/backend/commands/explain.c:194","src/backend/commands/explain.c:427","src/backend/commands/explain.c:453","src/backend/parser/analyze.c:128","src/backend/parser/analyze.c:170","src/backend/parser/analyze.c:207"],"title":"Call sites"},{"code":"\t/* Extract the query and, if enabled, jumble it */\n\tquery = castNode(Query, stmt-\u003equery);\n\tif (IsQueryIdEnabled())\n\t\tjstate = JumbleQuery(query);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query, jstate);\n\n\t/*\n\t * Parse analysis was done already, but we still have to run the rule\n\t * rewriter.  We do not do AcquireRewriteLocks: we assume the query either\n\t * came straight from the parser, or suitable locks were acquired by\n\t * plancache.c.\n\t */\n\trewritten = QueryRewrite(castNode(Query, stmt-\u003equery));","paragraphs":[],"title":"Core call context: src/backend/commands/explain.c:188–202"},{"code":"\t\t}\n\n\t\tctas_query = castNode(Query, copyObject(ctas-\u003equery));\n\t\tif (IsQueryIdEnabled())\n\t\t\tjstate = JumbleQuery(ctas_query);\n\t\tif (post_parse_analyze_hook)\n\t\t\t(*post_parse_analyze_hook) (pstate, ctas_query, jstate);\n\t\trewritten = QueryRewrite(ctas_query);\n\t\tAssert(list_length(rewritten) == 1);\n\t\tExplainOneQuery(linitial_node(Query, rewritten),\n\t\t\t\t\t\tCURSOR_OPT_PARALLEL_OK, ctas-\u003einto, es,\n\t\t\t\t\t\tpstate, params);\n\t}\n\telse if (IsA(utilityStmt, DeclareCursorStmt))\n\t{","paragraphs":[],"title":"Core call context: src/backend/commands/explain.c:421–435"},{"code":"\t\tJumbleState *jstate = NULL;\n\n\t\tdcs_query = castNode(Query, copyObject(dcs-\u003equery));\n\t\tif (IsQueryIdEnabled())\n\t\t\tjstate = JumbleQuery(dcs_query);\n\t\tif (post_parse_analyze_hook)\n\t\t\t(*post_parse_analyze_hook) (pstate, dcs_query, jstate);\n\n\t\trewritten = QueryRewrite(dcs_query);\n\t\tAssert(list_length(rewritten) == 1);\n\t\tExplainOneQuery(linitial_node(Query, rewritten),\n\t\t\t\t\t\tdcs-\u003eoptions, NULL, es,\n\t\t\t\t\t\tpstate, params);\n\t}\n\telse if (IsA(utilityStmt, ExecuteStmt))","paragraphs":[],"title":"Core call context: src/backend/commands/explain.c:447–461"}],"signature":"typedef void (*post_parse_analyze_hook_type) (ParseState *pstate, Query *query, JumbleState *jstate);\nextern PGDLLIMPORT post_parse_analyze_hook_type post_parse_analyze_hook;","sources":[{"label":"Interface declaration","path":"src/include/parser/analyze.h","sha256":"0d4ae51fc424c9d5e6d1d257e673e33066df4dcd1a31fb2ac875bfe6674b3cd2","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/parser/analyze.h#L22"},{"label":"Core definition","path":"src/backend/parser/analyze.c","sha256":"98a23a176bbf95155d780b6512118999bc9fa68be8d88f0d013daf2a7512466a","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/parser/analyze.c#L59"},{"label":"Call sites","path":"src/backend/commands/explain.c","sha256":"34c86d6070224a0e981efef51f79101d6d505e5874f1684ace183034bab14bb4","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/commands/explain.c#L194"},{"label":"Call sites","path":"src/backend/parser/analyze.c","sha256":"98a23a176bbf95155d780b6512118999bc9fa68be8d88f0d013daf2a7512466a","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/parser/analyze.c#L128"}],"translation_provenance":{"inputs":[{"label":"Interface declaration","path":"src/include/parser/analyze.h","sha256":"0d4ae51fc424c9d5e6d1d257e673e33066df4dcd1a31fb2ac875bfe6674b3cd2","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/parser/analyze.h#L22"},{"label":"Core definition","path":"src/backend/parser/analyze.c","sha256":"98a23a176bbf95155d780b6512118999bc9fa68be8d88f0d013daf2a7512466a","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/parser/analyze.c#L59"},{"label":"Call sites","path":"src/backend/commands/explain.c","sha256":"34c86d6070224a0e981efef51f79101d6d505e5874f1684ace183034bab14bb4","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/commands/explain.c#L194"},{"label":"Call sites","path":"src/backend/parser/analyze.c","sha256":"98a23a176bbf95155d780b6512118999bc9fa68be8d88f0d013daf2a7512466a","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/parser/analyze.c#L128"}],"kind":"authored-source-translation","locale":"zh-Hans","source_revision":"753057e340da8f22e57c9a409ea7a235fd6a46bd","translated_source_sha256":"caa09431696f6bcc34c8614cc242714ba890e33dc7263968d481d5f3e44dd2ea","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/parser/analyze.h","sha256":"0d4ae51fc424c9d5e6d1d257e673e33066df4dcd1a31fb2ac875bfe6674b3cd2","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/parser/analyze.h#L22"},{"label":"Core definition","path":"src/backend/parser/analyze.c","sha256":"98a23a176bbf95155d780b6512118999bc9fa68be8d88f0d013daf2a7512466a","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/parser/analyze.c#L59"},{"label":"Call sites","path":"src/backend/commands/explain.c","sha256":"34c86d6070224a0e981efef51f79101d6d505e5874f1684ace183034bab14bb4","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/commands/explain.c#L194"},{"label":"Call sites","path":"src/backend/parser/analyze.c","sha256":"98a23a176bbf95155d780b6512118999bc9fa68be8d88f0d013daf2a7512466a","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/parser/analyze.c#L128"}]},"MeasuredEvidence":{}},"Text":{"Collection":"hook","Key":"post_parse_analyze_hook","SourceDatabase":"center","Version":"18","Locale":"en","Title":"post_parse_analyze_hook","Summary":"Hook for plugins to get control at end of parse analysis","BodyHTML":"\u003cp\u003eHook for plugins to get control at end of parse analysis\u003c/p\u003e","SourceRevision":"753057e340da8f22e57c9a409ea7a235fd6a46bd","ContentHash":"6b3230857843576394e64249bebc100b6cd113063adfd925f969673fe01f58c4","Payload":{"description":["Hook for plugins to get control at end of parse analysis"],"related":[],"sections":[{"paragraphs":["src/backend/commands/explain.c:194","src/backend/commands/explain.c:427","src/backend/commands/explain.c:453","src/backend/parser/analyze.c:128","src/backend/parser/analyze.c:170","src/backend/parser/analyze.c:207"],"title":"Call sites"},{"code":"\t/* Extract the query and, if enabled, jumble it */\n\tquery = castNode(Query, stmt-\u003equery);\n\tif (IsQueryIdEnabled())\n\t\tjstate = JumbleQuery(query);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query, jstate);\n\n\t/*\n\t * Parse analysis was done already, but we still have to run the rule\n\t * rewriter.  We do not do AcquireRewriteLocks: we assume the query either\n\t * came straight from the parser, or suitable locks were acquired by\n\t * plancache.c.\n\t */\n\trewritten = QueryRewrite(castNode(Query, stmt-\u003equery));","paragraphs":[],"title":"Core call context: src/backend/commands/explain.c:188–202"},{"code":"\t\t}\n\n\t\tctas_query = castNode(Query, copyObject(ctas-\u003equery));\n\t\tif (IsQueryIdEnabled())\n\t\t\tjstate = JumbleQuery(ctas_query);\n\t\tif (post_parse_analyze_hook)\n\t\t\t(*post_parse_analyze_hook) (pstate, ctas_query, jstate);\n\t\trewritten = QueryRewrite(ctas_query);\n\t\tAssert(list_length(rewritten) == 1);\n\t\tExplainOneQuery(linitial_node(Query, rewritten),\n\t\t\t\t\t\tCURSOR_OPT_PARALLEL_OK, ctas-\u003einto, es,\n\t\t\t\t\t\tpstate, params);\n\t}\n\telse if (IsA(utilityStmt, DeclareCursorStmt))\n\t{","paragraphs":[],"title":"Core call context: src/backend/commands/explain.c:421–435"},{"code":"\t\tJumbleState *jstate = NULL;\n\n\t\tdcs_query = castNode(Query, copyObject(dcs-\u003equery));\n\t\tif (IsQueryIdEnabled())\n\t\t\tjstate = JumbleQuery(dcs_query);\n\t\tif (post_parse_analyze_hook)\n\t\t\t(*post_parse_analyze_hook) (pstate, dcs_query, jstate);\n\n\t\trewritten = QueryRewrite(dcs_query);\n\t\tAssert(list_length(rewritten) == 1);\n\t\tExplainOneQuery(linitial_node(Query, rewritten),\n\t\t\t\t\t\tdcs-\u003eoptions, NULL, es,\n\t\t\t\t\t\tpstate, params);\n\t}\n\telse if (IsA(utilityStmt, ExecuteStmt))","paragraphs":[],"title":"Core call context: src/backend/commands/explain.c:447–461"}]}},"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}
