{"Entry":{"collection":"hook","key":"post_parse_analyze_hook","name":"post_parse_analyze_hook","aliases":[],"metadata":{"aliases":[],"category":"Parsing and utility commands","content_hash":"c01640f35c773cc5a9ab5e31d37b64256b6be422994da2db8913fa4985dfd6cd","imported_at":"2026-09-27T17:57:58.846976+08:00","name":"post_parse_analyze_hook","name_zh":"post_parse_analyze_hook","slug":"post_parse_analyze_hook","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"],"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"}]},"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":"zh-Hans","Fallback":true,"Versions":["10","11","12","13","14","15","16","17","18","19","20"],"Locales":["en"],"Signatures":null,"Spellings":null,"SQLState":null,"Evidence":null}
