Hi, On 2026-02-03 17:29:46 -0500, Tom Lane wrote: > I wrote: > > Attached a v3 of the main patch (now again numbered 0001), plus > > new work in 0002 that adds the two new alignment values to > > pg_control and insists on a match before pg_upgrade'ing. > > I've gotten cold feet about this whole idea, and no longer think > we should pursue it. Aside from the problems already raised, > consider this: what would extensions do with existing int64-based > data types? We don't have any provision for altering the typalign > of an existing type, and if we did it would imply doing table > rewrites (at least for cases where the change wasn't effectively > a no-op). Worse, if such a type is created using "LIKE int8" > which has always been best practice, then whether it shows up > with align 'l' or 'd' in a new installation will depend on whether > you pg_upgrade'd or installed the extension fresh. So that looks > like a mess waiting to happen. Combine that with extensions that > manually set alignment = double, and never bother to update because > they can't change it and don't care anyway, and the inevitable end > result is that the 'l' and 'd' cases will be so randomly assigned > that there's not a meaningful difference after all. Perhaps we > could have got away with such a change in the pre-pg_upgrade era, > but I think we cannot now.
I can't really see a way to avoid these issues either :( > If we want to re-support AIX, I think we're stuck with going back > to the old way of calculating MAXALIGN, and then re-instituting that > regression test that checked for unsafely-aligned catalog columns. > Bleah. Still, as long as the regression test is accurate, it seems > like that'd be an annoyance not a major headache. I am pretty unhappy about that, I think the test and rules are just about incomprehensible. I wonder if we ought to instead just redefine float8 to be be aligned to 8 bytes, leaving double alone. Something like #if ALIGNOF_DOUBLE < ALIGNOF_LONG typedef double __attribute__((aligned(8))) float8; #define ALIGNOF_FLOAT* ALIGNOF_LONG #else typedef double float8; #define ALIGNOF_FLOAT8 ALIGNOF_DOUBLE #endif should do the trick. Greetings, Andres Freund
