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 2 : 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 4 : PG_FUNCTION_INFO_V1(pg_freespace); 26 : 27 : Datum 28 94 : pg_freespace(PG_FUNCTION_ARGS) 29 : { 30 94 : Oid relid = PG_GETARG_OID(0); 31 94 : int64 blkno = PG_GETARG_INT64(1); 32 : int16 freespace; 33 : Relation rel; 34 : 35 94 : rel = relation_open(relid, AccessShareLock); 36 : 37 94 : 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 94 : if (blkno < 0 || blkno > MaxBlockNumber) 45 4 : ereport(ERROR, 46 : (errcode(ERRCODE_INVALID_PARAMETER_VALUE), 47 : errmsg("invalid block number"))); 48 : 49 90 : freespace = GetRecordedFreeSpace(rel, blkno); 50 : 51 90 : relation_close(rel, AccessShareLock); 52 90 : PG_RETURN_INT16(freespace); 53 : }