Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 36e5fda

Browse files
committed
injection_points: Add support and tests for runtime arguments
This commit provides some test coverage for the runtime arguments of injection points, for both INJECTION_POINT_CACHED() and INJECTION_POINT(), as extended in 371f2db. The SQL functions injection_points_cached() and injection_points_run() are extended so as it is possible to pass an optional string value to them. Reviewed-by: Greg Burd <[email protected]> Discussion: https://postgr.es/m/[email protected]
1 parent 371f2db commit 36e5fda

File tree

4 files changed

+93
-10
lines changed

4 files changed

+93
-10
lines changed

src/test/modules/injection_points/expected/injection_points.out

+45
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,19 @@ CREATE FUNCTION wait_pid(int)
66
RETURNS void
77
AS :'regresslib'
88
LANGUAGE C STRICT;
9+
-- Non-strict checks
10+
SELECT injection_points_run(NULL);
11+
injection_points_run
12+
----------------------
13+
14+
(1 row)
15+
16+
SELECT injection_points_cached(NULL);
17+
injection_points_cached
18+
-------------------------
19+
20+
(1 row)
21+
922
SELECT injection_points_attach('TestInjectionBooh', 'booh');
1023
ERROR: incorrect action "booh" for injection point creation
1124
SELECT injection_points_attach('TestInjectionError', 'error');
@@ -39,6 +52,20 @@ NOTICE: notice triggered for injection point TestInjectionLog2
3952

4053
(1 row)
4154

55+
SELECT injection_points_run('TestInjectionLog2', NULL); -- notice
56+
NOTICE: notice triggered for injection point TestInjectionLog2
57+
injection_points_run
58+
----------------------
59+
60+
(1 row)
61+
62+
SELECT injection_points_run('TestInjectionLog2', 'foobar'); -- notice + arg
63+
NOTICE: notice triggered for injection point TestInjectionLog2 (foobar)
64+
injection_points_run
65+
----------------------
66+
67+
(1 row)
68+
4269
SELECT injection_points_run('TestInjectionLog'); -- notice
4370
NOTICE: notice triggered for injection point TestInjectionLog
4471
injection_points_run
@@ -48,6 +75,10 @@ NOTICE: notice triggered for injection point TestInjectionLog
4875

4976
SELECT injection_points_run('TestInjectionError'); -- error
5077
ERROR: error triggered for injection point TestInjectionError
78+
SELECT injection_points_run('TestInjectionError', NULL); -- error
79+
ERROR: error triggered for injection point TestInjectionError
80+
SELECT injection_points_run('TestInjectionError', 'foobar2'); -- error + arg
81+
ERROR: error triggered for injection point TestInjectionError (foobar2)
5182
-- Re-load cache and run again.
5283
\c
5384
SELECT injection_points_run('TestInjectionLog2'); -- notice
@@ -160,6 +191,20 @@ NOTICE: notice triggered for injection point TestInjectionLogLoad
160191

161192
(1 row)
162193

194+
SELECT injection_points_cached('TestInjectionLogLoad', NULL); -- runs from cache
195+
NOTICE: notice triggered for injection point TestInjectionLogLoad
196+
injection_points_cached
197+
-------------------------
198+
199+
(1 row)
200+
201+
SELECT injection_points_cached('TestInjectionLogLoad', 'foobar'); -- runs from cache
202+
NOTICE: notice triggered for injection point TestInjectionLogLoad (foobar)
203+
injection_points_cached
204+
-------------------------
205+
206+
(1 row)
207+
163208
SELECT injection_points_run('TestInjectionLogLoad'); -- runs from cache
164209
NOTICE: notice triggered for injection point TestInjectionLogLoad
165210
injection_points_run

src/test/modules/injection_points/injection_points--1.0.sql

+6-4
Original file line numberDiff line numberDiff line change
@@ -29,20 +29,22 @@ LANGUAGE C STRICT PARALLEL UNSAFE;
2929
--
3030
-- Executes the action attached to the injection point.
3131
--
32-
CREATE FUNCTION injection_points_run(IN point_name TEXT)
32+
CREATE FUNCTION injection_points_run(IN point_name TEXT,
33+
IN arg TEXT DEFAULT NULL)
3334
RETURNS void
3435
AS 'MODULE_PATHNAME', 'injection_points_run'
35-
LANGUAGE C STRICT PARALLEL UNSAFE;
36+
LANGUAGE C PARALLEL UNSAFE;
3637

3738
--
3839
-- injection_points_cached()
3940
--
4041
-- Executes the action attached to the injection point, from local cache.
4142
--
42-
CREATE FUNCTION injection_points_cached(IN point_name TEXT)
43+
CREATE FUNCTION injection_points_cached(IN point_name TEXT,
44+
IN arg TEXT DEFAULT NULL)
4345
RETURNS void
4446
AS 'MODULE_PATHNAME', 'injection_points_cached'
45-
LANGUAGE C STRICT PARALLEL UNSAFE;
47+
LANGUAGE C PARALLEL UNSAFE;
4648

4749
--
4850
-- injection_points_wakeup()

src/test/modules/injection_points/injection_points.c

+32-6
Original file line numberDiff line numberDiff line change
@@ -245,26 +245,36 @@ void
245245
injection_error(const char *name, const void *private_data, void *arg)
246246
{
247247
InjectionPointCondition *condition = (InjectionPointCondition *) private_data;
248+
char *argstr = (char *) arg;
248249

249250
if (!injection_point_allowed(condition))
250251
return;
251252

252253
pgstat_report_inj(name);
253254

254-
elog(ERROR, "error triggered for injection point %s", name);
255+
if (argstr)
256+
elog(ERROR, "error triggered for injection point %s (%s)",
257+
name, argstr);
258+
else
259+
elog(ERROR, "error triggered for injection point %s", name);
255260
}
256261

257262
void
258263
injection_notice(const char *name, const void *private_data, void *arg)
259264
{
260265
InjectionPointCondition *condition = (InjectionPointCondition *) private_data;
266+
char *argstr = (char *) arg;
261267

262268
if (!injection_point_allowed(condition))
263269
return;
264270

265271
pgstat_report_inj(name);
266272

267-
elog(NOTICE, "notice triggered for injection point %s", name);
273+
if (argstr)
274+
elog(NOTICE, "notice triggered for injection point %s (%s)",
275+
name, argstr);
276+
else
277+
elog(NOTICE, "notice triggered for injection point %s", name);
268278
}
269279

270280
/* Wait on a condition variable, awaken by injection_points_wakeup() */
@@ -405,10 +415,18 @@ PG_FUNCTION_INFO_V1(injection_points_run);
405415
Datum
406416
injection_points_run(PG_FUNCTION_ARGS)
407417
{
408-
char *name = text_to_cstring(PG_GETARG_TEXT_PP(0));
418+
char *name;
419+
char *arg = NULL;
420+
421+
if (PG_ARGISNULL(0))
422+
PG_RETURN_VOID();
423+
name = text_to_cstring(PG_GETARG_TEXT_PP(0));
424+
425+
if (!PG_ARGISNULL(1))
426+
arg = text_to_cstring(PG_GETARG_TEXT_PP(1));
409427

410428
pgstat_report_inj_fixed(0, 0, 1, 0, 0);
411-
INJECTION_POINT(name, NULL);
429+
INJECTION_POINT(name, arg);
412430

413431
PG_RETURN_VOID();
414432
}
@@ -420,10 +438,18 @@ PG_FUNCTION_INFO_V1(injection_points_cached);
420438
Datum
421439
injection_points_cached(PG_FUNCTION_ARGS)
422440
{
423-
char *name = text_to_cstring(PG_GETARG_TEXT_PP(0));
441+
char *name;
442+
char *arg = NULL;
443+
444+
if (PG_ARGISNULL(0))
445+
PG_RETURN_VOID();
446+
name = text_to_cstring(PG_GETARG_TEXT_PP(0));
447+
448+
if (!PG_ARGISNULL(1))
449+
arg = text_to_cstring(PG_GETARG_TEXT_PP(1));
424450

425451
pgstat_report_inj_fixed(0, 0, 0, 1, 0);
426-
INJECTION_POINT_CACHED(name, NULL);
452+
INJECTION_POINT_CACHED(name, arg);
427453

428454
PG_RETURN_VOID();
429455
}

src/test/modules/injection_points/sql/injection_points.sql

+10
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,23 @@ CREATE FUNCTION wait_pid(int)
99
AS :'regresslib'
1010
LANGUAGE C STRICT;
1111

12+
-- Non-strict checks
13+
SELECT injection_points_run(NULL);
14+
SELECT injection_points_cached(NULL);
15+
1216
SELECT injection_points_attach('TestInjectionBooh', 'booh');
1317
SELECT injection_points_attach('TestInjectionError', 'error');
1418
SELECT injection_points_attach('TestInjectionLog', 'notice');
1519
SELECT injection_points_attach('TestInjectionLog2', 'notice');
1620

1721
SELECT injection_points_run('TestInjectionBooh'); -- nothing
1822
SELECT injection_points_run('TestInjectionLog2'); -- notice
23+
SELECT injection_points_run('TestInjectionLog2', NULL); -- notice
24+
SELECT injection_points_run('TestInjectionLog2', 'foobar'); -- notice + arg
1925
SELECT injection_points_run('TestInjectionLog'); -- notice
2026
SELECT injection_points_run('TestInjectionError'); -- error
27+
SELECT injection_points_run('TestInjectionError', NULL); -- error
28+
SELECT injection_points_run('TestInjectionError', 'foobar2'); -- error + arg
2129

2230
-- Re-load cache and run again.
2331
\c
@@ -47,6 +55,8 @@ SELECT injection_points_load('TestInjectionLogLoad'); -- nothing
4755
SELECT injection_points_attach('TestInjectionLogLoad', 'notice');
4856
SELECT injection_points_load('TestInjectionLogLoad'); -- nothing happens
4957
SELECT injection_points_cached('TestInjectionLogLoad'); -- runs from cache
58+
SELECT injection_points_cached('TestInjectionLogLoad', NULL); -- runs from cache
59+
SELECT injection_points_cached('TestInjectionLogLoad', 'foobar'); -- runs from cache
5060
SELECT injection_points_run('TestInjectionLogLoad'); -- runs from cache
5161
SELECT injection_points_detach('TestInjectionLogLoad');
5262

0 commit comments

Comments
 (0)