diff options
4 files changed, 97 insertions, 2 deletions
diff --git a/src/test/modules/injection_points/expected/injection_points.out b/src/test/modules/injection_points/expected/injection_points.out index 382f3b0bf88..e02d6446dd4 100644 --- a/src/test/modules/injection_points/expected/injection_points.out +++ b/src/test/modules/injection_points/expected/injection_points.out @@ -307,7 +307,40 @@ SELECT injection_points_detach('TestConditionLocal1'); (1 row) --- No points should be left around. +-- Function variant for attach. +SELECT injection_points_attach(NULL, NULL, NULL, NULL); +ERROR: injection point name cannot be NULL +SELECT injection_points_attach('injection_points', NULL, NULL, NULL); +ERROR: injection point library cannot be NULL +SELECT injection_points_attach('injection_points', 'injection_notice', NULL, NULL); +ERROR: injection point function cannot be NULL +SELECT injection_points_attach('TestInjectionNoticeFunc', + 'injection_points', 'injection_notice', NULL); + injection_points_attach +------------------------- + +(1 row) + +SELECT point_name, library, function FROM injection_points_list() + ORDER BY point_name COLLATE "C"; + point_name | library | function +-------------------------+------------------+------------------ + TestInjectionNoticeFunc | injection_points | injection_notice +(1 row) + +SELECT injection_points_run('TestInjectionNoticeFunc', NULL); -- notice +NOTICE: notice triggered for injection point TestInjectionNoticeFunc + injection_points_run +---------------------- + +(1 row) + +SELECT injection_points_detach('TestInjectionNoticeFunc'); + injection_points_detach +------------------------- + +(1 row) + SELECT point_name, library, function FROM injection_points_list() ORDER BY point_name COLLATE "C"; point_name | library | function 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..a51ff538684 100644 --- a/src/test/modules/injection_points/injection_points--1.0.sql +++ b/src/test/modules/injection_points/injection_points--1.0.sql @@ -15,6 +15,18 @@ AS 'MODULE_PATHNAME', 'injection_points_attach' LANGUAGE C STRICT PARALLEL UNSAFE; -- +-- injection_points_attach() +-- +-- Attaches a function to the given injection point, with library name, +-- function name and private data. +-- +CREATE FUNCTION injection_points_attach(IN point_name TEXT, + IN library_name TEXT, IN function_name TEXT, IN private_data BYTEA) +RETURNS void +AS 'MODULE_PATHNAME', 'injection_points_attach_func' +LANGUAGE C PARALLEL UNSAFE; + +-- -- injection_points_load() -- -- Load an injection point already attached. diff --git a/src/test/modules/injection_points/injection_points.c b/src/test/modules/injection_points/injection_points.c index 31138301117..b7c1c58ea56 100644 --- a/src/test/modules/injection_points/injection_points.c +++ b/src/test/modules/injection_points/injection_points.c @@ -392,6 +392,47 @@ injection_points_attach(PG_FUNCTION_ARGS) } /* + * SQL function for creating an injection point with library name, function + * name and private data. + */ +PG_FUNCTION_INFO_V1(injection_points_attach_func); +Datum +injection_points_attach_func(PG_FUNCTION_ARGS) +{ + char *name; + char *lib_name; + char *function; + bytea *private_data = NULL; + int private_data_size = 0; + + if (PG_ARGISNULL(0)) + elog(ERROR, "injection point name cannot be NULL"); + if (PG_ARGISNULL(1)) + elog(ERROR, "injection point library cannot be NULL"); + if (PG_ARGISNULL(2)) + elog(ERROR, "injection point function cannot be NULL"); + + name = text_to_cstring(PG_GETARG_TEXT_PP(0)); + lib_name = text_to_cstring(PG_GETARG_TEXT_PP(1)); + function = text_to_cstring(PG_GETARG_TEXT_PP(2)); + + if (!PG_ARGISNULL(3)) + { + private_data = PG_GETARG_BYTEA_PP(3); + private_data_size = VARSIZE_ANY_EXHDR(private_data); + } + + pgstat_report_inj_fixed(1, 0, 0, 0, 0); + if (private_data != NULL) + InjectionPointAttach(name, lib_name, function, VARDATA_ANY(private_data), + private_data_size); + else + InjectionPointAttach(name, lib_name, function, NULL, + 0); + PG_RETURN_VOID(); +} + +/* * SQL function for loading an injection point. */ PG_FUNCTION_INFO_V1(injection_points_load); diff --git a/src/test/modules/injection_points/sql/injection_points.sql b/src/test/modules/injection_points/sql/injection_points.sql index 874421e9c11..87f7184b291 100644 --- a/src/test/modules/injection_points/sql/injection_points.sql +++ b/src/test/modules/injection_points/sql/injection_points.sql @@ -88,7 +88,16 @@ SELECT injection_points_detach('TestConditionError'); SELECT injection_points_attach('TestConditionLocal1', 'error'); SELECT injection_points_detach('TestConditionLocal1'); --- No points should be left around. +-- Function variant for attach. +SELECT injection_points_attach(NULL, NULL, NULL, NULL); +SELECT injection_points_attach('injection_points', NULL, NULL, NULL); +SELECT injection_points_attach('injection_points', 'injection_notice', NULL, NULL); +SELECT injection_points_attach('TestInjectionNoticeFunc', + 'injection_points', 'injection_notice', NULL); +SELECT point_name, library, function FROM injection_points_list() + ORDER BY point_name COLLATE "C"; +SELECT injection_points_run('TestInjectionNoticeFunc', NULL); -- notice +SELECT injection_points_detach('TestInjectionNoticeFunc'); SELECT point_name, library, function FROM injection_points_list() ORDER BY point_name COLLATE "C"; |
