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 : 15 2 : PG_MODULE_MAGIC; 16 : 17 : /* 18 : * Returns the amount of free space on a given page, according to the 19 : * free space map. 20 : */ 21 4 : PG_FUNCTION_INFO_V1(pg_freespace); 22 : 23 : Datum 24 94 : pg_freespace(PG_FUNCTION_ARGS) 25 : { 26 94 : Oid relid = PG_GETARG_OID(0); 27 94 : int64 blkno = PG_GETARG_INT64(1); 28 : int16 freespace; 29 : Relation rel; 30 : 31 94 : rel = relation_open(relid, AccessShareLock); 32 : 33 94 : if (blkno < 0 || blkno > MaxBlockNumber) 34 4 : ereport(ERROR, 35 : (errcode(ERRCODE_INVALID_PARAMETER_VALUE), 36 : errmsg("invalid block number"))); 37 : 38 90 : freespace = GetRecordedFreeSpace(rel, blkno); 39 : 40 90 : relation_close(rel, AccessShareLock); 41 90 : PG_RETURN_INT16(freespace); 42 : }