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
