From b86b552fb5a465c23ce845971d371e9552cb552c Mon Sep 17 00:00:00 2001 From: Rahila Syed Date: Tue, 28 Oct 2025 16:44:20 +0530 Subject: [PATCH] Extend injection_points_attach function Add a new action called "func" which will assign a user defined function to a given injection point. This requires user to specify module name and function name in addition to injection point name and action. --- .../injection_points--1.0.sql | 4 ++-- .../injection_points/injection_points.c | 19 +++++++++++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/test/modules/injection_points/injection_points--1.0.sql b/src/test/modules/injection_points/injection_points--1.0.sql index a7b61fbdfe6..da5ba0a40fa 100644 --- a/src/test/modules/injection_points/injection_points--1.0.sql +++ b/src/test/modules/injection_points/injection_points--1.0.sql @@ -9,10 +9,10 @@ -- Attaches the action to the given injection point. -- CREATE FUNCTION injection_points_attach(IN point_name TEXT, - IN action text) + IN action text, IN func TEXT default NULL, IN module TEXT default NULL) RETURNS void AS 'MODULE_PATHNAME', 'injection_points_attach' -LANGUAGE C STRICT PARALLEL UNSAFE; +LANGUAGE C PARALLEL UNSAFE; -- -- injection_points_load() diff --git a/src/test/modules/injection_points/injection_points.c b/src/test/modules/injection_points/injection_points.c index 31138301117..087d2b11a90 100644 --- a/src/test/modules/injection_points/injection_points.c +++ b/src/test/modules/injection_points/injection_points.c @@ -354,6 +354,7 @@ injection_points_attach(PG_FUNCTION_ARGS) char *name = text_to_cstring(PG_GETARG_TEXT_PP(0)); char *action = text_to_cstring(PG_GETARG_TEXT_PP(1)); char *function; + char *mod_name; InjectionPointCondition condition = {0}; if (strcmp(action, "error") == 0) @@ -362,6 +363,15 @@ injection_points_attach(PG_FUNCTION_ARGS) function = "injection_notice"; else if (strcmp(action, "wait") == 0) function = "injection_wait"; + else if (strcmp(action, "func") == 0) + { + if (PG_ARGISNULL(2)) + elog(ERROR, "function name cannot be null for \"%s\" action", action); + function = text_to_cstring(PG_GETARG_TEXT_PP(2)); + if (PG_ARGISNULL(3)) + elog(ERROR, "module name cannot be null for \"%s\" action", action); + mod_name = text_to_cstring(PG_GETARG_TEXT_PP(3)); + } else elog(ERROR, "incorrect action \"%s\" for injection point creation", action); @@ -372,8 +382,13 @@ injection_points_attach(PG_FUNCTION_ARGS) } pgstat_report_inj_fixed(1, 0, 0, 0, 0); - InjectionPointAttach(name, "injection_points", function, &condition, - sizeof(InjectionPointCondition)); + + if (strcmp(action, "func") == 0) + InjectionPointAttach(name, mod_name, function, &condition, + sizeof(InjectionPointCondition)); + else + InjectionPointAttach(name, "injection_points", function, &condition, + sizeof(InjectionPointCondition)); if (injection_point_local) { -- 2.34.1