From 6eb9c5a5657d1fe77b55cc261450f3538d35a94d Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 4 May 2024 14:19:15 +0200 Subject: Adding upstream version 13.4. Signed-off-by: Daniel Baumann --- contrib/pg_freespacemap/pg_freespacemap.c | 42 +++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 contrib/pg_freespacemap/pg_freespacemap.c (limited to 'contrib/pg_freespacemap/pg_freespacemap.c') diff --git a/contrib/pg_freespacemap/pg_freespacemap.c b/contrib/pg_freespacemap/pg_freespacemap.c new file mode 100644 index 0000000..b82cab2 --- /dev/null +++ b/contrib/pg_freespacemap/pg_freespacemap.c @@ -0,0 +1,42 @@ +/*------------------------------------------------------------------------- + * + * pg_freespacemap.c + * display contents of a free space map + * + * contrib/pg_freespacemap/pg_freespacemap.c + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "access/relation.h" +#include "funcapi.h" +#include "storage/freespace.h" + +PG_MODULE_MAGIC; + +/* + * Returns the amount of free space on a given page, according to the + * free space map. + */ +PG_FUNCTION_INFO_V1(pg_freespace); + +Datum +pg_freespace(PG_FUNCTION_ARGS) +{ + Oid relid = PG_GETARG_OID(0); + int64 blkno = PG_GETARG_INT64(1); + int16 freespace; + Relation rel; + + rel = relation_open(relid, AccessShareLock); + + if (blkno < 0 || blkno > MaxBlockNumber) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid block number"))); + + freespace = GetRecordedFreeSpace(rel, blkno); + + relation_close(rel, AccessShareLock); + PG_RETURN_INT16(freespace); +} -- cgit v1.2.3