1
0
mirror of https://github.com/postgres/postgres.git synced 2025-12-19 17:02:53 +03:00

injection_points: Add injection_points_list()

This function can be used to retrieve the information about all the
injection points attached to a cluster, providing coverage for
InjectionPointList() introduced in 7b2eb72b1b.

The original proposal turned around a system function, but that would
not be backpatchable to stable branches.  It was also a bit weird to
have a system function that fails depending on if the build allows
injection points or not.

Reviewed-by: Aleksander Alekseev <aleksander@timescale.com>
Reviewed-by: Rahila Syed <rahilasyed90@gmail.com>
Discussion: https://postgr.es/m/Z_xYkA21KyLEHvWR@paquier.xyz
This commit is contained in:
Michael Paquier
2025-07-10 10:01:10 +09:00
parent 48a23f6eae
commit 4eca711bc9
4 changed files with 74 additions and 0 deletions

View File

@@ -18,6 +18,7 @@
#include "postgres.h"
#include "fmgr.h"
#include "funcapi.h"
#include "injection_stats.h"
#include "miscadmin.h"
#include "nodes/pg_list.h"
@@ -545,6 +546,44 @@ injection_points_detach(PG_FUNCTION_ARGS)
PG_RETURN_VOID();
}
/*
* SQL function for listing all the injection points attached.
*/
PG_FUNCTION_INFO_V1(injection_points_list);
Datum
injection_points_list(PG_FUNCTION_ARGS)
{
#define NUM_INJECTION_POINTS_LIST 3
ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
List *inj_points;
ListCell *lc;
/* Build a tuplestore to return our results in */
InitMaterializedSRF(fcinfo, 0);
inj_points = InjectionPointList();
foreach(lc, inj_points)
{
Datum values[NUM_INJECTION_POINTS_LIST];
bool nulls[NUM_INJECTION_POINTS_LIST];
InjectionPointData *inj_point = lfirst(lc);
memset(values, 0, sizeof(values));
memset(nulls, 0, sizeof(nulls));
values[0] = PointerGetDatum(cstring_to_text(inj_point->name));
values[1] = PointerGetDatum(cstring_to_text(inj_point->library));
values[2] = PointerGetDatum(cstring_to_text(inj_point->function));
/* shove row into tuplestore */
tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
}
return (Datum) 0;
#undef NUM_INJECTION_POINTS_LIST
}
void
_PG_init(void)