From 6736da5484658b212a1e5f999b8f6b03306f1fc1 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Thu, 2 Oct 2008 12:20:50 +0000 Subject: [PATCH] Make the blkno arguments bigints instead of int4s. A signed int4 is not large enough for block numbers higher than 2^31. The old pre-FSM-rewrite pg_freespacemap implementation got this right. While we're at it, remove some unnecessary #includes. --- contrib/pg_freespacemap/pg_freespacemap.c | 10 ++++------ contrib/pg_freespacemap/pg_freespacemap.sql.in | 10 +++++----- doc/src/sgml/pgfreespacemap.sgml | 6 +++--- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/contrib/pg_freespacemap/pg_freespacemap.c b/contrib/pg_freespacemap/pg_freespacemap.c index 57a7e4490d..7b099e45b0 100644 --- a/contrib/pg_freespacemap/pg_freespacemap.c +++ b/contrib/pg_freespacemap/pg_freespacemap.c @@ -3,17 +3,15 @@ * pg_freespacemap.c * display contents of a free space map * - * $PostgreSQL: pgsql/contrib/pg_freespacemap/pg_freespacemap.c,v 1.11 2008/09/30 11:17:07 heikki Exp $ + * $PostgreSQL: pgsql/contrib/pg_freespacemap/pg_freespacemap.c,v 1.12 2008/10/02 12:20:50 heikki Exp $ *------------------------------------------------------------------------- */ #include "postgres.h" #include "access/heapam.h" -#include "access/htup.h" -#include "catalog/pg_type.h" #include "funcapi.h" +#include "storage/block.h" #include "storage/freespace.h" -#include "utils/builtins.h" PG_MODULE_MAGIC; @@ -31,13 +29,13 @@ Datum pg_freespace(PG_FUNCTION_ARGS) { Oid relid = PG_GETARG_OID(0); - uint32 blkno = PG_GETARG_UINT32(1); + int64 blkno = PG_GETARG_INT64(1); int16 freespace; Relation rel; rel = relation_open(relid, AccessShareLock); - if (!BlockNumberIsValid(blkno)) + if (blkno < 0 || blkno > MaxBlockNumber) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid block number"))); diff --git a/contrib/pg_freespacemap/pg_freespacemap.sql.in b/contrib/pg_freespacemap/pg_freespacemap.sql.in index 992fbcd991..d9bab1a579 100644 --- a/contrib/pg_freespacemap/pg_freespacemap.sql.in +++ b/contrib/pg_freespacemap/pg_freespacemap.sql.in @@ -1,26 +1,26 @@ -/* $PostgreSQL: pgsql/contrib/pg_freespacemap/pg_freespacemap.sql.in,v 1.10 2008/09/30 11:17:07 heikki Exp $ */ +/* $PostgreSQL: pgsql/contrib/pg_freespacemap/pg_freespacemap.sql.in,v 1.11 2008/10/02 12:20:50 heikki Exp $ */ -- Adjust this setting to control where the objects get created. SET search_path = public; -- Register the C function. -CREATE OR REPLACE FUNCTION pg_freespace(regclass, int4) +CREATE OR REPLACE FUNCTION pg_freespace(regclass, bigint) RETURNS int2 AS 'MODULE_PATHNAME', 'pg_freespace' LANGUAGE C; -- pg_freespace shows the recorded space avail at each block in a relation CREATE OR REPLACE FUNCTION - pg_freespace(rel regclass, blkno OUT int4, avail OUT int2) + pg_freespace(rel regclass, blkno OUT bigint, avail OUT int2) RETURNS SETOF RECORD AS $$ - SELECT blkno::int4, pg_freespace($1, blkno::int4) AS avail + 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; -- Don't want these to be available to public. -REVOKE ALL ON FUNCTION pg_freespace(regclass, int4) FROM PUBLIC; +REVOKE ALL ON FUNCTION pg_freespace(regclass, bigint) FROM PUBLIC; REVOKE ALL ON FUNCTION pg_freespace(regclass) FROM PUBLIC; diff --git a/doc/src/sgml/pgfreespacemap.sgml b/doc/src/sgml/pgfreespacemap.sgml index acb6374b35..f7263eef27 100644 --- a/doc/src/sgml/pgfreespacemap.sgml +++ b/doc/src/sgml/pgfreespacemap.sgml @@ -1,4 +1,4 @@ - + pg_freespacemap @@ -41,13 +41,13 @@ - pg_freespace(rel regclass IN, blkno OUT int4, avail OUT int2) + pg_freespace(rel regclass IN, blkno OUT bigint, avail OUT int2) Displays the the amount of free space on each page of the relation, - according to the FSM. A set of (blkno int4, avail int2) + according to the FSM. A set of (blkno bigint, avail int2) tuples is returned, one tuple for each page in the relation. -- 2.11.0