diff options
author | Heikki Linnakangas | 2008-10-02 12:20:50 +0000 |
---|---|---|
committer | Heikki Linnakangas | 2008-10-02 12:20:50 +0000 |
commit | 8f24e94b2803eb49d903c8f692939b73f8c21706 (patch) | |
tree | fa2dbf7c1814d761eae741cce8558ef95a41e839 | |
parent | 0d7cf684d92f8c46ea3b0d715146e0b5ecb00656 (diff) |
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.
-rw-r--r-- | contrib/pg_freespacemap/pg_freespacemap.c | 8 | ||||
-rw-r--r-- | contrib/pg_freespacemap/pg_freespacemap.sql.in | 8 | ||||
-rw-r--r-- | doc/src/sgml/pgfreespacemap.sgml | 4 |
3 files changed, 9 insertions, 11 deletions
diff --git a/contrib/pg_freespacemap/pg_freespacemap.c b/contrib/pg_freespacemap/pg_freespacemap.c index a369e9e060..c5bea76c20 100644 --- a/contrib/pg_freespacemap/pg_freespacemap.c +++ b/contrib/pg_freespacemap/pg_freespacemap.c @@ -9,11 +9,9 @@ #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 b5f24e3a68..5c67d8c90f 100644 --- a/contrib/pg_freespacemap/pg_freespacemap.sql.in +++ b/contrib/pg_freespacemap/pg_freespacemap.sql.in @@ -5,22 +5,22 @@ 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 aa2349c8d1..7701dae248 100644 --- a/doc/src/sgml/pgfreespacemap.sgml +++ b/doc/src/sgml/pgfreespacemap.sgml @@ -41,13 +41,13 @@ <varlistentry> <term> - <function>pg_freespace(rel regclass IN, blkno OUT int4, avail OUT int2)</function> + <function>pg_freespace(rel regclass IN, blkno OUT bigint, avail OUT int2)</function> </term> <listitem> <para> Displays the the amount of free space on each page of the relation, - according to the FSM. A set of <literal>(blkno int4, avail int2)</> + according to the FSM. A set of <literal>(blkno bigint, avail int2)</> tuples is returned, one tuple for each page in the relation. </para> </listitem> |