summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/test/modules/injection_points/expected/injection_points.out35
-rw-r--r--src/test/modules/injection_points/injection_points--1.0.sql12
-rw-r--r--src/test/modules/injection_points/injection_points.c41
-rw-r--r--src/test/modules/injection_points/sql/injection_points.sql11
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";