Make the blkno arguments bigints instead of int4s. A signed int4 is not
authorHeikki Linnakangas
Thu, 2 Oct 2008 12:20:50 +0000 (12:20 +0000)
committerHeikki Linnakangas
Thu, 2 Oct 2008 12:20:50 +0000 (12:20 +0000)
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
contrib/pg_freespacemap/pg_freespacemap.sql.in
doc/src/sgml/pgfreespacemap.sgml

index 57a7e4490d8c220e04598b3e9c16c9680af344a8..7b099e45b0de3d0828b6ea2610e0f21cd7b2a09b 100644 (file)
@@ -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")));
index 992fbcd99174a39d9926567088aa0c020dc74547..d9bab1a579afbd946eceab6053fe40905cde342a 100644 (file)
@@ -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;
index acb6374b3599f9878789836ecf0644da484fb8eb..f7263eef2787c3380368a6aa57c64b21575b1f1f 100644 (file)
@@ -1,4 +1,4 @@
-
+
 
 
  pg_freespacemap
 
    
     
-     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.