diff options
Diffstat (limited to 'contrib/pg_freespacemap')
-rw-r--r-- | contrib/pg_freespacemap/Makefile | 22 | ||||
-rw-r--r-- | contrib/pg_freespacemap/pg_freespacemap--1.0--1.1.sql | 7 | ||||
-rw-r--r-- | contrib/pg_freespacemap/pg_freespacemap--1.1--1.2.sql | 7 | ||||
-rw-r--r-- | contrib/pg_freespacemap/pg_freespacemap--1.1.sql | 25 | ||||
-rw-r--r-- | contrib/pg_freespacemap/pg_freespacemap.c | 42 | ||||
-rw-r--r-- | contrib/pg_freespacemap/pg_freespacemap.control | 5 |
6 files changed, 108 insertions, 0 deletions
diff --git a/contrib/pg_freespacemap/Makefile b/contrib/pg_freespacemap/Makefile new file mode 100644 index 0000000..da40b80 --- /dev/null +++ b/contrib/pg_freespacemap/Makefile @@ -0,0 +1,22 @@ +# contrib/pg_freespacemap/Makefile + +MODULE_big = pg_freespacemap +OBJS = \ + $(WIN32RES) \ + pg_freespacemap.o + +EXTENSION = pg_freespacemap +DATA = pg_freespacemap--1.1.sql pg_freespacemap--1.1--1.2.sql \ + pg_freespacemap--1.0--1.1.sql +PGFILEDESC = "pg_freespacemap - monitoring of free space map" + +ifdef USE_PGXS +PG_CONFIG = pg_config +PGXS := $(shell $(PG_CONFIG) --pgxs) +include $(PGXS) +else +subdir = contrib/pg_freespacemap +top_builddir = ../.. +include $(top_builddir)/src/Makefile.global +include $(top_srcdir)/contrib/contrib-global.mk +endif diff --git a/contrib/pg_freespacemap/pg_freespacemap--1.0--1.1.sql b/contrib/pg_freespacemap/pg_freespacemap--1.0--1.1.sql new file mode 100644 index 0000000..52d6576 --- /dev/null +++ b/contrib/pg_freespacemap/pg_freespacemap--1.0--1.1.sql @@ -0,0 +1,7 @@ +/* contrib/pg_freespacemap/pg_freespacemap--1.0--1.1.sql */ + +-- complain if script is sourced in psql, rather than via ALTER EXTENSION +\echo Use "ALTER EXTENSION pg_freespacemap UPDATE TO '1.1'" to load this file. \quit + +ALTER FUNCTION pg_freespace(regclass, bigint) PARALLEL SAFE; +ALTER FUNCTION pg_freespace(regclass) PARALLEL SAFE; diff --git a/contrib/pg_freespacemap/pg_freespacemap--1.1--1.2.sql b/contrib/pg_freespacemap/pg_freespacemap--1.1--1.2.sql new file mode 100644 index 0000000..f558def --- /dev/null +++ b/contrib/pg_freespacemap/pg_freespacemap--1.1--1.2.sql @@ -0,0 +1,7 @@ +/* contrib/pg_freespacemap/pg_freespacemap--1.1--1.2.sql */ + +-- complain if script is sourced in psql, rather than via ALTER EXTENSION +\echo Use "ALTER EXTENSION pg_freespacemap UPDATE TO '1.2'" to load this file. \quit + +GRANT EXECUTE ON FUNCTION pg_freespace(regclass, bigint) TO pg_stat_scan_tables; +GRANT EXECUTE ON FUNCTION pg_freespace(regclass) TO pg_stat_scan_tables; diff --git a/contrib/pg_freespacemap/pg_freespacemap--1.1.sql b/contrib/pg_freespacemap/pg_freespacemap--1.1.sql new file mode 100644 index 0000000..e1b8242 --- /dev/null +++ b/contrib/pg_freespacemap/pg_freespacemap--1.1.sql @@ -0,0 +1,25 @@ +/* contrib/pg_freespacemap/pg_freespacemap--1.1.sql */ + +-- complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "CREATE EXTENSION pg_freespacemap" to load this file. \quit + +-- Register the C function. +CREATE FUNCTION pg_freespace(regclass, bigint) +RETURNS int2 +AS 'MODULE_PATHNAME', 'pg_freespace' +LANGUAGE C STRICT PARALLEL SAFE; + +-- pg_freespace shows the recorded space avail at each block in a relation +CREATE FUNCTION + pg_freespace(rel regclass, blkno OUT bigint, avail OUT int2) +RETURNS SETOF RECORD +AS $$ + SELECT blkno, pg_freespace($1, blkno) AS avail + FROM generate_series(0, pg_relation_size($1) / current_setting('block_size')::bigint - 1) AS blkno; +$$ +LANGUAGE SQL PARALLEL SAFE; + + +-- Don't want these to be available to public. +REVOKE ALL ON FUNCTION pg_freespace(regclass, bigint) FROM PUBLIC; +REVOKE ALL ON FUNCTION pg_freespace(regclass) FROM PUBLIC; diff --git a/contrib/pg_freespacemap/pg_freespacemap.c b/contrib/pg_freespacemap/pg_freespacemap.c new file mode 100644 index 0000000..b82cab2 --- /dev/null +++ b/contrib/pg_freespacemap/pg_freespacemap.c @@ -0,0 +1,42 @@ +/*------------------------------------------------------------------------- + * + * pg_freespacemap.c + * display contents of a free space map + * + * contrib/pg_freespacemap/pg_freespacemap.c + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "access/relation.h" +#include "funcapi.h" +#include "storage/freespace.h" + +PG_MODULE_MAGIC; + +/* + * Returns the amount of free space on a given page, according to the + * free space map. + */ +PG_FUNCTION_INFO_V1(pg_freespace); + +Datum +pg_freespace(PG_FUNCTION_ARGS) +{ + Oid relid = PG_GETARG_OID(0); + int64 blkno = PG_GETARG_INT64(1); + int16 freespace; + Relation rel; + + rel = relation_open(relid, AccessShareLock); + + if (blkno < 0 || blkno > MaxBlockNumber) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid block number"))); + + freespace = GetRecordedFreeSpace(rel, blkno); + + relation_close(rel, AccessShareLock); + PG_RETURN_INT16(freespace); +} diff --git a/contrib/pg_freespacemap/pg_freespacemap.control b/contrib/pg_freespacemap/pg_freespacemap.control new file mode 100644 index 0000000..ac8fc50 --- /dev/null +++ b/contrib/pg_freespacemap/pg_freespacemap.control @@ -0,0 +1,5 @@ +# pg_freespacemap extension +comment = 'examine the free space map (FSM)' +default_version = '1.2' +module_pathname = '$libdir/pg_freespacemap' +relocatable = true |