PostgreSQL Source Code  git master
pg_freespacemap.c
Go to the documentation of this file.
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 "funcapi.h"
13 #include "storage/freespace.h"
14 
16 
17 /*
18  * Returns the amount of free space on a given page, according to the
19  * free space map.
20  */
22 
23 Datum
25 {
26  Oid relid = PG_GETARG_OID(0);
27  int64 blkno = PG_GETARG_INT64(1);
28  int16 freespace;
29  Relation rel;
30 
31  rel = relation_open(relid, AccessShareLock);
32 
33  if (blkno < 0 || blkno > MaxBlockNumber)
34  ereport(ERROR,
35  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
36  errmsg("invalid block number")));
37 
38  freespace = GetRecordedFreeSpace(rel, blkno);
39 
41  PG_RETURN_INT16(freespace);
42 }
signed short int16
Definition: c.h:346
#define AccessShareLock
Definition: lockdefs.h:36
#define PG_RETURN_INT16(x)
Definition: fmgr.h:346
int errcode(int sqlerrcode)
Definition: elog.c:608
unsigned int Oid
Definition: postgres_ext.h:31
#define ERROR
Definition: elog.h:43
#define MaxBlockNumber
Definition: block.h:35
Relation relation_open(Oid relationId, LOCKMODE lockmode)
Definition: relation.c:48
#define PG_GETARG_OID(n)
Definition: fmgr.h:270
Datum pg_freespace(PG_FUNCTION_ARGS)
#define ereport(elevel, rest)
Definition: elog.h:141
Size GetRecordedFreeSpace(Relation rel, BlockNumber heapBlk)
Definition: freespace.c:230
uintptr_t Datum
Definition: postgres.h:367
void relation_close(Relation relation, LOCKMODE lockmode)
Definition: relation.c:206
PG_MODULE_MAGIC
PG_FUNCTION_INFO_V1(pg_freespace)
int errmsg(const char *fmt,...)
Definition: elog.c:822
#define PG_FUNCTION_ARGS
Definition: fmgr.h:188
#define PG_GETARG_INT64(n)
Definition: fmgr.h:277