Hi All,
The SQL definition of pg_buffercache_pages() and pg_buffercache
declares relforknum as int2
CREATE FUNCTION pg_buffercache_pages()
RETURNS SETOF RECORD
AS 'MODULE_PATHNAME', 'pg_buffercache_pages'
LANGUAGE C PARALLEL SAFE;
-- Create a view for convenient access.
CREATE VIEW pg_buffercache AS
SELECT P.* FROM pg_buffercache_pages() AS P
(bufferid integer, relfilenode oid, reltablespace oid, reldatabase oid,
relforknumber int2, relblocknumber int8, isdirty bool, usagecount int2,
^^^^^^^^^^^^^^^^^
pinning_backends int4);
But C implementation uses ObjectIdGetDatum() where ObjectId is 32 bit integer.
values[4] = ObjectIdGetDatum(fctx->record[i].forknum);
Since forknum values are within 16 bits and that's unlikely to change
in future, int2 seems to ok. Also casting it to a wider integer, OID,
also doesn't seem like a correctness issue. But it does look
inconsistent and a reader of C implementation may think that the SQL
datatype used is int4. Should we instead change the C Implementation
to be
values[4] = Int16GetDatum((int16) fctx->record[i].forknum);
The code has been there for 17 years, and I didn't find any previous
complaints. I propose to change just the master branch.
--
Best Wishes,
Ashutosh Bapat