diff options
author | Peter Eisentraut | 2022-03-09 09:56:44 +0000 |
---|---|---|
committer | Peter Eisentraut | 2022-03-09 10:08:16 +0000 |
commit | df4c3cbd8f4f619785c735669150e3a1df9cf7ca (patch) | |
tree | 04cdd99397f5cfdb79a6d27f3736e6733fb4d48b | |
parent | ddf590b8115212ea061f9428f20f4c36d8e25e62 (diff) |
Add parse_analyze_withcb()
This extracts code from pg_analyze_and_rewrite_withcb() into a
separate function that mirrors the existing
parse_analyze_fixedparams() and parse_analyze_varparams().
Reviewed-by: Nathan Bossart <[email protected]>
Discussion: https://www.postgresql.org/message-id/flat/[email protected]
-rw-r--r-- | src/backend/parser/analyze.c | 38 | ||||
-rw-r--r-- | src/backend/tcop/postgres.c | 22 | ||||
-rw-r--r-- | src/include/parser/analyze.h | 5 |
3 files changed, 45 insertions, 20 deletions
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index 53c11b3a15..61026753a3 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -182,6 +182,44 @@ parse_analyze_varparams(RawStmt *parseTree, const char *sourceText, } /* + * parse_analyze_withcb + * + * This variant is used when the caller supplies their own parser callback to + * resolve parameters and possibly other things. + */ +Query * +parse_analyze_withcb(RawStmt *parseTree, const char *sourceText, + ParserSetupHook parserSetup, + void *parserSetupArg, + QueryEnvironment *queryEnv) +{ + ParseState *pstate = make_parsestate(NULL); + Query *query; + JumbleState *jstate = NULL; + + Assert(sourceText != NULL); /* required as of 8.4 */ + + pstate->p_sourcetext = sourceText; + pstate->p_queryEnv = queryEnv; + (*parserSetup) (pstate, parserSetupArg); + + query = transformTopLevelStmt(pstate, parseTree); + + if (IsQueryIdEnabled()) + jstate = JumbleQuery(query, sourceText); + + if (post_parse_analyze_hook) + (*post_parse_analyze_hook) (pstate, query, jstate); + + free_parsestate(pstate); + + pgstat_report_query_id(query->queryId, false); + + return query; +} + + +/* * parse_sub_analyze * Entry point for recursively analyzing a sub-statement. */ diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index d7e39aed64..ba2fcfeb4a 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -736,12 +736,8 @@ pg_analyze_and_rewrite_withcb(RawStmt *parsetree, void *parserSetupArg, QueryEnvironment *queryEnv) { - ParseState *pstate; Query *query; List *querytree_list; - JumbleState *jstate = NULL; - - Assert(query_string != NULL); /* required as of 8.4 */ TRACE_POSTGRESQL_QUERY_REWRITE_START(query_string); @@ -751,22 +747,8 @@ pg_analyze_and_rewrite_withcb(RawStmt *parsetree, if (log_parser_stats) ResetUsage(); - pstate = make_parsestate(NULL); - pstate->p_sourcetext = query_string; - pstate->p_queryEnv = queryEnv; - (*parserSetup) (pstate, parserSetupArg); - - query = transformTopLevelStmt(pstate, parsetree); - - if (IsQueryIdEnabled()) - jstate = JumbleQuery(query, query_string); - - if (post_parse_analyze_hook) - (*post_parse_analyze_hook) (pstate, query, jstate); - - free_parsestate(pstate); - - pgstat_report_query_id(query->queryId, false); + query = parse_analyze_withcb(parsetree, query_string, parserSetup, parserSetupArg, + queryEnv); if (log_parser_stats) ShowUsage("PARSE ANALYSIS STATISTICS"); diff --git a/src/include/parser/analyze.h b/src/include/parser/analyze.h index 06b237c39c..b30cbd26bf 100644 --- a/src/include/parser/analyze.h +++ b/src/include/parser/analyze.h @@ -14,6 +14,7 @@ #ifndef ANALYZE_H #define ANALYZE_H +#include "nodes/params.h" #include "parser/parse_node.h" #include "utils/queryjumble.h" @@ -28,6 +29,10 @@ extern Query *parse_analyze_fixedparams(RawStmt *parseTree, const char *sourceTe const Oid *paramTypes, int numParams, QueryEnvironment *queryEnv); extern Query *parse_analyze_varparams(RawStmt *parseTree, const char *sourceText, Oid **paramTypes, int *numParams, QueryEnvironment *queryEnv); +extern Query *parse_analyze_withcb(RawStmt *parseTree, const char *sourceText, + ParserSetupHook parserSetup, + void *parserSetupArg, + QueryEnvironment *queryEnv); extern Query *parse_sub_analyze(Node *parseTree, ParseState *parentParseState, CommonTableExpr *parentCTE, |