Add an additional hook for EXPLAIN option validation.
authorRobert Haas <[email protected]>
Thu, 20 Mar 2025 17:47:55 +0000 (13:47 -0400)
committerRobert Haas <[email protected]>
Thu, 20 Mar 2025 17:47:55 +0000 (13:47 -0400)
Commit c65bc2e1d14a2d4daed7c1921ac518f2c5ac3d17 made it possible for
loadable modules to add EXPLAIN options. Normally, any necessary
validation can be performed by the hook function passed to
RegisterExtensionExplainOption, but if a loadable module wants to sanity
check options against each other, that needs to be done after the entire
options list has been processed. So, add an additional hook for that
purpose.

Author: Sami Imseih <[email protected]>
Reviewed-by: Robert Haas <[email protected]>
Reviewed-by: Andrei Lepikhov <[email protected]>
Reviewed-by: Tom Lane <[email protected]>
Discussion: http://postgr.es/m/CAA5RZ0vOcJF91O2e5AQN+V6guMNLMhJx83dxALf-iUZ-hLGO_Q@mail.gmail.com

src/backend/commands/explain_state.c
src/include/commands/explain_state.h

index 1d4be3c18ac83a5dac8020fc668e1e76c707c7c6..60d98d63a62e218619d05b7fb293e0eaf4dded4e 100644 (file)
@@ -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);
 }
 
 /*
index 925097492b992ee3ac8739edb89bfc2761f0ca02..32728f5d1a1759acc5db196f9b4c3d79b4646b18 100644 (file)
@@ -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);