Re: Mis-use of type BlockNumber? - Mailing list pgsql-hackers

From Andres Freund
Subject Re: Mis-use of type BlockNumber?
Date
Msg-id rho2hmxz33lwy2gu6utxh3vkuoapmf436tbqydmuymogr6z5sp@id47ojmhuhhf
Whole thread
In response to Mis-use of type BlockNumber?  (Chao Li <li.evan.chao@gmail.com>)
Responses Re: Mis-use of type BlockNumber?
List pgsql-hackers
Hi,

On 2026-03-06 11:25:45 +0800, Chao Li wrote:
> While reviewing [1], I noticed several cases where BlockNumber seems to be misused.
> 
> Although BlockNumber is currently underlying defined as uint32, it has a special meaning. For example:
> ```
> #define InvalidBlockNumber ((BlockNumber) 0xFFFFFFFF)
> #define MaxBlockNumber ((BlockNumber) 0xFFFFFFFE)
> ```
> So my understanding is that BlockNumber should only be used to identify a block.
> 
> However, I saw several places where variables of type BlockNumber are actually used as counts. For example:
> ```
> typedef struct LVRelState
> {
> 
>     BlockNumber blkno;   <== correct usage
> 
>     BlockNumber rel_pages; /* total number of pages */  <== mis-use
> ```
> In this example, rel_pages is actually a count. In theory it could just be an int (or some other count type).

> Another example:
> ```
> static void
> system_time_samplescangetsamplesize(PlannerInfo *root,
>                                     RelOptInfo *baserel,
>                                     List *paramexprs,
>                                     BlockNumber *pages,
>                                     double *tuples)
> ```
> Here the parameter pages is also a count indicating the number of pages.
> 
> So I want to confirm whether my understanding is correct that these are misuses of BlockNumber. If so, would it be
wortha cleanup patch to fix such cases?
 

I don't love that we use BlockNumber this way either, but it is fairly
widespread and of long standing.  There is a lot of code in postgres, if you
just go and scour it to find stuff you individually don't like, you will be
busy for a long time (writing the "fixes") and we will be busy for a long time
(dealing with the influx of patches).  Just because some rarely changing
aspect of the code does something mildly ugly doesn't mean you have to
immediately send patches about it.  Sending and processing patches takes time
and energy.

Greetings,

Andres Freund



pgsql-hackers by date:

Previous
From: Sami Imseih
Date:
Subject: Re: [BUG + PATCH] DSA pagemap out-of-bounds in make_new_segment odd-sized path
Next
From: Nazir Bilal Yavuz
Date:
Subject: Re: Don't synchronously wait for already-in-progress IO in read stream