Re: Making type Datum be 8 bytes everywhere
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Michael Paquier <michael@paquier.xyz>
Cc: Peter Eisentraut <peter@eisentraut.org>,
Andres Freund <andres@anarazel.de>,
pgsql-hackers@lists.postgresql.org,
Robert Haas <robertmhaas@gmail.com>
Date: 2025-08-09T01:14:08Z
Lists: pgsql-hackers
I have just realized that this proposal has a rather nasty defect. Per the following comment in spgist_private.h: * If the prefix datum is of a pass-by-value type, it is stored in its * Datum representation, that is its on-disk representation is of length * sizeof(Datum). This is a fairly unfortunate choice, because in no other * place does Postgres use Datum as an on-disk representation; it creates * an unnecessary incompatibility between 32-bit and 64-bit builds. But the * compatibility loss is mostly theoretical since MAXIMUM_ALIGNOF typically * differs between such builds, too. Anyway we're stuck with it now. This means we cannot change sizeof(Datum), nor reconsider the pass-by-value classification of any datatype, without potentially breaking pg_upgrade of some SP-GiST indexes on 32-bit machines. Now, it looks like this doesn't affect any in-core SP-GiST opclasses. The only one using a potentially affected type is kd_point_ops which uses a float8 prefix. That'll have been stored in regular on-disk format on a 32-bit machine, but if we redefine it as being stored in 64-bit-Datum format, nothing actually changes. The case that would be problematic is a prefix type that's 4 bytes or less, and I don't see any. A quick search of Debian Code Search doesn't find any extensions that look like they are using small pass-by-value prefixes either. So maybe we can get away with just changing this, but it's worrisome. On the positive side, even if there are any SP-GiST opclasses that are at risk, the population of installations using them on 32-bit installs has got to be pretty tiny. And the worst-case answer is that you'd have to reindex such indexes after pg_upgrade. BTW, I don't think we can teach pg_upgrade to check for this hazard, because the SP-GiST APIs are such that the data type used for prefixes isn't visible at the SQL level. Do we think that making this change is valuable enough to justify taking such a risk? regards, tom lane
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Avoid faulty alignment of Datums in build_sorted_items().
- 09036dc71c68 19 (unreleased) landed
-
Grab the low-hanging fruit from forcing USE_FLOAT8_BYVAL to true.
- ee54046601de 19 (unreleased) landed
-
Grab the low-hanging fruit from forcing sizeof(Datum) to 8.
- 6aebedc38497 19 (unreleased) landed
-
Make type Datum be 8 bytes wide everywhere.
- 2a600a93c7be 19 (unreleased) landed
-
Mop-up for Datum conversion cleanups.
- 665c3dbba497 19 (unreleased) landed