Age Owner Branch data TLA 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 : :
164 tgl@sss.pgh.pa.us 16 :CBC 1 : 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 : : */
6185 heikki.linnakangas@i 25 : 2 : PG_FUNCTION_INFO_V1(pg_freespace);
26 : :
27 : : Datum
28 : 47 : pg_freespace(PG_FUNCTION_ARGS)
29 : : {
5931 bruce@momjian.us 30 : 47 : Oid relid = PG_GETARG_OID(0);
31 : 47 : int64 blkno = PG_GETARG_INT64(1);
32 : : int16 freespace;
33 : : Relation rel;
34 : :
6185 heikki.linnakangas@i 35 : 47 : rel = relation_open(relid, AccessShareLock);
36 : :
163 tgl@sss.pgh.pa.us 37 [ + + - + : 47 : if (!RELKIND_HAS_STORAGE(rel->rd_rel->relkind))
- - - - -
- ]
163 tgl@sss.pgh.pa.us 38 [ # # ]:UBC 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 : :
6183 heikki.linnakangas@i 44 [ + + + + ]:CBC 47 : if (blkno < 0 || blkno > MaxBlockNumber)
6185 45 [ + - ]: 2 : ereport(ERROR,
46 : : (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
47 : : errmsg("invalid block number")));
48 : :
49 : 45 : freespace = GetRecordedFreeSpace(rel, blkno);
50 : :
51 : 45 : relation_close(rel, AccessShareLock);
52 : 45 : PG_RETURN_INT16(freespace);
53 : : }
|