From f25fcd6965d785bc4f4e0676376f26a63bfe98d4 Mon Sep 17 00:00:00 2001
From: Sami Imseih <simseih@amazon.com>
Date: Tue, 18 Mar 2025 13:17:19 -0400
Subject: [PATCH v2 1/1] Add new hooks for performing additional EXPLAIN
 options validation

c65bc2e1d1 made it possible for loadable modules to define EXPLAIN
options. This patch introduces a new hook to allow a module to
perform validation of options against other options.

Discussion: https://www.postgresql.org/message-id/CAA5RZ0tM8jEe_LSjjrTux9TbTpLex-PFQtSuVcfXCWT%3DN%2Bthug%40mail.gmail.com
---
 src/backend/commands/explain_state.c | 7 +++++++
 src/include/commands/explain_state.h | 5 +++++
 2 files changed, 12 insertions(+)

diff --git a/src/backend/commands/explain_state.c b/src/backend/commands/explain_state.c
index 1d4be3c18ac..8fe1ca5c73e 100644
--- a/src/backend/commands/explain_state.c
+++ b/src/backend/commands/explain_state.c
@@ -37,6 +37,9 @@
 #include "commands/explain.h"
 #include "commands/explain_state.h"
 
+/* Hook to perform additional EXPLAIN options validation */
+explain_validate_options_hook_type explain_validate_options_hook = NULL;
+
 typedef struct
 {
 	const char *option_name;
@@ -196,6 +199,10 @@ ParseExplainOptionList(ExplainState *es, List *options, ParseState *pstate)
 
 	/* if the summary was not set explicitly, set default value */
 	es->summary = (summary_set) ? es->summary : es->analyze;
+
+	/* plugin specific option validation */
+	if (explain_validate_options_hook)
+		(*explain_validate_options_hook)(es, options, pstate);
 }
 
 /*
diff --git a/src/include/commands/explain_state.h b/src/include/commands/explain_state.h
index 925097492b9..32728f5d1a1 100644
--- a/src/include/commands/explain_state.h
+++ b/src/include/commands/explain_state.h
@@ -78,6 +78,11 @@ typedef struct ExplainState
 
 typedef void (*ExplainOptionHandler) (ExplainState *, DefElem *, ParseState *);
 
+/* Hook to perform additional EXPLAIN options validation */
+typedef void (*explain_validate_options_hook_type) (struct ExplainState *es, List *options,
+													ParseState *pstate);
+extern PGDLLIMPORT explain_validate_options_hook_type explain_validate_options_hook;
+
 extern ExplainState *NewExplainState(void);
 extern void ParseExplainOptionList(ExplainState *es, List *options,
 								   ParseState *pstate);
-- 
2.39.5 (Apple Git-154)

