Use correct macro for accessing offset numbers.

Started by Kirill Reshke3 months ago8 messageshackers
Jump to latest
#1Kirill Reshke
reshkekirill@gmail.com

Hi hackers!

While working on pageinspect support for GIN and SpGiST (welcome to
review them [0]/messages/by-id/CALdSSPiN13n7feQcY0WCmq8jzxjwqhNrt1E=g=g6aZANyE_OoQ@mail.gmail.com & [1]/messages/by-id/CALdSSPhbAQbFtjK0nT8_G5GsXmsSEVx8J735Ga+ZxLp9osHcRA@mail.gmail.com), I spotted $subi.

PFA trivial patch that uses UInt16GetDatum for OffsetNumber rather
than Int16GetDatum

[0]: /messages/by-id/CALdSSPiN13n7feQcY0WCmq8jzxjwqhNrt1E=g=g6aZANyE_OoQ@mail.gmail.com
[1]: /messages/by-id/CALdSSPhbAQbFtjK0nT8_G5GsXmsSEVx8J735Ga+ZxLp9osHcRA@mail.gmail.com

--
Best regards,
Kirill Reshke

Attachments:

v1-0001-Use-correct-macro-for-accessing-offset-numbers.patchapplication/octet-stream; name=v1-0001-Use-correct-macro-for-accessing-offset-numbers.patchDownload+3-4
#2Roman Khapov
rkhapov@yandex-team.ru
In reply to: Kirill Reshke (#1)
Re: Use correct macro for accessing offset numbers.

On 11 Jan 2026, at 16:21, Kirill Reshke <reshkekirill@gmail.com> wrote:

Hi hackers!

PFA trivial patch that uses UInt16GetDatum for OffsetNumber rather
than Int16GetDatum

Hi!

LGTM, should we check another places of offset number conversations to Datum
as part of this thread?

--
Best regards,
Roman Khapov

#3Kirill Reshke
reshkekirill@gmail.com
In reply to: Roman Khapov (#2)
Re: Use correct macro for accessing offset numbers.

On Sun, 11 Jan 2026 at 16:41, Roman Khapov <rkhapov@yandex-team.ru> wrote:

should we check another places of offset number conversations to Datum
as part of this thread?

Maybe, I have stopped some more cases, in v2-0001

--
Best regards,
Kirill Reshke

Attachments:

v1-0001-Use-correct-macro-for-accessing-offset-numbers.patchapplication/octet-stream; name=v1-0001-Use-correct-macro-for-accessing-offset-numbers.patchDownload+3-4
v2-0001-Use-UInt16GetDatum-for-stategy-number-access.patchapplication/octet-stream; name=v2-0001-Use-UInt16GetDatum-for-stategy-number-access.patchDownload+6-7
#4Michael Paquier
michael@paquier.xyz
In reply to: Kirill Reshke (#3)
Re: Use correct macro for accessing offset numbers.

On Sun, Jan 11, 2026 at 04:58:39PM +0500, Kirill Reshke wrote:

Maybe, I have stopped some more cases, in v2-0001

Right. It's true that we could be more consistent for all these based
on their base type, some of them, particularly in the GIN code now,
caring about using the correct macro. It may be a good occasion to
double-check the whole tree for similar holes based on unsigned types.
--
Michael

#5li carol
carol.li2025@outlook.com
In reply to: Michael Paquier (#4)
RE: Use correct macro for accessing offset numbers.

On Sun, Jan 11, 2026 at 04:58:39PM +0500, Kirill Reshke wrote:

Maybe, I have stopped some more cases, in v2-0001

Right. It's true that we could be more consistent for all these based on their
base type, some of them, particularly in the GIN code now, caring about using
the correct macro. It may be a good occasion to double-check the whole tree
for similar holes based on unsigned types.
--
Michael

Hi Kirill, Roman, and Michael,
While double-checking the tree for similar holes as Michael suggested, I noticed a couple more inconsistencies in contrib/pageinspect/ginfuncs.c where we are using signed macros for unsigned types.
Specifically, in gin_page_opaque_info, we use Int32GetDatum for maxoff:

values[1] = Int32GetDatum(opaq->maxoff);

Since maxoff is of type OffsetNumber (uint16), this seems to be the exact same pattern Kirill is addressing in other parts of the GIN code. Although it is widened to int32 here, for the sake of consistency, it should probably be using a 16-bit or unsigned macro.

Similarly, in gin_metapage_info, tailFreeSize (which is defined as uint32 in GinMetaPageData) is also converted using Int32GetDatum:

values[2] = Int32GetDatum(metadata->tailFreeSize);

It might be better to include these cleanups in the next version of the patch to ensure all pageinspect GIN functions follow the same standard.

Best regards,
Yuan Li(carol)

#6zengman
zengman@halodbtech.com
In reply to: Kirill Reshke (#3)
Re: Use correct macro for accessing offset numbers.

Hi,

I’ve also seen such cases in the kernel code, and I’m wondering if this should be added to the patch here?
```
postgres@zxm-VMware-Virtual-Platform:~/code/postgres$ git diff
diff --git a/src/backend/utils/adt/lockfuncs.c b/src/backend/utils/adt/lockfuncs.c
index bcbc226125c..9dadd6da672 100644
--- a/src/backend/utils/adt/lockfuncs.c
+++ b/src/backend/utils/adt/lockfuncs.c
@@ -329,7 +329,7 @@ pg_lock_status(PG_FUNCTION_ARGS)
                                values[1] = ObjectIdGetDatum(instance->locktag.locktag_field1);
                                values[8] = ObjectIdGetDatum(instance->locktag.locktag_field2);
                                values[6] = ObjectIdGetDatum(instance->locktag.locktag_field3);
-                               values[9] = Int16GetDatum(instance->locktag.locktag_field4);
+                               values[9] = UInt16GetDatum(instance->locktag.locktag_field4);
                                nulls[2] = true;
                                nulls[3] = true;
                                nulls[4] = true;
@@ -343,7 +343,7 @@ pg_lock_status(PG_FUNCTION_ARGS)
                                values[1] = ObjectIdGetDatum(instance->locktag.locktag_field1);
                                values[7] = ObjectIdGetDatum(instance->locktag.locktag_field2);
                                values[8] = ObjectIdGetDatum(instance->locktag.locktag_field3);
-                               values[9] = Int16GetDatum(instance->locktag.locktag_field4);
+                               values[9] = UInt16GetDatum(instance->locktag.locktag_field4);
                                nulls[2] = true;
                                nulls[3] = true;
                                nulls[4] = true;
```

--
Regards,
Man Zeng
www.openhalo.org

#7Kirill Reshke
reshkekirill@gmail.com
In reply to: li carol (#5)
Re: Use correct macro for accessing offset numbers.

On Mon, 12 Jan 2026 at 04:23, Michael Paquier <michael@paquier.xyz> wrote:

On Sun, Jan 11, 2026 at 04:58:39PM +0500, Kirill Reshke wrote:

Maybe, I have stopped some more cases, in v2-0001

Right. It's true that we could be more consistent for all these based
on their base type, some of them, particularly in the GIN code now,
caring about using the correct macro. It may be a good occasion to
double-check the whole tree for similar holes based on unsigned types.
--
Michael

Ok

Hi Kirill, Roman, and Michael,
While double-checking the tree for similar holes as Michael suggested, I noticed a couple more inconsistencies in contrib/pageinspect/ginfuncs.c where we are using signed macros for unsigned types.
Specifically, in gin_page_opaque_info, we use Int32GetDatum for maxoff:

values[1] = Int32GetDatum(opaq->maxoff);

Since maxoff is of type OffsetNumber (uint16), this seems to be the exact same pattern Kirill is addressing in other parts of the GIN code. Although it is widened to int32 here, for the sake of consistency, it should probably be using a 16-bit or unsigned macro.

Similarly, in gin_metapage_info, tailFreeSize (which is defined as uint32 in GinMetaPageData) is also converted using Int32GetDatum:

values[2] = Int32GetDatum(metadata->tailFreeSize);

It might be better to include these cleanups in the next version of the patch to ensure all pageinspect GIN functions follow the same standard.

Thank you, I have included your findings in v3.

On Mon, 12 Jan 2026 at 11:53, zengman <zengman@halodbtech.com> wrote:

Hi,

I’ve also seen such cases in the kernel code, and I’m wondering if this should be added to the patch here?
```
postgres@zxm-VMware-Virtual-Platform:~/code/postgres$ git diff
diff --git a/src/backend/utils/adt/lockfuncs.c b/src/backend/utils/adt/lockfuncs.c
index bcbc226125c..9dadd6da672 100644
--- a/src/backend/utils/adt/lockfuncs.c
+++ b/src/backend/utils/adt/lockfuncs.c
@@ -329,7 +329,7 @@ pg_lock_status(PG_FUNCTION_ARGS)
values[1] = ObjectIdGetDatum(instance->locktag.locktag_field1);
values[8] = ObjectIdGetDatum(instance->locktag.locktag_field2);
values[6] = ObjectIdGetDatum(instance->locktag.locktag_field3);
-                               values[9] = Int16GetDatum(instance->locktag.locktag_field4);
+                               values[9] = UInt16GetDatum(instance->locktag.locktag_field4);
nulls[2] = true;
nulls[3] = true;
nulls[4] = true;
@@ -343,7 +343,7 @@ pg_lock_status(PG_FUNCTION_ARGS)
values[1] = ObjectIdGetDatum(instance->locktag.locktag_field1);
values[7] = ObjectIdGetDatum(instance->locktag.locktag_field2);
values[8] = ObjectIdGetDatum(instance->locktag.locktag_field3);
-                               values[9] = Int16GetDatum(instance->locktag.locktag_field4);
+                               values[9] = UInt16GetDatum(instance->locktag.locktag_field4);
nulls[2] = true;
nulls[3] = true;
nulls[4] = true;

Thank you, I have included your findings in v3.

PFA v3 with fixes for signed usage across the tree, with my new
findings and suggestions from thread

--
Best regards,
Kirill Reshke

Attachments:

v3-0001-Use-correct-macro-for-accessing-unsigned-numbers.patchapplication/octet-stream; name=v3-0001-Use-correct-macro-for-accessing-unsigned-numbers.patchDownload+15-16
#8Michael Paquier
michael@paquier.xyz
In reply to: Kirill Reshke (#7)
Re: Use correct macro for accessing offset numbers.

On Mon, Jan 12, 2026 at 01:51:10PM +0500, Kirill Reshke wrote:

PFA v3 with fixes for signed usage across the tree, with my new
findings and suggestions from thread

Note that the change in get_opfamily_member() is not right based on
the type of "strategy". The rest was OK, so done.
--
Michael