Line data Source code
1 : /*-------------------------------------------------------------------------
2 : *
3 : * pg_freespacemap.c
4 : * display contents of a free space map
5 : *
6 : * contrib/pg_freespacemap/pg_freespacemap.c
7 : *-------------------------------------------------------------------------
8 : */
9 : #include "postgres.h"
10 :
11 : #include "access/relation.h"
12 : #include "fmgr.h"
13 : #include "storage/freespace.h"
14 : #include "utils/rel.h"
15 :
16 0 : PG_MODULE_MAGIC_EXT(
17 : .name = "pg_freespacemap",
18 : .version = PG_VERSION
19 : );
20 :
21 : /*
22 : * Returns the amount of free space on a given page, according to the
23 : * free space map.
24 : */
25 0 : PG_FUNCTION_INFO_V1(pg_freespace);
26 :
27 : Datum
28 0 : pg_freespace(PG_FUNCTION_ARGS)
29 : {
30 0 : Oid relid = PG_GETARG_OID(0);
31 0 : int64 blkno = PG_GETARG_INT64(1);
32 0 : int16 freespace;
33 0 : Relation rel;
34 :
35 0 : rel = relation_open(relid, AccessShareLock);
36 :
37 0 : if (!RELKIND_HAS_STORAGE(rel->rd_rel->relkind))
38 0 : ereport(ERROR,
39 : (errcode(ERRCODE_WRONG_OBJECT_TYPE),
40 : errmsg("relation \"%s\" does not have storage",
41 : RelationGetRelationName(rel)),
42 : errdetail_relkind_not_supported(rel->rd_rel->relkind)));
43 :
44 0 : if (blkno < 0 || blkno > MaxBlockNumber)
45 0 : ereport(ERROR,
46 : (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
47 : errmsg("invalid block number")));
48 :
49 0 : freespace = GetRecordedFreeSpace(rel, blkno);
50 :
51 0 : relation_close(rel, AccessShareLock);
52 0 : PG_RETURN_INT16(freespace);
53 0 : }
|