postgres.git / summary / log / commit / refs
commit df4c3cbd8f4f619785c735669150e3a1df9cf7ca
Author: Peter Eisentraut <peter@eisentraut.org>
Date: Wed Mar 09 09:56:44 2022 +0000
First released in: 15.0
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 <bossartn@amazon.com>
Discussion: https://www.postgresql.org/message-id/flat/c67ce276-52b4-0239-dc0e-39875bf81840@enterprisedb.com
src/backend/parser/analyze.c | 38 ++++++++++++++++++++++++++++++++++++++
src/backend/tcop/postgres.c | 22 ++--------------------
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 53c11b3a156..61026753a3d 100644
--- a/src/backend/parser/analyze.c
+++ b/src/backend/parser/analyze.c
@@ -181,6 +181,44 @@ parse_analyze_varparams(RawStmt *parseTree, const char *sourceText,
return query;
}
+/*
+ * 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 d7e39aed64b..ba2fcfeb4af 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 06b237c39c7..b30cbd26bf8 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,
[parent: ddf590b81152]