On Thu, 5 Mar 2026 at 19:26, Chao Li <[email protected]> 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/[email protected]
>
> Best regards,
> --
> Chao Li (Evan)
> HighGo Software Co., Ltd.
> https://www.highgo.com/
>
>
>
>
>
>
>

-- 
Regards,
Rafia Sabih
CYBERTEC PostgreSQL International GmbH

Reply via email to