Hi, On 2025-07-17 20:09:57 -0400, Tom Lane wrote: > In a discussion on Discord (in the PG #core-hacking channel, > which unfortunately is inaccessible to non-members), Andres > and Robert complained about the development/maintenance costs > of continuing to support 32-bit platforms. Here is a modest > proposal to reduce those costs without going so far as to > entirely desupport such platforms: let's require them to use > 8-byte Datums even though that's probably not a native data > type for them. That lets us get rid of logic to support the > !USE_FLOAT8_BYVAL case, and allows a few other simplifications. > > The attached patch switches to 8-byte Datums everywhere, but > doesn't make any effort to remove the now-dead code.
Thanks for writing that! > I made it just as a proof-of-concept that this can work. It compiled > cleanly and passed check-world for me on a 32-bit FreeBSD image. Interestingly it generates a *lot* of warnings here when building for 32 bit with gcc. One class of complaints is about DatumGetPointer() and PointerGetDatum() casting between different sizes: ../../../../../home/andres/src/postgresql/src/include/postgres.h: In function 'DatumGetPointer': ../../../../../home/andres/src/postgresql/src/include/postgres.h:320:16: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] 320 | return (Pointer) X; | ^ ../../../../../home/andres/src/postgresql/src/include/postgres.h: In function 'PointerGetDatum': ../../../../../home/andres/src/postgresql/src/include/postgres.h:330:16: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 330 | return (Datum) X; | ^ And then there's a set of complains due to code converting from NULL to Datum without going through PointerGetDatum(): ../../../../../home/andres/src/postgresql/src/include/access/htup_details.h: In function 'fastgetattr': ../../../../../home/andres/src/postgresql/src/include/access/htup_details.h:887:32: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 887 | return (Datum) NULL; ../../../../../home/andres/src/postgresql/src/include/access/itup.h: In function 'index_getattr': ../../../../../home/andres/src/postgresql/src/include/access/itup.h:157:32: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 157 | return (Datum) NULL; A third, not quite as verbose set is random code in .c files missing uses of DatumGetPointer(). There are lot of those. A fourth class is passing a Datum to VAR* macros. They're a bit too verbose to paste here, but it's just a variation of the above. I'm not really sure what our intended use of them is, do we intend to pass pointers or datums to the macros? I suspect we'd have to move the casts into the varlena macros, otherwise we'll have to add DatumGetPointer() uses all over. One of these days I should again try the experiment of making Datum into a struct, to automatically catch omissions of datum <-> native type. Having them be silent most of the time really sucks. I suspect that if we get the 64bit-datum-on-32bit-platform code to be warning-free, it'd get a lot easier to struct-ify Datum. I don't recall the details, but I suspect that all the varlena macros etc were the problem with that. > I've not looked into the performance consequences. We probably > should at least try to measure that, though I'm not sure what > our threshold of pain would be for deciding not to do this. >From my POV the threshold would have to be rather high for backend code. Less so in libpq, but that's not affected here. Greetings, Andres Freund