summaryrefslogtreecommitdiff
path: root/src/backend/parser
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/parser')
-rw-r--r--src/backend/parser/analyze.c38
1 files changed, 38 insertions, 0 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
@@ -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.
*/