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

From Rafia Sabih
Subject Re: Mis-use of type BlockNumber?
Date
Msg-id CA+FpmFdrM=L5f=e7+wqOkFkYK6r_S=TdKrHQ5qPbTNaoVG9PUA@mail.gmail.com
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


On Thu, 5 Mar 2026 at 19:26, Chao Li <li.evan.chao@gmail.com> wrote:
Hi,

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
```
Actually,  InvalidBlockNumber and MaxBlockNumber are special values, not the BlockNumber itself, it is as you said underlying uint32.
AFAIk these types for typedef are done so that we understand them in a particular context and not just use them as any other uint32. Increases the code readability.
There are other such examples too like Bucket in Hash.
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 worth a cleanup patch to fix such cases?

[1] https://postgr.es/m/81DAFACF-7D55-4A84-ACB0-0425D1669DB4@gmail.com

Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/








--
Regards,
Rafia Sabih
CYBERTEC PostgreSQL International GmbH

pgsql-hackers by date:

Previous
From: Chao Li
Date:
Subject: Re: DOC: fixes multiple errors in alter table doc
Next
From: Henson Choi
Date:
Subject: Re: SQL Property Graph Queries (SQL/PGQ)